def test_upload_counterpart_file_uploads_and_calls_api_if_not_dry_run(getuser): getuser.return_value = 'test user' bucket = mock.Mock() client = mock.Mock() client.get_supplier_framework_info.return_value = { "frameworkInterest": { "agreementId": 23, "declaration": {"nameOfOrganisation": "The supplier who signed"} } } with freeze_time('2016-11-12 13:14:15'): with mock.patch.object(builtins, 'open', mock.mock_open(read_data='foo')): upload_counterpart_file(bucket, 'g-cloud-8', 'pdfs/123456-file.pdf', False, client) bucket.save.assert_called_once_with( "g-cloud-8/agreements/123456/123456-agreement-countersignature-2016-11-12-131415.pdf", mock.ANY, acl='private', move_prefix=None, download_filename='The_supplier_who_signed-123456-agreement-countersignature.pdf' ) client.update_framework_agreement.assert_called_once_with( 23, {'countersignedAgreementPath': 'g-cloud-8/agreements/123456/123456-agreement-countersignature-2016-11-12-131415.pdf' }, 'upload-counterpart-agreements script run by test user' )
def test_upload_counterpart_file_does_not_perform_actions_if_dry_run( notify_fail_early): bucket = mock.Mock() data_api_client = mock.Mock() data_api_client.get_supplier_framework_info.return_value = { "frameworkInterest": { "agreementId": 23, "declaration": { "supplierRegisteredName": "The supplier who signed", "primaryContactEmail": "*****@*****.**", }, }, } data_api_client.find_users_iter.side_effect = lambda *args, **kwargs: iter( ( { "id": 111322, "emailAddress": "*****@*****.**", "supplierId": 123456, "active": True, }, { "id": 111321, "emailAddress": "*****@*****.**", "supplierId": 123456, "active": True, }, )) dm_notify_client = mock.Mock() dm_notify_client.send_email.side_effect = AssertionError( "This shouldn't be called") with mock.patch.object(builtins, 'open', mock.mock_open(read_data='foo')): upload_counterpart_file( bucket, { "name": "Dos Two", "slug": "digital-outcomes-and-specialists-2", }, 'pdfs/123456-file.pdf', True, data_api_client, dm_notify_client=dm_notify_client, notify_template_id="dead-beef-baad-f00d", notify_fail_early=notify_fail_early, ) assert bucket.save.called is False assert data_api_client.update_framework_agreement.called is False data_api_client.find_users_iter.assert_called_with(supplier_id=123456)
def test_upload_counterpart_file_does_not_upload_or_call_api_if_dry_run(): bucket = mock.Mock() client = mock.Mock() client.get_supplier_framework_info.return_value = { "frameworkInterest": { "agreementId": 23, "declaration": {"nameOfOrganisation": "The supplier who signed"} } } with mock.patch.object(builtins, 'open', mock.mock_open(read_data='foo')): upload_counterpart_file(bucket, 'g-cloud-8', 'pdfs/123456-file.pdf', True, client) bucket.save.assert_not_called() client.update_framework_agreement.assert_not_called()
def test_upload_counterpart_file_uploads_and_calls_api_if_not_dry_run(getuser, notify_fail_early): getuser.return_value = 'test user' bucket = mock.Mock() data_api_client = mock.Mock() data_api_client.get_supplier_framework_info.return_value = { "frameworkInterest": { "agreementId": 23, "declaration": { "supplierRegisteredName": "The supplier who signed", }, } } with freeze_time('2016-11-12 13:14:15'): with mock.patch.object(builtins, 'open', mock.mock_open(read_data='foo')): upload_counterpart_file( bucket, { "frameworkLiveAtUTC": '2019-07-02T11:00:00.603808Z', "name": "Gee Cloud Eight", "slug": "g-cloud-8", }, 'pdfs/123456-file.pdf', False, data_api_client, "Framework Agreement", notify_fail_early=notify_fail_early, ) bucket.save.assert_called_once_with( "g-cloud-8/agreements/123456/123456-agreement-countersignature-2016-11-12-131415.pdf", mock.ANY, acl='bucket-owner-full-control', download_filename='The_supplier_who_signed-123456-agreement-countersignature.pdf' ) data_api_client.update_framework_agreement.assert_called_once_with( 23, { 'countersignedAgreementPath': 'g-cloud-8/agreements/123456/123456-agreement-countersignature-2016-11-12-131415.pdf' }, 'upload-counterpart-agreements script run by test user' )
""" import sys sys.path.insert(0, '.') from dmscripts.env import get_api_endpoint_from_stage from dmscripts.bulk_upload_documents import get_bucket_name, get_all_files_of_type from dmscripts.upload_counterpart_agreements import upload_counterpart_file from docopt import docopt from dmapiclient import DataAPIClient from dmutils.s3 import S3 if __name__ == '__main__': arguments = docopt(__doc__) stage = arguments['<stage>'] client = DataAPIClient(get_api_endpoint_from_stage(stage), arguments['<api_token>']) framework_slug = arguments['<framework_slug>'] document_directory = arguments['<documents_directory>'] dry_run = arguments['--dry-run'] if dry_run: bucket = None else: bucket = S3(get_bucket_name(stage, "agreements")) for file_path in get_all_files_of_type(document_directory, "pdf"): upload_counterpart_file(bucket, framework_slug, file_path, dry_run, client)
def test_fails_if_email_template_error( notify_raise_email_error, notify_fail_early, find_users_iterable, expected_send_email_emails, ): bucket = mock.Mock() data_api_client = mock.Mock() data_api_client.get_supplier_framework_info.return_value = { "frameworkInterest": { "agreementId": 23, "declaration": { "supplierRegisteredName": "The supplier who signed", "primaryContactEmail": "*****@*****.**", }, }, } data_api_client.find_users_iter.side_effect = lambda *args, **kwargs: iter(find_users_iterable) dm_notify_client = mock.Mock() if notify_raise_email_error: dm_notify_client.send_email.side_effect = EmailTemplateError("Forgot the stamp") with mock.patch.object(builtins, 'open', mock.mock_open(read_data='foo')): with (pytest.raises(EmailTemplateError) if notify_raise_email_error else _empty_context_manager()): upload_counterpart_file( bucket, { "frameworkLiveAtUTC": '2019-07-02T11:00:00.603808Z', "name": "Dos Two", "slug": "digital-outcomes-and-specialists-2", }, 'pdfs/123456-file.pdf', False, data_api_client, "Framework Agreement", dm_notify_client=dm_notify_client, notify_template_id="dead-beef-baad-f00d", notify_fail_early=notify_fail_early, ) assert bucket.save.called is True assert data_api_client.update_framework_agreement.called is True data_api_client.find_users_iter.assert_called_with(supplier_id=123456) expected_personalisation = { "framework_slug": "digital-outcomes-and-specialists-2", "framework_name": "Dos Two", "supplier_name": "The supplier who signed", "contract_title": "Framework Agreement", "frameworkLiveAt_dateformat": '2 July 2019' } if notify_raise_email_error: # we don't want to dictate anything about the order emails are tried in so we can't know which one it will # have tried first - this is probably the only useful thing we can assert assert len(dm_notify_client.send_email.call_args_list) == 1 else: assert sorted(dm_notify_client.send_email.call_args_list) == sorted( ( (email, "dead-beef-baad-f00d", expected_personalisation), {"allow_resend": True}, ) for email in expected_send_email_emails )
arguments["--notify-key"], logger=logger) if dry_run: bucket = None else: bucket = S3(get_bucket_name(stage, "agreements")) failure_count = 0 for file_path in get_all_files_of_type(document_directory, "pdf"): try: upload_counterpart_file( bucket, framework, file_path, dry_run, data_api_client, dm_notify_client=dm_notify_client, notify_template_id=arguments.get("--notify-template-id"), notify_fail_early=False, logger=logger, ) except (OSError, IOError, S3ResponseError, EmailError, APIError) as e: # upload_counterpart_file should have already logged these so no need here failure_count += 1 # we return the failure_count as the error code, though note these count "failures" quite pessimistically, a single # email's notify call failing will count the supplier's action as a failure even if the file was successfully # uploaded (and possibly even other emails managed to get out) sys.exit(failure_count)