wbcore 2.2.1__py2.py3-none-any.whl → 2.2.4__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. wbcore/contrib/agenda/locale/de/LC_MESSAGES/django.po +113 -0
  2. wbcore/contrib/agenda/static/agenda/markdown/documentation/building.md +11 -0
  3. wbcore/contrib/agenda/static/agenda/markdown/documentation/conferenceroom.md +20 -0
  4. wbcore/contrib/authentication/fixtures/authentication.json +62 -0
  5. wbcore/contrib/authentication/locale/de/LC_MESSAGES/django.po +610 -0
  6. wbcore/contrib/authentication/templates/activate_confirm.html +12 -0
  7. wbcore/contrib/authentication/templates/base.html +135 -0
  8. wbcore/contrib/authentication/templates/email_base_template.html +335 -0
  9. wbcore/contrib/authentication/templates/password_reset_done.html +13 -0
  10. wbcore/contrib/authentication/templates/password_reset_email.html +11 -0
  11. wbcore/contrib/authentication/templates/password_reset_email_html.html +43 -0
  12. wbcore/contrib/authentication/templates/password_reset_form.html +23 -0
  13. wbcore/contrib/authentication/templates/password_reset_sent.html +11 -0
  14. wbcore/contrib/authentication/templates/reset_password.html +15 -0
  15. wbcore/contrib/authentication/templates/user_registration_email.html +37 -0
  16. wbcore/contrib/color/admin.py +28 -0
  17. wbcore/contrib/color/apps.py +5 -0
  18. wbcore/contrib/color/enums.py +17 -0
  19. wbcore/contrib/color/factories.py +10 -0
  20. wbcore/contrib/color/fields.py +29 -0
  21. wbcore/contrib/color/forms.py +13 -0
  22. wbcore/contrib/color/models.py +62 -0
  23. wbcore/contrib/color/tests/conftest.py +10 -0
  24. wbcore/contrib/color/tests/test_color_models.py +61 -0
  25. wbcore/contrib/color/tests/test_fields.py +25 -0
  26. wbcore/contrib/currency/fixtures/currency.yaml +1014 -0
  27. wbcore/contrib/currency/fixtures/currency_fx_rate.yaml +73585 -0
  28. wbcore/contrib/directory/fixtures/directory.json +3924 -0
  29. wbcore/contrib/directory/locale/de/LC_MESSAGES/django.po +1686 -0
  30. wbcore/contrib/directory/static/directory/markdown/documentation/address.md +38 -0
  31. wbcore/contrib/directory/static/directory/markdown/documentation/banking.md +54 -0
  32. wbcore/contrib/directory/static/directory/markdown/documentation/bankingentry.md +38 -0
  33. wbcore/contrib/directory/static/directory/markdown/documentation/clientmanagerrelationship.md +42 -0
  34. wbcore/contrib/directory/static/directory/markdown/documentation/company.md +52 -0
  35. wbcore/contrib/directory/static/directory/markdown/documentation/companytype.md +2 -0
  36. wbcore/contrib/directory/static/directory/markdown/documentation/customerstatus.md +2 -0
  37. wbcore/contrib/directory/static/directory/markdown/documentation/email.md +20 -0
  38. wbcore/contrib/directory/static/directory/markdown/documentation/employeecompany.md +34 -0
  39. wbcore/contrib/directory/static/directory/markdown/documentation/employerperson.md +43 -0
  40. wbcore/contrib/directory/static/directory/markdown/documentation/person.md +61 -0
  41. wbcore/contrib/directory/static/directory/markdown/documentation/position.md +2 -0
  42. wbcore/contrib/directory/static/directory/markdown/documentation/relationshiptype.md +2 -0
  43. wbcore/contrib/directory/static/directory/markdown/documentation/socialmedia.md +23 -0
  44. wbcore/contrib/directory/static/directory/markdown/documentation/specialization.md +2 -0
  45. wbcore/contrib/directory/static/directory/markdown/documentation/systememployee.md +31 -0
  46. wbcore/contrib/directory/static/directory/markdown/documentation/telephone.md +23 -0
  47. wbcore/contrib/directory/static/directory/markdown/documentation/telephonesearch.md +26 -0
  48. wbcore/contrib/directory/static/directory/markdown/documentation/userisclient.md +14 -0
  49. wbcore/contrib/directory/static/directory/markdown/documentation/userismanager.md +28 -0
  50. wbcore/contrib/directory/static/directory/markdown/documentation/website.md +20 -0
  51. wbcore/contrib/documents/fixtures/docments.json +135 -0
  52. wbcore/contrib/documents/locale/de/LC_MESSAGES/django.po +272 -0
  53. wbcore/contrib/documents/static/documents/markdown/documentation/document_types.md +21 -0
  54. wbcore/contrib/documents/static/documents/markdown/documentation/documents.md +18 -0
  55. wbcore/contrib/documents/static/documents/markdown/documentation/shareablelink.md +28 -0
  56. wbcore/contrib/documents/static/documents/markdown/documentation/shareablelinkaccess.md +20 -0
  57. wbcore/contrib/documents/tests/conftest.py +30 -0
  58. wbcore/contrib/documents/tests/test_models.py +144 -0
  59. wbcore/contrib/example_app/fixtures/example_app.json +7425 -0
  60. wbcore/contrib/example_app/tests/test_models/test_event.py +87 -0
  61. wbcore/contrib/example_app/tests/test_models/test_match.py +210 -0
  62. wbcore/contrib/example_app/tests/test_models/test_others.py +159 -0
  63. wbcore/contrib/example_app/tests/test_serializers/test_league_serializer.py +34 -0
  64. wbcore/contrib/example_app/tests/test_serializers/test_match_serializer.py +134 -0
  65. wbcore/contrib/example_app/tests/test_serializers/test_role_serializer.py +13 -0
  66. wbcore/contrib/example_app/tests/test_serializers/test_sport_serializer.py +14 -0
  67. wbcore/contrib/example_app/tests/test_serializers/test_stadium_serializer.py +14 -0
  68. wbcore/contrib/example_app/tests/test_serializers/test_team_result_serializer.py +30 -0
  69. wbcore/contrib/example_app/tests/test_serializers/test_team_serializer.py +70 -0
  70. wbcore/contrib/example_app/tests/test_viewsets/test_event_viewset.py +162 -0
  71. wbcore/contrib/example_app/tests/test_viewsets/test_league_viewset.py +84 -0
  72. wbcore/contrib/example_app/tests/test_viewsets/test_match_viewset.py +65 -0
  73. wbcore/contrib/example_app/tests/test_viewsets/test_person_viewset.py +166 -0
  74. wbcore/contrib/example_app/tests/test_viewsets/test_role_viewset.py +75 -0
  75. wbcore/contrib/example_app/tests/test_viewsets/test_sport_viewset.py +75 -0
  76. wbcore/contrib/example_app/tests/test_viewsets/test_stadium_viewset.py +75 -0
  77. wbcore/contrib/example_app/tests/test_viewsets/test_team_viewset.py +92 -0
  78. wbcore/contrib/example_app/tests/test_viewsets/test_teamresult_viewset.py +58 -0
  79. wbcore/contrib/example_app/tests/test_viewsets/test_utils_viewsets.py +124 -0
  80. wbcore/contrib/geography/fixtures/geography.json +13454 -0
  81. wbcore/contrib/geography/static/geography/markdown/documentation/geography.md +16 -0
  82. wbcore/contrib/guardian/apps.py +6 -0
  83. wbcore/contrib/guardian/configurations.py +3 -0
  84. wbcore/contrib/guardian/filters.py +21 -0
  85. wbcore/contrib/guardian/tasks.py +10 -0
  86. wbcore/contrib/guardian/urls.py +12 -0
  87. wbcore/contrib/guardian/utils.py +124 -0
  88. wbcore/contrib/io/fixtures/io.json +145 -0
  89. wbcore/contrib/io/locale/de/LC_MESSAGES/django.po +52 -0
  90. wbcore/contrib/notifications/locale/de/LC_MESSAGES/django.po +60 -0
  91. wbcore/contrib/notifications/static/notifications/service-worker.js +1 -0
  92. wbcore/contrib/notifications/templates/notifications/notification_template.html +43 -0
  93. wbcore/contrib/notifications/viewsets/configs/notification_types.py +27 -0
  94. wbcore/contrib/notifications/viewsets/configs/notifications.py +85 -0
  95. wbcore/contrib/workflow/fixtures/workflow.json +612 -0
  96. wbcore/contrib/workflow/locale/de/LC_MESSAGES/django.po +1289 -0
  97. wbcore/contrib/workflow/static/workflow/markdown/documentation/assignedprocessstep.md +33 -0
  98. wbcore/contrib/workflow/static/workflow/markdown/documentation/condition.md +24 -0
  99. wbcore/contrib/workflow/static/workflow/markdown/documentation/decisionstep.md +30 -0
  100. wbcore/contrib/workflow/static/workflow/markdown/documentation/emailstep.md +45 -0
  101. wbcore/contrib/workflow/static/workflow/markdown/documentation/finishstep.md +33 -0
  102. wbcore/contrib/workflow/static/workflow/markdown/documentation/joinstep.md +33 -0
  103. wbcore/contrib/workflow/static/workflow/markdown/documentation/process.md +33 -0
  104. wbcore/contrib/workflow/static/workflow/markdown/documentation/processstep.md +51 -0
  105. wbcore/contrib/workflow/static/workflow/markdown/documentation/scriptstep.md +33 -0
  106. wbcore/contrib/workflow/static/workflow/markdown/documentation/splitstep.md +30 -0
  107. wbcore/contrib/workflow/static/workflow/markdown/documentation/startstep.md +27 -0
  108. wbcore/contrib/workflow/static/workflow/markdown/documentation/transition.md +27 -0
  109. wbcore/contrib/workflow/static/workflow/markdown/documentation/userstep.md +42 -0
  110. wbcore/contrib/workflow/static/workflow/markdown/documentation/workflow.md +32 -0
  111. wbcore/contrib/workflow/templates/Test_Templates.txt +25 -0
  112. wbcore/contrib/workflow/tests/test_models/step/test_decision_step.py +79 -0
  113. wbcore/contrib/workflow/tests/test_models/step/test_email_step.py +45 -0
  114. wbcore/contrib/workflow/tests/test_models/step/test_finish_step.py +105 -0
  115. wbcore/contrib/workflow/tests/test_models/step/test_join_step.py +127 -0
  116. wbcore/contrib/workflow/tests/test_models/step/test_script_step.py +24 -0
  117. wbcore/contrib/workflow/tests/test_models/step/test_split_step.py +49 -0
  118. wbcore/contrib/workflow/tests/test_models/step/test_step.py +621 -0
  119. wbcore/contrib/workflow/tests/test_models/step/test_user_step.py +225 -0
  120. wbcore/contrib/workflow/tests/test_models/test_condition.py +103 -0
  121. wbcore/contrib/workflow/tests/test_models/test_data.py +134 -0
  122. wbcore/contrib/workflow/tests/test_models/test_process.py +98 -0
  123. wbcore/contrib/workflow/tests/test_models/test_transition.py +128 -0
  124. wbcore/contrib/workflow/tests/test_models/test_workflow.py +358 -0
  125. wbcore/locale/de/LC_MESSAGES/django.po +667 -0
  126. wbcore/templates/errors/404.html +134 -0
  127. wbcore/templates/errors/500.html +138 -0
  128. wbcore/templates/errors/503.html +132 -0
  129. wbcore/templates/errors/custom.html +132 -0
  130. wbcore/templates/forms.py +0 -0
  131. wbcore/templates/notifications/email_template.html +43 -0
  132. wbcore/templates/wbcore/admin/change_list.html +8 -0
  133. wbcore/templates/wbcore/admin/csv_form.html +15 -0
  134. wbcore/templates/wbcore/dynamic_color_array.html +29 -0
  135. wbcore/templates/wbcore/email_base_template.html +335 -0
  136. wbcore/templates/wbcore/email_notification_template.html +10 -0
  137. wbcore/templates/wbcore/frontend.html +51 -0
  138. wbcore/test/e2e_helpers_methods/e2e_checks.py +121 -0
  139. wbcore/test/e2e_helpers_methods/e2e_helper_methods.py +395 -0
  140. wbcore/tests/test_permissions/test_backend.py +29 -0
  141. {wbcore-2.2.1.dist-info → wbcore-2.2.4.dist-info}/METADATA +1 -1
  142. {wbcore-2.2.1.dist-info → wbcore-2.2.4.dist-info}/RECORD +143 -3
  143. {wbcore-2.2.1.dist-info → wbcore-2.2.4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,30 @@
1
+ import pytest
2
+ from django.forms.models import model_to_dict
3
+ from rest_framework.exceptions import ValidationError
4
+ from rest_framework.test import APITestCase
5
+ from wbcore.contrib.example_app.factories import (
6
+ LeagueFactory,
7
+ TeamFactory,
8
+ TeamResultsFactory,
9
+ )
10
+ from wbcore.contrib.example_app.serializers import TeamResultsModelSerializer
11
+
12
+
13
+ @pytest.mark.django_db
14
+ class TestTeamResultSerializer(APITestCase):
15
+ def test_result_serializer(self):
16
+ team = TeamFactory()
17
+ league = LeagueFactory()
18
+ result: dict = model_to_dict(TeamResultsFactory.build(team=team, league=league))
19
+ result["games_played"] = 3
20
+ result_serializer = TeamResultsModelSerializer(data=result)
21
+
22
+ self.assertTrue(result_serializer.is_valid())
23
+
24
+ def test_same_result(self):
25
+ result = TeamResultsFactory()
26
+ new_result: dict = model_to_dict(TeamResultsFactory.build(team=result.team, league=result.league))
27
+ new_result["games_played"] = 3
28
+
29
+ with pytest.raises(ValidationError):
30
+ TeamResultsModelSerializer(data=new_result).is_valid(raise_exception=True)
@@ -0,0 +1,70 @@
1
+ from datetime import date, datetime, timedelta
2
+
3
+ import pytest
4
+ from django.forms.models import model_to_dict
5
+ from rest_framework.exceptions import ValidationError
6
+ from rest_framework.test import APITestCase
7
+ from wbcore.contrib.directory.factories import PersonFactory
8
+ from wbcore.contrib.example_app.factories import (
9
+ PlayerFactory,
10
+ SportPersonFactory,
11
+ StadiumFactory,
12
+ TeamFactory,
13
+ )
14
+ from wbcore.contrib.example_app.serializers import (
15
+ PlayerModelSerializer,
16
+ SportPersonModelSerializer,
17
+ TeamErrorMessages,
18
+ TeamModelSerializer,
19
+ )
20
+
21
+
22
+ @pytest.mark.django_db
23
+ class TestSportPersonModelSerializer(APITestCase):
24
+ def test_person_serializer(self):
25
+ person_data: dict = model_to_dict(SportPersonFactory.build(profile=PersonFactory()))
26
+ sport_person_serializer = SportPersonModelSerializer(data=person_data)
27
+ self.assertTrue(sport_person_serializer.is_valid())
28
+
29
+ def test_player_serializer(self):
30
+ player_data: dict = model_to_dict(PlayerFactory.build(current_team=TeamFactory()))
31
+ player_serializer = PlayerModelSerializer(data=player_data)
32
+ self.assertTrue(player_serializer.is_valid())
33
+
34
+
35
+ @pytest.mark.django_db
36
+ class TestTeamModelSerializer(APITestCase):
37
+ def test_team_serializer(self):
38
+ coach = SportPersonFactory()
39
+ stadium = StadiumFactory()
40
+
41
+ team_data: dict = model_to_dict(TeamFactory.build(coach=coach, home_stadium=stadium))
42
+ team_serializer = TeamModelSerializer(data=team_data)
43
+ self.assertTrue(team_serializer.is_valid())
44
+
45
+ def test_team_exists(self):
46
+ coach = SportPersonFactory()
47
+ stadium = StadiumFactory()
48
+ team = TeamFactory(coach=coach, home_stadium=stadium)
49
+ new_team_data: dict = model_to_dict(TeamFactory.build(home_stadium=stadium, name=team.name))
50
+ with self.assertRaisesMessage(ValidationError, TeamErrorMessages.team_exists.value):
51
+ team_serializer = TeamModelSerializer(data=new_team_data)
52
+ self.assertFalse(team_serializer.is_valid(raise_exception=True))
53
+
54
+ def test_team_wrong_date(self):
55
+ stadium = StadiumFactory()
56
+ future_date: date = (datetime.now() + timedelta(days=1)).date()
57
+ team_data: dict = model_to_dict(TeamFactory.build(founded_date=future_date, home_stadium=stadium))
58
+
59
+ with self.assertRaisesMessage(ValidationError, TeamErrorMessages.wrong_founding_date.value):
60
+ team_serializer = TeamModelSerializer(data=team_data)
61
+ self.assertFalse(team_serializer.is_valid(raise_exception=True))
62
+
63
+ def test_team_name_placeholder(self):
64
+ coach = SportPersonFactory()
65
+ stadium = StadiumFactory()
66
+ team_data: dict = model_to_dict(TeamFactory.build(home_stadium=stadium, coach=coach))
67
+ team_serializer = TeamModelSerializer(data=team_data)
68
+ self.assertTrue(team_serializer.is_valid())
69
+ self.assertTrue("name" in team_serializer.fields)
70
+ self.assertTrue(team_serializer.fields["name"].placeholder == "Enter team name here")
@@ -0,0 +1,162 @@
1
+ import pytest
2
+ from django.test import Client, TestCase
3
+ from django.urls import reverse
4
+ from wbcore.contrib.authentication.factories import UserFactory
5
+ from wbcore.contrib.example_app.factories import EventFactory, EventTypeFactory
6
+ from wbcore.contrib.example_app.models import Event, EventType
7
+ from wbcore.contrib.example_app.serializers import (
8
+ EventModelSerializer,
9
+ EventTypeModelSerializer,
10
+ )
11
+ from wbcore.contrib.example_app.tests.test_viewsets.test_utils_viewsets import (
12
+ find_instances_in_response,
13
+ get_create_view,
14
+ get_delete_view,
15
+ get_detail_view,
16
+ get_partial_view,
17
+ get_update_view,
18
+ )
19
+ from wbcore.contrib.example_app.viewsets import EventModelViewSet, EventTypeModelViewSet
20
+
21
+
22
+ @pytest.mark.django_db
23
+ class TestEventModelViewSet(TestCase):
24
+ def setUp(self) -> None:
25
+ self.user = UserFactory(is_active=True, is_superuser=True)
26
+ self.client = Client()
27
+ self.client.force_login(user=self.user)
28
+ self.list_url = reverse("example_app:event-list")
29
+ self.detail_url_str = "example_app:event-detail"
30
+
31
+ def test_list_view(self):
32
+ response = self.client.get(self.list_url)
33
+ self.assertEqual(response.status_code, 200)
34
+
35
+ def test_create_view(self):
36
+ event = EventFactory()
37
+ response = get_create_view(self.client, event, self.user, self.list_url, EventModelViewSet)
38
+ self.assertEqual(response.status_code, 201)
39
+ self.assertTrue(
40
+ Event.objects.filter(event_type=event.event_type, match=event.match, minute=event.minute).exists()
41
+ )
42
+
43
+ def test_detail_view(self):
44
+ instance = EventFactory()
45
+ response = get_detail_view(self.client, instance.pk, self.detail_url_str)
46
+ self.assertEqual(response.status_code, 200)
47
+ self.assertEqual(response.data["instance"]["id"], instance.id)
48
+
49
+ def test_update_view(self):
50
+ instance = EventFactory()
51
+ max_match_duration = instance.match.sport.match_duration
52
+ instance.minute = max_match_duration - instance.minute
53
+ response = get_update_view(self.client, instance, EventModelSerializer, self.detail_url_str)
54
+ instance.refresh_from_db()
55
+ self.assertEqual(response.status_code, 200)
56
+ self.assertEqual(response.data["instance"]["minute"], instance.minute)
57
+
58
+ def test_partial_update_view(self):
59
+ instance = EventFactory()
60
+ max_match_duration = instance.match.sport.match_duration
61
+ response = get_partial_view(
62
+ self.client, instance.id, {"minute": max_match_duration - instance.minute}, self.detail_url_str
63
+ )
64
+ instance.refresh_from_db()
65
+ self.assertEqual(response.status_code, 200)
66
+ self.assertEqual(response.data["instance"]["minute"], instance.minute)
67
+
68
+ def test_delete_view(self):
69
+ instance = EventFactory()
70
+ response = get_delete_view(self.client, self.detail_url_str, instance.pk)
71
+ # It is not possible to delete an event, since the get_endpoint_url returns None. I suppose that is expected behavior.
72
+ self.assertEqual(response.status_code, 405)
73
+ self.assertTrue(Event.objects.filter(pk=instance.pk).exists())
74
+
75
+ def test_ordering_fields(self):
76
+ event1 = EventFactory(minute=30)
77
+ EventFactory(person=event1.person, minute=20, event_type=event1.event_type, match=event1.match)
78
+ EventFactory(person=event1.person, minute=40, event_type=event1.event_type, match=event1.match)
79
+
80
+ response = self.client.get(self.list_url)
81
+ self.assertEqual(response.status_code, 200)
82
+ self.assertEqual(response.data["count"], Event.objects.count())
83
+ self.assertEqual(response.data["results"][0]["minute"], 20)
84
+ self.assertEqual(response.data["results"][1]["minute"], 30)
85
+ self.assertEqual(response.data["results"][2]["minute"], 40)
86
+
87
+
88
+ @pytest.mark.django_db
89
+ class TestEventTypeModelViewSet(TestCase):
90
+ def setUp(self) -> None:
91
+ self.user = UserFactory(is_active=True, is_superuser=True)
92
+ self.client = Client()
93
+ self.client.force_login(user=self.user)
94
+ self.list_url = reverse("example_app:eventtype-list")
95
+ self.detail_url_str = "example_app:eventtype-detail"
96
+
97
+ def test_list_view(self):
98
+ response = self.client.get(self.list_url)
99
+ self.assertEqual(response.status_code, 200)
100
+
101
+ def test_create_view(self):
102
+ event_type = EventTypeFactory()
103
+ response = get_create_view(self.client, event_type, self.user, self.list_url, EventTypeModelViewSet)
104
+ self.assertEqual(response.status_code, 201)
105
+ self.assertTrue(EventType.objects.filter(name=event_type.name).exists())
106
+
107
+ def test_detail_view(self):
108
+ instance = EventTypeFactory()
109
+ response = get_detail_view(self.client, instance.pk, self.detail_url_str)
110
+ self.assertEqual(response.status_code, 200)
111
+ self.assertEqual(response.data["instance"]["id"], instance.id)
112
+
113
+ def test_update_view(self):
114
+ instance = EventTypeFactory()
115
+ instance.name = "Updated Instance"
116
+ response = get_update_view(self.client, instance, EventTypeModelSerializer, self.detail_url_str)
117
+ instance.refresh_from_db()
118
+ self.assertEqual(response.status_code, 200)
119
+ self.assertEqual(response.data["instance"]["name"], instance.name)
120
+
121
+ def test_partial_update_view(self):
122
+ instance = EventTypeFactory()
123
+ response = get_partial_view(self.client, instance.id, {"name": "Updated Instance"}, self.detail_url_str)
124
+ instance.refresh_from_db()
125
+ self.assertEqual(response.status_code, 200)
126
+ self.assertEqual(response.data["instance"]["name"], instance.name)
127
+
128
+ def test_delete_view(self):
129
+ instance = EventTypeFactory()
130
+ response = get_delete_view(self.client, self.detail_url_str, instance.pk)
131
+ self.assertEqual(response.status_code, 204)
132
+ self.assertFalse(Event.objects.filter(pk=instance.pk).exists())
133
+
134
+ def test_ordering_fields(self):
135
+ event_a = EventTypeFactory(name="BBB")
136
+ event_b = EventTypeFactory(name="AAA", sport=event_a.sport)
137
+ event_c = EventTypeFactory(name="CCC", sport=event_a.sport)
138
+
139
+ response = self.client.get(self.list_url)
140
+ self.assertEqual(response.status_code, 200)
141
+ self.assertEqual(response.data["count"], EventType.objects.count())
142
+ self.assertEqual(response.data["results"][0]["id"], event_b.id)
143
+ self.assertEqual(response.data["results"][1]["id"], event_a.id)
144
+ self.assertEqual(response.data["results"][2]["id"], event_c.id)
145
+
146
+ def test_event_type_sport(self):
147
+ type_a = EventTypeFactory()
148
+ type_b = EventTypeFactory(sport=type_a.sport)
149
+ type_c = EventTypeFactory()
150
+ expected_number_of_types = EventType.objects.filter(sport=type_a.sport).count()
151
+ event_type_url = reverse("example_app:eventtype-sport-list", args=[type_a.sport.id])
152
+ response = self.client.get(event_type_url)
153
+ type_a_found, type_b_found, type_c_found = find_instances_in_response([type_a, type_b, type_c], response)
154
+ self.assertEqual(response.status_code, 200)
155
+ self.assertEqual(
156
+ response.data["count"],
157
+ expected_number_of_types,
158
+ f"The answer should contain {expected_number_of_types} types",
159
+ )
160
+ self.assertTrue(type_a_found, "Type A was not found in Response")
161
+ self.assertTrue(type_b_found, "Type B was not found in Response")
162
+ self.assertFalse(type_c_found, "type C was found in Response, but should not be found")
@@ -0,0 +1,84 @@
1
+ import pytest
2
+ from django.test import Client, TestCase
3
+ from django.urls import reverse
4
+ from wbcore.contrib.authentication.factories import SuperUserFactory
5
+ from wbcore.contrib.example_app.factories import LeagueFactory
6
+ from wbcore.contrib.example_app.models import League
7
+ from wbcore.contrib.example_app.serializers import LeagueModelSerializer
8
+ from wbcore.contrib.example_app.tests.test_viewsets.test_utils_viewsets import (
9
+ find_instances_in_response,
10
+ get_create_view,
11
+ get_delete_view,
12
+ get_detail_view,
13
+ get_partial_view,
14
+ get_update_view,
15
+ )
16
+ from wbcore.contrib.example_app.viewsets import LeagueModelViewSet
17
+
18
+
19
+ @pytest.mark.django_db
20
+ class TestLeagueModelViewSet(TestCase):
21
+ def setUp(self):
22
+ self.user = SuperUserFactory()
23
+ self.client = Client()
24
+ self.client.force_login(user=self.user)
25
+ self.list_url = reverse("example_app:league-list")
26
+ self.detail_url_str = "example_app:league-detail"
27
+
28
+ def test_list_view(self):
29
+ response = self.client.get(self.list_url)
30
+ self.assertEqual(response.status_code, 200)
31
+
32
+ def test_create_view(self):
33
+ league = LeagueFactory()
34
+ response = get_create_view(self.client, league, self.user, self.list_url, LeagueModelViewSet)
35
+ self.assertEqual(response.status_code, 201)
36
+ self.assertTrue(League.objects.filter(name=league.name).exists())
37
+
38
+ def test_detail_view(self):
39
+ instance = LeagueFactory()
40
+ response = get_detail_view(self.client, instance.pk, self.detail_url_str)
41
+ self.assertEqual(response.status_code, 200)
42
+ self.assertEqual(response.data["instance"]["name"], instance.name)
43
+
44
+ def test_update_view(self):
45
+ instance = LeagueFactory()
46
+ instance.name = "Updated Instance"
47
+ response = get_update_view(self.client, instance, LeagueModelSerializer, self.detail_url_str)
48
+ instance.refresh_from_db()
49
+ self.assertEqual(response.status_code, 200)
50
+ self.assertEqual(response.data["instance"]["name"], instance.name)
51
+
52
+ def test_partial_update_view(self):
53
+ instance = LeagueFactory()
54
+ response = get_partial_view(self.client, instance.id, {"name": "Updated Instance"}, self.detail_url_str)
55
+ instance.refresh_from_db()
56
+ self.assertEqual(response.status_code, 200)
57
+ self.assertEqual(response.data["instance"]["name"], instance.name)
58
+
59
+ def test_delete_view(self):
60
+ instance = LeagueFactory()
61
+ response = get_delete_view(self.client, self.detail_url_str, instance.pk)
62
+ self.assertEqual(response.status_code, 204)
63
+ self.assertFalse(League.objects.filter(pk=instance.pk).exists())
64
+
65
+ def test_league_sport(self):
66
+ league_a = LeagueFactory()
67
+ league_b = LeagueFactory(sport=league_a.sport)
68
+ league_c = LeagueFactory()
69
+ expected_number_of_league = League.objects.filter(sport=league_a.sport).count()
70
+ league_sport_url = reverse("example_app:league-sport-list", args=[league_a.sport.id])
71
+ response = self.client.get(league_sport_url)
72
+ league_a_found, league_b_found, league_c_found = find_instances_in_response(
73
+ [league_a, league_b, league_c], response
74
+ )
75
+
76
+ self.assertEqual(response.status_code, 200)
77
+ self.assertEqual(
78
+ response.data["count"],
79
+ expected_number_of_league,
80
+ f"The answer should contain {expected_number_of_league} leagues",
81
+ )
82
+ self.assertTrue(league_a_found, "Player A was not found in Response.")
83
+ self.assertTrue(league_b_found, "Player B was not found in Response.")
84
+ self.assertFalse(league_c_found, "Player C was found in Response, but should not be found.")
@@ -0,0 +1,65 @@
1
+ import pytest
2
+ from django.test import Client, TestCase
3
+ from django.urls import reverse
4
+ from wbcore.contrib.authentication.factories import SuperUserFactory
5
+ from wbcore.contrib.example_app.factories import MatchFactory, TeamFactory
6
+ from wbcore.contrib.example_app.models import Match
7
+ from wbcore.contrib.example_app.serializers import MatchModelSerializer
8
+ from wbcore.contrib.example_app.tests.test_viewsets.test_utils_viewsets import (
9
+ get_create_view,
10
+ get_delete_view,
11
+ get_detail_view,
12
+ get_partial_view,
13
+ get_update_view,
14
+ )
15
+ from wbcore.contrib.example_app.viewsets import MatchModelViewSet
16
+
17
+
18
+ @pytest.mark.django_db
19
+ class TestMatchModelViewSet(TestCase):
20
+ def setUp(self):
21
+ self.user = SuperUserFactory()
22
+ self.client = Client()
23
+ self.client.force_login(user=self.user)
24
+ self.list_url = reverse("example_app:match-list")
25
+ self.detail_url_str = "example_app:match-detail"
26
+
27
+ def test_list_view(self):
28
+ response = self.client.get(self.list_url)
29
+ self.assertEqual(response.status_code, 200)
30
+
31
+ def test_create_view(self):
32
+ match = MatchFactory()
33
+ response = get_create_view(self.client, match, self.user, self.list_url, MatchModelViewSet)
34
+ self.assertEqual(response.status_code, 201)
35
+ self.assertTrue(Match.objects.filter(home=match.home, away=match.away).exists())
36
+
37
+ def test_detail_view(self):
38
+ instance = MatchFactory()
39
+ response = get_detail_view(self.client, instance.pk, self.detail_url_str)
40
+ self.assertEqual(response.status_code, 200)
41
+ self.assertEqual(response.data["instance"]["id"], instance.id)
42
+
43
+ def test_update_view(self):
44
+ instance = MatchFactory(status=Match.MatchStatus.SCHEDULED)
45
+ new_home_team = TeamFactory()
46
+ instance.home = new_home_team
47
+ response = get_update_view(self.client, instance, MatchModelSerializer, self.detail_url_str)
48
+ instance.refresh_from_db()
49
+ self.assertEqual(response.status_code, 200)
50
+ self.assertEqual(response.data["instance"]["home"], instance.home.id)
51
+
52
+ def test_partial_update_view(self):
53
+ instance = MatchFactory()
54
+ new_home_team = TeamFactory()
55
+ response = get_partial_view(self.client, instance.id, {"home": new_home_team.id}, self.detail_url_str)
56
+ instance.refresh_from_db()
57
+ self.assertEqual(response.status_code, 200)
58
+ self.assertEqual(response.data["instance"]["home"], instance.home.id)
59
+
60
+ def test_delete_view(self):
61
+ instance = MatchFactory()
62
+ self.assertTrue(Match.objects.filter(pk=instance.pk).exists())
63
+ response = get_delete_view(self.client, self.detail_url_str, instance.pk)
64
+ self.assertEqual(response.status_code, 204)
65
+ self.assertFalse(Match.objects.filter(pk=instance.pk).exists())
@@ -0,0 +1,166 @@
1
+ import pytest
2
+ from django.test import Client, TestCase
3
+ from django.urls import reverse
4
+ from wbcore.contrib.authentication.factories import SuperUserFactory
5
+ from wbcore.contrib.example_app.factories import (
6
+ PlayerFactory,
7
+ SportPersonFactory,
8
+ TeamFactory,
9
+ )
10
+ from wbcore.contrib.example_app.models import Player, SportPerson
11
+ from wbcore.contrib.example_app.serializers import (
12
+ PlayerModelSerializer,
13
+ SportPersonModelSerializer,
14
+ )
15
+ from wbcore.contrib.example_app.tests.test_viewsets.test_utils_viewsets import (
16
+ find_instances_in_response,
17
+ get_create_view,
18
+ get_delete_view,
19
+ get_detail_view,
20
+ get_partial_view,
21
+ get_update_view,
22
+ )
23
+ from wbcore.contrib.example_app.viewsets import (
24
+ PlayerModelViewSet,
25
+ SportPersonModelViewSet,
26
+ )
27
+
28
+
29
+ @pytest.mark.django_db
30
+ class TestSportPersonModelViewSet(TestCase):
31
+ def setUp(self):
32
+ self.user = SuperUserFactory()
33
+ self.client = Client()
34
+ self.client.force_login(user=self.user)
35
+ self.list_url = reverse("example_app:person-list")
36
+ self.detail_url_str = "example_app:person-detail"
37
+
38
+ def test_list_view(self):
39
+ response = self.client.get(self.list_url)
40
+ self.assertEqual(response.status_code, 200)
41
+
42
+ def test_create_view(self):
43
+ person = SportPersonFactory()
44
+ response = get_create_view(self.client, person, self.user, self.list_url, SportPersonModelViewSet)
45
+ self.assertEqual(response.status_code, 201)
46
+ self.assertTrue(SportPerson.objects.filter(last_name=person.last_name).exists())
47
+
48
+ def test_detail_view(self):
49
+ instance = SportPersonFactory()
50
+ response = get_detail_view(self.client, instance.pk, self.detail_url_str)
51
+ self.assertEqual(response.status_code, 200)
52
+ self.assertEqual(response.data["instance"]["last_name"], instance.last_name)
53
+
54
+ def test_update_view(self):
55
+ instance = SportPersonFactory()
56
+ instance.last_name = "Updated Instance"
57
+ instance.profile_image = None
58
+ response = get_update_view(self.client, instance, SportPersonModelSerializer, self.detail_url_str)
59
+ instance.refresh_from_db()
60
+ self.assertEqual(response.status_code, 200)
61
+ self.assertEqual(response.data["instance"]["last_name"], instance.last_name)
62
+
63
+ def test_partial_update_view(self):
64
+ instance = SportPersonFactory()
65
+ response = get_partial_view(self.client, instance.id, {"last_name": "Updated Instance"}, self.detail_url_str)
66
+ instance.refresh_from_db()
67
+ self.assertEqual(response.status_code, 200)
68
+ self.assertEqual(response.data["instance"]["last_name"], instance.last_name)
69
+
70
+ def test_delete_view(self):
71
+ instance = SportPersonFactory()
72
+ response = get_delete_view(self.client, self.detail_url_str, instance.pk)
73
+ self.assertEqual(response.status_code, 204)
74
+ self.assertFalse(SportPerson.objects.filter(pk=instance.pk).exists())
75
+
76
+ def test_ordering_fields(self):
77
+ person_a = SportPersonFactory(first_name="Hans", last_name="Brecht")
78
+ person_b = SportPersonFactory(first_name="Hans", last_name="Ahrens")
79
+ person_c = SportPersonFactory(first_name="Ralf", last_name="Christ")
80
+
81
+ response = self.client.get(self.list_url)
82
+ self.assertEqual(response.status_code, 200)
83
+ self.assertEqual(response.data["count"], SportPerson.objects.count())
84
+ self.assertEqual(response.data["results"][0]["id"], person_b.id)
85
+ self.assertEqual(response.data["results"][1]["id"], person_a.id)
86
+ self.assertEqual(response.data["results"][2]["id"], person_c.id)
87
+
88
+
89
+ @pytest.mark.django_db
90
+ class TestPlayerModelViewSet(TestCase):
91
+ def setUp(self):
92
+ self.user = SuperUserFactory()
93
+ self.client = Client()
94
+ self.client.force_login(user=self.user)
95
+ self.detail_url_str = "example_app:player-detail"
96
+ self.list_url = reverse("example_app:player-list")
97
+
98
+ def test_list_view(self):
99
+ response = self.client.get(self.list_url)
100
+ self.assertEqual(response.status_code, 200)
101
+
102
+ def test_create_view(self):
103
+ player = PlayerFactory()
104
+ response = get_create_view(self.client, player, self.user, self.list_url, PlayerModelViewSet)
105
+ self.assertEqual(response.status_code, 201)
106
+ self.assertTrue(Player.objects.filter(last_name=player.last_name).exists())
107
+
108
+ def test_detail_view(self):
109
+ instance = PlayerFactory()
110
+ response = get_detail_view(self.client, instance.pk, self.detail_url_str)
111
+ self.assertEqual(response.status_code, 200)
112
+ self.assertEqual(response.data["instance"]["last_name"], instance.last_name)
113
+
114
+ def test_update_view(self):
115
+ instance = PlayerFactory()
116
+ instance.last_name = "Updated Instance"
117
+ response = get_update_view(self.client, instance, PlayerModelSerializer, self.detail_url_str)
118
+ instance.refresh_from_db()
119
+ self.assertEqual(response.status_code, 200)
120
+ self.assertEqual(response.data["instance"]["last_name"], instance.last_name)
121
+
122
+ def test_partial_update_view(self):
123
+ instance = PlayerFactory()
124
+ response = get_partial_view(self.client, instance.id, {"last_name": "Updated Instance"}, self.detail_url_str)
125
+ instance.refresh_from_db()
126
+ self.assertEqual(response.status_code, 200)
127
+ self.assertEqual(response.data["instance"]["last_name"], instance.last_name)
128
+
129
+ def test_delete_view(self):
130
+ instance = PlayerFactory()
131
+ response = get_delete_view(self.client, self.detail_url_str, instance.pk)
132
+ self.assertEqual(response.status_code, 204)
133
+ self.assertFalse(Player.objects.filter(pk=instance.pk).exists())
134
+
135
+ def test_ordering_fields(self):
136
+ team_a, team_b = TeamFactory(name="Team A"), TeamFactory(name="Team B")
137
+ person_a = PlayerFactory(first_name="Hans", last_name="Ahrens", current_team=team_b)
138
+ person_b = PlayerFactory(first_name="Hans", last_name="Ahrens", current_team=team_a)
139
+ person_c = PlayerFactory(first_name="Ralf", last_name="Brecht")
140
+
141
+ response = self.client.get(self.list_url)
142
+ self.assertEqual(response.status_code, 200)
143
+ self.assertEqual(response.data["count"], Player.objects.count())
144
+ self.assertEqual(response.data["results"][0]["id"], person_b.id)
145
+ self.assertEqual(response.data["results"][1]["id"], person_a.id)
146
+ self.assertEqual(response.data["results"][2]["id"], person_c.id)
147
+
148
+ def test_player_team(self):
149
+ player_a = PlayerFactory()
150
+ player_b = PlayerFactory(current_team=player_a.current_team)
151
+ player_c = PlayerFactory()
152
+ expected_number_of_player = Player.objects.filter(current_team=player_a.current_team).count()
153
+ player_team_url = reverse("example_app:player-team-list", args=[player_a.current_team.id])
154
+ response = self.client.get(player_team_url)
155
+ player_a_found, player_b_found, player_c_found = find_instances_in_response(
156
+ [player_a, player_b, player_c], response
157
+ )
158
+ self.assertEqual(
159
+ response.data["count"],
160
+ expected_number_of_player,
161
+ f"The answer should contain {expected_number_of_player} players",
162
+ )
163
+ self.assertEqual(response.status_code, 200)
164
+ self.assertTrue(player_a_found, "Player A was not found in Response")
165
+ self.assertTrue(player_b_found, "Player B was not found in Response")
166
+ self.assertFalse(player_c_found, "Player C was found in Response, but should not be found")
@@ -0,0 +1,75 @@
1
+ import pytest
2
+ from django.test import Client, TestCase
3
+ from django.urls import reverse
4
+ from wbcore.contrib.authentication.factories import SuperUserFactory
5
+ from wbcore.contrib.example_app.factories import RoleFactory
6
+ from wbcore.contrib.example_app.models import Role
7
+ from wbcore.contrib.example_app.serializers import RoleModelSerializer
8
+ from wbcore.contrib.example_app.tests.test_viewsets.test_utils_viewsets import (
9
+ get_create_view,
10
+ get_delete_view,
11
+ get_detail_view,
12
+ get_partial_view,
13
+ get_update_view,
14
+ )
15
+ from wbcore.contrib.example_app.viewsets import RoleModelViewSet
16
+
17
+
18
+ @pytest.mark.django_db
19
+ class TestRoleModelViewSet(TestCase):
20
+ def setUp(self):
21
+ self.user = SuperUserFactory()
22
+ self.client = Client()
23
+ self.client.force_login(user=self.user)
24
+ self.list_url = reverse("example_app:role-list")
25
+ self.detail_url_str = "example_app:role-detail"
26
+
27
+ def test_list_view(self):
28
+ response = self.client.get(self.list_url)
29
+ self.assertEqual(response.status_code, 200)
30
+
31
+ def test_create_view(self):
32
+ role = RoleFactory()
33
+ response = get_create_view(self.client, role, self.user, self.list_url, RoleModelViewSet)
34
+ self.assertEqual(response.status_code, 201)
35
+ self.assertTrue(Role.objects.filter(title=role.title).exists())
36
+
37
+ def test_detail_view(self):
38
+ instance = RoleFactory()
39
+ response = get_detail_view(self.client, instance.pk, self.detail_url_str)
40
+ self.assertEqual(response.status_code, 200)
41
+ self.assertEqual(response.data["instance"]["title"], instance.title)
42
+
43
+ def test_update_view(self):
44
+ instance = RoleFactory()
45
+ instance.title = "Updated Instance"
46
+ response = get_update_view(self.client, instance, RoleModelSerializer, self.detail_url_str)
47
+ instance.refresh_from_db()
48
+ self.assertEqual(response.status_code, 200)
49
+ self.assertEqual(response.data["instance"]["title"], instance.title)
50
+
51
+ def test_partial_update_view(self):
52
+ instance = RoleFactory()
53
+ response = get_partial_view(self.client, instance.id, {"title": "Patched Title"}, self.detail_url_str)
54
+ instance.refresh_from_db()
55
+ self.assertEqual(response.status_code, 200)
56
+ self.assertEqual(response.data["instance"]["title"], instance.title)
57
+
58
+ def test_delete_view(self):
59
+ instance = RoleFactory()
60
+ response = get_delete_view(self.client, self.detail_url_str, instance.pk)
61
+ self.assertEqual(response.status_code, 204)
62
+ self.assertFalse(Role.objects.filter(pk=instance.pk).exists())
63
+
64
+ def test_ordering_fields(self):
65
+ first_role, second_role, third_role = "Role A", "Role B", "Role C"
66
+ RoleFactory(title=second_role)
67
+ RoleFactory(title=first_role)
68
+ RoleFactory(title=third_role)
69
+
70
+ response = self.client.get(self.list_url)
71
+ self.assertEqual(response.status_code, 200)
72
+ self.assertEqual(response.data["count"], Role.objects.count())
73
+ self.assertEqual(response.data["results"][0]["title"], first_role)
74
+ self.assertEqual(response.data["results"][1]["title"], second_role)
75
+ self.assertEqual(response.data["results"][2]["title"], third_role)