Coverage for src / mesh / tests / workflow / tests / test_workflow_base.py: 97%
62 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +0000
1import random
2import re
4from django.core import mail
5from django.core.files.uploadedfile import SimpleUploadedFile
6from django.test import Client, TestCase, override_settings
7from faker import Faker
9from mesh.models.orm.user_models import User
10from mesh.models.roles.editor import Editor
11from mesh.models.roles.journal_manager import JournalManager
12from mesh.models.roles.reviewer import Reviewer
13from mesh.tests.workflow.helpers.workflow_state_initiators import WorkflowStateInitiators
16@override_settings(EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend")
17class WorkflowBaseTest(TestCase):
18 def setUp(self):
19 # settings.DEBUG = True
20 mail.outbox = []
22 self.author_user = User.objects.create_user(email="author@uga.fr", password="mesh_pw123")
23 self.journal_manager_user = User.objects.create_user(
24 email="journal_manager@uga.fr",
25 password="mesh_pw123",
26 journal_manager=True,
27 current_role=JournalManager.code(),
28 )
29 self.editor_user = User.objects.create_user(
30 email="editor@uga.fr", password="mesh_pw123", current_role=Editor.code()
31 )
32 self.reviewer_user = User.objects.create_user(
33 email="reviewer@uga.fr", password="mesh_pw123", current_role=Reviewer.code()
34 )
36 # JournalManager.objects.create(user=self.journal_manager_user)
37 # Editor.objects.create(user=self.editor_user)
38 # Reviewer.objects.create(user=self.reviewer_user)
40 self.author_client = Client()
41 self.journal_manager_client = Client()
42 self.editor_client = Client()
43 self.reviewer_client = Client()
45 self.author_client.force_login(self.author_user)
46 self.journal_manager_client.force_login(self.journal_manager_user)
47 self.editor_client.force_login(self.editor_user)
48 self.reviewer_client.force_login(self.reviewer_user)
50 self.workflow_state_initiators = WorkflowStateInitiators()
52 def get_reviewer_token_url(self):
53 email = mail.outbox[0]
54 match = re.search(r"/login-token\S+", email.body)
55 return "http://127.0.0.1:8000" + match.group(0)[:-1]
57 def get_pdf(self, file_nbr: int = None):
58 if file_nbr is None:
59 file_nbr = random.randint(1, 5)
60 pdf_name = f"revue_episciences_{file_nbr}.pdf"
61 pdf_file = SimpleUploadedFile(
62 pdf_name,
63 b"%PDF-1.4\n%...\n%%EOF",
64 content_type="application/pdf",
65 )
66 ## Test with real files
67 # pdf_file = SimpleUploadedFile(
68 # f"../tests_files/{pdf_name}",
69 # b"%PDF-1.4 test\n%%EOF",
70 # content_type="application/pdf",
71 # )
72 api_article_update_data = { # noqa: F841
73 "astype": "",
74 "kwds": [],
75 "pid": "",
76 "container_pid": "",
77 "contributors": [
78 {
79 "orcid": "",
80 "idref": "",
81 "mid": "",
82 "first_name": "Thomas",
83 "last_name": "Delawarre",
84 "prefix": "",
85 "suffix": "",
86 "email": "t@d.fr",
87 "string_name": "",
88 "addresses": [],
89 "address_text": "",
90 "ror": [],
91 "role": "author",
92 "deceased_before_publication": False,
93 "equal_contrib": False,
94 "contrib_xml": "",
95 "corresponding": False,
96 "seq": 1,
97 }
98 ],
99 "lang": "en",
100 "trans_lang": "fr",
101 "pcj_topics": [],
102 "conference": "",
103 "bibitems": [],
104 "dates": [{"type": "type", "date": "accepted"}],
105 "pci_section": {"lang": "en", "type": "pci", "value": ""},
106 "pdf": {"pdf_name": pdf_name},
107 "illustration": {"illustration_name": ""},
108 "title_html": [{"lang": "en", "value": "<p>Mon titre</p>\n"}],
109 "abstracts": [{"lang": "en", "value": "<p>This is my abstract</p>\n"}],
110 "titles": [[{"lang": "en", "value": "<p>Mon titre</p>\n"}]],
111 }
112 return pdf_file, api_article_update_data
114 def create_fake_reviewer_data(self):
115 fake = Faker(["fr", "en"])
117 reviewer_first_name = fake.first_name()
118 reviewer_last_name = fake.last_name()
119 reviewer_email = fake.unique.email()
120 reviewer_profile = {
121 "first_name": reviewer_first_name,
122 "last_name": reviewer_last_name,
123 "email": reviewer_email,
124 "keywords": "",
125 }
126 return reviewer_profile
128 def get_request_reviewer_data(self, reviewer_select="new", suggested_user="", quick="off"):
129 """
130 reviewer_select: str, "new" or "shortlist", whether the reviewer is a new one or selected from the shortlist
131 quick: str, "on" or "off", whether the review is a quick review or not
132 suggested_user: str, email or username of the suggested reviewer
133 """
134 fake = Faker(["fr", "en"])
136 if reviewer_select == "new":
137 reviewer_first_name = fake.first_name()
138 reviewer_last_name = fake.last_name()
139 reviewer_email = fake.unique.email()
140 else:
141 try:
142 # if suggested_user == "":
143 # suggested_user_pk_list = Suggestion.objects.values_list('pk', flat=True)
144 # suggested_user = str(random.choice(suggested_user_pk_list))
145 # # reviewer = Suggestion.objects.filter(suggested_user__email="reviewer@uga.fr").first().suggested_user
146 # suggested_reviewer = SuggestedReviewer.objects.all().first()
147 suggested_user = "1"
148 reviewer_email = ""
149 reviewer_first_name = ""
150 reviewer_last_name = ""
151 except Exception as e:
152 raise ValueError(f"Suggested user not found due to Error : {e}")
154 reviewer_profile = {
155 "first_name": reviewer_first_name,
156 "last_name": reviewer_last_name,
157 "email": reviewer_email,
158 "keywords": "",
159 }
161 review_request_data = {
162 "suggested_user": suggested_user,
163 "quick": quick,
164 "reviewer_select": reviewer_select,
165 "reviewer_email": reviewer_email,
166 "reviewer_first_name": reviewer_first_name,
167 "reviewer_last_name": reviewer_last_name,
168 "date_response_due": "2030-03-10",
169 "date_review_due": "2030-03-15",
170 "request_email_subject": "New referee request",
171 "quick_request_email_subject": "New referee request for a quick review",
172 "request_email": """<div>Dear {{ RECIPIENT }},<br />
173 A review review has been requested for the submission: <a href="http://127.0.0.1:8000/submissions/1/">hello </a><br />
174 Alternatively, you can directly access the application without setting a password using the following link <a href="{{ TOKEN_AUTH_URL|safe }}">{{ TOKEN_AUTH_URL }}</a>.<br />
175 """,
176 "quick_request_email": """<div>Dear {{ RECIPIENT }},<br />
177 A quick review has been requested for the submission: <a href="http://127.0.0.1:8000/submissions/1/">world </a><br />
178 Alternatively, you can directly access the application without setting a password using the following link <a href="{{ TOKEN_AUTH_URL|safe }}">{{ TOKEN_AUTH_URL }}</a>.<br />
179 """,
180 }
181 return review_request_data, reviewer_profile