- test_get_redirect_uri_from_host_header: épingle oauth_redirect_uri à vide pour tester la dérivation Host de façon isolée (le .env du projet définit OAUTH_REDIRECT_URI, qui passe prioritaire par design) - conftest: pose FLOWDECK_DATA_DIR vers un répertoire temporel inscriptible pour les tests emoji/docx/covers qui dépendaient de /data (conteneur) - ajoute scripts/audit_functional.py: audit de bout-en-bout des processus (notes, DB, tâches, partage, publication, export, recherche, agents) Suite locale: 538 passed
72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
"""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_")
|
|
data_dir = tempfile.mkdtemp(prefix="fd_data_")
|
|
|
|
# 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"
|
|
# Point data-root (uploads/, emoji/, covers/) at a writable temp dir so tests
|
|
# don't depend on the container's /data path existing on a dev host.
|
|
os.environ["FLOWDECK_DATA_DIR"] = data_dir
|
|
|
|
# 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
|