ci(tradein): тесты браузерного сайдкара наконец бегут в пайплайне (#2722) #2726

Merged
bot-backend merged 1 commit from ci/2722-browser-job into main 2026-08-06 11:19:51 +00:00
Collaborator

Summary

Пункт 1 из #2722, после починки красноты в #2724 (смержен) — порядок именно такой, чтобы job не был красным с первого дня.

Каталог tradein-mvp/browser/ (108 тестов) не гонял ни один пайплайн:

  • ci-tradein.yml гейтит tradein-mvp/backend/** и tradein-mvp/frontend/**;
  • deploy-tradein.yml — то же самое;
  • сайдкар не член uv-воркспейса (tradein-mvp/pyproject.toml: members = ["backend", "packages/*"]), поэтому и uv run pytest из backend его не собирал.

Следствие: 4 теста лежали красными с 2026-06-20 и 2026-07-02, а файл test_server_smoke.py за это время правился дважды (#2430, #2433) — краснота не остановила ничего.

Показательно, что сам PR #2724 получил вакуумно-зелёный чек: он трогал только browser/**, ни один фильтр не сработал, все job'ы скипнулись, статус — success. Ровно тот сценарий, ради которого этот файл когда-то и заводили (#2208).

Что добавлено

Отдельный job browser-tests + свой paths-filter browser. Не шаг в backend-job, потому что:

  1. сайдкар вне воркспейса → uv sync --frozen его зависимости не ставит;
  2. aiohttp — единственная не-stdlib зависимость сьюта — отсутствует в tradein-mvp/uv.lock, backend-окружение сьют просто не запустит;
  3. разный scope: правка browser/ не должна гонять backend-сьют и наоборот.

Окружение job'а — намеренно лёгкое

pip install pytest aiohttp, и всё. Ни playwright, ни camoufox, ни закачки Firefox:

  • camoufox импортируется лениво внутри _launch_browser (server.py:346), а тесты мокают _ensure_browser/_do_fetch и грузят server.py по пути через importlib;
  • pytest-asyncio не нужен: async def test_ в каталоге ноль — каждый тест сам крутит asyncio.run().

Делить на юнит/интеграцию не понадобилось: живого браузера не требует ни один тест, 0 skipped — весь сьют идёт целиком, молча пропущенной части нет.

timeout-minutes: 10 — у каталога нет своего pyproject, а значит и pytest-timeout backend'а (timeout=120) на него не распространяется; нативный job-таймаут дешевле плагина ради одного каталога.

deploy-tradein.yml НЕ трогал (его правит открытый #2680).

Test plan

  • venv ровно из pytest+aiohttp, команда буквально как в job (pytest -q из tradein-mvp/browser/) → 108 passed, 0 failed, 0 skipped
  • yaml.safe_load + yamllint на ci-tradein.yml → чисто; job'ы: changes, backend-tests, browser-tests, frontend-checks
  • Главная проверка — на этом самом PR: правка .forgejo/workflows/ci-tradein.yml подпадает под новый фильтр browser, значит browser-tests обязан РЕАЛЬНО исполниться и быть зелёным в чеках ниже (а не скипнуться, как у #2724)

Refs #2722

## Summary Пункт 1 из #2722, после починки красноты в #2724 (смержен) — порядок именно такой, чтобы job не был красным с первого дня. Каталог `tradein-mvp/browser/` (108 тестов) не гонял **ни один** пайплайн: - `ci-tradein.yml` гейтит `tradein-mvp/backend/**` и `tradein-mvp/frontend/**`; - `deploy-tradein.yml` — то же самое; - сайдкар **не член uv-воркспейса** (`tradein-mvp/pyproject.toml`: `members = ["backend", "packages/*"]`), поэтому и `uv run pytest` из backend его не собирал. Следствие: 4 теста лежали красными с 2026-06-20 и 2026-07-02, а файл `test_server_smoke.py` за это время правился дважды (#2430, #2433) — краснота не остановила ничего. Показательно, что **сам PR #2724 получил вакуумно-зелёный чек**: он трогал только `browser/**`, ни один фильтр не сработал, все job'ы скипнулись, статус — success. Ровно тот сценарий, ради которого этот файл когда-то и заводили (#2208). ### Что добавлено Отдельный job `browser-tests` + свой paths-filter `browser`. Не шаг в backend-job, потому что: 1. сайдкар вне воркспейса → `uv sync --frozen` его зависимости не ставит; 2. `aiohttp` — единственная не-stdlib зависимость сьюта — **отсутствует в `tradein-mvp/uv.lock`**, backend-окружение сьют просто не запустит; 3. разный scope: правка `browser/` не должна гонять backend-сьют и наоборот. ### Окружение job'а — намеренно лёгкое `pip install pytest aiohttp`, и всё. Ни playwright, ни camoufox, ни закачки Firefox: - `camoufox` импортируется **лениво** внутри `_launch_browser` (`server.py:346`), а тесты мокают `_ensure_browser`/`_do_fetch` и грузят `server.py` по пути через `importlib`; - `pytest-asyncio` не нужен: `async def test_` в каталоге **ноль** — каждый тест сам крутит `asyncio.run()`. Делить на юнит/интеграцию не понадобилось: **живого браузера не требует ни один тест**, `0 skipped` — весь сьют идёт целиком, молча пропущенной части нет. `timeout-minutes: 10` — у каталога нет своего pyproject, а значит и `pytest-timeout` backend'а (`timeout=120`) на него не распространяется; нативный job-таймаут дешевле плагина ради одного каталога. `deploy-tradein.yml` НЕ трогал (его правит открытый #2680). ## Test plan - [x] venv ровно из `pytest`+`aiohttp`, команда буквально как в job (`pytest -q` из `tradein-mvp/browser/`) → **108 passed, 0 failed, 0 skipped** - [x] `yaml.safe_load` + `yamllint` на `ci-tradein.yml` → чисто; job'ы: `changes`, `backend-tests`, `browser-tests`, `frontend-checks` - [ ] **Главная проверка — на этом самом PR**: правка `.forgejo/workflows/ci-tradein.yml` подпадает под новый фильтр `browser`, значит `browser-tests` обязан РЕАЛЬНО исполниться и быть зелёным в чеках ниже (а не скипнуться, как у #2724) Refs #2722
bot-backend added 1 commit 2026-08-06 11:14:34 +00:00
ci(tradein): тесты браузерного сайдкара наконец бегут в пайплайне (#2722)
All checks were successful
CI / changes (pull_request) Successful in 9s
CI Trade-In / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 50s
CI Trade-In / frontend-checks (pull_request) Successful in 1m14s
CI Trade-In / backend-tests (pull_request) Successful in 3m18s
9947c57689
Каталог tradein-mvp/browser/ не гонял НИ ОДИН пайплайн: ci-tradein гейтит
backend/ и frontend/, deploy-tradein — тоже, а сам сайдкар не член uv-воркспейса
(members = backend + packages/*), так что и pytest из backend его не собирал.
Итог — 108 содержательных тестов вне охвата, из них 4 лежали красными на main
(с 2026-06-20 и 2026-07-02) при том, что файл дважды правился уже после поломки.
Красноту починил PR #2724, этот job закрывает причину, по которой её не видели.

Отдельный job, а не шаг в backend-job:
  - сайдкар вне воркспейса → uv sync --frozen его зависимости не ставит;
  - aiohttp (единственная не-stdlib зависимость сьюта) отсутствует в
    tradein-mvp/uv.lock, то есть backend-окружение сьют просто не запустит;
  - свой paths-filter: правка browser/ не обязана гонять backend-сьют и наоборот.

Окружение намеренно лёгкое: pytest + aiohttp, и всё. camoufox/playwright не
нужны — camoufox импортируется лениво внутри _launch_browser, а тесты мокают
_ensure_browser/_do_fetch. pytest-asyncio тоже не нужен: `async def test_` в
каталоге ноль, каждый тест сам крутит asyncio.run(). Проверено прогоном на venv
ровно из этих двух пакетов: 108 passed, 0 skipped — то есть в CI идёт весь
сьют целиком, без молча пропущенной интеграционной части.

timeout-minutes: 10 — у каталога нет своего pyproject, а значит и pytest-timeout
из backend'а (timeout=120) на него не распространяется; нативный job-таймаут
дешевле плагина ради одного каталога.

Refs #2722
bot-backend merged commit 3527d2b608 into main 2026-08-06 11:19:51 +00:00
bot-backend deleted branch ci/2722-browser-job 2026-08-06 11:19:51 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2726
No description provided.