@@ -384,6 +384,84 @@ def test_job_identity_key_func_exact(self):
384
384
job1 = Job .load (self .env , test_job_1 .uuid )
385
385
self .assertEqual (job1 .identity_key , expected_key )
386
386
387
+ def test_job_cancelled_while_started (self ):
388
+ # Job finishes successfully:
389
+ # if record was set to cancel in the meantime, it is overriden
390
+ test_job = Job (self .method , max_retries = 3 )
391
+ test_job .store ()
392
+ test_job .set_enqueued ()
393
+ test_job .set_started ()
394
+ test_job .store ()
395
+ stored = self .queue_job .search ([("uuid" , "=" , test_job .uuid )])
396
+ stored .button_cancelled ()
397
+ # Simulate successful job
398
+ test_job .perform ()
399
+ datetime_path = "odoo.addons.queue_job.job.datetime"
400
+ with mock .patch (datetime_path , autospec = True ) as mock_datetime :
401
+ mock_datetime .now .return_value = datetime (2015 , 3 , 15 , 16 , 41 , 0 )
402
+ test_job .set_done ("Job ended successfully" )
403
+ self .assertEqual (test_job .state , DONE )
404
+ self .assertEqual (test_job .retry , 1 )
405
+ test_job .store ()
406
+ self .assertEqual (stored .state , DONE )
407
+ self .assertEqual (stored .date_cancelled , False )
408
+ self .assertEqual (stored .date_done , datetime (2015 , 3 , 15 , 16 , 41 ))
409
+ self .assertEqual (stored .retry , 1 )
410
+ self .assertEqual (stored .result , "Job ended successfully" )
411
+
412
+ def test_job_cancelled_while_started_not_retried (self ):
413
+ # Job fails with retryable error:
414
+ # if record was set to cancel in the meantime, it is not retried
415
+ test_job = Job (self .method , kwargs = {"raise_retry" : True }, max_retries = 3 )
416
+ test_job .store ()
417
+ test_job .set_enqueued ()
418
+ test_job .set_started ()
419
+ test_job .store ()
420
+ stored = self .queue_job .search ([("uuid" , "=" , test_job .uuid )])
421
+ datetime_path = "odoo.addons.queue_job.job.datetime"
422
+ with mock .patch (datetime_path , autospec = True ) as mock_datetime :
423
+ mock_datetime .now .return_value = datetime (2015 , 3 , 15 , 16 , 41 , 0 )
424
+ stored .button_cancelled ()
425
+ # Simulate fail/retry job
426
+ with self .assertRaises (RetryableJobError ) as cm :
427
+ test_job .perform ()
428
+ test_job .set_pending (result = str (cm .exception ), reset_retry = False )
429
+ self .assertEqual (test_job .state , PENDING )
430
+ self .assertEqual (test_job .retry , 1 )
431
+ test_job .store ()
432
+ self .assertEqual (stored .state , CANCELLED )
433
+ self .assertEqual (stored .date_cancelled , datetime (2015 , 3 , 15 , 16 , 41 ))
434
+ self .assertEqual (stored .date_done , False )
435
+ self .assertEqual (stored .retry , 1 )
436
+ self .assertEqual (stored .result , "Must be retried later" )
437
+
438
+ def test_job_cancelled_while_started_failed (self ):
439
+ # Job fails:
440
+ # if record was set to cancel in the meantime, keep state cancelled
441
+ test_job = Job (self .method , max_retries = 3 )
442
+ test_job .store ()
443
+ test_job .set_enqueued ()
444
+ test_job .set_started ()
445
+ test_job .store ()
446
+ stored = self .queue_job .search ([("uuid" , "=" , test_job .uuid )])
447
+ datetime_path = "odoo.addons.queue_job.job.datetime"
448
+ with mock .patch (datetime_path , autospec = True ) as mock_datetime :
449
+ mock_datetime .now .return_value = datetime (2015 , 3 , 15 , 16 , 41 , 0 )
450
+ stored .button_cancelled ()
451
+ # Simulate failed job
452
+ test_job .perform ()
453
+ test_job .set_failed (result = False , exc_info = "failed test" , exc_name = "FailedTest" )
454
+ self .assertEqual (test_job .state , FAILED )
455
+ self .assertEqual (test_job .retry , 1 )
456
+ test_job .store ()
457
+ self .assertEqual (stored .state , CANCELLED )
458
+ self .assertEqual (stored .date_cancelled , datetime (2015 , 3 , 15 , 16 , 41 ))
459
+ self .assertEqual (stored .date_done , False )
460
+ self .assertEqual (stored .retry , 1 )
461
+ self .assertEqual (stored .result , "Cancelled by OdooBot" )
462
+ self .assertEqual (stored .exc_info , "failed test" )
463
+ self .assertEqual (stored .exc_name , "FailedTest" )
464
+
387
465
388
466
class TestJobs (JobCommonCase ):
389
467
"""Test jobs on other methods or with different job configuration"""
0 commit comments