"""FlowDeck — pytest fixtures and configuration. Each test gets a fresh, isolated SQLite database and backup directory so the suite is safe to run in parallel (``pytest -n auto``): workers never share a database file, and no state leaks between tests. """ import os import tempfile from pathlib import Path import pytest from fastapi.testclient import TestClient @pytest.fixture def client(): """FastAPI TestClient with a fresh temporary SQLite database.""" db_file = tempfile.NamedTemporaryFile(suffix=".db", delete=False) db_path = db_file.name db_file.close() backup_dir = tempfile.mkdtemp(prefix="fd_backups_") # Set env BEFORE importing app modules (config reads at import time). os.environ["DATABASE_URL"] = f"sqlite:///{db_path}" os.environ["APP_SECRET_KEY"] = "test-secret-for-tests" os.environ["RATE_LIMIT_ENABLED"] = "false" os.environ["BACKUP_ENABLED"] = "true" os.environ["BACKUP_DIR"] = backup_dir os.environ["PROJECT_SYNC_ENABLED"] = "false" # IMPORTANT: mutate the existing Settings singleton in place — do NOT rebind # `app.config.settings`. Modules such as `app.services.backup` and # `app.routers.auth` hold a direct reference imported at load time, so # rebinding would leave them pointing at the stale defaults (this was the # cause of the previously-skipped flaky backup tests). import app.config s = app.config.settings s.database_url = f"sqlite:///{db_path}" s.app_secret_key = "test-secret-for-tests" s.rate_limit_enabled = False s.backup_enabled = True s.backup_dir = backup_dir s.backup_interval_hours = 24 s.backup_keep = 30 s.project_sync_enabled = False from app.db import init_db from app.main import app init_db() yield TestClient(app) # Cleanup try: os.unlink(db_path) except PermissionError: pass # Windows: file may still be open in another thread for p in Path(backup_dir).glob("*.db"): try: p.unlink() except PermissionError: pass try: Path(backup_dir).rmdir() except OSError: pass