""" Session-scoped fixtures that spin up and tear down the test stack. The test stack uses docker-compose.test.yml which: - Runs on port 18000 (won't collide with the dev stack on 8000) - Uses tmpfs for all storage (no data survives after `down`) - Uses project name "langlearn-test" to stay isolated from dev containers """ import pathlib import subprocess import httpx import pytest PROJECT_ROOT = pathlib.Path(__file__).parent.parent COMPOSE_FILE = str(PROJECT_ROOT / "docker-compose.test.yml") COMPOSE_PROJECT = "langlearn-test" API_BASE_URL = "http://localhost:18000" def _compose(*args: str) -> None: subprocess.run( ["docker", "compose", "-p", COMPOSE_PROJECT, "-f", COMPOSE_FILE, *args], cwd=PROJECT_ROOT, check=True, ) @pytest.fixture(scope="session", autouse=True) def docker_stack(): """Bring the test stack up before the session; tear it down (including volumes) after.""" _compose("up", "--build", "--wait", "-d") yield _compose("down", "-v") @pytest.fixture def client() -> httpx.Client: """A plain httpx client pointed at the test API. Not authenticated.""" with httpx.Client(base_url=API_BASE_URL) as c: yield c