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

1import random 

2import re 

3 

4from django.core import mail 

5from django.core.files.uploadedfile import SimpleUploadedFile 

6from django.test import Client, TestCase, override_settings 

7from faker import Faker 

8 

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 

14 

15 

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 = [] 

21 

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 ) 

35 

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) 

39 

40 self.author_client = Client() 

41 self.journal_manager_client = Client() 

42 self.editor_client = Client() 

43 self.reviewer_client = Client() 

44 

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) 

49 

50 self.workflow_state_initiators = WorkflowStateInitiators() 

51 

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] 

56 

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 

113 

114 def create_fake_reviewer_data(self): 

115 fake = Faker(["fr", "en"]) 

116 

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 

127 

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"]) 

135 

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}") 

153 

154 reviewer_profile = { 

155 "first_name": reviewer_first_name, 

156 "last_name": reviewer_last_name, 

157 "email": reviewer_email, 

158 "keywords": "", 

159 } 

160 

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