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

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 

9 

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") 

21 

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")) 

37 

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 ) 

49 

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 ) 

62 

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)) 

67 

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) 

72 

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) 

81 

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) 

91 

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()) 

102 

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) 

112 

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) 

123 

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') 

136 

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()) 

142 

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()) 

149 

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())