Skip to content

Commit bd43138

Browse files
committed
Added tests
1 parent 387182a commit bd43138

23 files changed

+1716
-30
lines changed

api/serializers.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,18 @@ def validate(self, data):
10051005
data["status"] = ExpertReportAnnotation.STATUS_PUBLIC
10061006

10071007
data['validation_complete_executive'] = data.pop("is_decisive")
1008-
1008+
user_role = data['user']
1009+
if isinstance(user_role, User):
1010+
user_role = UserStat.objects.filter(user=user_role).first()
1011+
can_set_is_decisive = False
1012+
if user_role:
1013+
can_set_is_decisive = user_role.has_role_permission_by_model(
1014+
action='mark_as_decisive',
1015+
model=ExpertReportAnnotation,
1016+
country=data['report'].country
1017+
)
1018+
if not can_set_is_decisive:
1019+
data['validation_complete_executive'] = False
10091020
return data
10101021

10111022
def create(self, validated_data):

api/tests/conftest.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from rest_framework.authtoken.models import Token
88

9+
from django.contrib.auth.models import Group
910
from django.core.files.uploadedfile import SimpleUploadedFile
1011
from django.core.management import call_command
1112
from django.contrib.auth import get_user_model
@@ -18,7 +19,7 @@
1819
from api.tests.utils import grant_permission_to_user
1920
from api.tests.clients import AppAPIClient
2021

21-
from tigacrafting.models import IdentificationTask, Taxon
22+
from tigacrafting.models import IdentificationTask, Taxon, UserStat
2223
from tigaserver_app.models import EuropeCountry, Report, Photo
2324

2425
from .factories import create_mobile_user, create_regular_user
@@ -250,4 +251,47 @@ def taxon_root():
250251
rank=Taxon.TaxonomicRank.CLASS,
251252
name="Insecta",
252253
common_name=""
253-
)
254+
)
255+
256+
@pytest.fixture
257+
def group_expert():
258+
group, _ = Group.objects.get_or_create(name="expert")
259+
return group
260+
261+
@pytest.fixture
262+
def group_superexpert():
263+
group, _ = Group.objects.get_or_create(name="superexpert")
264+
return group
265+
266+
@pytest.fixture
267+
def user_with_role_annotator(user, group_expert):
268+
user.groups.add(group_expert)
269+
return user
270+
271+
@pytest.fixture
272+
def user_with_role_annotator_in_country(user_with_role_annotator, es_country):
273+
user_stat = UserStat.objects.get(user=user_with_role_annotator)
274+
user_stat.native_of = es_country
275+
user_stat.save()
276+
277+
return user_with_role_annotator
278+
279+
@pytest.fixture
280+
def user_with_role_supervisor_in_country(user, group_expert, es_country):
281+
user.groups.add(group_expert)
282+
user_stat = UserStat.objects.get(user=user)
283+
user_stat.national_supervisor_of = es_country
284+
user_stat.save()
285+
286+
return user
287+
288+
@pytest.fixture
289+
def user_with_role_reviewer(user, group_superexpert):
290+
user.groups.add(group_superexpert)
291+
return user
292+
293+
@pytest.fixture
294+
def user_with_role_admin(user):
295+
user.is_superuser = True
296+
user.save()
297+
return user

api/tests/integration/identification_tasks/annotations/create.tavern.yml

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,4 +230,124 @@ stages:
230230
strict:
231231
- json:off
232232
json:
233-
id: !int "{assignment.pk}"
233+
id: !int "{assignment.pk}"
234+
235+
---
236+
237+
test_name: User can create a new annotation if annotator
238+
239+
240+
includes:
241+
- !include schema.yml
242+
243+
marks:
244+
- usefixtures:
245+
- api_live_url
246+
- endpoint
247+
- user_with_role_annotator
248+
- jwt_token_user
249+
- taxon_root
250+
- parametrize:
251+
key: is_decisive
252+
vals:
253+
- true
254+
- false
255+
256+
stages:
257+
- name: Create classification
258+
request:
259+
url: "{api_live_url}/{endpoint}/"
260+
headers:
261+
Authorization: "Bearer {jwt_token_user}"
262+
method: "POST"
263+
json:
264+
classification:
265+
taxon_id: !int "{taxon_root.pk}"
266+
confidence_label: 'definitely'
267+
is_decisive: "{is_decisive}"
268+
response:
269+
status_code: 201
270+
strict:
271+
- json:off
272+
json:
273+
is_decisive: false
274+
275+
---
276+
277+
test_name: User can create a new annotation if supervisor
278+
279+
280+
includes:
281+
- !include schema.yml
282+
283+
marks:
284+
- usefixtures:
285+
- api_live_url
286+
- endpoint
287+
- user_with_role_supervisor_in_country
288+
- jwt_token_user
289+
- taxon_root
290+
- parametrize:
291+
key: is_decisive
292+
vals:
293+
- true
294+
- false
295+
296+
stages:
297+
- name: Create classification
298+
request:
299+
url: "{api_live_url}/{endpoint}/"
300+
headers:
301+
Authorization: "Bearer {jwt_token_user}"
302+
method: "POST"
303+
json:
304+
classification:
305+
taxon_id: !int "{taxon_root.pk}"
306+
confidence_label: 'definitely'
307+
is_decisive: "{is_decisive}"
308+
response:
309+
status_code: 201
310+
strict:
311+
- json:off
312+
json:
313+
is_decisive: !bool "{is_decisive}"
314+
315+
---
316+
317+
test_name: User can create a new annotation if reviewer
318+
319+
320+
includes:
321+
- !include schema.yml
322+
323+
marks:
324+
- usefixtures:
325+
- api_live_url
326+
- endpoint
327+
- user_with_role_reviewer
328+
- jwt_token_user
329+
- taxon_root
330+
- parametrize:
331+
key: is_decisive
332+
vals:
333+
- true
334+
- false
335+
336+
stages:
337+
- name: Create classification
338+
request:
339+
url: "{api_live_url}/{endpoint}/"
340+
headers:
341+
Authorization: "Bearer {jwt_token_user}"
342+
method: "POST"
343+
json:
344+
classification:
345+
taxon_id: !int "{taxon_root.pk}"
346+
confidence_label: 'definitely'
347+
is_decisive: "{is_decisive}"
348+
response:
349+
status_code: 201
350+
strict:
351+
- json:off
352+
json:
353+
is_decisive: !bool "{is_decisive}"

api/tests/integration/identification_tasks/annotations/delete.tavern.yml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,81 @@ stages:
3535
method: "DELETE"
3636
response:
3737
status_code: 405
38+
39+
---
40+
41+
test_name: Delete is disabled if annotator
42+
43+
44+
includes:
45+
- !include schema.yml
46+
47+
marks:
48+
- usefixtures:
49+
- api_live_url
50+
- endpoint
51+
- annotation
52+
- user_with_role_annotator
53+
- jwt_token_user
54+
55+
stages:
56+
- name: Delete classification
57+
request:
58+
url: "{api_live_url}/{endpoint}/{annotation.pk}/"
59+
headers:
60+
Authorization: "Bearer {jwt_token_user}"
61+
method: "DELETE"
62+
response:
63+
status_code: 403
64+
65+
---
66+
67+
test_name: Delete is disabled if supervisor
68+
69+
70+
includes:
71+
- !include schema.yml
72+
73+
marks:
74+
- usefixtures:
75+
- api_live_url
76+
- endpoint
77+
- annotation
78+
- user_with_role_supervisor_in_country
79+
- jwt_token_user
80+
81+
stages:
82+
- name: Delete classification
83+
request:
84+
url: "{api_live_url}/{endpoint}/{annotation.pk}/"
85+
headers:
86+
Authorization: "Bearer {jwt_token_user}"
87+
method: "DELETE"
88+
response:
89+
status_code: 403
90+
91+
---
92+
93+
test_name: Delete is disabled if reviewer
94+
95+
96+
includes:
97+
- !include schema.yml
98+
99+
marks:
100+
- usefixtures:
101+
- api_live_url
102+
- endpoint
103+
- annotation
104+
- user_with_role_reviewer
105+
- jwt_token_user
106+
107+
stages:
108+
- name: Delete classification
109+
request:
110+
url: "{api_live_url}/{endpoint}/{annotation.pk}/"
111+
headers:
112+
Authorization: "Bearer {jwt_token_user}"
113+
method: "DELETE"
114+
response:
115+
status_code: 403

0 commit comments

Comments
 (0)