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