43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
|
|
"""
|
||
|
|
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
|