diff --git a/app/letters/rest.py b/app/letters/rest.py index e5b4cd518..7ce5c4d53 100644 --- a/app/letters/rest.py +++ b/app/letters/rest.py @@ -1,6 +1,5 @@ from flask import Blueprint, jsonify, request -from app.celery.tasks import process_returned_letters_list from app.config import QueueNames from app.letters.letter_schemas import letter_references from app.schema_validation import validate @@ -14,15 +13,16 @@ register_errors(letter_job) MAX_REFERENCES_PER_TASK = 5000 -@letter_job.route('/letters/returned', methods=['POST']) -def create_process_returned_letters_job(): - references = validate(request.get_json(), letter_references)['references'] +# TODO: return deactivation notice +# @letter_job.route('/letters/returned', methods=['POST']) +# def create_process_returned_letters_job(): +# references = validate(request.get_json(), letter_references)['references'] - for start_index in range(0, len(references), MAX_REFERENCES_PER_TASK): - process_returned_letters_list.apply_async( - args=(references[start_index:start_index + MAX_REFERENCES_PER_TASK], ), - queue=QueueNames.DATABASE, - compression='zlib' - ) +# for start_index in range(0, len(references), MAX_REFERENCES_PER_TASK): +# process_returned_letters_list.apply_async( +# args=(references[start_index:start_index + MAX_REFERENCES_PER_TASK], ), +# queue=QueueNames.DATABASE, +# compression='zlib' +# ) - return jsonify(references=references), 200 +# return jsonify(references=references), 200 diff --git a/app/service/rest.py b/app/service/rest.py index e74c66e5a..33c2d7262 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -122,10 +122,7 @@ from app.schemas import ( service_schema, ) from app.service import statistics -from app.service.send_notification import ( - send_one_off_notification, - send_pdf_letter_notification, -) +from app.service.send_notification import send_one_off_notification from app.service.send_pdf_letter_schema import send_pdf_letter_request from app.service.sender import send_notification_to_service_users from app.service.service_contact_list_schema import ( @@ -749,11 +746,12 @@ def create_one_off_notification(service_id): return jsonify(resp), 201 -@service_blueprint.route('//send-pdf-letter', methods=['POST']) -def create_pdf_letter(service_id): - data = validate(request.get_json(), send_pdf_letter_request) - resp = send_pdf_letter_notification(service_id, data) - return jsonify(resp), 201 +# TODO: return deactivation notice +# @service_blueprint.route('//send-pdf-letter', methods=['POST']) +# def create_pdf_letter(service_id): +# data = validate(request.get_json(), send_pdf_letter_request) +# resp = send_pdf_letter_notification(service_id, data) +# return jsonify(resp), 201 @service_blueprint.route('//email-reply-to', methods=["GET"]) diff --git a/tests/app/celery/test_nightly_tasks.py b/tests/app/celery/test_nightly_tasks.py index 6cd9c16f4..2c003876a 100644 --- a/tests/app/celery/test_nightly_tasks.py +++ b/tests/app/celery/test_nightly_tasks.py @@ -112,25 +112,6 @@ def test_will_remove_csv_files_for_jobs_older_than_retention_period( ], any_order=True) -@freeze_time('2017-01-01 10:00:00') -def test_remove_csv_files_filters_by_type(mocker, sample_service): - mocker.patch('app.celery.nightly_tasks.s3.remove_job_from_s3') - """ - Jobs older than seven days are deleted, but only two day's worth (two-day window) - """ - letter_template = create_template(service=sample_service, template_type=LETTER_TYPE) - sms_template = create_template(service=sample_service, template_type=SMS_TYPE) - - eight_days_ago = datetime.utcnow() - timedelta(days=8) - - job_to_delete = create_job(template=letter_template, created_at=eight_days_ago) - create_job(template=sms_template, created_at=eight_days_ago) - - assert s3.remove_job_from_s3.call_args_list == [ - call(job_to_delete.service_id, job_to_delete.id), - ] - - def test_delete_sms_notifications_older_than_retention_calls_child_task(notify_api, mocker): mocked = mocker.patch('app.celery.nightly_tasks._delete_notifications_older_than_retention_by_type') delete_sms_notifications_older_than_retention() diff --git a/tests/app/celery/test_reporting_tasks.py b/tests/app/celery/test_reporting_tasks.py index 6c1e8ded2..1bae08a7b 100644 --- a/tests/app/celery/test_reporting_tasks.py +++ b/tests/app/celery/test_reporting_tasks.py @@ -87,10 +87,8 @@ def test_create_nightly_notification_status_triggers_tasks( @freeze_time('2019-08-01T00:30') @pytest.mark.parametrize('notification_date, expected_types_aggregated', [ ('2019-08-01', set()), - ('2019-07-31', {EMAIL_TYPE, SMS_TYPE, LETTER_TYPE}), - ('2019-07-28', {EMAIL_TYPE, SMS_TYPE, LETTER_TYPE}), - ('2019-07-27', {LETTER_TYPE}), - ('2019-07-22', {LETTER_TYPE}), + ('2019-07-31', {EMAIL_TYPE, SMS_TYPE}), + ('2019-07-28', {EMAIL_TYPE, SMS_TYPE}), ('2019-07-21', set()), ]) def test_create_nightly_notification_status_triggers_relevant_tasks( diff --git a/tests/app/service/send_notification/test_send_pdf_letter_notification.py b/tests/app/service/send_notification/test_send_pdf_letter_notification.py deleted file mode 100644 index 091396fd0..000000000 --- a/tests/app/service/send_notification/test_send_pdf_letter_notification.py +++ /dev/null @@ -1,132 +0,0 @@ -import pytest -from freezegun import freeze_time -from notifications_utils.s3 import S3ObjectNotFound - -from app.dao.notifications_dao import get_notification_by_id -from app.models import EMAIL_TYPE, LETTER_TYPE, UPLOAD_LETTERS -from app.service.send_notification import send_pdf_letter_notification -from app.v2.errors import BadRequestError, TooManyRequestsError -from tests.app.db import create_service - - -@pytest.fixture -def post_data(sample_service_full_permissions, fake_uuid): - return { - 'filename': 'valid.pdf', - 'created_by': sample_service_full_permissions.users[0].id, - 'file_id': fake_uuid, - 'postage': 'second', - 'recipient_address': 'Bugs%20Bunny%0A123%20Main%20Street%0ALooney%20Town' - } - - -@pytest.mark.parametrize('permissions', [ - [EMAIL_TYPE], - [UPLOAD_LETTERS], -]) -def test_send_pdf_letter_notification_raises_error_if_service_does_not_have_permission( - notify_db_session, - permissions, - post_data, -): - service = create_service(service_permissions=permissions) - - with pytest.raises(BadRequestError): - send_pdf_letter_notification(service.id, post_data) - - -def test_send_pdf_letter_notification_raises_error_if_service_is_over_daily_message_limit( - mocker, - sample_service_full_permissions, - post_data, -): - mocker.patch( - 'app.service.send_notification.check_service_over_daily_message_limit', - side_effect=TooManyRequestsError(10)) - - with pytest.raises(TooManyRequestsError): - send_pdf_letter_notification(sample_service_full_permissions.id, post_data) - - -def test_send_pdf_letter_notification_validates_created_by( - sample_service_full_permissions, - sample_user, - post_data -): - post_data['created_by'] = sample_user.id - - with pytest.raises(BadRequestError): - send_pdf_letter_notification(sample_service_full_permissions.id, post_data) - - -def test_send_pdf_letter_notification_raises_error_if_service_in_trial_mode( - mocker, - sample_service_full_permissions, - post_data, -): - sample_service_full_permissions.restricted = True - - with pytest.raises(BadRequestError) as e: - send_pdf_letter_notification(sample_service_full_permissions.id, post_data) - assert 'trial mode' in e.value.message - - -@pytest.mark.skip(reason="Skipping letter-related functionality for now") -def test_send_pdf_letter_notification_raises_error_when_pdf_is_not_in_transient_letter_bucket( - mocker, - sample_service_full_permissions, - notify_user, - post_data, -): - mocker.patch('app.service.send_notification.utils_s3download', side_effect=S3ObjectNotFound({}, '')) - - with pytest.raises(S3ObjectNotFound): - send_pdf_letter_notification(sample_service_full_permissions.id, post_data) - - -def test_send_pdf_letter_notification_does_nothing_if_notification_already_exists( - mocker, - sample_service_full_permissions, - notify_user, - sample_notification, - post_data, -): - post_data['file_id'] = sample_notification.id - mocker.patch('app.service.send_notification.utils_s3download', side_effect=S3ObjectNotFound({}, '')) - response = send_pdf_letter_notification(sample_service_full_permissions.id, post_data) - assert response['id'] == str(sample_notification.id) - - -@freeze_time("2019-08-02 11:00:00") -@pytest.mark.skip(reason="Skipping letter-related functionality for now") -def test_send_pdf_letter_notification_creates_notification_and_moves_letter( - mocker, - sample_service_full_permissions, - notify_user, - post_data, -): - mocker.patch('app.service.send_notification.utils_s3download') - mocker.patch('app.service.send_notification.get_page_count', return_value=1) - s3_mock = mocker.patch('app.service.send_notification.move_uploaded_pdf_to_letters_bucket') - - result = send_pdf_letter_notification(sample_service_full_permissions.id, post_data) - file_id = post_data['file_id'] - - notification = get_notification_by_id(file_id) - - assert str(notification.id) == file_id - assert notification.api_key_id is None - assert notification.client_reference == post_data['filename'] - assert notification.created_by_id == post_data['created_by'] - assert notification.postage == 'second' - assert notification.notification_type == LETTER_TYPE - assert notification.billable_units == 1 - assert notification.to == "Bugs Bunny\n123 Main Street\nLooney Town" - - assert notification.service_id == sample_service_full_permissions.id - assert result == {'id': str(notification.id)} - - s3_mock.assert_called_once_with( - 'service-{}/{}.pdf'.format(sample_service_full_permissions.id, file_id), - '2019-08-02/NOTIFY.{}.D.2.C.20190802110000.PDF'.format(notification.reference) - ) diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 278446a7b..22c2709e7 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -2510,40 +2510,6 @@ def test_create_pdf_letter(mocker, sample_service_full_permissions, client, fake assert json_resp == {'id': fake_uuid} -@pytest.mark.parametrize('post_data, expected_errors', [ - ( - {}, - [ - {'error': 'ValidationError', 'message': 'postage is a required property'}, - {'error': 'ValidationError', 'message': 'filename is a required property'}, - {'error': 'ValidationError', 'message': 'created_by is a required property'}, - {'error': 'ValidationError', 'message': 'file_id is a required property'}, - {'error': 'ValidationError', 'message': 'recipient_address is a required property'} - ] - ), - ( - {"postage": "third", "filename": "string", "created_by": "string", "file_id": "string", - "recipient_address": "Some Address"}, - [ - {'error': 'ValidationError', - 'message': 'postage invalid. It must be first, second, europe or rest-of-world.'} - ] - ) -]) -def test_create_pdf_letter_validates_against_json_schema( - sample_service_full_permissions, client, post_data, expected_errors -): - response = client.post( - url_for('service.create_pdf_letter', service_id=sample_service_full_permissions.id), - data=json.dumps(post_data), - headers=[('Content-Type', 'application/json'), create_admin_authorization_header()] - ) - json_resp = json.loads(response.get_data(as_text=True)) - - assert response.status_code == 400 - assert json_resp['errors'] == expected_errors - - def test_get_notification_for_service_includes_template_redacted(admin_request, sample_notification): resp = admin_request.get( 'service.get_notification_for_service', @@ -2555,17 +2521,6 @@ def test_get_notification_for_service_includes_template_redacted(admin_request, assert resp['template']['redact_personalisation'] is False -def test_get_notification_for_service_includes_precompiled_letter(admin_request, sample_notification): - resp = admin_request.get( - 'service.get_notification_for_service', - service_id=sample_notification.service_id, - notification_id=sample_notification.id - ) - - assert resp['id'] == str(sample_notification.id) - assert resp['template']['is_precompiled_letter'] is False - - def test_get_all_notifications_for_service_includes_template_redacted(admin_request, sample_service): normal_template = create_template(sample_service) diff --git a/tests/app/template/test_rest.py b/tests/app/template/test_rest.py index c1d2d34c3..b1c555f4d 100644 --- a/tests/app/template/test_rest.py +++ b/tests/app/template/test_rest.py @@ -115,35 +115,6 @@ def test_create_a_new_template_for_a_service_adds_folder_relationship( assert template.folder == parent_folder -@pytest.mark.parametrize("template_type, expected_postage", [ - (SMS_TYPE, None), (EMAIL_TYPE, None), (LETTER_TYPE, "second") -]) -def test_create_a_new_template_for_a_service_adds_postage_for_letters_only( - client, sample_service, template_type, expected_postage -): - data = { - 'name': 'my template', - 'template_type': template_type, - 'content': 'template content', - 'service': str(sample_service.id), - 'created_by': str(sample_service.users[0].id) - } - if template_type in [EMAIL_TYPE, LETTER_TYPE]: - data["subject"] = "Hi, I have good news" - - data = json.dumps(data) - auth_header = create_admin_authorization_header() - - response = client.post( - '/service/{}/template'.format(sample_service.id), - headers=[('Content-Type', 'application/json'), auth_header], - data=data - ) - assert response.status_code == 201 - template = Template.query.filter(Template.name == 'my template').first() - assert template.postage == expected_postage - - def test_create_template_should_return_400_if_folder_is_for_a_different_service( client, sample_service ): @@ -323,8 +294,8 @@ def test_should_be_error_if_service_does_not_exist_on_update(client, fake_uuid): assert json_resp['message'] == 'No result found' -@pytest.mark.parametrize('template_type', [EMAIL_TYPE, LETTER_TYPE]) -def test_must_have_a_subject_on_an_email_or_letter_template(client, sample_user, sample_service, template_type): +@pytest.mark.parametrize('template_type', [EMAIL_TYPE]) +def test_must_have_a_subject_on_an_email_template(client, sample_user, sample_service, template_type): data = { 'name': 'my template', 'template_type': template_type, @@ -429,50 +400,6 @@ def test_should_be_able_to_archive_template_should_remove_template_folders( assert not updated_template.folder -def test_get_precompiled_template_for_service( - client, - notify_user, - sample_service, -): - assert len(sample_service.templates) == 0 - - response = client.get( - '/service/{}/template/precompiled'.format(sample_service.id), - headers=[create_admin_authorization_header()], - ) - assert response.status_code == 200 - assert len(sample_service.templates) == 1 - - data = json.loads(response.get_data(as_text=True)) - assert data['name'] == 'Pre-compiled PDF' - assert data['hidden'] is True - - -def test_get_precompiled_template_for_service_when_service_has_existing_precompiled_template( - client, - notify_user, - sample_service, -): - create_template( - sample_service, - template_name='Exisiting precompiled template', - template_type=LETTER_TYPE, - hidden=True) - assert len(sample_service.templates) == 1 - - response = client.get( - '/service/{}/template/precompiled'.format(sample_service.id), - headers=[create_admin_authorization_header()], - ) - - assert response.status_code == 200 - assert len(sample_service.templates) == 1 - - data = json.loads(response.get_data(as_text=True)) - assert data['name'] == 'Exisiting precompiled template' - assert data['hidden'] is True - - def test_should_be_able_to_get_all_templates_for_a_service(client, sample_user, sample_service): data = { 'name': 'my template 1',