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