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'
            )
Exemple #2
0
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()
Exemple #4
0
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)
Exemple #6
0
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)