Technical Design: Паттерн Self-Bootstrapping Sandbox
1. Концепция
Self-Bootstrapping Sandbox (Самозагружающаяся песочница) — это подход к интеграционному тестированию, при котором тестовое окружение создается не вручную (через фикстуры или заранее подготовленные файлы), а с помощью самого тестируемого инструмента (CLI).
Это гарантирует, что:
- Инструмент может использовать то, что сам создает.
- Тесты имитируют реальный путь пользователя (End-to-End).
- Отсутствует "дрейф" между тестами и реальностью, так как нет искусственно созданных моков файловой системы.
2. Реализация и Изоляция
Ключевым элементом песочницы является поддержка переменной окружения HSM_REGISTRY_PATH.
2.1. Изоляция реестра
При инициализации HSMCore проверяет наличие HSM_REGISTRY_PATH. Если переменная установлена, HSM использует указанный путь вместо стандартного ./hsm-registry. Это позволяет тестам:
- Создавать временную директорию.
- Наполнять её тестовыми манифестами.
- Запускать команды HSM, будучи уверенными, что они не затронут реальный реестр.
3. Цикл полного пути (Full Path Cycle)
В HSM этот паттерн реализуется через следующую последовательность действий, имитирующую реальный жизненный цикл разработки:
Шаг 1: Рождение Вселенной (Project & Registry Init)
Тест инициализирует новый проект. Команда hsm init автоматически создает не только hsm.yaml, но и структуру локального реестра hsm-registry/.
hsm init --name sandbox-project
- Результат: Созданы
hsm.yamlи папкиhsm-registry/{libraries,services,library_groups,service_groups}.
Шаг 2: Создание Кирпичиков (Library Init)
Тест создает две реальные Python-библиотеки.
hsm library init lib-standalone --path ./libs/lib-standalone
hsm library init lib-in-group --path ./libs/lib-in-group
- Действие: HSM вызывает
uv init --lib, создавая валидныеpyproject.toml. - Регистрация: Пути к библиотекам автоматически прописываются в
hsm-registry/libraries/.
Шаг 3: Сборка Стэка (Project Configuration)
Тест распределяет библиотеки и сервисы по структуре проекта.
- Библиотеки:
lib-standaloneдобавляется как прямая библиотека проекта.lib-in-groupдобавляется в именованную группу (например,core-libs).
- Сервисы:
- Регистрируется и добавляется standalone-сервис (например,
redis). - Регистрируется и добавляется сервис в группу (например,
db-cluster).
- Регистрируется и добавляется standalone-сервис (например,
Шаг 4: Материализация (Sync & Validate)
Вызов финальной синхронизации всего стэка.
hsm sync
- Проверка Python:
uvдолжен успешно создать.venvи установить обе библиотеки (одну напрямую, другую через группу). - Проверка Docker: Команда
docker compose configдолжна подтвердить валидность сгенерированногоdocker-compose.hsm.yml, объединяющего standalone-сервис и сервисы из групп.
4. Преимущества для HSM
- High Fidelity: Мы уверены, что
uvиdockerпонимают наши файлы. - Документация через тесты: Код тестов становится живым примером того, как пользоваться инструментом.
- Легкая отладка: Если тест упал, в
/tmpостается полностью готовый проект, в который можно зайти и запустить команды вручную.
5. Реализация в pytest
Для поддержки этого паттерна используется фикстура hsm_sandbox, которая:
- Создает изолированную директорию.
- Устанавливает переменную окружения
HSM_REGISTRY_PATH, чтобы команды по умолчанию работали с тестовым реестром. - Предоставляет хелпер для запуска команд и проверки их вывода.