Files
orchestrator/docs/work-items/ORCH-062/04-test-plan.yaml

96 lines
5.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
work_item: ORCH-062
stage: analysis
author_agent: analyst
status: ready-for-review
created_at: 2026-06-09
model_used: claude-opus-4-8
title: "Авто-prune docker build cache на mva154 — план тестов"
framework: pytest
scope: >
Покрывает code-путь (Вариант A — heartbeat-демон src/build_cache_pruner.py по образцу
src/disk_watchdog.py): чистая decision-логика (надо ли убирать на этом тике), построение
безопасной docker-команды с политикой удержания, never-raise на ошибках subprocess/таймаут/
недоступность docker.sock, kill-switch (демон не стартует), наблюдаемость status()/GET /queue,
интеграция в lifespan. ВНЕ покрытия pytest: реальный вызов docker (subprocess мокается — тесты
не должны трогать настоящий docker daemon), реальное освобождение диска. Если архитектор выберет
чистый инфра-путь (B daemon.json / C cron) без кода src/**, применимые TC сводятся к ручной
host-верификации, описанной в 07-infra-requirements.md / INFRA.md (см. TC-10).
notes: >
docker-вызовы изолируются моками (monkeypatch subprocess.run / docker-клиента) — НИ ОДИН тест не
выполняет настоящий `docker builder prune`. Время/период инъектируются (now_provider), как в
тестах disk_watchdog. Полный регресс `pytest tests/ -q` остаётся зелёным; STAGE_TRANSITIONS /
QG_CHECKS / схема БД не затрагиваются — отдельных гейт-тестов фича не добавляет.
tests:
- id: TC-01
type: unit
description: "decide-функция: при включённом pruner и истёкшем периоде с прошлой уборки решение = PRUNE"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-02
type: unit
description: "decide-функция: период с прошлой уборки не истёк → решение = SKIP (анти-частота, NFR-4)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-03
type: unit
description: "Построение docker-команды несёт возрастной фильтр удержания (until=<retention>) и НЕ содержит image/system prune (FR-2/FR-3/AC-2/AC-3)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-04
type: unit
description: "never-raise: subprocess бросает исключение / возвращает ненулевой rc → тик не падает, ошибка залогирована (FR-6/AC-4)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-05
type: unit
description: "never-raise: недоступность docker.sock (FileNotFoundError/PermissionError) → тик пропускается, цикл жив (FR-6/AC-4)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-06
type: unit
description: "never-raise: таймаут docker-команды (TimeoutExpired) проглатывается, фоновый цикл продолжает работу (FR-6/AC-4)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-07
type: unit
description: "kill-switch: при *_enabled=False start() — no-op, фоновый поток не стартует (FR-5/AC-5/NFR-3)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-08
type: unit
description: "config: невалидный *_interval_s / retention → лог-warning + безопасный дефолт, старт не падает (FR-5/AC-6)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-09
type: unit
description: "status() never-raise и содержит enabled/interval_s/retention/last_run_ts + best-effort результат последней уборки (FR-4/AC-7)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-10
type: unit
description: "Изоляция от Quality Gate: модуль-pruner — leaf, не импортирует stage_engine/stages/qg; STAGE_TRANSITIONS и QG_CHECKS не изменены (NFR-2/AC-8)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-11
type: integration
description: "lifespan: при включённом флаге демон стартует в app-lifespan и корректно останавливается на shutdown (рядом с disk_watchdog), docker замокан (FR-1/AC-1)"
module: tests/test_build_cache_pruner.py
expected: PASS
- id: TC-12
type: integration
description: "GET /queue содержит read-only блок авто-prune с состоянием (enabled/interval_s/retention/last_run_ts); при выключенном флаге enabled=false (FR-4/AC-5/AC-7)"
module: tests/test_build_cache_pruner.py
expected: PASS