"""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