Coverage for src / mesh / tests / roles / test_reviewer.py: 100%
159 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-08-11 09:47 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-08-11 09:47 +0000
1from django.test import override_settings
3from mesh.app_settings import BlindMode
4from mesh.models.orm.factories import (
5 ReviewFactory,
6 SubmissionFactory,
7 SubmissionVersionFactory,
8 UserFactory,
9)
10from mesh.models.orm.review_models import Review
11from mesh.models.orm.submission_models import Submission, SubmissionState
12from mesh.models.orm.user_models import User
13from mesh.models.roles.reviewer import Reviewer
14from mesh.models.submission_status import SubmissionStatus
15from mesh.tests.base_test_case import BaseTestCase
18class ReviewerTestCase(BaseTestCase):
19 used_models = [Review, Submission]
20 class_used_models = [User]
22 @classmethod
23 def setUpClass(cls) -> None:
24 super().setUpClass()
25 cls.user_author = UserFactory.create()
26 cls.user_reviewer = UserFactory.create()
28 def test_submissions(self):
29 submission_1 = SubmissionFactory.create(created_by=self.user_author)
30 version_1 = SubmissionVersionFactory.create(submission=submission_1)
31 submission_2 = SubmissionFactory.create(created_by=self.user_author)
32 version_2 = SubmissionVersionFactory.create(submission=submission_2)
33 submission_3 = SubmissionFactory.create(created_by=self.user_reviewer)
34 version_3 = SubmissionVersionFactory.create(submission=submission_3)
36 review_1 = ReviewFactory.create(version=version_1, reviewer=self.user_reviewer)
37 review_2 = ReviewFactory.create(version=version_2, reviewer=self.user_reviewer)
38 review_3 = ReviewFactory.create(version=version_3)
40 role = Reviewer(self.user_reviewer)
41 # self.assertTrue(role.active)
43 submissions = role.get_submissions()
44 self.assertEqual(len(submissions), 2)
45 self.assertIn(submission_1, submissions)
46 self.assertIn(submission_2, submissions)
48 censored_submission_1 = next(s for s in submissions if s == submission_1)
49 version_censored_1 = next(
50 v for v in censored_submission_1.versions_censored if v == version_1
51 )
52 review_censored_1 = next(r for r in version_censored_1.reviews_censored if r == review_1)
53 censored_submission_2 = next(s for s in submissions if s == submission_2)
54 version_censored_2 = next(
55 v for v in censored_submission_2.versions_censored if v == version_2
56 )
57 review_censored_2 = next(r for r in version_censored_2.reviews_censored if r == review_2)
59 self.assertTrue(role.can_access_submission(censored_submission_1))
60 self.assertTrue(role.can_access_submission(censored_submission_2))
61 self.assertFalse(role.can_access_submission(submission_3))
63 self.assertTrue(role.can_access_version(version_censored_1))
64 self.assertTrue(role.can_access_version(version_censored_2))
65 self.assertFalse(role.can_access_version(version_3))
67 self.assertTrue(role.can_access_review(submission_1, review_censored_1))
68 self.assertTrue(role.can_access_review(submission_2, review_censored_2))
69 self.assertFalse(role.can_access_review(submission_3, review_3))
71 def test_get_current_open_review(self):
72 submission = SubmissionFactory.create(created_by=self.user_author)
73 version_1 = SubmissionVersionFactory.create(
74 submission=submission, submitted=True, review_open=True
75 )
77 review_1 = ReviewFactory.create(reviewer=self.user_reviewer, version=version_1)
79 role = Reviewer(self.user_reviewer)
81 submission = role.get_submissions().get(pk=submission.pk)
82 version_censored_1 = next(v for v in submission.versions_censored if v == version_1)
83 self.assertEqual(review_1, role.get_current_open_review(version_censored_1))
85 version_1.review_open = False
86 version_1.save()
88 submission = role.get_submissions().get(pk=submission.pk)
89 version_censored_1 = next(v for v in submission.versions_censored if v == version_1)
90 self.assertIsNone(role.get_current_open_review(version_censored_1))
92 # Refresh cache
93 version_2 = SubmissionVersionFactory.create(
94 submission=submission, submitted=True, review_open=True
95 )
97 submission = role.get_submissions().get(pk=submission.pk)
98 version_censored_1 = next(v for v in submission.versions_censored if v == version_1)
99 with self.assertRaises(StopIteration):
100 next(v for v in submission.versions_censored if v == version_2)
101 self.assertIsNone(role.get_current_open_review(version_censored_1))
102 # self.assertIsNone(role.get_current_open_review(version_censored_2))
104 review_2 = ReviewFactory.create(reviewer=self.user_reviewer, version=version_2)
106 submission = role.get_submissions().get(pk=submission.pk)
107 version_censored_2 = next(v for v in submission.versions_censored if v == version_2)
108 self.assertIsNone(role.get_current_open_review(version_censored_1))
109 self.assertEqual(review_2, role.get_current_open_review(version_censored_2))
111 review_2.submitted = True
112 review_2.save()
114 submission = role.get_submissions().get(pk=submission.pk)
115 version_censored_2 = next(v for v in submission.versions_censored if v == version_2)
116 self.assertIsNone(role.get_current_open_review(version_censored_1))
117 self.assertIsNone(role.get_current_open_review(version_censored_2))
119 def test_can_edit_review(self):
120 submission = SubmissionFactory.create(created_by=self.user_author)
121 version = SubmissionVersionFactory.create(
122 submission=submission, submitted=True, review_open=True
123 )
125 review = ReviewFactory.create(reviewer=self.user_reviewer, version=version)
126 role = Reviewer(self.user_reviewer)
128 self.assertTrue(role.can_edit_review(submission, review))
130 version.review_open = False
131 version.save()
132 self.assertFalse(role.can_edit_review(submission, review))
134 version.review_open = True
135 version.save()
136 review.submitted = True
137 review.save()
138 self.assertFalse(role.can_edit_review(submission, review))
140 def test_can_access_submission_author(self):
141 submission = SubmissionFactory.create(created_by=self.user_author)
142 version = SubmissionVersionFactory.create(
143 submission=submission, submitted=True, review_open=True
144 )
146 ReviewFactory.create(reviewer=self.user_reviewer, version=version)
148 with override_settings(MESH_BLIND_MODE=BlindMode.SINGLE_BLIND.value):
149 # HACK : We cannot test our custom query with sqlite...
150 # Knowing that it crashes should be enough to ensure the StrAggr gets at least parsed
151 role = Reviewer(self.user_reviewer)
152 submission = role.get_submissions().get(pk=submission.pk)
154 self.assertEqual(len(submission.authors_censored), 0)
156 with override_settings(MESH_BLIND_MODE=BlindMode.SINGLE_BLIND.value):
157 role = Reviewer(self.user_reviewer)
159 submission = role.get_submissions().get(pk=submission.pk)
161 self.assertEqual(len(submission.authors_censored), 0)
163 with override_settings(MESH_BLIND_MODE=BlindMode.DOUBLE_BLIND.value):
164 role = Reviewer(self.user_reviewer)
165 submission = role.get_submissions().get(pk=submission.pk)
166 self.assertEqual(submission.authors_string, "**** ****")
167 self.assertEqual(len(submission.authors_censored), 0)
169 def test_submission_status(self):
170 submission = SubmissionFactory.create(created_by=self.user_author)
171 version = SubmissionVersionFactory.create(
172 submission=submission, submitted=True, review_open=True
173 )
174 role = Reviewer(self.user_reviewer)
176 # No access to the submission
177 with self.assertRaises(Submission.DoesNotExist):
178 submission = role.get_submissions().get(pk=submission.pk)
179 # status = role.get_submission_status(submission)
180 # self.assertEqual(status.status, SubmissionStatus.ERROR)
182 # A review request for the current version
183 review = ReviewFactory.create(reviewer=self.user_reviewer, version=version)
185 submission = role.get_submissions().get(pk=submission.pk)
186 status = role.get_submission_status(submission)
187 self.assertEqual(status.status, SubmissionStatus.TODO)
189 # An accepted review request for the current version
190 review.accepted = True
191 review.save()
193 submission = role.get_submissions().get(pk=submission.pk)
194 status = role.get_submission_status(submission)
195 self.assertEqual(status.status, SubmissionStatus.TODO)
197 # An accepted review request for the current version with review process closed
198 version.review_open = False
199 version.save()
201 submission = role.get_submissions().get(pk=submission.pk)
202 status = role.get_submission_status(submission)
203 self.assertEqual(status.status, SubmissionStatus.WAITING)
205 # Re-open review process
206 version.review_open = True
207 version.save()
209 submission = role.get_submissions().get(pk=submission.pk)
210 status = role.get_submission_status(submission)
211 self.assertEqual(status.status, SubmissionStatus.TODO)
213 # An declined review request for the current version
214 review.accepted = False
215 review.save()
217 submission = role.get_submissions().get(pk=submission.pk)
218 status = role.get_submission_status(submission)
219 self.assertEqual(status.status, SubmissionStatus.DONE)
221 # A submitted review for the current version
222 review.submitted = True
223 review.save()
225 submission = role.get_submissions().get(pk=submission.pk)
226 status = role.get_submission_status(submission)
227 self.assertEqual(status.status, SubmissionStatus.WAITING)
229 # New version with no review attached.
230 version.review_open = False
231 version.save()
232 version = SubmissionVersionFactory.create(
233 submission=submission, submitted=True, review_open=True
234 )
236 submission = role.get_submissions().get(pk=submission.pk)
237 status = role.get_submission_status(submission)
238 self.assertEqual(status.status, SubmissionStatus.WAITING)
240 # Accepted submission
241 submission.state = SubmissionState.ACCEPTED.value
242 submission.save()
244 submission = role.get_submissions().get(pk=submission.pk)
245 status = role.get_submission_status(submission)
246 self.assertEqual(status.status, SubmissionStatus.DONE)
248 # Rejected submission
249 submission.state = SubmissionState.REJECTED.value
250 submission.save()
252 submission = role.get_submissions().get(pk=submission.pk)
253 status = role.get_submission_status(submission)
254 self.assertEqual(status.status, SubmissionStatus.DONE)