def test_collate_letter_pdfs_to_be_sent(notify_api, sample_letter_template, mocker, time_to_run_task): with freeze_time("2020-02-17 18:00:00"): create_notification( template=sample_letter_template, status='created', reference='ref0', created_at=(datetime.now() - timedelta(hours=2)) ) create_notification( template=sample_letter_template, status='created', reference='ref1', created_at=(datetime.now() - timedelta(hours=3)) ) create_notification( template=sample_letter_template, status='created', reference='ref2', created_at=(datetime.now() - timedelta(days=2)) ) mocker.patch('app.celery.tasks.s3.head_s3_object', side_effect=[ {'ContentLength': 2}, {'ContentLength': 1}, {'ContentLength': 3}, ]) mock_celery = mocker.patch('app.celery.letters_pdf_tasks.notify_celery.send_task') with set_config_values(notify_api, {'MAX_LETTER_PDF_COUNT_PER_ZIP': 2}): with freeze_time(time_to_run_task): collate_letter_pdfs_to_be_sent() assert len(mock_celery.call_args_list) == 2 assert mock_celery.call_args_list[0] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-16/NOTIFY.REF2.D.2.C.C.20200215180000.PDF', '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF' ], 'upload_filename': 'NOTIFY.2020-02-17.001.k3x_WqC5KhB6e2DWv9Ma.ZIP' }, queue='process-ftp-tasks', compression='zlib' ) assert mock_celery.call_args_list[1] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-17/NOTIFY.REF0.D.2.C.C.20200217160000.PDF' ], 'upload_filename': 'NOTIFY.2020-02-17.002.J85cUw-FWlKuAIOcwdLS.ZIP' }, queue='process-ftp-tasks', compression='zlib' )
def test_collate_letter_pdfs_to_be_sent(notify_api, notify_db_session, mocker, time_to_run_task): with freeze_time("2020-02-17 18:00:00"): service_1 = create_service( service_name="service 1", service_id='f2fe37b0-1301-11eb-aba9-4c3275916899') letter_template_1 = create_template(service_1, template_type=LETTER_TYPE) # second class create_notification(template=letter_template_1, status='created', reference='ref0', created_at=(datetime.now() - timedelta(hours=2))) create_notification(template=letter_template_1, status='created', reference='ref1', created_at=(datetime.now() - timedelta(hours=3))) create_notification(template=letter_template_1, status='created', reference='ref2', created_at=(datetime.now() - timedelta(days=2))) # first class create_notification(template=letter_template_1, status='created', reference='first_class', created_at=(datetime.now() - timedelta(hours=4)), postage="first") # international create_notification(template=letter_template_1, status='created', reference='international', created_at=(datetime.now() - timedelta(days=3)), postage="europe") create_notification(template=letter_template_1, status='created', reference='international', created_at=(datetime.now() - timedelta(days=4)), postage="rest-of-world") # different service second class service_2 = create_service( service_name="service 2", service_id='3a5cea08-29fd-4bb9-b582-8dedd928b149') letter_template_2 = create_template(service_2, template_type=LETTER_TYPE) create_notification(template=letter_template_2, status='created', reference='another_service', created_at=(datetime.now() - timedelta(hours=2))) mocker.patch('app.celery.tasks.s3.head_s3_object', side_effect=[ { 'ContentLength': 1 }, { 'ContentLength': 1 }, { 'ContentLength': 2 }, { 'ContentLength': 1 }, { 'ContentLength': 3 }, { 'ContentLength': 1 }, { 'ContentLength': 1 }, ]) mock_celery = mocker.patch( 'app.celery.letters_pdf_tasks.notify_celery.send_task') with set_config_values(notify_api, {'MAX_LETTER_PDF_COUNT_PER_ZIP': 2}): with freeze_time(time_to_run_task): collate_letter_pdfs_to_be_sent() assert len(mock_celery.call_args_list) == 6 assert mock_celery.call_args_list[0] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': ['2020-02-17/NOTIFY.FIRST_CLASS.D.1.C.C.20200217140000.PDF'], 'upload_filename': f'NOTIFY.2020-02-17.1.001.kHh01fdUxT9iEIYUt5Wx.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[1] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': ['2020-02-17/NOTIFY.ANOTHER_SERVICE.D.2.C.C.20200217160000.PDF'], 'upload_filename': f'NOTIFY.2020-02-17.2.001.MezXnKP3IvNZEoMsSlVo.{service_2.id}.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[2] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-16/NOTIFY.REF2.D.2.C.C.20200215180000.PDF', '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF' ], 'upload_filename': f'NOTIFY.2020-02-17.2.002.k3x_WqC5KhB6e2DWv9Ma.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[3] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': ['2020-02-17/NOTIFY.REF0.D.2.C.C.20200217160000.PDF'], 'upload_filename': f'NOTIFY.2020-02-17.2.003.J85cUw-FWlKuAIOcwdLS.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[4] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': ['2020-02-15/NOTIFY.INTERNATIONAL.D.E.C.C.20200214180000.PDF'], 'upload_filename': f'NOTIFY.2020-02-17.E.001.4YajCZzgzIl7zf8bjWK2.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[5] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-14/NOTIFY.INTERNATIONAL.D.N.C.C.20200213180000.PDF', ], 'upload_filename': f'NOTIFY.2020-02-17.N.001.eSvP8Ph6EBKhh3k7BSA2.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib')
def test_collate_letter_pdfs_to_be_sent( notify_api, notify_db_session, mocker, time_to_run_task, letter_volumes_email_template ): with freeze_time("2020-02-17 18:00:00"): service_1 = create_service(service_name="service 1", service_id='f2fe37b0-1301-11eb-aba9-4c3275916899') letter_template_1 = create_template(service_1, template_type=LETTER_TYPE) # second class create_notification( template=letter_template_1, status='created', reference='ref0', created_at=(datetime.now() - timedelta(hours=2)) ) create_notification( template=letter_template_1, status='created', reference='ref1', created_at=(datetime.now() - timedelta(hours=3)) ) create_notification( template=letter_template_1, status='created', reference='ref2', created_at=(datetime.now() - timedelta(days=2)) ) # first class create_notification( template=letter_template_1, status='created', reference='first_class', created_at=(datetime.now() - timedelta(hours=4)), postage="first" ) # international create_notification( template=letter_template_1, status='created', reference='international', created_at=(datetime.now() - timedelta(days=3)), postage="europe" ) create_notification( template=letter_template_1, status='created', reference='international', created_at=(datetime.now() - timedelta(days=4)), postage="rest-of-world" ) # different service second class service_2 = create_service(service_name="service 2", service_id='3a5cea08-29fd-4bb9-b582-8dedd928b149') letter_template_2 = create_template(service_2, template_type=LETTER_TYPE) create_notification( template=letter_template_2, status='created', reference='another_service', created_at=(datetime.now() - timedelta(hours=2)) ) bucket_name = current_app.config['LETTERS_PDF_BUCKET_NAME'] s3 = boto3.client('s3', region_name='eu-west-1') s3.create_bucket( Bucket=bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'} ) filenames = [ '2020-02-17/NOTIFY.FIRST_CLASS.D.1.C.C.20200217140000.PDF', '2020-02-16/NOTIFY.REF2.D.2.C.C.20200215180000.PDF', '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF', '2020-02-17/NOTIFY.REF0.D.2.C.C.20200217160000.PDF', '2020-02-15/NOTIFY.INTERNATIONAL.D.E.C.C.20200214180000.PDF', '2020-02-14/NOTIFY.INTERNATIONAL.D.N.C.C.20200213180000.PDF', '2020-02-17/NOTIFY.ANOTHER_SERVICE.D.2.C.C.20200217160000.PDF' ] for filename in filenames: s3.put_object(Bucket=bucket_name, Key=filename, Body=b'f') mock_celery = mocker.patch('app.celery.letters_pdf_tasks.notify_celery.send_task') mock_send_email_to_dvla = mocker.patch( 'app.celery.letters_pdf_tasks.send_letters_volume_email_to_dvla' ) with set_config_values(notify_api, {'MAX_LETTER_PDF_COUNT_PER_ZIP': 2}): with freeze_time(time_to_run_task): collate_letter_pdfs_to_be_sent() mock_send_email_to_dvla.assert_called_once_with([ (1, 1, 'europe'), (1, 1, 'first'), (1, 1, 'rest-of-world'), (4, 4, 'second') ], datetime(2020, 2, 17).date()) assert len(mock_celery.call_args_list) == 6 assert mock_celery.call_args_list[0] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-17/NOTIFY.FIRST_CLASS.D.1.C.C.20200217140000.PDF' ], 'upload_filename': f'NOTIFY.2020-02-17.1.001.kHh01fdUxT9iEIYUt5Wx.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib' ) assert mock_celery.call_args_list[1] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': ['2020-02-17/NOTIFY.ANOTHER_SERVICE.D.2.C.C.20200217160000.PDF'], 'upload_filename': f'NOTIFY.2020-02-17.2.001.MezXnKP3IvNZEoMsSlVo.{service_2.id}.ZIP' }, queue='process-ftp-tasks', compression='zlib' ) assert mock_celery.call_args_list[2] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-16/NOTIFY.REF2.D.2.C.C.20200215180000.PDF', '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF' ], 'upload_filename': f'NOTIFY.2020-02-17.2.002.k3x_WqC5KhB6e2DWv9Ma.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib' ) assert mock_celery.call_args_list[3] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-17/NOTIFY.REF0.D.2.C.C.20200217160000.PDF' ], 'upload_filename': f'NOTIFY.2020-02-17.2.003.J85cUw-FWlKuAIOcwdLS.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib' ) assert mock_celery.call_args_list[4] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-15/NOTIFY.INTERNATIONAL.D.E.C.C.20200214180000.PDF' ], 'upload_filename': f'NOTIFY.2020-02-17.E.001.4YajCZzgzIl7zf8bjWK2.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib' ) assert mock_celery.call_args_list[5] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-14/NOTIFY.INTERNATIONAL.D.N.C.C.20200213180000.PDF', ], 'upload_filename': f'NOTIFY.2020-02-17.N.001.eSvP8Ph6EBKhh3k7BSA2.{letter_template_1.service_id}.ZIP' }, queue='process-ftp-tasks', compression='zlib' )
def test_collate_letter_pdfs_to_be_sent(notify_api, sample_letter_template, mocker, time_to_run_task): with freeze_time("2020-02-17 18:00:00"): # second class create_notification(template=sample_letter_template, status='created', reference='ref0', created_at=(datetime.now() - timedelta(hours=2))) create_notification(template=sample_letter_template, status='created', reference='ref1', created_at=(datetime.now() - timedelta(hours=3))) create_notification(template=sample_letter_template, status='created', reference='ref2', created_at=(datetime.now() - timedelta(days=2))) # first class create_notification(template=sample_letter_template, status='created', reference='first_class', created_at=(datetime.now() - timedelta(hours=4)), postage="first") # international create_notification(template=sample_letter_template, status='created', reference='international', created_at=(datetime.now() - timedelta(days=3)), postage="europe") create_notification(template=sample_letter_template, status='created', reference='international', created_at=(datetime.now() - timedelta(days=4)), postage="rest-of-world") mocker.patch('app.celery.tasks.s3.head_s3_object', side_effect=[ { 'ContentLength': 1 }, { 'ContentLength': 1 }, { 'ContentLength': 2 }, { 'ContentLength': 1 }, { 'ContentLength': 3 }, { 'ContentLength': 1 }, ]) mock_celery = mocker.patch( 'app.celery.letters_pdf_tasks.notify_celery.send_task') with set_config_values(notify_api, {'MAX_LETTER_PDF_COUNT_PER_ZIP': 2}): with freeze_time(time_to_run_task): collate_letter_pdfs_to_be_sent() assert len(mock_celery.call_args_list) == 5 assert mock_celery.call_args_list[0] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': ['2020-02-17/NOTIFY.FIRST_CLASS.D.1.C.C.20200217140000.PDF'], 'upload_filename': 'NOTIFY.2020-02-17.1.001.kHh01fdUxT9iEIYUt5Wx.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[1] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-16/NOTIFY.REF2.D.2.C.C.20200215180000.PDF', '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF' ], 'upload_filename': 'NOTIFY.2020-02-17.2.001.k3x_WqC5KhB6e2DWv9Ma.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[2] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': ['2020-02-17/NOTIFY.REF0.D.2.C.C.20200217160000.PDF'], 'upload_filename': 'NOTIFY.2020-02-17.2.002.J85cUw-FWlKuAIOcwdLS.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[3] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': ['2020-02-15/NOTIFY.INTERNATIONAL.D.E.C.C.20200214180000.PDF'], 'upload_filename': 'NOTIFY.2020-02-17.E.001.4YajCZzgzIl7zf8bjWK2.ZIP' }, queue='process-ftp-tasks', compression='zlib') assert mock_celery.call_args_list[4] == call( name='zip-and-send-letter-pdfs', kwargs={ 'filenames_to_zip': [ '2020-02-14/NOTIFY.INTERNATIONAL.D.N.C.C.20200213180000.PDF', ], 'upload_filename': 'NOTIFY.2020-02-17.N.001.eSvP8Ph6EBKhh3k7BSA2.ZIP' }, queue='process-ftp-tasks', compression='zlib')