tp done
This commit is contained in:
112
tests/enonce/etape5_test_api.py
Normal file
112
tests/enonce/etape5_test_api.py
Normal file
@@ -0,0 +1,112 @@
|
||||
import pytest
|
||||
from httpx import AsyncClient
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
# CORRECTION : Importer le modèle Movie
|
||||
from app.models import Movie
|
||||
|
||||
# Marqueur pour indiquer à pytest que ce sont des tests asynchrones
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
async def test_read_genres_api(test_client: AsyncClient, test_data):
|
||||
"""Teste le TODO 'GET /genres/' (API) - Étape 5."""
|
||||
response = await test_client.get("/api/v1/genres/")
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert isinstance(data, list)
|
||||
assert len(data) >= 2 # "Science-Fiction" et "Action" de la fixture
|
||||
assert data[0]["label"] == "Science-Fiction"
|
||||
assert data[1]["label"] == "Action"
|
||||
|
||||
|
||||
async def test_participants_api_workflow(test_client: AsyncClient, test_data):
|
||||
"""
|
||||
Teste le workflow complet pour les participants :
|
||||
- POST /participants/ (TODO)
|
||||
- GET /participants/ (TODO)
|
||||
- PATCH /participants/{id} (TODO)
|
||||
"""
|
||||
|
||||
# 1. Tester GET /participants/ (TODO) avec les données de la fixture
|
||||
response_get_all = await test_client.get("/api/v1/participants/")
|
||||
assert response_get_all.status_code == 200
|
||||
list_data = response_get_all.json()
|
||||
assert len(list_data) == 2 # Nolan et DiCaprio
|
||||
|
||||
# Utiliser les valeurs simples de la fixture test_data
|
||||
assert list_data[0]["last_name"] == test_data["actor_leo_lastname"] # Trié par nom de famille
|
||||
assert list_data[1]["last_name"] == test_data["director_nolan_lastname"]
|
||||
|
||||
# 2. Tester POST /participants/ (TODO)
|
||||
participant_data = {"first_name": "Greta", "last_name": "Gerwig"}
|
||||
response_post = await test_client.post("/api/v1/participants/", json=participant_data)
|
||||
|
||||
assert response_post.status_code == 201
|
||||
created_data = response_post.json()
|
||||
assert created_data["first_name"] == "Greta"
|
||||
participant_id = created_data["id"]
|
||||
|
||||
# 3. Tester PATCH /participants/{id} (TODO)
|
||||
patch_data = {"first_name": "G.", "last_name": "Gerwig-Baumbach"}
|
||||
response_patch = await test_client.patch(
|
||||
f"/api/v1/participants/{participant_id}",
|
||||
json=patch_data
|
||||
)
|
||||
assert response_patch.status_code == 200
|
||||
updated_data = response_patch.json()
|
||||
assert updated_data["first_name"] == "G."
|
||||
assert updated_data["last_name"] == "Gerwig-Baumbach"
|
||||
|
||||
|
||||
async def test_opinions_api_workflow(test_client: AsyncClient, db_session: AsyncSession, test_data):
|
||||
"""
|
||||
Teste le workflow des avis :
|
||||
- POST /movies/{id}/opinions/ (TODO)
|
||||
- DELETE /opinions/{id} (déjà fourni, mais on teste)
|
||||
"""
|
||||
|
||||
# 1. Créer un film de test manuellement pour avoir un movie_id
|
||||
|
||||
# Ajouter les champs NOT NULL (duration, synopsis)
|
||||
movie = Movie(
|
||||
title="Inception",
|
||||
year=2010,
|
||||
duration=148,
|
||||
synopsis="Un film sur les rêves.",
|
||||
|
||||
# Utiliser les ID simples de la fixture test_data
|
||||
genre_id=test_data["genre_action_id"],
|
||||
director_id=test_data["director_nolan_id"]
|
||||
)
|
||||
|
||||
db_session.add(movie)
|
||||
await db_session.commit()
|
||||
await db_session.refresh(movie)
|
||||
movie_id = movie.id
|
||||
|
||||
# 2. Tester POST /movies/{id}/opinions/ (TODO)
|
||||
opinion_data = {
|
||||
"note": 5,
|
||||
"comment": "Mind-blowing!",
|
||||
"member_id": test_data["member_user_id"]
|
||||
}
|
||||
response_post = await test_client.post(
|
||||
f"/api/v1/movies/{movie_id}/opinions/",
|
||||
json=opinion_data
|
||||
)
|
||||
|
||||
assert response_post.status_code == 201
|
||||
created_opinion = response_post.json()
|
||||
assert created_opinion["comment"] == "Mind-blowing!"
|
||||
assert created_opinion["member"]["login"] == test_data["member_user_login"]
|
||||
|
||||
opinion_id = created_opinion["id"]
|
||||
|
||||
# 3. Tester DELETE /opinions/{id}
|
||||
response_delete = await test_client.delete(f"/api/v1/opinions/{opinion_id}")
|
||||
assert response_delete.status_code == 204 # No Content
|
||||
|
||||
# 4. Vérifier que la suppression lève un 404 si on réessaye
|
||||
response_delete_again = await test_client.delete(f"/api/v1/opinions/{opinion_id}")
|
||||
assert response_delete_again.status_code == 404
|
||||
Reference in New Issue
Block a user