Exercices Django Avancé Tests d'API simules
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Tests d'API simules

En entreprise, une API sans tests c'est du code jetable. A chaque modification, tu risques de casser quelque chose sans t'en rendre compte. Les tests d'API automatises te permettent de verifier en quelques secondes que tout fonctionne encore apres un changement.

Un bon test d'API verifie trois choses : le status code (200, 201, 404...), le contenu de la reponse, et les effets de bord (un POST a bien cree l'objet, un DELETE l'a bien supprime). On va construire un client de test qui simule des requetes HTTP.

Tu vas créer une classe APITestClient qui :

__init__(viewset) : prend un ViewSet (avec dispatch) et l'associe au client

get(path) : simule une requête GET. path est '/' pour la liste ou '/<id>/' pour un detail. Retourne le résultat de dispatch.

post(path, data) : simule une requête POST avec des données

put(path, data) : simule une requête PUT avec des données

delete(path) : simule une requête DELETE

Le client doit extraire le pk depuis le path quand il est present (ex: '/1/' -> pk=1).

Tu vas aussi écrire une fonction run_api_tests(client) qui exécute une série de tests et retourne un dictionnaire avec 'passed' (nombre de tests reussis) et 'failed' (nombre de tests echoues) et 'details' (liste des résultats). Les tests a exécuter :
1. GET sur liste vide retourne status 200 et data vide
2. POST crée un article et retourne status 201
3. GET sur la liste retourne 1 article
4. GET sur l'article crée retourne ses données
5. PUT modifie l'article
6. DELETE supprime l'article et retourne 204

Exemple :

vs = ArticleViewSet()
client = APITestClient(vs)
client.post('/', {'title': 'Hello'})
renvoie {'status': 201, 'data': {'id': 1, 'title': 'Hello'}}

Tests (4/5)

Client GET vide
vs = ArticleViewSet()
client = APITestClient(vs)
r = client.get('/')
assert r['status'] == 200 and r['data'] == []
Client POST
vs = ArticleViewSet()
client = APITestClient(vs)
r = client.post('/', {'title': 'Hello'})
assert r['status'] == 201 and r['data']['id'] == 1
Client GET detail
vs = ArticleViewSet()
client = APITestClient(vs)
client.post('/', {'title': 'Test'})
r = client.get('/1/')
assert r['status'] == 200 and r['data']['title'] == 'Test'
run_api_tests complet
vs = ArticleViewSet()
client = APITestClient(vs)
r = run_api_tests(client)
assert r['passed'] == 6 and r['failed'] == 0

+ 0 tests cachés

Indices (3 disponibles)

solution.py