mirror of
https://github.com/R0m1k3/TodoFlow.git
synced 2026-10-11 17:28:17 +02:00
110 lines
3.8 KiB
Python
110 lines
3.8 KiB
Python
import pytest
|
|
from uuid import UUID
|
|
from fastapi.testclient import TestClient
|
|
from sqlmodel import SQLModel, create_engine, Session
|
|
from sqlmodel.pool import StaticPool
|
|
|
|
from app.main import app, verify_api_key
|
|
from app.database import get_session
|
|
from app.models import Task, TaskStatus
|
|
|
|
# Clé API valide pour les tests
|
|
VALID_API_KEY = "test-token-123"
|
|
|
|
# Montage d'une base de données SQLite en mémoire pour les tests unitaires
|
|
@pytest.fixture(name="session")
|
|
def session_fixture():
|
|
engine = create_engine(
|
|
"sqlite://",
|
|
connect_args={"check_same_thread": False},
|
|
poolclass=StaticPool,
|
|
)
|
|
SQLModel.metadata.create_all(engine)
|
|
with Session(engine) as session:
|
|
yield session
|
|
|
|
@pytest.fixture(name="client")
|
|
def client_fixture(session: Session):
|
|
# Remplacement du générateur de session par la session de test en mémoire
|
|
def get_session_override():
|
|
return session
|
|
|
|
app.dependency_overrides[get_session] = get_session_override
|
|
|
|
# Remplacement des clés API valides par notre clé de test
|
|
from app.config import settings
|
|
settings.API_KEYS_RAW = VALID_API_KEY
|
|
|
|
with TestClient(app) as client:
|
|
yield client
|
|
|
|
app.dependency_overrides.clear()
|
|
|
|
def test_verify_api_key_required(client: TestClient):
|
|
# Sans clé API, l'accès doit être refusé (401)
|
|
response = client.get("/api/v1/tasks")
|
|
assert response.status_code == 401
|
|
assert "clé API est manquante" in response.json()["detail"]
|
|
|
|
def test_verify_api_key_invalid(client: TestClient):
|
|
# Avec une clé API incorrecte, l'accès doit être refusé (403)
|
|
response = client.get("/api/v1/tasks", headers={"X-API-Key": "mauvaise-cle"})
|
|
assert response.status_code == 403
|
|
assert "Clé API invalide" in response.json()["detail"]
|
|
|
|
def test_create_and_read_task(client: TestClient):
|
|
headers = {"X-API-Key": VALID_API_KEY}
|
|
|
|
# 1. Création d'une tâche
|
|
payload = {
|
|
"title": "Acheter du pain",
|
|
"description": "Prendre une tradition bien cuite",
|
|
"status": "A faire"
|
|
}
|
|
response = client.post("/api/v1/tasks", json=payload, headers=headers)
|
|
assert response.status_code == 201
|
|
data = response.json()
|
|
assert data["title"] == "Acheter du pain"
|
|
assert "id" in data
|
|
assert "created_at" in data
|
|
task_id = data["id"]
|
|
|
|
# 2. Lecture de la tâche spécifique
|
|
response = client.get(f"/api/v1/tasks/{task_id}", headers=headers)
|
|
assert response.status_code == 200
|
|
assert response.json()["title"] == "Acheter du pain"
|
|
|
|
def test_update_task_status(client: TestClient):
|
|
headers = {"X-API-Key": VALID_API_KEY}
|
|
|
|
# 1. Création
|
|
payload = {"title": "Coder l'API"}
|
|
response = client.post("/api/v1/tasks", json=payload, headers=headers)
|
|
task_id = response.json()["id"]
|
|
|
|
# 2. Passage à "En cours"
|
|
response = client.put(f"/api/v1/tasks/{task_id}", json={"status": "En cours"}, headers=headers)
|
|
assert response.status_code == 200
|
|
assert response.json()["status"] == "En cours"
|
|
|
|
# 3. Passage à "Termine"
|
|
response = client.put(f"/api/v1/tasks/{task_id}", json={"status": "Termine"}, headers=headers)
|
|
assert response.status_code == 200
|
|
assert response.json()["status"] == "Termine"
|
|
|
|
def test_delete_task(client: TestClient):
|
|
headers = {"X-API-Key": VALID_API_KEY}
|
|
|
|
# 1. Création
|
|
payload = {"title": "Tâche éphémère"}
|
|
response = client.post("/api/v1/tasks", json=payload, headers=headers)
|
|
task_id = response.json()["id"]
|
|
|
|
# 2. Suppression
|
|
response = client.delete(f"/api/v1/tasks/{task_id}", headers=headers)
|
|
assert response.status_code == 204
|
|
|
|
# 3. Vérification de la disparition (404)
|
|
response = client.get(f"/api/v1/tasks/{task_id}", headers=headers)
|
|
assert response.status_code == 404
|