@@ -190,4 +190,165 @@ def test_export_progress_with_failed_celery_task(
190
190
assert (
191
191
artist_export_job .export_status == ExportJob .ExportStatus .EXPORT_ERROR
192
192
)
193
- assert artist_export_job .error_message == expected_error_message
193
+
194
+
195
+ @pytest .mark .django_db (transaction = True )
196
+ def test_cancel_export_admin_action (
197
+ client : Client ,
198
+ superuser : User ,
199
+ mocker : pytest_mock .MockerFixture ,
200
+ ):
201
+ """Test `cancel_export` via admin action."""
202
+ client .force_login (superuser )
203
+
204
+ revoke_mock = mocker .patch ("celery.current_app.control.revoke" )
205
+ export_data_mock = mocker .patch (
206
+ "import_export_extensions.models.ExportJob.export_data" ,
207
+ )
208
+ job : ExportJob = ArtistExportJobFactory ()
209
+
210
+ response = client .post (
211
+ reverse ("admin:import_export_extensions_exportjob_changelist" ),
212
+ data = {
213
+ "action" : "cancel_jobs" ,
214
+ "_selected_action" : [job .pk ],
215
+ },
216
+ )
217
+ job .refresh_from_db ()
218
+
219
+ assert response .status_code == status .HTTP_302_FOUND
220
+ assert job .export_status == ExportJob .ExportStatus .CANCELLED
221
+ assert (
222
+ response .wsgi_request ._messages ._queued_messages [0 ].message
223
+ == f"Export of { job } canceled"
224
+ )
225
+ export_data_mock .assert_called_once ()
226
+ revoke_mock .assert_called_once_with (job .export_task_id , terminate = True )
227
+
228
+
229
+ @pytest .mark .django_db (transaction = True )
230
+ def test_cancel_export_admin_action_with_incorrect_export_job_status (
231
+ client : Client ,
232
+ superuser : User ,
233
+ mocker : pytest_mock .MockerFixture ,
234
+ ):
235
+ """Test `cancel_export` via admin action with wrong export job status."""
236
+ client .force_login (superuser )
237
+
238
+ revoke_mock = mocker .patch ("celery.current_app.control.revoke" )
239
+ job : ExportJob = ArtistExportJobFactory ()
240
+
241
+ expected_error_message = f"ExportJob with id { job .pk } has incorrect status"
242
+
243
+ response = client .post (
244
+ reverse ("admin:import_export_extensions_exportjob_changelist" ),
245
+ data = {
246
+ "action" : "cancel_jobs" ,
247
+ "_selected_action" : [job .pk ],
248
+ },
249
+ )
250
+ job .refresh_from_db ()
251
+
252
+ assert response .status_code == status .HTTP_302_FOUND
253
+ assert job .export_status == ExportJob .ExportStatus .EXPORTED
254
+ assert (
255
+ expected_error_message
256
+ in response .wsgi_request ._messages ._queued_messages [0 ].message
257
+ )
258
+ revoke_mock .assert_not_called ()
259
+
260
+
261
+ @pytest .mark .parametrize (
262
+ argnames = ["job_status" , "expected_fieldsets" ],
263
+ argvalues = [
264
+ pytest .param (
265
+ ExportJob .ExportStatus .CREATED ,
266
+ (
267
+ (
268
+ "export_status" ,
269
+ "_model" ,
270
+ "created" ,
271
+ "export_started" ,
272
+ "export_finished" ,
273
+ ),
274
+ ),
275
+ id = "Get fieldsets for job in status CREATED" ,
276
+ ),
277
+ pytest .param (
278
+ ExportJob .ExportStatus .EXPORTED ,
279
+ (
280
+ (
281
+ "export_status" ,
282
+ "_model" ,
283
+ "created" ,
284
+ "export_started" ,
285
+ "export_finished" ,
286
+ ),
287
+ ("data_file" ,),
288
+ ),
289
+ id = "Get fieldsets for job in status EXPORTED" ,
290
+ ),
291
+ pytest .param (
292
+ ExportJob .ExportStatus .EXPORTING ,
293
+ (
294
+ (
295
+ "export_status" ,
296
+ "export_progressbar" ,
297
+ ),
298
+ ),
299
+ id = "Get fieldsets for job in status EXPORTING" ,
300
+ ),
301
+ pytest .param (
302
+ ExportJob .ExportStatus .EXPORT_ERROR ,
303
+ (
304
+ (
305
+ "export_status" ,
306
+ "_model" ,
307
+ "created" ,
308
+ "export_started" ,
309
+ "export_finished" ,
310
+ ),
311
+ (
312
+ "error_message" ,
313
+ "traceback" ,
314
+ ),
315
+ ),
316
+ id = "Get fieldsets for job in status EXPORT_ERROR" ,
317
+ ),
318
+ ],
319
+ )
320
+ def test_get_fieldsets_by_export_job_status (
321
+ client : Client ,
322
+ superuser : User ,
323
+ job_status : ExportJob .ExportStatus ,
324
+ expected_fieldsets : tuple [tuple [str ]],
325
+ mocker : pytest_mock .MockerFixture ,
326
+ ):
327
+ """Test that appropriate fieldsets returned for different job statuses."""
328
+ client .force_login (superuser )
329
+
330
+ mocker .patch (
331
+ "import_export_extensions.models.ExportJob.export_data" ,
332
+ )
333
+ job : ExportJob = ArtistExportJobFactory ()
334
+ job .export_status = job_status
335
+ job .save ()
336
+
337
+ response = client .get (
338
+ reverse (
339
+ "admin:import_export_extensions_exportjob_change" ,
340
+ kwargs = {"object_id" : job .pk },
341
+ ),
342
+ )
343
+
344
+ fieldsets = response .context ["adminform" ].fieldsets
345
+ fields = [fields ["fields" ] for _ , fields in fieldsets ]
346
+
347
+ assert tuple (fields ) == (
348
+ * expected_fieldsets ,
349
+ (
350
+ "resource_path" ,
351
+ "resource_kwargs" ,
352
+ "file_format_path" ,
353
+ ),
354
+ )
0 commit comments