Coverage for api\tests\test_evenement.py: 100%
83 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 15:18 +0200
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 15:18 +0200
1from django.test import TestCase
2from rest_framework.test import APIClient
3from rest_framework import status
4from django.urls import reverse
5from api.models import Evenement, Lieu
6from users.models.base_user import User
7from datetime import date, time
8from api.serializers import EvenementSerializer
10# ---------- MODELE ----------
11class EvenementModelTest(TestCase):
12 def test_str_representation(self):
13 lieu = Lieu.objects.create(nom="Stade Pierre Mauroy")
14 evenement = Evenement.objects.create(
15 description="100m Final",
16 lieu=lieu,
17 date=date(2025, 8, 1),
18 horraire=time(15, 0)
19 )
20 self.assertEqual(str(evenement), "100m Final")
22# ---------- SERIALIZER ----------
23class EvenementSerializerTest(TestCase):
24 def test_serializer_content(self):
25 lieu = Lieu.objects.create(nom="Bercy")
26 evenement = Evenement.objects.create(
27 description="Boxe - Quart de finale",
28 lieu=lieu,
29 date=date(2025, 7, 30),
30 horraire=time(18, 30)
31 )
32 serializer = EvenementSerializer(instance=evenement)
33 self.assertEqual(serializer.data['id'], evenement.id)
34 self.assertEqual(serializer.data['lieu']['id'], lieu.id)
35 self.assertEqual(serializer.data['date'], str(evenement.date))
36 self.assertEqual(serializer.data['horraire'], evenement.horraire.strftime("%H:%M:%S"))
38# ---------- API ----------
39class EvenementAPITest(TestCase):
40 def setUp(self):
41 self.client = APIClient()
42 self.lieu = Lieu.objects.create(nom="Grand Palais")
43 self.evenement = Evenement.objects.create(
44 description="Escrime - Demi-finale",
45 lieu=self.lieu,
46 date=date(2025, 8, 5),
47 horraire=time(11, 0)
48 )
50 self.admin_user = User.objects.create_admin(
51 email="admin@example.com",
52 password="Adminp@ss123456789"
53 )
54 self.super_user = User.objects.create_superuser(
55 email="super@example.com",
56 password="Superp@ss123456789"
57 )
58 self.normal_user = User.objects.create_user(
59 email="user@example.com",
60 password="Userp@ss123456789"
61 )
63 def test_get_list_evenements(self):
64 response = self.client.get(reverse('evenement-list'))
65 self.assertEqual(response.status_code, status.HTTP_200_OK)
66 self.assertIn("Escrime - Demi-finale", str(response.data))
68 def test_get_detail_evenement(self):
69 response = self.client.get(reverse('evenement-detail', kwargs={'pk': self.evenement.id}))
70 self.assertEqual(response.status_code, status.HTTP_200_OK)
71 self.assertEqual(response.data['description'], self.evenement.description)
73 def test_create_evenement_unauthenticated_fail(self):
74 response = self.client.post(reverse('evenement-create'), data={
75 'description': 'Nouveau match',
76 'lieu_id': self.lieu.id,
77 'date': '2025-08-10',
78 'horraire': '16:00:00'
79 })
80 self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
82 def test_create_evenement_user_fail(self):
83 self.client.force_authenticate(user=self.normal_user)
84 response = self.client.post(reverse('evenement-create'), data={
85 'description': 'Interdit',
86 'lieu_id': self.lieu.id,
87 'date': '2025-08-12',
88 'horraire': '19:00:00'
89 })
90 self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
92 def test_create_evenement_admin_succeed(self):
93 self.client.force_authenticate(user=self.admin_user)
94 response = self.client.post(reverse('evenement-create'), data={
95 'description': 'Finale Natation',
96 'lieu_id': self.lieu.id,
97 'date': '2025-08-15',
98 'horraire': '10:00:00'
99 })
100 self.assertEqual(response.status_code, status.HTTP_201_CREATED)
101 self.assertTrue(Evenement.objects.filter(description="Finale Natation").exists())
103 def test_update_evenement_unauthenticated_fail(self):
104 url = reverse('evenement-update', kwargs={'pk': self.evenement.id})
105 response = self.client.put(url, data={
106 'description': 'Modifié',
107 'lieu_id': self.lieu.id,
108 'date': '2025-08-05',
109 'horraire': '11:00:00'
110 })
111 self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
113 def test_update_evenement_user_fail(self):
114 self.client.force_authenticate(user=self.normal_user)
115 url = reverse('evenement-update', kwargs={'pk': self.evenement.id})
116 response = self.client.put(url, data={
117 'description': 'Tentative Modif',
118 'lieu_id': self.lieu.id,
119 'date': '2025-08-05',
120 'horraire': '11:00:00'
121 })
122 self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
124 def test_update_evenement_admin_succeed(self):
125 self.client.force_authenticate(user=self.admin_user)
126 url = reverse('evenement-update', kwargs={'pk': self.evenement.id})
127 response = self.client.put(url, data={
128 'description': 'Modifié par admin',
129 'lieu_id': self.lieu.id,
130 'date': '2025-08-05',
131 'horraire': '11:00:00'
132 })
133 self.assertEqual(response.status_code, status.HTTP_200_OK)
134 self.evenement.refresh_from_db()
135 self.assertEqual(self.evenement.description, 'Modifié par admin')
137 def test_delete_evenement_unauthenticated_fail(self):
138 url = reverse('evenement-delete', kwargs={'pk': self.evenement.id})
139 response = self.client.delete(url)
140 self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
141 self.assertTrue(Evenement.objects.filter(pk=self.evenement.id).exists())
143 def test_delete_evenement_user_fail(self):
144 self.client.force_authenticate(user=self.normal_user)
145 url = reverse('evenement-delete', kwargs={'pk': self.evenement.id})
146 response = self.client.delete(url)
147 self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
148 self.assertTrue(Evenement.objects.filter(pk=self.evenement.id).exists())
150 def test_delete_evenement_admin_succeed(self):
151 self.client.force_authenticate(user=self.admin_user)
152 url = reverse('evenement-delete', kwargs={'pk': self.evenement.id})
153 response = self.client.delete(url)
154 self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
155 self.assertFalse(Evenement.objects.filter(pk=self.evenement.id).exists())