fix(tradein/tests): тесты авторизации проверяют настоящий guard + реальный рендер PDF #2541

Merged
lekss361 merged 1 commit from fix/tradein-audit-tests into main 2026-07-26 23:04:44 +00:00
Owner

1. Тесты авторизации проверяли копию, а не авторизацию

test_rbac.py и test_internal_auth_secret.py держали собственные копии middleware внутри тестового приложения, с докстрингом «MIRROR of app.main — keep in sync». Копия уже отстала: в ней полностью отсутствовала проверка внутреннего секрета, которая в бою есть. То есть правки настоящей авторизации тесты бы не заметили.

rbac_guard и его константы вынесены из app/main.py в новый app/core/rbac.py — модуль без побочных эффектов, тянет только конфиг и auth, без базы и lifespan. main.py теперь импортирует guard оттуда и регистрирует явно; правка в main.py минимальна и ограничена этим выносом. Оба теста подключают настоящий guard.

Проверено, что тесты теперь ловят регрессию: guard был временно сломан, тесты покраснели, guard возвращён.

2. Генератор PDF был замокан целиком

test_pdf_security.py подменял WeasyPrint заглушкой, поэтому регрессия вёрстки отчёта для CI была невидима — ровно тот класс дефекта, который чинился вручную накануне (коммит 42a50cf8, пустые страницы).

Добавлен test_pdf_real_render.py с настоящим рендером: проверяет, что обычная оценка занимает ровно 4 страницы без хвостовой пустой, что состояние «недостаточно данных» укладывается в одну, и наличие ключевых блоков. Существующие security-тесты с моком не тронуты — они проверяют другое.

Test plan

  • Полный набор зелёный
  • Эксперимент с намеренной поломкой guard подтвердил, что тест ловит регрессию
## 1. Тесты авторизации проверяли копию, а не авторизацию `test_rbac.py` и `test_internal_auth_secret.py` держали **собственные копии** middleware внутри тестового приложения, с докстрингом «MIRROR of app.main — keep in sync». Копия уже отстала: в ней полностью отсутствовала проверка внутреннего секрета, которая в бою есть. То есть правки настоящей авторизации тесты бы не заметили. `rbac_guard` и его константы вынесены из `app/main.py` в новый `app/core/rbac.py` — модуль без побочных эффектов, тянет только конфиг и auth, без базы и lifespan. `main.py` теперь импортирует guard оттуда и регистрирует явно; правка в `main.py` минимальна и ограничена этим выносом. Оба теста подключают **настоящий** guard. **Проверено, что тесты теперь ловят регрессию:** guard был временно сломан, тесты покраснели, guard возвращён. ## 2. Генератор PDF был замокан целиком `test_pdf_security.py` подменял WeasyPrint заглушкой, поэтому регрессия вёрстки отчёта для CI была невидима — ровно тот класс дефекта, который чинился вручную накануне (коммит `42a50cf8`, пустые страницы). Добавлен `test_pdf_real_render.py` с настоящим рендером: проверяет, что обычная оценка занимает **ровно 4 страницы** без хвостовой пустой, что состояние «недостаточно данных» укладывается в одну, и наличие ключевых блоков. Существующие security-тесты с моком не тронуты — они проверяют другое. ## Test plan - [x] Полный набор зелёный - [x] Эксперимент с намеренной поломкой guard подтвердил, что тест ловит регрессию
lekss361 added 1 commit 2026-07-26 21:44:15 +00:00
fix(tradein/tests): stop mirroring rbac_guard, add real WeasyPrint page-count regression test
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m27s
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
64f3f8769f
test_rbac.py and test_internal_auth_secret.py each kept a hand-maintained
"MIRROR of app.main" copy of rbac_guard. The copies had already drifted:
test_rbac.py's copy was missing the #2213 X-Internal-Auth-Secret
defense-in-depth check entirely, so a regression in the real guard would not
have failed CI. Extracted rbac_guard (+ its constants) into app/core/rbac.py
(no DB/lifespan side effects) so app/main.py and both test files import and
exercise the exact same production code path instead of copies.

Verified the fix actually catches regressions: temporarily neutered the
secret-gate check in app/core/rbac.py, confirmed
test_internal_auth_secret.py went red (2 failures), then reverted — suite
back to green (31/31).

Also added tests/test_pdf_real_render.py: test_pdf_security.py stubs
WeasyPrint entirely, so it structurally cannot catch a real pagination
regression like the one just fixed in commit 42a50cf8 (extra trailing blank
5th page from the running @page header/footer). The new module renders the
REAL PDF via generate_trade_in_pdf and asserts the documented "4 pages, no
blank" invariant directly. It needs WeasyPrint's native Pango/cairo/GObject
libs (absent on this Windows sandbox and on ci-tradein.yml's bare
ubuntu-latest runner), so it self-skips via
pytest.skip(allow_module_level=True) wherever those aren't present, and runs
for real only where they are (e.g. `docker exec tradein-backend python -m
pytest -m pdf_render tests/test_pdf_real_render.py`) — see its docstring.
Existing mocked security tests are untouched (they check different things).

tests/conftest.py added (didn't exist before) to register the pdf_render
marker cleanly.
lekss361 merged commit ca46411346 into main 2026-07-26 23:04:44 +00:00
lekss361 deleted branch fix/tradein-audit-tests 2026-07-26 23:04:44 +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#2541
No description provided.