"""Test fixtures: fresh temp-file SQLite DB per test session (spec ยง8.4).""" import os import tempfile import httpx import pytest # Must be set before any app module is imported (engine binds at import time) _tmpdir = tempfile.mkdtemp(prefix="calcount-test-") os.environ["CALCOUNT_DATABASE_URL"] = f"sqlite:///{_tmpdir}/test.db" from fastapi.testclient import TestClient # noqa: E402 from database import run_migrations # noqa: E402 from main import app # noqa: E402 @pytest.fixture(scope="session") def client(): run_migrations() with TestClient(app) as c: yield c @pytest.fixture def off_mock(monkeypatch): """Replace _default_client() in services.off with a mock client backed by httpx.MockTransport. Tests assign off_mock.handler to control responses. Usage: def test_foo(client, off_mock): def handler(request): return httpx.Response(200, json={...}) off_mock.handler = handler resp = client.get("/api/off/product/123") """ state = _MockState() def _make_mock_client(): return httpx.Client( transport=httpx.MockTransport(lambda req: state.handler(req)) ) import services.off as off_mod monkeypatch.setattr(off_mod, "_default_client", _make_mock_client) return state class _MockState: """Mutable state so tests can set .handler after fixture injection.""" def __init__(self): self.handler = None