Files
TodoFlow/server/tests/test_api.py
T

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