wbcrm 1.56.8__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.
- wbcrm/__init__.py +1 -0
- wbcrm/admin/__init__.py +5 -0
- wbcrm/admin/accounts.py +60 -0
- wbcrm/admin/activities.py +104 -0
- wbcrm/admin/events.py +43 -0
- wbcrm/admin/groups.py +8 -0
- wbcrm/admin/products.py +9 -0
- wbcrm/apps.py +5 -0
- wbcrm/configurations/__init__.py +1 -0
- wbcrm/configurations/base.py +16 -0
- wbcrm/dynamic_preferences_registry.py +38 -0
- wbcrm/factories/__init__.py +14 -0
- wbcrm/factories/accounts.py +57 -0
- wbcrm/factories/activities.py +124 -0
- wbcrm/factories/groups.py +24 -0
- wbcrm/factories/products.py +11 -0
- wbcrm/filters/__init__.py +10 -0
- wbcrm/filters/accounts.py +80 -0
- wbcrm/filters/activities.py +204 -0
- wbcrm/filters/groups.py +21 -0
- wbcrm/filters/products.py +38 -0
- wbcrm/filters/signals.py +95 -0
- wbcrm/fixtures/wbcrm.json +1215 -0
- wbcrm/kpi_handlers/activities.py +171 -0
- wbcrm/locale/de/LC_MESSAGES/django.mo +0 -0
- wbcrm/locale/de/LC_MESSAGES/django.po +1557 -0
- wbcrm/locale/de/LC_MESSAGES/django.po.translated +1630 -0
- wbcrm/locale/en/LC_MESSAGES/django.mo +0 -0
- wbcrm/locale/en/LC_MESSAGES/django.po +1466 -0
- wbcrm/locale/fr/LC_MESSAGES/django.mo +0 -0
- wbcrm/locale/fr/LC_MESSAGES/django.po +1467 -0
- wbcrm/migrations/0001_initial_squashed_squashed_0032_productcompanyrelationship_alter_product_prospects_and_more.py +3948 -0
- wbcrm/migrations/0002_alter_activity_repeat_choice.py +32 -0
- wbcrm/migrations/0003_remove_activity_external_id_and_more.py +63 -0
- wbcrm/migrations/0004_alter_activity_status.py +28 -0
- wbcrm/migrations/0005_account_accountrole_accountroletype_and_more.py +182 -0
- wbcrm/migrations/0006_alter_activity_location.py +17 -0
- wbcrm/migrations/0007_alter_account_status.py +23 -0
- wbcrm/migrations/0008_alter_activity_options.py +16 -0
- wbcrm/migrations/0009_alter_account_is_public.py +19 -0
- wbcrm/migrations/0010_alter_account_reference_id.py +17 -0
- wbcrm/migrations/0011_activity_summary.py +22 -0
- wbcrm/migrations/0012_alter_activity_summary.py +17 -0
- wbcrm/migrations/0013_account_action_plan_account_relationship_status_and_more.py +34 -0
- wbcrm/migrations/0014_alter_account_relationship_status.py +24 -0
- wbcrm/migrations/0015_alter_activity_type.py +23 -0
- wbcrm/migrations/0016_auto_20241205_1015.py +106 -0
- wbcrm/migrations/0017_event.py +40 -0
- wbcrm/migrations/0018_activity_search_vector.py +24 -0
- wbcrm/migrations/__init__.py +0 -0
- wbcrm/models/__init__.py +5 -0
- wbcrm/models/accounts.py +648 -0
- wbcrm/models/activities.py +1419 -0
- wbcrm/models/events.py +15 -0
- wbcrm/models/groups.py +119 -0
- wbcrm/models/llm/activity_summaries.py +41 -0
- wbcrm/models/llm/analyze_relationship.py +50 -0
- wbcrm/models/products.py +86 -0
- wbcrm/models/recurrence.py +280 -0
- wbcrm/preferences.py +13 -0
- wbcrm/report/activity_report.py +110 -0
- wbcrm/serializers/__init__.py +23 -0
- wbcrm/serializers/accounts.py +141 -0
- wbcrm/serializers/activities.py +525 -0
- wbcrm/serializers/groups.py +30 -0
- wbcrm/serializers/products.py +58 -0
- wbcrm/serializers/recurrence.py +91 -0
- wbcrm/serializers/signals.py +71 -0
- wbcrm/static/wbcrm/markdown/documentation/activity.md +86 -0
- wbcrm/static/wbcrm/markdown/documentation/activitytype.md +20 -0
- wbcrm/static/wbcrm/markdown/documentation/group.md +2 -0
- wbcrm/static/wbcrm/markdown/documentation/product.md +11 -0
- wbcrm/synchronization/__init__.py +0 -0
- wbcrm/synchronization/activity/__init__.py +0 -0
- wbcrm/synchronization/activity/admin.py +73 -0
- wbcrm/synchronization/activity/backend.py +214 -0
- wbcrm/synchronization/activity/backends/__init__.py +0 -0
- wbcrm/synchronization/activity/backends/google/__init__.py +2 -0
- wbcrm/synchronization/activity/backends/google/google_calendar_backend.py +406 -0
- wbcrm/synchronization/activity/backends/google/request_utils/__init__.py +16 -0
- wbcrm/synchronization/activity/backends/google/request_utils/external_to_internal/create.py +75 -0
- wbcrm/synchronization/activity/backends/google/request_utils/external_to_internal/delete.py +78 -0
- wbcrm/synchronization/activity/backends/google/request_utils/external_to_internal/update.py +155 -0
- wbcrm/synchronization/activity/backends/google/request_utils/internal_to_external/update.py +181 -0
- wbcrm/synchronization/activity/backends/google/tasks.py +21 -0
- wbcrm/synchronization/activity/backends/google/tests/__init__.py +0 -0
- wbcrm/synchronization/activity/backends/google/tests/conftest.py +1 -0
- wbcrm/synchronization/activity/backends/google/tests/test_data.py +81 -0
- wbcrm/synchronization/activity/backends/google/tests/test_google_backend.py +319 -0
- wbcrm/synchronization/activity/backends/google/tests/test_utils.py +274 -0
- wbcrm/synchronization/activity/backends/google/typing_informations.py +139 -0
- wbcrm/synchronization/activity/backends/google/utils.py +217 -0
- wbcrm/synchronization/activity/backends/outlook/__init__.py +0 -0
- wbcrm/synchronization/activity/backends/outlook/backend.py +593 -0
- wbcrm/synchronization/activity/backends/outlook/msgraph.py +436 -0
- wbcrm/synchronization/activity/backends/outlook/parser.py +432 -0
- wbcrm/synchronization/activity/backends/outlook/tests/__init__.py +0 -0
- wbcrm/synchronization/activity/backends/outlook/tests/conftest.py +1 -0
- wbcrm/synchronization/activity/backends/outlook/tests/fixtures.py +606 -0
- wbcrm/synchronization/activity/backends/outlook/tests/test_admin.py +118 -0
- wbcrm/synchronization/activity/backends/outlook/tests/test_backend.py +274 -0
- wbcrm/synchronization/activity/backends/outlook/tests/test_controller.py +249 -0
- wbcrm/synchronization/activity/backends/outlook/tests/test_parser.py +174 -0
- wbcrm/synchronization/activity/controller.py +627 -0
- wbcrm/synchronization/activity/dynamic_preferences_registry.py +119 -0
- wbcrm/synchronization/activity/preferences.py +27 -0
- wbcrm/synchronization/activity/shortcuts.py +16 -0
- wbcrm/synchronization/activity/tasks.py +21 -0
- wbcrm/synchronization/activity/urls.py +7 -0
- wbcrm/synchronization/activity/utils.py +46 -0
- wbcrm/synchronization/activity/views.py +41 -0
- wbcrm/synchronization/admin.py +1 -0
- wbcrm/synchronization/apps.py +14 -0
- wbcrm/synchronization/dynamic_preferences_registry.py +1 -0
- wbcrm/synchronization/management.py +36 -0
- wbcrm/synchronization/tasks.py +1 -0
- wbcrm/synchronization/urls.py +5 -0
- wbcrm/tasks.py +264 -0
- wbcrm/templates/email/activity.html +98 -0
- wbcrm/templates/email/activity_report.html +6 -0
- wbcrm/templates/email/daily_summary.html +72 -0
- wbcrm/templates/email/global_daily_summary.html +85 -0
- wbcrm/tests/__init__.py +0 -0
- wbcrm/tests/accounts/__init__.py +0 -0
- wbcrm/tests/accounts/test_models.py +393 -0
- wbcrm/tests/accounts/test_viewsets.py +88 -0
- wbcrm/tests/conftest.py +76 -0
- wbcrm/tests/disable_signals.py +62 -0
- wbcrm/tests/e2e/__init__.py +1 -0
- wbcrm/tests/e2e/e2e_wbcrm_utility.py +83 -0
- wbcrm/tests/e2e/test_e2e.py +370 -0
- wbcrm/tests/test_assignee_methods.py +40 -0
- wbcrm/tests/test_chartviewsets.py +112 -0
- wbcrm/tests/test_dto.py +64 -0
- wbcrm/tests/test_filters.py +52 -0
- wbcrm/tests/test_models.py +217 -0
- wbcrm/tests/test_recurrence.py +292 -0
- wbcrm/tests/test_report.py +21 -0
- wbcrm/tests/test_serializers.py +171 -0
- wbcrm/tests/test_tasks.py +95 -0
- wbcrm/tests/test_viewsets.py +967 -0
- wbcrm/tests/tests.py +121 -0
- wbcrm/typings.py +109 -0
- wbcrm/urls.py +67 -0
- wbcrm/viewsets/__init__.py +22 -0
- wbcrm/viewsets/accounts.py +122 -0
- wbcrm/viewsets/activities.py +341 -0
- wbcrm/viewsets/buttons/__init__.py +7 -0
- wbcrm/viewsets/buttons/accounts.py +27 -0
- wbcrm/viewsets/buttons/activities.py +89 -0
- wbcrm/viewsets/buttons/signals.py +17 -0
- wbcrm/viewsets/display/__init__.py +12 -0
- wbcrm/viewsets/display/accounts.py +110 -0
- wbcrm/viewsets/display/activities.py +444 -0
- wbcrm/viewsets/display/groups.py +22 -0
- wbcrm/viewsets/display/products.py +105 -0
- wbcrm/viewsets/endpoints/__init__.py +8 -0
- wbcrm/viewsets/endpoints/accounts.py +25 -0
- wbcrm/viewsets/endpoints/activities.py +30 -0
- wbcrm/viewsets/endpoints/groups.py +7 -0
- wbcrm/viewsets/endpoints/products.py +9 -0
- wbcrm/viewsets/groups.py +38 -0
- wbcrm/viewsets/menu/__init__.py +8 -0
- wbcrm/viewsets/menu/accounts.py +18 -0
- wbcrm/viewsets/menu/activities.py +49 -0
- wbcrm/viewsets/menu/groups.py +16 -0
- wbcrm/viewsets/menu/products.py +20 -0
- wbcrm/viewsets/mixins.py +35 -0
- wbcrm/viewsets/previews/__init__.py +1 -0
- wbcrm/viewsets/previews/activities.py +10 -0
- wbcrm/viewsets/products.py +57 -0
- wbcrm/viewsets/recurrence.py +27 -0
- wbcrm/viewsets/titles/__init__.py +13 -0
- wbcrm/viewsets/titles/accounts.py +23 -0
- wbcrm/viewsets/titles/activities.py +61 -0
- wbcrm/viewsets/titles/products.py +13 -0
- wbcrm/viewsets/titles/utils.py +46 -0
- wbcrm/workflows/__init__.py +1 -0
- wbcrm/workflows/assignee_methods.py +25 -0
- wbcrm-1.56.8.dist-info/METADATA +11 -0
- wbcrm-1.56.8.dist-info/RECORD +182 -0
- wbcrm-1.56.8.dist-info/WHEEL +5 -0
|
@@ -0,0 +1,967 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from django.contrib.messages import get_messages
|
|
3
|
+
from django.test import Client
|
|
4
|
+
from dynamic_preferences.registries import global_preferences_registry
|
|
5
|
+
from rest_framework import status
|
|
6
|
+
from rest_framework.reverse import reverse
|
|
7
|
+
from rest_framework.test import APIClient, APIRequestFactory
|
|
8
|
+
from wbcore.contrib.agenda.models import CalendarItem
|
|
9
|
+
from wbcore.contrib.authentication.factories import (
|
|
10
|
+
InternalUserFactory,
|
|
11
|
+
SuperUserFactory,
|
|
12
|
+
)
|
|
13
|
+
from wbcore.contrib.authentication.models import Permission
|
|
14
|
+
from wbcore.messages import InMemoryMessageStorage
|
|
15
|
+
from wbcore.test.utils import get_data_from_factory, get_kwargs, get_model_factory
|
|
16
|
+
|
|
17
|
+
from wbcrm.models import Activity, ActivityParticipant
|
|
18
|
+
from wbcrm.viewsets import (
|
|
19
|
+
ActivityParticipantModelViewSet,
|
|
20
|
+
ActivityTypeModelViewSet,
|
|
21
|
+
ActivityViewSet,
|
|
22
|
+
ProductModelViewSet,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# =====================================================================================================================
|
|
26
|
+
# TESTING ACTIVITY VIEWSETS
|
|
27
|
+
# =====================================================================================================================
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@pytest.mark.django_db
|
|
31
|
+
class TestActivityModelViewSet:
|
|
32
|
+
api_factory = APIRequestFactory()
|
|
33
|
+
|
|
34
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
35
|
+
def test_random_cannot_see_private_item(self, mvs, activity_factory, user_factory):
|
|
36
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
37
|
+
item = activity_factory(visibility=CalendarItem.Visibility.PRIVATE, preceded_by=None)
|
|
38
|
+
request = self.api_factory.get("")
|
|
39
|
+
request.user = user
|
|
40
|
+
view = mvs.as_view({"get": "list"})
|
|
41
|
+
response = view(request).render()
|
|
42
|
+
|
|
43
|
+
assert response.status_code == status.HTTP_200_OK
|
|
44
|
+
assert response.data["results"]
|
|
45
|
+
assert len(response.data["results"]) == 1
|
|
46
|
+
assert response.data["results"][0]["id"] == item.id
|
|
47
|
+
assert response.data["results"][0]["title"] == "Private Activity"
|
|
48
|
+
|
|
49
|
+
# =================================================================================================================
|
|
50
|
+
# TESTING CONFIDENTIAL CALENDAR ITEMS
|
|
51
|
+
# =================================================================================================================
|
|
52
|
+
|
|
53
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
54
|
+
def test_manager_can_see_confidential_item(self, mvs, activity_factory, user_factory):
|
|
55
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
56
|
+
permission = Permission.objects.get(codename="administrate_confidential_items")
|
|
57
|
+
user.user_permissions.add(permission)
|
|
58
|
+
item = activity_factory(visibility=CalendarItem.Visibility.CONFIDENTIAL, preceded_by=None)
|
|
59
|
+
request = self.api_factory.get("")
|
|
60
|
+
request.user = user
|
|
61
|
+
view = mvs.as_view({"get": "list"})
|
|
62
|
+
response = view(request).render()
|
|
63
|
+
|
|
64
|
+
assert response.status_code == status.HTTP_200_OK
|
|
65
|
+
assert response.data["results"]
|
|
66
|
+
assert len(response.data["results"]) == 1
|
|
67
|
+
assert response.data["results"][0]["id"] == item.id
|
|
68
|
+
assert response.data["results"][0]["title"] == item.title
|
|
69
|
+
|
|
70
|
+
@pytest.mark.parametrize("mvs", [ActivityParticipantModelViewSet])
|
|
71
|
+
def test_create_activity_participant(self, mvs, activity_participant_factory):
|
|
72
|
+
# Arrange
|
|
73
|
+
activity_participant = activity_participant_factory()
|
|
74
|
+
superuser = InternalUserFactory(is_active=True, is_superuser=True)
|
|
75
|
+
data = get_data_from_factory(activity_participant, mvs, delete=True, superuser=superuser)
|
|
76
|
+
request = self.api_factory.post("", data=data)
|
|
77
|
+
request.user = superuser
|
|
78
|
+
kwargs = {"activity_id": activity_participant.activity.id}
|
|
79
|
+
view = mvs.as_view({"post": "create"})
|
|
80
|
+
# Act
|
|
81
|
+
response = view(request, **kwargs)
|
|
82
|
+
# Assert
|
|
83
|
+
assert response.status_code == status.HTTP_201_CREATED
|
|
84
|
+
assert response.data.get("instance")
|
|
85
|
+
assert response.data["instance"]["participant"] == activity_participant.participant.id
|
|
86
|
+
assert (
|
|
87
|
+
response.data["instance"]["participation_status"]
|
|
88
|
+
== activity_participant.participation_status
|
|
89
|
+
== ActivityParticipant.ParticipationStatus.PENDING_INVITATION
|
|
90
|
+
)
|
|
91
|
+
assert response.data["instance"]["activity"] == activity_participant.activity.id
|
|
92
|
+
|
|
93
|
+
# @pytest.mark.parametrize("mvs", [ActivityParticipantModelViewSet])
|
|
94
|
+
def test_get_activity_participant_instance(self, activity_participant_factory):
|
|
95
|
+
# Arranged
|
|
96
|
+
activity_participant = activity_participant_factory.create()
|
|
97
|
+
user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
98
|
+
client = APIClient()
|
|
99
|
+
url = reverse(
|
|
100
|
+
"wbcrm:activity-participant-detail",
|
|
101
|
+
kwargs={"pk": activity_participant.id, "activity_id": activity_participant.activity.id},
|
|
102
|
+
)
|
|
103
|
+
client.force_authenticate(user)
|
|
104
|
+
response = client.get(url)
|
|
105
|
+
|
|
106
|
+
# Assert
|
|
107
|
+
assert response.status_code == status.HTTP_200_OK
|
|
108
|
+
assert response.data.get("instance")
|
|
109
|
+
assert not response.data.get("results")
|
|
110
|
+
assert response.data["instance"]["id"] == activity_participant.id
|
|
111
|
+
|
|
112
|
+
@pytest.mark.parametrize("mvs", [ActivityParticipantModelViewSet])
|
|
113
|
+
def test_get_activity_participant_list(self, mvs, activity_participant_factory):
|
|
114
|
+
# Arrange
|
|
115
|
+
activity_participant_1 = activity_participant_factory()
|
|
116
|
+
activity_participant_factory(activity=activity_participant_1.activity)
|
|
117
|
+
activity_participant_factory(activity=activity_participant_1.activity)
|
|
118
|
+
request = self.api_factory.get("")
|
|
119
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
120
|
+
view = mvs.as_view({"get": "list"})
|
|
121
|
+
kwargs = {"activity_id": activity_participant_1.activity.id}
|
|
122
|
+
# Act
|
|
123
|
+
response = view(request, **kwargs)
|
|
124
|
+
# Assert
|
|
125
|
+
assert response.status_code == status.HTTP_200_OK
|
|
126
|
+
assert not response.data.get("instance")
|
|
127
|
+
assert response.data.get("results")
|
|
128
|
+
assert response.data["results"]
|
|
129
|
+
assert len(response.data["results"]) == 3
|
|
130
|
+
|
|
131
|
+
@pytest.mark.parametrize("mvs", [ActivityParticipantModelViewSet])
|
|
132
|
+
def test_delete_activity_participant_instance(self, mvs, activity_participant_factory):
|
|
133
|
+
# Arrange
|
|
134
|
+
activity_participant = activity_participant_factory()
|
|
135
|
+
request = self.api_factory.delete("")
|
|
136
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
137
|
+
view = mvs.as_view({"delete": "destroy"})
|
|
138
|
+
kwargs = {"activity_id": activity_participant.activity.id}
|
|
139
|
+
# Act
|
|
140
|
+
response = view(request, pk=activity_participant.id, **kwargs)
|
|
141
|
+
# Assert
|
|
142
|
+
assert response.status_code == status.HTTP_204_NO_CONTENT
|
|
143
|
+
|
|
144
|
+
@pytest.mark.parametrize("mvs", [ActivityParticipantModelViewSet])
|
|
145
|
+
def test_partial_update_activity_participant_instance(self, mvs, activity_participant_factory, person_factory):
|
|
146
|
+
# Arrange
|
|
147
|
+
activity_participant = activity_participant_factory()
|
|
148
|
+
new_participant = person_factory()
|
|
149
|
+
superuser = InternalUserFactory(is_active=True, is_superuser=True)
|
|
150
|
+
request = self.api_factory.patch("", data={"participant": new_participant.id})
|
|
151
|
+
request.user = superuser
|
|
152
|
+
view = mvs.as_view({"patch": "partial_update"})
|
|
153
|
+
kwargs = {"activity_id": activity_participant.activity.id}
|
|
154
|
+
# Act
|
|
155
|
+
response = view(request, pk=activity_participant.id, **kwargs)
|
|
156
|
+
# Assert
|
|
157
|
+
assert response.status_code == status.HTTP_200_OK
|
|
158
|
+
assert response.data["instance"]["participant"] == new_participant.id
|
|
159
|
+
assert not response.data["instance"]["participant"] == activity_participant.participant.id
|
|
160
|
+
|
|
161
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
162
|
+
def test_msg_missing_company(
|
|
163
|
+
self,
|
|
164
|
+
mvs,
|
|
165
|
+
activity_factory,
|
|
166
|
+
person_factory,
|
|
167
|
+
company_factory,
|
|
168
|
+
):
|
|
169
|
+
company_a = company_factory()
|
|
170
|
+
company_b = company_factory()
|
|
171
|
+
person = person_factory()
|
|
172
|
+
person.employers.set([company_a, company_b])
|
|
173
|
+
activity = activity_factory(participants=[person], companies=None, disable_participant_check=False)
|
|
174
|
+
request = APIRequestFactory().get("")
|
|
175
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
176
|
+
request.query_params = {}
|
|
177
|
+
request._messages = InMemoryMessageStorage(request)
|
|
178
|
+
mvs.request = request
|
|
179
|
+
mvs.kwargs = get_kwargs(activity, ActivityViewSet, request)
|
|
180
|
+
mvs.kwargs["pk"] = activity.pk
|
|
181
|
+
mvs().add_messages(request, instance=activity)
|
|
182
|
+
assert len(get_messages(request)._messages) > 0
|
|
183
|
+
|
|
184
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
185
|
+
def test_msg_missing_participant(
|
|
186
|
+
self,
|
|
187
|
+
mvs,
|
|
188
|
+
activity_factory,
|
|
189
|
+
person_factory,
|
|
190
|
+
company_factory,
|
|
191
|
+
):
|
|
192
|
+
company = company_factory()
|
|
193
|
+
person = person_factory()
|
|
194
|
+
person.employers.set([company])
|
|
195
|
+
company.employees.set([person])
|
|
196
|
+
activity = activity_factory(participants=None, companies=[company], disable_participant_check=False)
|
|
197
|
+
activity.disable_participant_check = False
|
|
198
|
+
activity.save()
|
|
199
|
+
request = APIRequestFactory().put("")
|
|
200
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
201
|
+
request.query_params = {}
|
|
202
|
+
request._messages = InMemoryMessageStorage(request)
|
|
203
|
+
mvs.request = request
|
|
204
|
+
mvs.kwargs = get_kwargs(activity, ActivityViewSet, request)
|
|
205
|
+
mvs.kwargs["pk"] = activity.pk
|
|
206
|
+
mvs().add_messages(request, instance=activity)
|
|
207
|
+
assert len(get_messages(request)._messages) > 0
|
|
208
|
+
|
|
209
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
210
|
+
def test_msg_missing_participant_no_check(
|
|
211
|
+
self,
|
|
212
|
+
mvs,
|
|
213
|
+
activity_factory,
|
|
214
|
+
person_factory,
|
|
215
|
+
company_factory,
|
|
216
|
+
):
|
|
217
|
+
company = company_factory()
|
|
218
|
+
person = person_factory()
|
|
219
|
+
person.employers.set([company])
|
|
220
|
+
company.employees.set([person])
|
|
221
|
+
internal_user = InternalUserFactory.create()
|
|
222
|
+
activity = activity_factory(
|
|
223
|
+
participants=None, creator=internal_user.profile, companies=[company], disable_participant_check=True
|
|
224
|
+
)
|
|
225
|
+
request = APIRequestFactory().put("")
|
|
226
|
+
request.user = internal_user
|
|
227
|
+
request.query_params = {}
|
|
228
|
+
request._messages = InMemoryMessageStorage(request)
|
|
229
|
+
mvs.request = request
|
|
230
|
+
mvs.kwargs = get_kwargs(activity, ActivityViewSet, request)
|
|
231
|
+
mvs.kwargs["pk"] = activity.pk
|
|
232
|
+
mvs().add_messages(request, instance=activity)
|
|
233
|
+
assert len(get_messages(request)._messages) == 0
|
|
234
|
+
|
|
235
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
236
|
+
def test_msg_missing_participant_and_company(
|
|
237
|
+
self,
|
|
238
|
+
mvs,
|
|
239
|
+
activity_factory,
|
|
240
|
+
person_factory,
|
|
241
|
+
company_factory,
|
|
242
|
+
):
|
|
243
|
+
company_a = company_factory()
|
|
244
|
+
company_b = company_factory()
|
|
245
|
+
company_c = company_factory()
|
|
246
|
+
person_a = person_factory()
|
|
247
|
+
person_b = person_factory()
|
|
248
|
+
person_a.employers.set([company_a])
|
|
249
|
+
person_b.employers.set([company_b, company_c])
|
|
250
|
+
company_a.employees.set([person_a])
|
|
251
|
+
company_b.employees.set([person_b])
|
|
252
|
+
activity = activity_factory(participants=[person_b], companies=[company_a], disable_participant_check=False)
|
|
253
|
+
request = APIRequestFactory().patch("")
|
|
254
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
255
|
+
request.query_params = {}
|
|
256
|
+
request._messages = InMemoryMessageStorage(request)
|
|
257
|
+
mvs.request = request
|
|
258
|
+
mvs.kwargs = get_kwargs(activity, ActivityViewSet, request)
|
|
259
|
+
mvs.kwargs["pk"] = activity.pk
|
|
260
|
+
mvs().add_messages(request, instance=activity)
|
|
261
|
+
assert len(get_messages(request)._messages) > 0
|
|
262
|
+
|
|
263
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
264
|
+
def test_get_messages(self, mvs, activity_factory, recurring_activity_factory, person_factory):
|
|
265
|
+
request = APIRequestFactory().get("")
|
|
266
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
267
|
+
person1 = person_factory()
|
|
268
|
+
obj = recurring_activity_factory(
|
|
269
|
+
status=Activity.Status.PLANNED, repeat_choice=Activity.ReoccuranceChoice.DAILY, participants=(person1,)
|
|
270
|
+
)
|
|
271
|
+
activity_factory(start=obj.start, end=obj.end, participants=(person1,))
|
|
272
|
+
request.query_params = {}
|
|
273
|
+
request._messages = InMemoryMessageStorage(request)
|
|
274
|
+
mvs.request = request
|
|
275
|
+
mvs.kwargs = get_kwargs(obj, ActivityViewSet, request)
|
|
276
|
+
mvs.kwargs["pk"] = obj.pk
|
|
277
|
+
mvs().add_messages(request, instance=obj)
|
|
278
|
+
assert len(get_messages(request)._messages) > 0
|
|
279
|
+
|
|
280
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
281
|
+
def test_create_activity(self, mvs, activity_factory):
|
|
282
|
+
# Arrange
|
|
283
|
+
activity = activity_factory()
|
|
284
|
+
user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
285
|
+
data = get_data_from_factory(activity, mvs, delete=True, superuser=user)
|
|
286
|
+
request = self.api_factory.post("", data=data)
|
|
287
|
+
request.user = user
|
|
288
|
+
kwargs = {}
|
|
289
|
+
view = mvs.as_view({"post": "create"})
|
|
290
|
+
# Act
|
|
291
|
+
response = view(request, kwargs).render()
|
|
292
|
+
# Assert
|
|
293
|
+
assert response.status_code == status.HTTP_201_CREATED
|
|
294
|
+
assert response.data.get("instance")
|
|
295
|
+
assert response.data["instance"]["title"] == activity.title
|
|
296
|
+
|
|
297
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
298
|
+
def test_create_reviewed_activity(self, mvs, activity_factory):
|
|
299
|
+
# Arrange
|
|
300
|
+
activity = activity_factory(result="A Test Review For This Activity!")
|
|
301
|
+
user = SuperUserFactory()
|
|
302
|
+
data = get_data_from_factory(activity, mvs, delete=True, superuser=user)
|
|
303
|
+
request = self.api_factory.post("", data=data)
|
|
304
|
+
request.user = user
|
|
305
|
+
kwargs = {}
|
|
306
|
+
view = mvs.as_view({"post": "create"})
|
|
307
|
+
# Act
|
|
308
|
+
response = view(request, kwargs).render()
|
|
309
|
+
# Assert
|
|
310
|
+
assert response.status_code == status.HTTP_201_CREATED
|
|
311
|
+
assert response.data.get("instance")
|
|
312
|
+
assert response.data["instance"]["title"] == activity.title
|
|
313
|
+
assert response.data["instance"]["result"] == activity.result
|
|
314
|
+
|
|
315
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
316
|
+
def test_get_activity_instance(self, mvs, activity_factory):
|
|
317
|
+
# Arrange
|
|
318
|
+
activity = activity_factory()
|
|
319
|
+
request = self.api_factory.get("")
|
|
320
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
321
|
+
view = mvs.as_view({"get": "retrieve"})
|
|
322
|
+
# Act
|
|
323
|
+
response = view(request, pk=activity.id).render()
|
|
324
|
+
# Assert
|
|
325
|
+
assert response.status_code == status.HTTP_200_OK
|
|
326
|
+
assert response.data.get("instance")
|
|
327
|
+
assert not response.data.get("results")
|
|
328
|
+
assert response.data["instance"]["id"] == activity.id
|
|
329
|
+
|
|
330
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
331
|
+
def test_get_activity_list(self, mvs, activity_factory):
|
|
332
|
+
# Arrange
|
|
333
|
+
activity_factory.create_batch(3, preceded_by=None)
|
|
334
|
+
request = self.api_factory.get("")
|
|
335
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
336
|
+
view = mvs.as_view({"get": "list"})
|
|
337
|
+
# Act
|
|
338
|
+
response = view(request).render()
|
|
339
|
+
# Assert
|
|
340
|
+
assert response.status_code == status.HTTP_200_OK
|
|
341
|
+
assert not response.data.get("instance")
|
|
342
|
+
assert response.data.get("results")
|
|
343
|
+
assert response.data["results"]
|
|
344
|
+
assert len(response.data["results"]) == 3
|
|
345
|
+
|
|
346
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
347
|
+
def test_delete_activity_instance(self, mvs, activity_factory):
|
|
348
|
+
# Arrange
|
|
349
|
+
activity = activity_factory()
|
|
350
|
+
request = self.api_factory.delete("")
|
|
351
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
352
|
+
view = mvs.as_view({"delete": "destroy"})
|
|
353
|
+
# Act
|
|
354
|
+
response = view(request, pk=activity.id).render()
|
|
355
|
+
# Assert
|
|
356
|
+
assert response.status_code == status.HTTP_204_NO_CONTENT
|
|
357
|
+
|
|
358
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
359
|
+
def test_update_activity_instance(self, mvs, activity_factory):
|
|
360
|
+
activity_old = activity_factory()
|
|
361
|
+
activity_new = activity_factory()
|
|
362
|
+
user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
363
|
+
data = get_data_from_factory(activity_new, mvs, update=True, superuser=user)
|
|
364
|
+
request = self.api_factory.put("", data=data)
|
|
365
|
+
request.user = user
|
|
366
|
+
view = mvs.as_view({"put": "update"})
|
|
367
|
+
response = view(request, pk=activity_old.id).render()
|
|
368
|
+
assert response.status_code == status.HTTP_200_OK
|
|
369
|
+
assert not activity_old.title == activity_new.title
|
|
370
|
+
assert response.data["instance"]["id"] == activity_old.id
|
|
371
|
+
|
|
372
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
373
|
+
def test_update_reviewed_activity_instance(self, mvs, activity_factory):
|
|
374
|
+
user = SuperUserFactory()
|
|
375
|
+
client = Client()
|
|
376
|
+
client.force_login(user)
|
|
377
|
+
activity: Activity = activity_factory()
|
|
378
|
+
updated_result = activity.result + "Foo Bar"
|
|
379
|
+
data = get_data_from_factory(activity, mvs, update=True, superuser=user)
|
|
380
|
+
data["result"] = updated_result
|
|
381
|
+
assert activity.result != updated_result
|
|
382
|
+
update_url: str = reverse("wbcrm:activity-detail", args=[activity.pk])
|
|
383
|
+
response = client.put(update_url, data, content_type="application/json")
|
|
384
|
+
assert response.status_code == status.HTTP_200_OK
|
|
385
|
+
activity.refresh_from_db()
|
|
386
|
+
assert activity.result == updated_result
|
|
387
|
+
|
|
388
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
389
|
+
def test_partial_update_activity_instance(self, mvs, activity_factory):
|
|
390
|
+
activity = activity_factory()
|
|
391
|
+
user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
392
|
+
request = self.api_factory.patch("", data={"title": "New Title"})
|
|
393
|
+
request.user = user
|
|
394
|
+
view = mvs.as_view({"patch": "partial_update"})
|
|
395
|
+
response = view(request, pk=activity.id).render()
|
|
396
|
+
assert response.status_code == status.HTTP_200_OK
|
|
397
|
+
assert response.data["instance"]["id"] == activity.id
|
|
398
|
+
|
|
399
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
400
|
+
def test_partial_update_reviewed_activity_instance(self, mvs, activity_factory):
|
|
401
|
+
user = SuperUserFactory()
|
|
402
|
+
client = Client()
|
|
403
|
+
client.force_login(user)
|
|
404
|
+
activity: Activity = activity_factory()
|
|
405
|
+
updated_result = activity.result + "Foo Bar"
|
|
406
|
+
update_url: str = reverse("wbcrm:activity-detail", args=[activity.pk])
|
|
407
|
+
|
|
408
|
+
assert activity.result != updated_result
|
|
409
|
+
response = client.patch(update_url, {"result": updated_result}, content_type="application/json")
|
|
410
|
+
assert response.status_code == status.HTTP_200_OK
|
|
411
|
+
activity.refresh_from_db()
|
|
412
|
+
assert activity.result == updated_result
|
|
413
|
+
|
|
414
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
415
|
+
def test_conference_room_capacity_error_message(
|
|
416
|
+
self, mvs, activity_factory, person_factory, conference_room_factory
|
|
417
|
+
):
|
|
418
|
+
room = conference_room_factory(capacity=2)
|
|
419
|
+
p1 = person_factory()
|
|
420
|
+
p2 = person_factory()
|
|
421
|
+
p3 = person_factory()
|
|
422
|
+
activity = activity_factory(conference_room=room, participants=[p1, p2, p3])
|
|
423
|
+
request = self.api_factory.get("")
|
|
424
|
+
request._messages = InMemoryMessageStorage(request)
|
|
425
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
426
|
+
view = mvs.as_view({"get": "retrieve"})
|
|
427
|
+
# Act
|
|
428
|
+
response = view(request, pk=activity.id).render()
|
|
429
|
+
assert len(response.data["messages"]) == 1
|
|
430
|
+
|
|
431
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
432
|
+
def test_conference_room_capacity_no_error_message(
|
|
433
|
+
self, mvs, activity_factory, person_factory, conference_room_factory
|
|
434
|
+
):
|
|
435
|
+
room = conference_room_factory(capacity=3)
|
|
436
|
+
p1 = person_factory()
|
|
437
|
+
p2 = person_factory()
|
|
438
|
+
p3 = person_factory()
|
|
439
|
+
activity = activity_factory(conference_room=room, participants=[p1, p2, p3])
|
|
440
|
+
request = self.api_factory.get("")
|
|
441
|
+
request._messages = InMemoryMessageStorage(request)
|
|
442
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
443
|
+
view = mvs.as_view({"get": "retrieve"})
|
|
444
|
+
response = view(request, pk=activity.id).render()
|
|
445
|
+
assert len(response.data["messages"]) == 0
|
|
446
|
+
|
|
447
|
+
# =================================================================================================================
|
|
448
|
+
# TESTING PRIVATE ACTIVITIES
|
|
449
|
+
# =================================================================================================================
|
|
450
|
+
|
|
451
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
452
|
+
def test_assignee_can_see_private_activity_list(self, mvs, activity_factory, user_factory):
|
|
453
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
454
|
+
activity = activity_factory(
|
|
455
|
+
visibility=CalendarItem.Visibility.PRIVATE, assigned_to=user.profile, preceded_by=None
|
|
456
|
+
)
|
|
457
|
+
request = self.api_factory.get("")
|
|
458
|
+
request.user = user
|
|
459
|
+
view = mvs.as_view({"get": "list"})
|
|
460
|
+
response = view(request).render()
|
|
461
|
+
# Assert
|
|
462
|
+
assert response.status_code == status.HTTP_200_OK
|
|
463
|
+
assert response.data["results"]
|
|
464
|
+
assert len(response.data["results"]) == 1
|
|
465
|
+
assert response.data["results"][0]["id"] == activity.id
|
|
466
|
+
assert response.data["results"][0]["title"] == activity.title
|
|
467
|
+
assert response.data["results"][0]["type"] == activity.type.id
|
|
468
|
+
assert response.data["results"][0]["participants"] == list(
|
|
469
|
+
activity.participants.all().values_list("id", flat=True)
|
|
470
|
+
)
|
|
471
|
+
assert response.data["results"][0]["companies"] == list(activity.companies.all().values_list("id", flat=True))
|
|
472
|
+
assert response.data["results"][0]["groups"] == list(activity.groups.all().values_list("id", flat=True))
|
|
473
|
+
assert response.data["results"][0]["edited"] is not None
|
|
474
|
+
assert response.data["results"][0]["created"] is not None
|
|
475
|
+
assert response.data["results"][0]["description"] == activity.description
|
|
476
|
+
assert response.data["results"][0]["latest_reviewer"] == activity.latest_reviewer.id
|
|
477
|
+
if activity.status not in [Activity.Status.CANCELLED, Activity.Status.REVIEWED]:
|
|
478
|
+
assert response.data["results"][0]["_additional_resources"] is not None
|
|
479
|
+
|
|
480
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
481
|
+
def test_participant_can_see_private_activity_list(self, mvs, activity_factory, user_factory):
|
|
482
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
483
|
+
activity = activity_factory(
|
|
484
|
+
visibility=CalendarItem.Visibility.PRIVATE, participants=[user.profile.id], preceded_by=None
|
|
485
|
+
)
|
|
486
|
+
request = self.api_factory.get("")
|
|
487
|
+
request.user = user
|
|
488
|
+
view = mvs.as_view({"get": "list"})
|
|
489
|
+
response = view(request).render()
|
|
490
|
+
# Assert
|
|
491
|
+
assert response.status_code == status.HTTP_200_OK
|
|
492
|
+
assert response.data["results"]
|
|
493
|
+
assert len(response.data["results"]) == 1
|
|
494
|
+
assert response.data["results"][0]["id"] == activity.id
|
|
495
|
+
assert response.data["results"][0]["title"] == activity.title
|
|
496
|
+
assert response.data["results"][0]["type"] == activity.type.id
|
|
497
|
+
assert response.data["results"][0]["participants"] == list(
|
|
498
|
+
activity.participants.all().values_list("id", flat=True)
|
|
499
|
+
)
|
|
500
|
+
assert response.data["results"][0]["companies"] == list(activity.companies.all().values_list("id", flat=True))
|
|
501
|
+
assert response.data["results"][0]["groups"] == list(activity.groups.all().values_list("id", flat=True))
|
|
502
|
+
assert response.data["results"][0]["edited"] is not None
|
|
503
|
+
assert response.data["results"][0]["created"] is not None
|
|
504
|
+
assert response.data["results"][0]["description"] == activity.description
|
|
505
|
+
assert response.data["results"][0]["result"] == activity.result
|
|
506
|
+
assert response.data["results"][0]["latest_reviewer"] == activity.latest_reviewer.id
|
|
507
|
+
if activity.status not in [Activity.Status.CANCELLED, Activity.Status.REVIEWED]:
|
|
508
|
+
assert response.data["results"][0]["_additional_resources"] is not None
|
|
509
|
+
|
|
510
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
511
|
+
def test_random_cannot_see_private_activity_list(self, mvs, activity_factory, user_factory):
|
|
512
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
513
|
+
activity = activity_factory(visibility=CalendarItem.Visibility.PRIVATE, preceded_by=None)
|
|
514
|
+
request = self.api_factory.get("")
|
|
515
|
+
request.user = user
|
|
516
|
+
view = mvs.as_view({"get": "list"})
|
|
517
|
+
response = view(request).render()
|
|
518
|
+
# Assert
|
|
519
|
+
assert response.status_code == status.HTTP_200_OK
|
|
520
|
+
assert response.data["results"]
|
|
521
|
+
assert len(response.data["results"]) == 1
|
|
522
|
+
assert response.data["results"][0]["id"] == activity.id
|
|
523
|
+
assert response.data["results"][0]["title"] == "Private Activity"
|
|
524
|
+
assert response.data["results"][0]["type"] is None
|
|
525
|
+
assert response.data["results"][0]["edited"] is None
|
|
526
|
+
assert response.data["results"][0]["created"] is None
|
|
527
|
+
assert response.data["results"][0]["description"] is None
|
|
528
|
+
assert response.data["results"][0]["result"] is None
|
|
529
|
+
assert response.data["results"][0]["latest_reviewer"] is None
|
|
530
|
+
assert response.data["results"][0]["participants"] is not None
|
|
531
|
+
assert response.data["results"][0]["_participants"] is not None
|
|
532
|
+
assert response.data["results"][0]["companies"] is not None
|
|
533
|
+
assert response.data["results"][0]["_companies"] is not None
|
|
534
|
+
assert response.data["results"][0]["groups"] is not None
|
|
535
|
+
assert response.data["results"][0]["_groups"] is not None
|
|
536
|
+
assert response.data["results"][0]["_additional_resources"] is None
|
|
537
|
+
|
|
538
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
539
|
+
def test_assignee_can_see_private_activity_instance(self, mvs, activity_factory, user_factory):
|
|
540
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
541
|
+
activity = activity_factory(
|
|
542
|
+
visibility=CalendarItem.Visibility.PRIVATE, assigned_to=user.profile, preceded_by=None
|
|
543
|
+
)
|
|
544
|
+
request = self.api_factory.get("")
|
|
545
|
+
request.user = user
|
|
546
|
+
view = mvs.as_view({"get": "retrieve"})
|
|
547
|
+
response = view(request, pk=activity.id).render()
|
|
548
|
+
assert response.status_code == status.HTTP_200_OK
|
|
549
|
+
assert response.data.get("instance")
|
|
550
|
+
assert not response.data.get("results")
|
|
551
|
+
assert response.data["instance"]["id"] == activity.id
|
|
552
|
+
assert response.data["instance"]["title"] == activity.title
|
|
553
|
+
assert response.data["instance"]["participants"] == list(
|
|
554
|
+
activity.participants.all().values_list("id", flat=True)
|
|
555
|
+
)
|
|
556
|
+
assert response.data["instance"]["type"] == activity.type.id
|
|
557
|
+
assert response.data["instance"]["companies"] == list(activity.companies.all().values_list("id", flat=True))
|
|
558
|
+
assert response.data["instance"]["groups"] == list(activity.groups.all().values_list("id", flat=True))
|
|
559
|
+
assert response.data["instance"]["edited"] is not None
|
|
560
|
+
assert response.data["instance"]["created"] is not None
|
|
561
|
+
assert response.data["instance"]["description"] == activity.description
|
|
562
|
+
assert response.data["instance"]["result"] == activity.result
|
|
563
|
+
assert response.data["instance"]["latest_reviewer"] == activity.latest_reviewer.id
|
|
564
|
+
if activity.status not in [Activity.Status.CANCELLED, Activity.Status.REVIEWED]:
|
|
565
|
+
assert response.data["instance"]["_additional_resources"] is not None
|
|
566
|
+
assert response.data["instance"]["all_day"] == activity.all_day
|
|
567
|
+
assert response.data["instance"]["assigned_to"] == activity.assigned_to.id
|
|
568
|
+
assert response.data["instance"]["conference_room"] == activity.conference_room
|
|
569
|
+
assert response.data["instance"]["disable_participant_check"] == activity.disable_participant_check
|
|
570
|
+
assert response.data["instance"]["creator"] == activity.creator.id
|
|
571
|
+
assert response.data["instance"]["importance"] == activity.importance
|
|
572
|
+
assert response.data["instance"]["online_meeting"] == activity.online_meeting
|
|
573
|
+
assert response.data["instance"]["reminder_choice"] == activity.reminder_choice
|
|
574
|
+
|
|
575
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
576
|
+
def test_participant_can_see_private_activity_instance(self, mvs, activity_factory, user_factory):
|
|
577
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
578
|
+
activity = activity_factory(
|
|
579
|
+
visibility=CalendarItem.Visibility.PRIVATE, participants=[user.profile.id], preceded_by=None
|
|
580
|
+
)
|
|
581
|
+
request = self.api_factory.get("")
|
|
582
|
+
request.user = user
|
|
583
|
+
view = mvs.as_view({"get": "retrieve"})
|
|
584
|
+
response = view(request, pk=activity.id).render()
|
|
585
|
+
assert response.status_code == status.HTTP_200_OK
|
|
586
|
+
assert response.data.get("instance")
|
|
587
|
+
assert not response.data.get("results")
|
|
588
|
+
assert response.data["instance"]["id"] == activity.id
|
|
589
|
+
assert response.data["instance"]["title"] == activity.title
|
|
590
|
+
assert response.data["instance"]["participants"] == list(
|
|
591
|
+
activity.participants.all().values_list("id", flat=True)
|
|
592
|
+
)
|
|
593
|
+
assert response.data["instance"]["type"] == activity.type.id
|
|
594
|
+
assert response.data["instance"]["companies"] == list(activity.companies.all().values_list("id", flat=True))
|
|
595
|
+
assert response.data["instance"]["groups"] == list(activity.groups.all().values_list("id", flat=True))
|
|
596
|
+
assert response.data["instance"]["edited"] is not None
|
|
597
|
+
assert response.data["instance"]["created"] is not None
|
|
598
|
+
assert response.data["instance"]["description"] == activity.description
|
|
599
|
+
assert response.data["instance"]["result"] == activity.result
|
|
600
|
+
assert response.data["instance"]["latest_reviewer"] == activity.latest_reviewer.id
|
|
601
|
+
if activity.status not in [Activity.Status.CANCELLED, Activity.Status.REVIEWED]:
|
|
602
|
+
assert response.data["instance"]["_additional_resources"] is not None
|
|
603
|
+
assert response.data["instance"]["all_day"] == activity.all_day
|
|
604
|
+
assert response.data["instance"]["assigned_to"] == activity.assigned_to.id
|
|
605
|
+
assert response.data["instance"]["conference_room"] == activity.conference_room
|
|
606
|
+
assert response.data["instance"]["disable_participant_check"] == activity.disable_participant_check
|
|
607
|
+
assert response.data["instance"]["creator"] == activity.creator.id
|
|
608
|
+
assert response.data["instance"]["importance"] == activity.importance
|
|
609
|
+
assert response.data["instance"]["online_meeting"] == activity.online_meeting
|
|
610
|
+
assert response.data["instance"]["reminder_choice"] == activity.reminder_choice
|
|
611
|
+
|
|
612
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
613
|
+
def test_random_cannot_see_private_activity_instance(self, mvs, activity_factory, user_factory):
|
|
614
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
615
|
+
activity = activity_factory(visibility=CalendarItem.Visibility.PRIVATE, preceded_by=None)
|
|
616
|
+
request = self.api_factory.get("")
|
|
617
|
+
request.user = user
|
|
618
|
+
view = mvs.as_view({"get": "retrieve"})
|
|
619
|
+
response = view(request, pk=activity.id).render()
|
|
620
|
+
# Assert
|
|
621
|
+
assert response.status_code == status.HTTP_200_OK
|
|
622
|
+
assert response.data.get("instance")
|
|
623
|
+
assert not response.data.get("results")
|
|
624
|
+
assert response.data["instance"]["id"] == activity.id
|
|
625
|
+
assert response.data["instance"]["title"] == "Private Activity"
|
|
626
|
+
assert response.data["instance"]["participants"] is not None
|
|
627
|
+
assert response.data["instance"]["_participants"] is not None
|
|
628
|
+
assert response.data["instance"]["companies"] is not None
|
|
629
|
+
assert response.data["instance"]["_companies"] is not None
|
|
630
|
+
assert response.data["instance"]["groups"] is not None
|
|
631
|
+
assert response.data["instance"]["_groups"] is not None
|
|
632
|
+
assert response.data["instance"]["assigned_to"] is not None
|
|
633
|
+
assert response.data["instance"]["_assigned_to"] is not None
|
|
634
|
+
assert response.data["instance"]["creator"] is not None
|
|
635
|
+
assert response.data["instance"]["_creator"] is not None
|
|
636
|
+
assert response.data["instance"]["type"] is None
|
|
637
|
+
assert response.data["instance"]["_type"] is None
|
|
638
|
+
assert response.data["instance"]["edited"] is None
|
|
639
|
+
assert response.data["instance"]["created"] is None
|
|
640
|
+
assert response.data["instance"]["description"] is None
|
|
641
|
+
assert response.data["instance"]["result"] is None
|
|
642
|
+
assert response.data["instance"]["latest_reviewer"] is None
|
|
643
|
+
assert response.data["instance"]["_latest_reviewer"] is None
|
|
644
|
+
assert response.data["instance"]["_additional_resources"] is None
|
|
645
|
+
assert response.data["instance"]["all_day"] is None
|
|
646
|
+
assert response.data["instance"]["conference_room"] is None
|
|
647
|
+
assert response.data["instance"]["disable_participant_check"] is None
|
|
648
|
+
assert response.data["instance"]["importance"] is None
|
|
649
|
+
assert response.data["instance"]["location"] is None
|
|
650
|
+
assert response.data["instance"]["location_latitude"] is None
|
|
651
|
+
assert response.data["instance"]["location_longitude"] is None
|
|
652
|
+
assert response.data["instance"]["online_meeting"] is None
|
|
653
|
+
assert response.data["instance"]["reminder_choice"] is None
|
|
654
|
+
assert response.data["instance"]["reviewed_at"] is None
|
|
655
|
+
|
|
656
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
657
|
+
def test_private_instance_not_deleteable(self, mvs, activity_factory, user_factory):
|
|
658
|
+
activity = activity_factory(visibility=CalendarItem.Visibility.PRIVATE, preceded_by=None)
|
|
659
|
+
request = self.api_factory.delete("")
|
|
660
|
+
request.user = user_factory(is_active=True, is_superuser=True)
|
|
661
|
+
view = mvs.as_view({"delete": "destroy"})
|
|
662
|
+
response = view(request, pk=activity.id).render()
|
|
663
|
+
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
|
|
664
|
+
|
|
665
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
666
|
+
def test_private_instance_deleteable_for_participant(self, mvs, activity_factory, user_factory):
|
|
667
|
+
superuser = user_factory(is_active=True, is_superuser=True)
|
|
668
|
+
activity = activity_factory(
|
|
669
|
+
visibility=CalendarItem.Visibility.PRIVATE, participants=[superuser.profile.id], preceded_by=None
|
|
670
|
+
)
|
|
671
|
+
request = self.api_factory.delete("")
|
|
672
|
+
request.user = superuser
|
|
673
|
+
view = mvs.as_view({"delete": "destroy"})
|
|
674
|
+
response = view(request, pk=activity.id).render()
|
|
675
|
+
assert response.status_code == status.HTTP_204_NO_CONTENT
|
|
676
|
+
|
|
677
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
678
|
+
def test_private_instance_deleteable_for_assignee(self, mvs, activity_factory, user_factory):
|
|
679
|
+
superuser = user_factory(is_active=True, is_superuser=True)
|
|
680
|
+
activity = activity_factory(
|
|
681
|
+
visibility=CalendarItem.Visibility.PRIVATE, assigned_to=superuser.profile, preceded_by=None
|
|
682
|
+
)
|
|
683
|
+
request = self.api_factory.delete("")
|
|
684
|
+
request.user = superuser
|
|
685
|
+
view = mvs.as_view({"delete": "destroy"})
|
|
686
|
+
response = view(request, pk=activity.id).render()
|
|
687
|
+
assert response.status_code == status.HTTP_204_NO_CONTENT
|
|
688
|
+
|
|
689
|
+
# =================================================================================================================
|
|
690
|
+
# TESTING CONFIDENTIAL ACTIVITIES
|
|
691
|
+
# =================================================================================================================
|
|
692
|
+
|
|
693
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
694
|
+
def test_manager_can_see_confidential_activity_list(self, mvs, activity_factory, user_factory):
|
|
695
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
696
|
+
permission = Permission.objects.get(codename="administrate_confidential_items")
|
|
697
|
+
user.user_permissions.add(permission)
|
|
698
|
+
activity = activity_factory(visibility=CalendarItem.Visibility.CONFIDENTIAL, preceded_by=None)
|
|
699
|
+
request = self.api_factory.get("")
|
|
700
|
+
request.user = user
|
|
701
|
+
view = mvs.as_view({"get": "list"})
|
|
702
|
+
response = view(request).render()
|
|
703
|
+
# Assert
|
|
704
|
+
assert response.status_code == status.HTTP_200_OK
|
|
705
|
+
assert response.data["results"]
|
|
706
|
+
assert len(response.data["results"]) == 1
|
|
707
|
+
assert response.data["results"][0]["id"] == activity.id
|
|
708
|
+
assert response.data["results"][0]["title"] == activity.title
|
|
709
|
+
assert response.data["results"][0]["participants"] == list(
|
|
710
|
+
activity.participants.all().values_list("id", flat=True)
|
|
711
|
+
)
|
|
712
|
+
assert response.data["results"][0]["companies"] == list(activity.companies.all().values_list("id", flat=True))
|
|
713
|
+
assert response.data["results"][0]["groups"] == list(activity.groups.all().values_list("id", flat=True))
|
|
714
|
+
assert response.data["results"][0]["type"] == activity.type.id
|
|
715
|
+
assert response.data["results"][0]["edited"] is not None
|
|
716
|
+
assert response.data["results"][0]["created"] is not None
|
|
717
|
+
assert response.data["results"][0]["description"] == activity.description
|
|
718
|
+
assert response.data["results"][0]["latest_reviewer"] == activity.latest_reviewer.id
|
|
719
|
+
if activity.status not in [Activity.Status.CANCELLED, Activity.Status.REVIEWED]:
|
|
720
|
+
assert response.data["results"][0]["_additional_resources"] is not None
|
|
721
|
+
|
|
722
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
723
|
+
def test_random_cannot_see_confidential_activity_list(self, mvs, activity_factory, user_factory):
|
|
724
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
725
|
+
activity = activity_factory(visibility=CalendarItem.Visibility.CONFIDENTIAL, preceded_by=None)
|
|
726
|
+
request = self.api_factory.get("")
|
|
727
|
+
request.user = user
|
|
728
|
+
view = mvs.as_view({"get": "list"})
|
|
729
|
+
response = view(request).render()
|
|
730
|
+
# Assert
|
|
731
|
+
assert response.status_code == status.HTTP_200_OK
|
|
732
|
+
assert response.data["results"]
|
|
733
|
+
assert len(response.data["results"]) == 1
|
|
734
|
+
assert response.data["results"][0]["id"] == activity.id
|
|
735
|
+
assert response.data["results"][0]["title"] == "Confidential Activity"
|
|
736
|
+
assert response.data["results"][0]["participants"] is None
|
|
737
|
+
assert response.data["results"][0]["companies"] is None
|
|
738
|
+
assert response.data["results"][0]["groups"] is None
|
|
739
|
+
assert response.data["results"][0]["type"] is None
|
|
740
|
+
assert response.data["results"][0]["edited"] is None
|
|
741
|
+
assert response.data["results"][0]["created"] is None
|
|
742
|
+
assert response.data["results"][0]["description"] is None
|
|
743
|
+
assert response.data["results"][0]["result"] is None
|
|
744
|
+
assert response.data["results"][0]["latest_reviewer"] is None
|
|
745
|
+
assert response.data["results"][0]["_additional_resources"] is None
|
|
746
|
+
|
|
747
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
748
|
+
def test_manager_can_see_confidential_activity_instance(self, mvs, activity_factory, user_factory):
|
|
749
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
750
|
+
permission = Permission.objects.get(codename="administrate_confidential_items")
|
|
751
|
+
user.user_permissions.add(permission)
|
|
752
|
+
activity = activity_factory(visibility=CalendarItem.Visibility.CONFIDENTIAL, preceded_by=None)
|
|
753
|
+
request = self.api_factory.get("")
|
|
754
|
+
request.user = user
|
|
755
|
+
view = mvs.as_view({"get": "retrieve"})
|
|
756
|
+
response = view(request, pk=activity.id).render()
|
|
757
|
+
assert response.status_code == status.HTTP_200_OK
|
|
758
|
+
assert response.data.get("instance")
|
|
759
|
+
assert not response.data.get("results")
|
|
760
|
+
assert response.data["instance"]["id"] == activity.id
|
|
761
|
+
assert response.data["instance"]["title"] == activity.title
|
|
762
|
+
assert response.data["instance"]["participants"] == list(
|
|
763
|
+
activity.participants.all().values_list("id", flat=True)
|
|
764
|
+
)
|
|
765
|
+
assert response.data["instance"]["type"] == activity.type.id
|
|
766
|
+
assert response.data["instance"]["companies"] == list(activity.companies.all().values_list("id", flat=True))
|
|
767
|
+
assert response.data["instance"]["groups"] == list(activity.groups.all().values_list("id", flat=True))
|
|
768
|
+
assert response.data["instance"]["edited"] is not None
|
|
769
|
+
assert response.data["instance"]["created"] is not None
|
|
770
|
+
assert response.data["instance"]["description"] == activity.description
|
|
771
|
+
assert response.data["instance"]["result"] == activity.result
|
|
772
|
+
assert response.data["instance"]["latest_reviewer"] == activity.latest_reviewer.id
|
|
773
|
+
if activity.status not in [Activity.Status.CANCELLED, Activity.Status.REVIEWED]:
|
|
774
|
+
assert response.data["instance"]["_additional_resources"] is not None
|
|
775
|
+
assert response.data["instance"]["all_day"] == activity.all_day
|
|
776
|
+
assert response.data["instance"]["assigned_to"] == activity.assigned_to.id
|
|
777
|
+
assert response.data["instance"]["conference_room"] == activity.conference_room
|
|
778
|
+
assert response.data["instance"]["disable_participant_check"] == activity.disable_participant_check
|
|
779
|
+
assert response.data["instance"]["creator"] == activity.creator.id
|
|
780
|
+
assert response.data["instance"]["importance"] == activity.importance
|
|
781
|
+
assert response.data["instance"]["online_meeting"] == activity.online_meeting
|
|
782
|
+
assert response.data["instance"]["reminder_choice"] == activity.reminder_choice
|
|
783
|
+
|
|
784
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
785
|
+
def test_random_cannot_see_confidential_activity_instance(self, mvs, activity_factory, user_factory):
|
|
786
|
+
user = user_factory(is_active=True, is_superuser=True)
|
|
787
|
+
activity = activity_factory(visibility=CalendarItem.Visibility.CONFIDENTIAL, preceded_by=None)
|
|
788
|
+
request = self.api_factory.get("")
|
|
789
|
+
request.user = user
|
|
790
|
+
view = mvs.as_view({"get": "retrieve"})
|
|
791
|
+
response = view(request, pk=activity.id).render()
|
|
792
|
+
# Assert
|
|
793
|
+
assert response.status_code == status.HTTP_200_OK
|
|
794
|
+
assert response.data.get("instance")
|
|
795
|
+
assert not response.data.get("results")
|
|
796
|
+
assert response.data["instance"]["id"] == activity.id
|
|
797
|
+
assert response.data["instance"]["title"] == "Confidential Activity"
|
|
798
|
+
assert response.data["instance"]["participants"] is None
|
|
799
|
+
assert response.data["instance"]["_participants"] is None
|
|
800
|
+
assert response.data["instance"]["type"] is None
|
|
801
|
+
assert response.data["instance"]["_type"] is None
|
|
802
|
+
assert response.data["instance"]["companies"] is None
|
|
803
|
+
assert response.data["instance"]["_companies"] is None
|
|
804
|
+
assert response.data["instance"]["groups"] is None
|
|
805
|
+
assert response.data["instance"]["_groups"] is None
|
|
806
|
+
assert response.data["instance"]["edited"] is None
|
|
807
|
+
assert response.data["instance"]["created"] is None
|
|
808
|
+
assert response.data["instance"]["description"] is None
|
|
809
|
+
assert response.data["instance"]["result"] is None
|
|
810
|
+
assert response.data["instance"]["latest_reviewer"] is None
|
|
811
|
+
assert response.data["instance"]["_latest_reviewer"] is None
|
|
812
|
+
assert response.data["instance"]["_additional_resources"] is None
|
|
813
|
+
assert response.data["instance"]["all_day"] is None
|
|
814
|
+
assert response.data["instance"]["assigned_to"] is None
|
|
815
|
+
assert response.data["instance"]["conference_room"] is None
|
|
816
|
+
assert response.data["instance"]["disable_participant_check"] is None
|
|
817
|
+
assert response.data["instance"]["creator"] is None
|
|
818
|
+
assert response.data["instance"]["importance"] is None
|
|
819
|
+
assert response.data["instance"]["location"] is None
|
|
820
|
+
assert response.data["instance"]["location_latitude"] is None
|
|
821
|
+
assert response.data["instance"]["location_longitude"] is None
|
|
822
|
+
assert response.data["instance"]["online_meeting"] is None
|
|
823
|
+
assert response.data["instance"]["reminder_choice"] is None
|
|
824
|
+
assert response.data["instance"]["reviewed_at"] is None
|
|
825
|
+
assert response.data["instance"]["_assigned_to"] is None
|
|
826
|
+
assert response.data["instance"]["_creator"] is None
|
|
827
|
+
|
|
828
|
+
@pytest.mark.parametrize("mvs", [ActivityViewSet])
|
|
829
|
+
def test_confidential_instance_not_deleteable(self, mvs, activity_factory, internal_user_factory, user_factory):
|
|
830
|
+
employee = internal_user_factory().profile
|
|
831
|
+
user = user_factory(is_active=True)
|
|
832
|
+
employee.user_account = user
|
|
833
|
+
for permission in Permission.objects.exclude(codename="administrate_confidential_items"):
|
|
834
|
+
user.user_permissions.add(permission)
|
|
835
|
+
global_preferences_registry.manager()["directory__main_company"] = employee.employers.first().id
|
|
836
|
+
activity = activity_factory(visibility=CalendarItem.Visibility.CONFIDENTIAL, preceded_by=None)
|
|
837
|
+
request = self.api_factory.delete("")
|
|
838
|
+
request.user = user
|
|
839
|
+
view = mvs.as_view({"delete": "destroy"})
|
|
840
|
+
response = view(request, pk=activity.id).render()
|
|
841
|
+
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
|
|
842
|
+
|
|
843
|
+
|
|
844
|
+
# =====================================================================================================================
|
|
845
|
+
# TESTING ENTRY VIEWSETS
|
|
846
|
+
# =====================================================================================================================
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
# # =====================================================================================================================
|
|
850
|
+
# # TESTING UTILS VIEWSETS
|
|
851
|
+
# # =====================================================================================================================
|
|
852
|
+
|
|
853
|
+
|
|
854
|
+
@pytest.mark.django_db
|
|
855
|
+
class TestUtilsViewSets:
|
|
856
|
+
api_factory = APIRequestFactory()
|
|
857
|
+
|
|
858
|
+
@pytest.mark.parametrize(
|
|
859
|
+
"mvs",
|
|
860
|
+
[
|
|
861
|
+
ActivityTypeModelViewSet,
|
|
862
|
+
ProductModelViewSet,
|
|
863
|
+
],
|
|
864
|
+
)
|
|
865
|
+
def test_get_utils(self, mvs):
|
|
866
|
+
request = self.api_factory.get("")
|
|
867
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
868
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
869
|
+
factory.create_batch(3)
|
|
870
|
+
vs = mvs.as_view({"get": "list"})
|
|
871
|
+
response = vs(request)
|
|
872
|
+
assert response.data.get("results")
|
|
873
|
+
assert not response.data.get("instance")
|
|
874
|
+
assert len(response.data.get("results")) == 3
|
|
875
|
+
assert response.status_code == status.HTTP_200_OK
|
|
876
|
+
|
|
877
|
+
@pytest.mark.parametrize(
|
|
878
|
+
"mvs",
|
|
879
|
+
[
|
|
880
|
+
ActivityTypeModelViewSet,
|
|
881
|
+
ProductModelViewSet,
|
|
882
|
+
],
|
|
883
|
+
)
|
|
884
|
+
def test_retrieve_utils(self, mvs):
|
|
885
|
+
request = self.api_factory.get("")
|
|
886
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
887
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
888
|
+
obj = factory()
|
|
889
|
+
vs = mvs.as_view({"get": "retrieve"})
|
|
890
|
+
response = vs(request, pk=obj.id)
|
|
891
|
+
assert response.data.get("instance")
|
|
892
|
+
assert not response.data.get("results")
|
|
893
|
+
assert response.status_code == status.HTTP_200_OK
|
|
894
|
+
|
|
895
|
+
@pytest.mark.parametrize(
|
|
896
|
+
"mvs",
|
|
897
|
+
[
|
|
898
|
+
ActivityTypeModelViewSet,
|
|
899
|
+
ProductModelViewSet,
|
|
900
|
+
],
|
|
901
|
+
)
|
|
902
|
+
def test_post_utils(self, mvs):
|
|
903
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
904
|
+
obj = factory()
|
|
905
|
+
super_user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
906
|
+
data = get_data_from_factory(obj, mvs, superuser=super_user, delete=True)
|
|
907
|
+
request = self.api_factory.post("", data=data)
|
|
908
|
+
request.user = super_user
|
|
909
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
910
|
+
vs = mvs.as_view({"post": "create"})
|
|
911
|
+
response = vs(request, **kwargs)
|
|
912
|
+
assert response.status_code == status.HTTP_201_CREATED
|
|
913
|
+
|
|
914
|
+
@pytest.mark.parametrize(
|
|
915
|
+
"mvs",
|
|
916
|
+
[
|
|
917
|
+
ActivityTypeModelViewSet,
|
|
918
|
+
ProductModelViewSet,
|
|
919
|
+
],
|
|
920
|
+
)
|
|
921
|
+
def test_delete_utils(self, mvs):
|
|
922
|
+
request = self.api_factory.delete("")
|
|
923
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
924
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
925
|
+
obj = factory()
|
|
926
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
927
|
+
vs = mvs.as_view({"delete": "destroy"})
|
|
928
|
+
response = vs(request, **kwargs, pk=obj.pk)
|
|
929
|
+
assert response.status_code == status.HTTP_204_NO_CONTENT
|
|
930
|
+
|
|
931
|
+
@pytest.mark.parametrize(
|
|
932
|
+
"mvs",
|
|
933
|
+
[
|
|
934
|
+
ActivityTypeModelViewSet,
|
|
935
|
+
ProductModelViewSet,
|
|
936
|
+
],
|
|
937
|
+
)
|
|
938
|
+
def test_put_utils(self, mvs):
|
|
939
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
940
|
+
old_obj = factory()
|
|
941
|
+
new_obj = factory()
|
|
942
|
+
user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
943
|
+
data = get_data_from_factory(new_obj, mvs, superuser=user, delete=True)
|
|
944
|
+
request = APIRequestFactory().put("", data=data)
|
|
945
|
+
request.user = user
|
|
946
|
+
vs = mvs.as_view({"put": "update"})
|
|
947
|
+
response = vs(request, pk=old_obj.id)
|
|
948
|
+
assert response.status_code == status.HTTP_200_OK
|
|
949
|
+
assert response.data["instance"]["title"] == new_obj.title
|
|
950
|
+
assert not response.data["instance"]["title"] == old_obj.title
|
|
951
|
+
|
|
952
|
+
@pytest.mark.parametrize(
|
|
953
|
+
"mvs",
|
|
954
|
+
[
|
|
955
|
+
ActivityTypeModelViewSet,
|
|
956
|
+
ProductModelViewSet,
|
|
957
|
+
],
|
|
958
|
+
)
|
|
959
|
+
def test_patch_utils(self, mvs):
|
|
960
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
961
|
+
obj = factory()
|
|
962
|
+
request = APIRequestFactory().patch("", data={"title": "New Title"})
|
|
963
|
+
request.user = InternalUserFactory(is_active=True, is_superuser=True)
|
|
964
|
+
vs = mvs.as_view({"patch": "partial_update"})
|
|
965
|
+
response = vs(request, pk=obj.id)
|
|
966
|
+
assert response.status_code == status.HTTP_200_OK
|
|
967
|
+
assert response.data["instance"]["title"] == "New Title"
|