Coverage for src / mesh / tests / workflow / helpers / editor_request_helpers.py: 95%

82 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-05-04 12:41 +0000

1import logging 

2 

3from django.core.files.uploadedfile import SimpleUploadedFile 

4from django.urls import reverse 

5 

6from mesh.models.orm.review_models import ReviewState 

7from mesh.models.orm.submission_models import Submission, SubmissionState 

8from mesh.tests.workflow.helpers.base_helpers import ( 

9 assert_decision_comment, 

10 assert_review_state, 

11 assert_submission_state, 

12 check_submission_detail_page, 

13) 

14 

15logger = logging.getLogger(__name__) 

16 

17 

18def create_reviewer(client, reviewer_profile, expected_status_code=302): 

19 response = client.post(reverse("mesh:reviewer_list"), data=reviewer_profile) 

20 assert response.status_code == expected_status_code, ( 

21 f"Error on create reviewer response status code, expected {expected_status_code}, got {response.status_code}" 

22 ) 

23 

24 

25### Editorial decision helpers ### 

26 

27 

28def get_reviewer_shortlist_page(client, expected_status_code=200): 

29 response = client.get( 

30 reverse("mesh:reviewer_list"), 

31 ) 

32 assert response.status_code == expected_status_code, ( 

33 f"Error on get reviewer shortlist response status code, expected {expected_status_code}, got {response.status_code}" 

34 ) 

35 

36 

37def add_reviewer_to_shortlist(client, reviewer_data, expected_status_code=302): 

38 response = client.post( 

39 reverse("mesh:reviewer_list"), 

40 data=reviewer_data, 

41 ) 

42 assert response.status_code == expected_status_code, ( 

43 f"Error on add reviewer to shortlist response status code, expected {expected_status_code}, got {response.status_code}" 

44 ) 

45 

46 

47def add_reviewer_to_shortlist_workflow(client, reviewer_data): 

48 get_reviewer_shortlist_page(client) 

49 add_reviewer_to_shortlist(client, reviewer_data) 

50 

51 

52def make_editorial_decision( 

53 client, 

54 submission_pk, 

55 decision="rejected", 

56 comment="<p>Some editorial decision comment</p>", 

57 additional_files=SimpleUploadedFile("file.pdf", b"%PDF1.3\nfile_contentxxxxxxxxxxx"), 

58 expected_status_code=302, 

59): 

60 """ 

61 decision in list [accepted, rejected, rev_requested]""" 

62 data = { 

63 "value": decision, 

64 "comment": comment, 

65 "additional_files": additional_files, 

66 } 

67 response = client.post( 

68 reverse("mesh:editorial_decision_create", kwargs={"submission_pk": submission_pk}), 

69 data=data, 

70 ) 

71 assert response.status_code == expected_status_code, ( 

72 f"Error on make_editorial_decision response status code, expected {expected_status_code}, got {response.status_code}" 

73 ) 

74 

75 

76def update_editorial_decision( 

77 client, 

78 submission_pk, 

79 version_pk, 

80 decision=None, 

81 comment="<p>Some editorial decision comment</p>", 

82 expected_status_code=302, 

83): 

84 """ 

85 decision in list [accepted, rejected, rev_requested]""" 

86 response = client.post( 

87 reverse( 

88 "mesh:editorial_decision_update", 

89 kwargs={"submission_pk": submission_pk, "version_pk": version_pk}, 

90 ), 

91 data={"comment": comment}, 

92 ) 

93 assert response.status_code == expected_status_code, ( 

94 f"Error on make_editorial_decision response status code, expected {expected_status_code}, got {response.status_code}" 

95 ) 

96 

97 

98def reject_submission_workflow(client, submission_pk, expected_state=SubmissionState.REJECTED): 

99 check_submission_detail_page(client, submission_pk) 

100 make_editorial_decision( 

101 client, 

102 submission_pk=submission_pk, 

103 decision=expected_state.value, 

104 additional_files=SimpleUploadedFile( 

105 "file_reject.pdf", b"%PDF1.3\nfile_contentxxxxxxxxxxx" 

106 ), 

107 ) 

108 assert_submission_state(submission_pk=submission_pk, expected_state=expected_state) 

109 check_submission_detail_page(client, submission_pk) 

110 

111 

112def accept_submission_workflow(client, submission_pk, expected_state=SubmissionState.ACCEPTED): 

113 check_submission_detail_page(client, submission_pk) 

114 make_editorial_decision( 

115 client, 

116 submission_pk=submission_pk, 

117 decision=expected_state.value, 

118 additional_files=SimpleUploadedFile( 

119 "file_accept.pdf", b"%PDF1.3\nfile_contentxxxxxxxxxxx" 

120 ), 

121 ) 

122 assert_submission_state(submission_pk=submission_pk, expected_state=expected_state) 

123 check_submission_detail_page(client, submission_pk) 

124 

125 

126def request_revision_workflow( 

127 client, submission_pk, expected_state=SubmissionState.REVISION_REQUESTED 

128): 

129 check_submission_detail_page(client, submission_pk) 

130 make_editorial_decision( 

131 client, 

132 submission_pk=submission_pk, 

133 decision="rev_requested", 

134 additional_files=SimpleUploadedFile( 

135 "file_request.pdf", b"%PDF1.3\nfile_contentxxxxxxxxxxx" 

136 ), 

137 ) 

138 assert_submission_state(submission_pk=submission_pk, expected_state=expected_state) 

139 check_submission_detail_page(client, submission_pk) 

140 

141 

142def edit_revision_workflow(client, submission_pk, expected_state=SubmissionState.REJECTED): 

143 check_submission_detail_page(client, submission_pk) 

144 make_editorial_decision( 

145 client, 

146 submission_pk=submission_pk, 

147 decision=expected_state.value, 

148 additional_files=SimpleUploadedFile("file_2.pdf", b"%PDF1.3\nfile_contentxxxxxxxxxxx"), 

149 ) 

150 version_pk = Submission.objects.get(pk=submission_pk).versions.first().pk 

151 get_decision_edit_page(client, submission_pk, version_pk) 

152 # Trying to change the decision state should NOT update it 

153 update_editorial_decision( 

154 client, 

155 submission_pk=submission_pk, 

156 version_pk=version_pk, 

157 decision="rev_requested", 

158 comment="I made a typo", 

159 ) 

160 assert_submission_state(submission_pk=submission_pk, expected_state=expected_state) 

161 assert_decision_comment(version_pk, "I made a typo") 

162 

163 

164### Request revision helpers ### 

165 

166 

167def get_request_review_page(client, submission_pk, version_pk, expected_status_code=200): 

168 response = client.get( 

169 reverse( 

170 "mesh:review_create", kwargs={"submission_pk": submission_pk, "version_pk": version_pk} 

171 ), 

172 ) 

173 assert response.status_code == expected_status_code, ( 

174 f"Error on get_request_review_page response status code, expected {expected_status_code}, got {response.status_code}" 

175 ) 

176 

177 

178def get_decision_edit_page(client, submission_pk, version_pk, expected_status_code=200): 

179 response = client.get( 

180 reverse( 

181 "mesh:editorial_decision_update", 

182 kwargs={"submission_pk": submission_pk, "version_pk": version_pk}, 

183 ), 

184 ) 

185 assert response.status_code == expected_status_code, ( 

186 f"Error on get_request_review_page response status code, expected {expected_status_code}, got {response.status_code}" 

187 ) 

188 

189 

190def remove_reviewer_to_review_shortlist( 

191 client, submission_pk, user_pk="1", expected_status_code=200 

192): 

193 response = client.get( 

194 reverse( 

195 "mesh:remove_reviewer_from_shortlist", kwargs={"pk": submission_pk, "user_pk": user_pk} 

196 ), 

197 ) 

198 assert response.status_code == expected_status_code, ( 

199 f"Error on remove_reviewer_to_review_shortlist response status code, expected {expected_status_code}, got {response.status_code}" 

200 ) 

201 

202 

203def request_review(client, submission_pk, version_pk, data, expected_status_code=302): 

204 response = client.post( 

205 reverse( 

206 "mesh:review_create", kwargs={"submission_pk": submission_pk, "version_pk": version_pk} 

207 ), 

208 data=data, 

209 ) 

210 assert response.status_code == expected_status_code, ( 

211 f"Error on request_review response status code, expected {expected_status_code}, got {response.status_code}" 

212 ) 

213 

214 

215def submission_add_reviewer_to_shortlist( 

216 client, submission_pk, user_pk="1", user_type="reviewer", expected_status_code=200 

217): 

218 response = client.post( 

219 reverse( 

220 "mesh:submission_add_reviewer_to_shortlist", 

221 kwargs={ 

222 "submission_pk": submission_pk, 

223 # "version_pk": version_pk, 

224 "user_pk": user_pk, 

225 "user_type": user_type, 

226 }, 

227 ), 

228 # data=data, 

229 ) 

230 assert response.status_code == expected_status_code, ( 

231 f"Error on submission_add_reviewer_to_shortlist response status code, expected {expected_status_code}, got {response.status_code}" 

232 ) 

233 

234 

235def request_review_workflow(client, submission_pk, request_review_data): 

236 submission = Submission.objects.get(pk=submission_pk) 

237 version = submission.versions.last() 

238 version_pk = version.pk 

239 

240 check_submission_detail_page(client, submission_pk) 

241 get_request_review_page(client, submission_pk, version_pk) 

242 request_review(client, submission_pk, version_pk, data=request_review_data) 

243 assert_review_state( 

244 submission_pk=submission_pk, expected_review_state=ReviewState.AWAITING_ACCEPTANCE 

245 ) 

246 

247 

248def request_review_with_shortlist_workflow( 

249 client, submission_pk, request_review_data, reviewer_data, user_type="reviewer" 

250): 

251 """ 

252 user_type in list ['reviewer', 'user'] 

253 """ 

254 submission = Submission.objects.get(pk=submission_pk) 

255 version = submission.versions.last() 

256 version_pk = version.pk 

257 

258 # reviewer_user = get_suggestion(request_review_data[1]['suggested_user']).suggested_user 

259 

260 check_submission_detail_page(client, submission_pk) 

261 get_request_review_page(client, submission_pk, version_pk) 

262 reviewer_user_pk = "1" 

263 submission_add_reviewer_to_shortlist( 

264 client, submission_pk, user_pk=reviewer_user_pk, user_type=user_type 

265 ) 

266 request_review(client, submission_pk, version_pk, data=request_review_data) 

267 assert_review_state( 

268 submission_pk=submission_pk, expected_review_state=ReviewState.AWAITING_ACCEPTANCE 

269 )