Coverage for api\tests\test_epreuve.py: 100%

81 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-13 15:18 +0200

1from datetime import date, time 

2 

3from django.test import TestCase 

4from rest_framework.test import APIClient 

5from rest_framework import status 

6from django.urls import reverse 

7from api.models import Epreuve, Discipline, Evenement, Lieu 

8from api.serializers import EpreuveSerializer 

9from users.models.base_user import User 

10 

11# ---------- MODELE ---------- 

12class EpreuveModelTest(TestCase): 

13 def test_str_representation(self): 

14 lieu = Lieu.objects.create(nom="Stade de France") 

15 discipline = Discipline.objects.create(nom="Athlétisme") 

16 evenement = Evenement.objects.create(description="JO 2024", 

17 lieu=lieu, 

18 date=date(2025, 8, 1), 

19 horraire=time(14, 0) 

20 ) 

21 epreuve = Epreuve.objects.create(libelle="100m", discipline=discipline, evenement=evenement) 

22 self.assertEqual(str(epreuve), "100m") 

23 

24# ---------- SERIALIZER ---------- 

25class EpreuveSerializerTest(TestCase): 

26 def test_serializer_content(self): 

27 lieu = Lieu.objects.create(nom="Stade de France") 

28 discipline = Discipline.objects.create(nom="Natation") 

29 evenement = Evenement.objects.create( 

30 description="JO 2024", 

31 lieu=lieu, 

32 date=date(2025, 8, 1), 

33 horraire=time(14, 0) 

34 ) 

35 epreuve = Epreuve.objects.create( 

36 libelle="100m nage libre", 

37 discipline=discipline, 

38 evenement=evenement 

39 ) 

40 serializer = EpreuveSerializer(instance=epreuve) 

41 self.assertEqual(serializer.data['libelle'], "100m nage libre") 

42 self.assertEqual(serializer.data['discipline']['id'], discipline.id) 

43 self.assertEqual(serializer.data['evenement']['id'], evenement.id) 

44 

45# ---------- API ---------- 

46class EpreuveAPITest(TestCase): 

47 def setUp(self): 

48 self.client = APIClient() 

49 self.lieu = Lieu.objects.create(nom="Bercy Arena") 

50 self.discipline = Discipline.objects.create(nom="Boxe") 

51 self.evenement = Evenement.objects.create(description="JO 2024", 

52 lieu=self.lieu, 

53 date=date(2025, 8, 1), 

54 horraire=time(14, 0) 

55 ) 

56 self.epreuve = Epreuve.objects.create(libelle="Poids lourd", discipline=self.discipline, evenement=self.evenement) 

57 

58 self.admin_user = User.objects.create_admin( 

59 email="admin@example.com", 

60 password="Adminp@ss123456789", 

61 ) 

62 self.super_user = User.objects.create_superuser( 

63 email="super@example.com", 

64 password="Superp@ss123456789", 

65 ) 

66 self.normal_user = User.objects.create_user( 

67 email="user@example.com", 

68 password="Userp@ss123456789", 

69 ) 

70 

71 def test_get_list_epreuves(self): 

72 response = self.client.get(reverse('epreuve-list')) 

73 self.assertEqual(response.status_code, status.HTTP_200_OK) 

74 self.assertIn("Poids lourd", str(response.data)) 

75 

76 def test_get_detail_epreuve(self): 

77 response = self.client.get(reverse('epreuve-detail', kwargs={'pk': self.epreuve.id})) 

78 self.assertEqual(response.status_code, status.HTTP_200_OK) 

79 self.assertEqual(response.data['libelle'], self.epreuve.libelle) 

80 

81 def test_create_epreuve_unauthenticated_fail(self): 

82 response = self.client.post(reverse('epreuve-create'), data={ 

83 'libelle': 'Nouvelle Epreuve', 

84 'discipline': self.discipline.id, 

85 'evenement': self.evenement.id 

86 }) 

87 self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) 

88 

89 def test_create_epreuve_user_fail(self): 

90 self.client.force_authenticate(user=self.normal_user) 

91 response = self.client.post(reverse('epreuve-create'), data={ 

92 'libelle': 'Interdit', 

93 'discipline': self.discipline.id, 

94 'evenement': self.evenement.id 

95 }) 

96 self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) 

97 

98 def test_create_epreuve_admin_succeed(self): 

99 self.client.force_authenticate(user=self.admin_user) 

100 response = self.client.post(reverse('epreuve-create'), data={ 

101 'libelle': 'Combat Final', 

102 'discipline_id': self.discipline.id, 

103 'evenement_id': self.evenement.id 

104 }) 

105 self.assertEqual(response.status_code, status.HTTP_201_CREATED) 

106 self.assertTrue(Epreuve.objects.filter(libelle='Combat Final').exists()) 

107 

108 def test_update_epreuve_admin_succeed(self): 

109 self.client.force_authenticate(user=self.admin_user) 

110 url = reverse('epreuve-update', kwargs={'pk': self.epreuve.id}) 

111 response = self.client.put(url, data={ 

112 'libelle': 'Poids super lourd', 

113 'discipline_id': self.discipline.id, 

114 'evenement_id': self.evenement.id 

115 }) 

116 self.assertEqual(response.status_code, status.HTTP_200_OK) 

117 self.epreuve.refresh_from_db() 

118 self.assertEqual(self.epreuve.libelle, 'Poids super lourd') 

119 

120 def test_update_epreuve_user_fail(self): 

121 self.client.force_authenticate(user=self.normal_user) 

122 url = reverse('epreuve-update', kwargs={'pk': self.epreuve.id}) 

123 response = self.client.put(url, data={ 

124 'libelle': 'Modification non autorisée', 

125 'discipline_id': self.discipline.id, 

126 'evenement_id': self.evenement.id 

127 }) 

128 self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) 

129 self.epreuve.refresh_from_db() 

130 self.assertEqual(self.epreuve.libelle, 'Poids lourd') 

131 

132 def test_delete_epreuve_admin_succeed(self): 

133 self.client.force_authenticate(user=self.admin_user) 

134 url = reverse('epreuve-delete', kwargs={'pk': self.epreuve.id}) 

135 response = self.client.delete(url) 

136 self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) 

137 self.assertFalse(Epreuve.objects.filter(pk=self.epreuve.id).exists()) 

138 

139 def test_delete_epreuve_user_fail(self): 

140 self.client.force_authenticate(user=self.normal_user) 

141 url = reverse('epreuve-delete', kwargs={'pk': self.epreuve.id}) 

142 response = self.client.delete(url) 

143 self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) 

144 self.assertTrue(Epreuve.objects.filter(pk=self.epreuve.id).exists())