diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py index da84028b4..2a9cc8a4d 100644 --- a/tests/app/dao/test_jobs_dao.py +++ b/tests/app/dao/test_jobs_dao.py @@ -6,14 +6,16 @@ import pytest from freezegun import freeze_time from app.dao.jobs_dao import ( - dao_get_job_by_service_id_and_job_id, + can_letter_job_be_cancelled, + dao_cancel_letter_job, dao_create_job, - dao_update_job, - dao_get_jobs_by_service_id, - dao_set_scheduled_jobs_to_pending, dao_get_future_scheduled_job_by_id_and_service_id, + dao_get_job_by_service_id_and_job_id, + dao_get_jobs_by_service_id, + dao_get_jobs_older_than_data_retention, dao_get_notification_outcomes_for_job, - dao_get_jobs_older_than_data_retention + dao_set_scheduled_jobs_to_pending, + dao_update_job, ) from app.models import ( Job, @@ -308,3 +310,84 @@ def assert_job_stat(job, result, sent, delivered, failed): assert result.sent == sent assert result.delivered == delivered assert result.failed == failed + + +@freeze_time('2019-06-13 13:00') +def test_dao_cancel_letter_job_cancels_job_and_returns_number_of_cancelled_notifications( + sample_letter_template, admin_request +): + job = create_job(template=sample_letter_template, notification_count=1, job_status='finished') + notification = create_notification(template=job.template, job=job, status='created') + result = dao_cancel_letter_job(job) + assert result == 1 + assert notification.status == 'cancelled' + assert job.job_status == 'cancelled' + + +@freeze_time('2019-06-13 13:00') +def test_can_letter_job_be_cancelled_returns_true_if_job_can_be_cancelled(sample_letter_template, admin_request): + job = create_job(template=sample_letter_template, notification_count=1, job_status='finished') + create_notification(template=job.template, job=job, status='created') + result, errors = can_letter_job_be_cancelled(job) + assert result + assert not errors + + +@freeze_time('2019-06-13 13:00') +def test_can_letter_job_be_cancelled_returns_false_and_error_message_if_notification_status_sending( + sample_letter_template, admin_request +): + job = create_job(template=sample_letter_template, notification_count=2, job_status='finished') + create_notification(template=job.template, job=job, status='sending') + create_notification(template=job.template, job=job, status='created') + result, errors = can_letter_job_be_cancelled(job) + assert not result + assert errors == "Sorry, it's too late, letters have already been sent." + + +def test_can_letter_job_be_cancelled_returns_false_and_error_message_if_letters_already_sent_to_dvla( + sample_letter_template, admin_request +): + with freeze_time('2019-06-13 13:00'): + job = create_job(template=sample_letter_template, notification_count=1, job_status='finished') + letter = create_notification(template=job.template, job=job, status='created') + + with freeze_time('2019-06-13 17:32'): + result, errors = can_letter_job_be_cancelled(job) + assert not result + assert errors == "Sorry, it's too late, letters have already been sent." + assert letter.status == 'created' + assert job.job_status == 'finished' + + +@freeze_time('2019-06-13 13:00') +def test_can_letter_job_be_cancelled_returns_false_and_error_message_if_not_a_letter_job( + sample_template, admin_request +): + job = create_job(template=sample_template, notification_count=1, job_status='finished') + create_notification(template=job.template, job=job, status='created') + result, errors = can_letter_job_be_cancelled(job) + assert not result + assert errors == "Only letter jobs can be cancelled through this endpoint. This is not a letter job." + + +@freeze_time('2019-06-13 13:00') +def test_can_letter_job_be_cancelled_returns_false_and_error_message_if_job_not_finished( + sample_letter_template, admin_request +): + job = create_job(template=sample_letter_template, notification_count=1, job_status="in progress") + create_notification(template=job.template, job=job, status='created') + result, errors = can_letter_job_be_cancelled(job) + assert not result + assert errors == "This job is still being processed. Wait a couple of minutes and try again." + + +@freeze_time('2019-06-13 13:00') +def test_can_letter_job_be_cancelled_returns_false_and_error_message_if_notifications_not_in_db_yet( + sample_letter_template, admin_request +): + job = create_job(template=sample_letter_template, notification_count=2, job_status='finished') + create_notification(template=job.template, job=job, status='created') + result, errors = can_letter_job_be_cancelled(job) + assert not result + assert errors == "This job is still being processed. Wait a couple of minutes and try again." diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index 0609cef40..d81210491 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -72,102 +72,56 @@ def test_cant_cancel_normal_job(client, sample_job, mocker): @freeze_time('2019-06-13 13:00') -def test_dao_cancel_letter_job_updates_notifications_and_job_to_cancelled(sample_letter_template, admin_request): +def test_cancel_letter_job_updates_notifications_and_job_to_cancelled(sample_letter_template, admin_request, mocker): job = create_job(template=sample_letter_template, notification_count=1, job_status='finished') - notification = create_notification(template=job.template, job=job, status='created') + create_notification(template=job.template, job=job, status='created') + + mock_get_job = mocker.patch('app.job.rest.dao_get_job_by_service_id_and_job_id', return_value=job) + mock_can_letter_job_be_cancelled = mocker.patch( + 'app.job.rest.can_letter_job_be_cancelled', return_value=(True, None) + ) + mock_dao_cancel_letter_job = mocker.patch('app.job.rest.dao_cancel_letter_job', return_value=1) + response = admin_request.post( 'job.cancel_letter_job', service_id=job.service_id, job_id=job.id, ) + + mock_get_job.assert_called_once_with(job.service_id, str(job.id)) + mock_can_letter_job_be_cancelled.assert_called_once_with(job) + mock_dao_cancel_letter_job.assert_called_once_with(job) + assert response == 1 - assert notification.status == 'cancelled' - assert job.job_status == 'cancelled' @freeze_time('2019-06-13 13:00') -def test_dao_cancel_letter_job_does_not_allow_cancel_if_notification_status_sending( - sample_letter_template, admin_request +def test_cancel_letter_job_does_not_call_cancel_if_can_letter_job_be_cancelled_returns_False( + sample_letter_template, admin_request, mocker ): job = create_job(template=sample_letter_template, notification_count=2, job_status='finished') - letter_1 = create_notification(template=job.template, job=job, status='sending') - letter_2 = create_notification(template=job.template, job=job, status='created') + create_notification(template=job.template, job=job, status='sending') + create_notification(template=job.template, job=job, status='created') + + mock_get_job = mocker.patch('app.job.rest.dao_get_job_by_service_id_and_job_id', return_value=job) + error_message = "Sorry, it's too late, letters have already been sent." + mock_can_letter_job_be_cancelled = mocker.patch( + 'app.job.rest.can_letter_job_be_cancelled', return_value=(False, error_message) + ) + mock_dao_cancel_letter_job = mocker.patch('app.job.rest.dao_cancel_letter_job') + response = admin_request.post( 'job.cancel_letter_job', service_id=job.service_id, job_id=job.id, _expected_status=400 ) + + mock_get_job.assert_called_once_with(job.service_id, str(job.id)) + mock_can_letter_job_be_cancelled.assert_called_once_with(job) + mock_dao_cancel_letter_job.assert_not_called + assert response["message"] == "Sorry, it's too late, letters have already been sent." - assert letter_1.status == 'sending' - assert letter_2.status == 'created' - assert job.job_status == 'finished' - - -def test_dao_cancel_letter_job_does_not_allow_cancel_if_letters_already_sent_to_dvla( - sample_letter_template, admin_request -): - with freeze_time('2019-06-13 13:00'): - job = create_job(template=sample_letter_template, notification_count=1, job_status='finished') - letter = create_notification(template=job.template, job=job, status='created') - - with freeze_time('2019-06-13 17:32'): - response = admin_request.post( - 'job.cancel_letter_job', - service_id=job.service_id, - job_id=job.id, - _expected_status=400 - ) - assert response["message"] == "Sorry, it's too late, letters have already been sent." - assert letter.status == 'created' - assert job.job_status == 'finished' - - -@freeze_time('2019-06-13 13:00') -def test_dao_cancel_letter_job_does_not_allow_cancel_if_not_a_letter_job(sample_template, admin_request): - job = create_job(template=sample_template, notification_count=1, job_status='finished') - notification = create_notification(template=job.template, job=job, status='created') - response = admin_request.post( - 'job.cancel_letter_job', - service_id=job.service_id, - job_id=job.id, - _expected_status=400 - ) - assert response["message"] == "Only letter jobs can be cancelled through this endpoint. This is not a letter job." - assert notification.status == 'created' - assert job.job_status == 'finished' - - -@freeze_time('2019-06-13 13:00') -def test_dao_cancel_letter_job_does_not_allow_cancel_if_job_not_finished(sample_letter_template, admin_request): - job = create_job(template=sample_letter_template, notification_count=1, job_status="in progress") - letter = create_notification(template=job.template, job=job, status='created') - response = admin_request.post( - 'job.cancel_letter_job', - service_id=job.service_id, - job_id=job.id, - _expected_status=400 - ) - assert response["message"] == "This job is still being processed. Wait a couple of minutes and try again." - assert letter.status == 'created' - assert job.job_status == 'in progress' - - -@freeze_time('2019-06-13 13:00') -def test_dao_cancel_letter_job_does_not_allow_cancel_if_notifications_not_in_db_yet( - sample_letter_template, admin_request -): - job = create_job(template=sample_letter_template, notification_count=2, job_status='finished') - letter = create_notification(template=job.template, job=job, status='created') - response = admin_request.post( - 'job.cancel_letter_job', - service_id=job.service_id, - job_id=job.id, - _expected_status=400 - ) - assert response["message"] == "This job is still being processed. Wait a couple of minutes and try again." - assert letter.status == 'created' - assert job.job_status == 'finished' def test_create_unscheduled_job(client, sample_template, mocker, fake_uuid):