Coverage for src/mesh/tests/roles/test_reviewer.py: 100%
156 statements
« prev ^ index » next coverage.py v7.9.0, created at 2026-02-04 09:42 +0000
« prev ^ index » next coverage.py v7.9.0, created at 2026-02-04 09:42 +0000
1from django.test import override_settings
3from mesh.model.roles.reviewer import Reviewer, ReviewerRights
5from ...app_settings import BlindMode
6from ...model.submission_status import SubmissionStatus
7from ...models.factories import (
8 ReviewFactory,
9 SubmissionFactory,
10 SubmissionVersionFactory,
11 UserFactory,
12)
13from ...models.review_models import Review
14from ...models.submission_models import Submission, SubmissionState
15from ...models.user_models import User
16from ..base_test_case import BaseTestCase
19class ReviewerTestCase(BaseTestCase):
20 used_models = [Review, Submission]
21 class_used_models = [User]
23 @classmethod
24 def setUpClass(cls) -> None:
25 super().setUpClass()
26 cls.user_author = UserFactory.create()
27 cls.user_reviewer = UserFactory.create()
29 def test_submissions(self):
30 submission_1 = SubmissionFactory.create(created_by=self.user_author)
31 version_1 = SubmissionVersionFactory.create(submission=submission_1)
32 submission_2 = SubmissionFactory.create(created_by=self.user_author)
33 version_2 = SubmissionVersionFactory.create(submission=submission_2)
34 submission_3 = SubmissionFactory.create(created_by=self.user_reviewer)
35 version_3 = SubmissionVersionFactory.create(submission=submission_3)
37 review_1 = ReviewFactory.create(version=version_1, reviewer=self.user_reviewer)
38 review_2 = ReviewFactory.create(version=version_2, reviewer=self.user_reviewer)
39 review_3 = ReviewFactory.create(version=version_3)
41 role = Reviewer(self.user_reviewer)
42 self.assertTrue(role.active)
44 rights = role.rights
45 self.assertEqual(len(rights.submissions), 2)
46 self.assertIn(submission_1, rights.submissions)
47 self.assertIn(submission_2, rights.submissions)
49 self.assertEqual(len(rights.reviews), 2)
50 self.assertIn(review_1, rights.reviews)
51 self.assertIn(review_2, rights.reviews)
53 self.assertTrue(rights.can_access_submission(submission_1))
54 self.assertTrue(rights.can_access_submission(submission_2))
55 self.assertFalse(rights.can_access_submission(submission_3))
57 self.assertTrue(rights.can_access_version(version_1))
58 self.assertTrue(rights.can_access_version(version_2))
59 self.assertFalse(rights.can_access_version(version_3))
61 self.assertTrue(rights.can_access_review(review_1))
62 self.assertTrue(rights.can_access_review(review_2))
63 self.assertFalse(rights.can_access_review(review_3))
65 def test_get_current_open_review(self):
66 submission = SubmissionFactory.create(created_by=self.user_author)
67 version_1 = SubmissionVersionFactory.create(
68 submission=submission, submitted=True, review_open=True
69 )
71 review_1 = ReviewFactory.create(reviewer=self.user_reviewer, version=version_1)
73 rights = ReviewerRights(self.user_reviewer)
74 self.assertEqual(review_1, rights.get_current_open_review(version_1))
76 version_1.review_open = False
77 version_1.save()
78 rights = ReviewerRights(self.user_reviewer)
79 self.assertIsNone(rights.get_current_open_review(version_1))
81 # Refresh cache
82 submission = Submission.objects.get(pk=submission.pk)
83 version_2 = SubmissionVersionFactory.create(
84 submission=submission, submitted=True, review_open=True
85 )
86 rights = ReviewerRights(self.user_reviewer)
87 self.assertIsNone(rights.get_current_open_review(version_1))
88 self.assertIsNone(rights.get_current_open_review(version_2))
90 review_2 = ReviewFactory.create(reviewer=self.user_reviewer, version=version_2)
91 rights = ReviewerRights(self.user_reviewer)
92 self.assertIsNone(rights.get_current_open_review(version_1))
93 self.assertEqual(review_2, rights.get_current_open_review(version_2))
95 review_2.submitted = True
96 review_2.save()
97 rights = ReviewerRights(self.user_reviewer)
98 self.assertIsNone(rights.get_current_open_review(version_1))
99 self.assertIsNone(rights.get_current_open_review(version_2))
101 def test_can_edit_review(self):
102 submission = SubmissionFactory.create(created_by=self.user_author)
103 version = SubmissionVersionFactory.create(
104 submission=submission, submitted=True, review_open=True
105 )
107 review = ReviewFactory.create(reviewer=self.user_reviewer, version=version)
108 rights = ReviewerRights(self.user_reviewer)
110 self.assertTrue(rights.can_edit_review(review))
112 version.review_open = False
113 version.save()
114 rights = ReviewerRights(self.user_reviewer)
115 self.assertFalse(rights.can_edit_review(review))
117 version.review_open = True
118 version.save()
119 review.submitted = True
120 review.save()
121 rights = ReviewerRights(self.user_reviewer)
122 self.assertFalse(rights.can_edit_review(review))
124 @override_settings(MESH_BLIND_MODE=BlindMode.NO_BLIND.value)
125 def test_can_access_submission_author(self):
126 submission = SubmissionFactory.create(created_by=self.user_author)
127 version = SubmissionVersionFactory.create(
128 submission=submission, submitted=True, review_open=True
129 )
131 ReviewFactory.create(reviewer=self.user_reviewer, version=version)
132 rights = ReviewerRights(self.user_reviewer)
134 self.assertTrue(rights.can_access_submission_author(submission))
136 with override_settings(MESH_BLIND_MODE=BlindMode.SINGLE_BLIND.value):
137 self.assertTrue(rights.can_access_submission_author(submission))
139 with override_settings(MESH_BLIND_MODE=BlindMode.DOUBLE_BLIND.value):
140 self.assertFalse(rights.can_access_submission_author(submission))
142 def test_submission_status(self):
143 submission = SubmissionFactory.create(created_by=self.user_author)
144 version = SubmissionVersionFactory.create(
145 submission=submission, submitted=True, review_open=True
146 )
147 rights = ReviewerRights(self.user_reviewer)
149 # No access to the submission
150 status = rights.get_submission_status(submission)
151 self.assertEqual(status.status, SubmissionStatus.ERROR)
153 # A review request for the current version
154 review = ReviewFactory.create(reviewer=self.user_reviewer, version=version)
155 rights = ReviewerRights(self.user_reviewer)
156 submission = Submission.objects.get(pk=submission.pk)
157 status = rights.get_submission_status(submission)
158 self.assertEqual(status.status, SubmissionStatus.TODO)
160 # An accepted review request for the current version
161 review.accepted = True
162 review.save()
163 rights = ReviewerRights(self.user_reviewer)
164 submission = Submission.objects.get(pk=submission.pk)
165 status = rights.get_submission_status(submission)
166 self.assertEqual(status.status, SubmissionStatus.TODO)
168 # An accepted review request for the current version with review process closed
169 version.review_open = False
170 version.save()
171 rights = ReviewerRights(self.user_reviewer)
172 submission = Submission.objects.get(pk=submission.pk)
173 status = rights.get_submission_status(submission)
174 self.assertEqual(status.status, SubmissionStatus.WAITING)
176 # Re-open review process
177 version.review_open = True
178 version.save()
179 rights = ReviewerRights(self.user_reviewer)
180 submission = Submission.objects.get(pk=submission.pk)
181 status = rights.get_submission_status(submission)
182 self.assertEqual(status.status, SubmissionStatus.TODO)
184 # An declined review request for the current version
185 review.accepted = False
186 review.save()
187 rights = ReviewerRights(self.user_reviewer)
188 submission = Submission.objects.get(pk=submission.pk)
189 status = rights.get_submission_status(submission)
190 self.assertEqual(status.status, SubmissionStatus.DONE)
192 # A submitted review for the current version
193 review.submitted = True
194 review.save()
195 rights = ReviewerRights(self.user_reviewer)
196 submission = Submission.objects.get(pk=submission.pk)
197 status = rights.get_submission_status(submission)
198 self.assertEqual(status.status, SubmissionStatus.WAITING)
200 # New version with no review attached.
201 version.review_open = False
202 version.save()
203 version = SubmissionVersionFactory.create(
204 submission=submission, submitted=True, review_open=True
205 )
206 rights = ReviewerRights(self.user_reviewer)
207 submission = Submission.objects.get(pk=submission.pk)
208 status = rights.get_submission_status(submission)
209 self.assertEqual(status.status, SubmissionStatus.WAITING)
211 # Accepted submission
212 submission.state = SubmissionState.ACCEPTED.value
213 submission.save()
214 rights = ReviewerRights(self.user_reviewer)
215 submission = Submission.objects.get(pk=submission.pk)
216 status = rights.get_submission_status(submission)
217 self.assertEqual(status.status, SubmissionStatus.DONE)
219 # Rejected submission
220 submission.state = SubmissionState.REJECTED.value
221 submission.save()
222 rights = ReviewerRights(self.user_reviewer)
223 submission = Submission.objects.get(pk=submission.pk)
224 status = rights.get_submission_status(submission)
225 self.assertEqual(status.status, SubmissionStatus.DONE)