diff --git a/app/celery/tasks.py b/app/celery/tasks.py index a868a76dc..cdf5dc7d2 100644 --- a/app/celery/tasks.py +++ b/app/celery/tasks.py @@ -267,18 +267,23 @@ def persist_letter( def build_dvla_file(self, job_id): try: if all_notifications_are_created_for_job(job_id): - notifications = dao_get_all_notifications_for_job(job_id) - file = "" - for n in notifications: - t = {"content": n.template.content, "subject": n.template.subject} - # This unique id is a 7 digits requested by DVLA, not known if this number needs to be sequential. - unique_id = int(''.join(map(str, random.sample(range(9), 7)))) - template = LetterDVLATemplate(t, n.personalisation, unique_id) - file = file + str(template) + "\n" - s3upload(filedata=file, - region=current_app.config['AWS_REGION'], - bucket_name=current_app.config['DVLA_UPLOAD_BUCKET_NAME'], - file_location="{}-dvla-job.text".format(job_id)) + file_contents = '\n'.join( + str(LetterDVLATemplate( + notification.template.__dict__, + notification.personalisation, + # This unique id is a 7 digits requested by DVLA, not known + # if this number needs to be sequential. + numeric_id=random.randint(1, int('9' * 7)), + contact_block=notification.service.letter_contact_block, + )) + for notification in dao_get_all_notifications_for_job(job_id) + ) + s3upload( + filedata=file_contents + '\n', + region=current_app.config['AWS_REGION'], + bucket_name=current_app.config['DVLA_UPLOAD_BUCKET_NAME'], + file_location="{}-dvla-job.text".format(job_id) + ) else: current_app.logger.info("All notifications for job {} are not persisted".format(job_id)) self.retry(queue="retry", exc="All notifications for job {} are not persisted".format(job_id)) diff --git a/tests/app/celery/test_tasks.py b/tests/app/celery/test_tasks.py index eae030386..671d52189 100644 --- a/tests/app/celery/test_tasks.py +++ b/tests/app/celery/test_tasks.py @@ -971,17 +971,30 @@ def test_build_dvla_file(sample_letter_template, mocker): create_notification(template=job.template, job=job) create_notification(template=job.template, job=job) - mocked = mocker.patch("app.celery.tasks.s3upload") - mocker.patch("app.celery.tasks.LetterDVLATemplate.__str__", return_value="dvla|string") + mocker.patch("app.celery.tasks.random.randint", return_value=999) + mocked_upload = mocker.patch("app.celery.tasks.s3upload") + mocked_letter_template = mocker.patch("app.celery.tasks.LetterDVLATemplate") + mocked_letter_template_instance = mocked_letter_template.return_value + mocked_letter_template_instance.__str__.return_value = "dvla|string" build_dvla_file(job.id) - file = "dvla|string\ndvla|string\n" + mocked_upload.assert_called_once_with( + filedata="dvla|string\ndvla|string\n", + region=current_app.config['AWS_REGION'], + bucket_name=current_app.config['DVLA_UPLOAD_BUCKET_NAME'], + file_location="{}-dvla-job.text".format(job.id) + ) - assert mocked.called - mocked.assert_called_once_with(filedata=file, - region=current_app.config['AWS_REGION'], - bucket_name=current_app.config['DVLA_UPLOAD_BUCKET_NAME'], - file_location="{}-dvla-job.text".format(job.id)) + # Template + assert mocked_letter_template.call_args[0][0]['subject'] == 'Template subject' + assert mocked_letter_template.call_args[0][0]['content'] == 'Dear Sir/Madam, Hello. Yours Truly, The Government.' + + # Personalisation + assert mocked_letter_template.call_args[0][1] is None + + # Named arguments + assert mocked_letter_template.call_args[1]['numeric_id'] == 999 + assert mocked_letter_template.call_args[1]['contact_block'] == 'London,\nSW1A 1AA' def test_build_dvla_file_retries_if_all_notifications_are_not_created(sample_letter_template, mocker): diff --git a/tests/app/conftest.py b/tests/app/conftest.py index 387bb33eb..0805242b7 100644 --- a/tests/app/conftest.py +++ b/tests/app/conftest.py @@ -134,7 +134,8 @@ def sample_service( 'message_limit': limit, 'restricted': restricted, 'email_from': email_from, - 'created_by': user + 'created_by': user, + 'letter_contact_block': 'London,\nSW1A 1AA', } service = Service.query.filter_by(name=service_name).first() if not service: