gendesign/backend/tests/conftest.py
Light1YT 0247f13fb6
All checks were successful
Deploy / changes (push) Successful in 5s
Deploy / build-frontend (push) Has been skipped
Deploy / build-backend (push) Successful in 1m35s
Deploy / build-worker (push) Successful in 2m49s
Deploy / deploy (push) Successful in 1m13s
test(rbac): test-mode bypass so api/v1 suite can authenticate (CI-rehab 1/3)
The whole backend api/v1 test suite hits `app` via TestClient mimo Caddy, so
rbac_guard (app/main.py) 401'd every authed request (no X-Authenticated-User)
— 112 tests red, the suite effectively dead (which is how #994's district 500
shipped uncaught). Add `settings.testing` (default False — prod RBAC untouched)
+ a strictly-gated bypass at the top of rbac_guard; tests/conftest.py enables it
(env TESTING=1 + settings.testing=True before app import).

Security: bypass fires ONLY when settings.testing is True, which is set NOWHERE
in prod (default False; only tests/conftest.py flips it). RBAC's 401/403 logic
stays covered by tests/test_rbac.py (its own middleware copy, ignores the flag).

Effect: 112 → 42 failed, 1590 → 1660 passed. Remaining 42 (+5 mv_layout env
errors) are stale-mock/assertion drift + env-required tests — fixed in CI-rehab
2/3. Foundation for a real Forgejo pytest gate (3/3).

Refs #944.
2026-06-03 18:29:20 +05:00

42 lines
2.2 KiB
Python
Raw Permalink 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.

"""Shared pytest fixtures для backend-сьюта.
NB: RBAC-гейт (app/main.py `rbac_guard`) требует заголовок `X-Authenticated-User`
на любом non-public пути — иначе 401. Тесты, бьющие по `app` через TestClient,
должны слать этот заголовок ЯВНО на запрос (напр. test_parcel_by_bbox), либо
тестировать именно no-auth путь (admin-тесты ждут 401 без заголовка). Глобально
заголовок НЕ инжектим — это ломает тесты, проверяющие отказ авторизации.
"""
from __future__ import annotations
import os
import pytest
# Включаем test-mode ДО любого импорта app: rbac_guard (app/main.py) пропускает
# запросы при settings.testing=True (юнит-тесты бьют по app мимо Caddy и не несут
# X-Authenticated-User → иначе 401 на всём api/v1). Ставим и env (на случай
# ре-инстанцирования Settings), и атрибут синглтона напрямую (надёжно независимо
# от порядка импортов). RBAC-логика (401/403) покрыта в test_rbac.py — там своя
# копия middleware, на settings.testing НЕ смотрит, поэтому остаётся валидной.
os.environ.setdefault("TESTING", "1")
from app.core.config import settings
settings.testing = True
@pytest.fixture(autouse=True)
def _clear_dependency_overrides():
"""Сбрасывать app.dependency_overrides после каждого теста (anti-leak).
Тест переопределяет get_db через app.dependency_overrides; без сброса override
течёт в следующий тест → ложные коннекты к реальной БД / флейки. Импорт app
локальный (ленивый) — не тянем тяжёлый app.main при сборе тестов без него.
"""
yield
try:
from app.main import app
app.dependency_overrides.clear()
except Exception:
pass