import json
import os
from contextlib import contextmanager
from datetime import date, datetime, timedelta
from unittest.mock import Mock
import pytest
from bs4 import BeautifulSoup
from flask import Flask, url_for
from notifications_python_client.errors import HTTPError
from notifications_utils.url_safe_token import generate_token
from app import create_app
from app.notify_client.models import InvitedOrgUser, InvitedUser, User
from . import (
TestClient,
api_key_json,
generate_uuid,
invite_json,
invited_user,
job_json,
notification_json,
org_invite_json,
organisation_json,
sample_uuid,
service_json,
single_notification_json,
template_json,
template_version_json,
user_json,
)
@pytest.fixture
def app_(request):
app = Flask('app')
create_app(app)
ctx = app.app_context()
ctx.push()
app.test_client_class = TestClient
yield app
ctx.pop()
@pytest.fixture(scope='function')
def service_one(api_user_active):
return service_json(SERVICE_ONE_ID, 'service one', [api_user_active.id])
@pytest.fixture(scope='function')
def multiple_reply_to_email_addresses(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'email_address': 'test@example.com',
'is_default': True,
'created_at': datetime.utcnow(),
'updated_at': None
}, {
'id': '5678',
'service_id': service_id,
'email_address': 'test2@example.com',
'is_default': False,
'created_at': datetime.utcnow(),
'updated_at': None
}, {
'id': '9457',
'service_id': service_id,
'email_address': 'test3@example.com',
'is_default': False,
'created_at': datetime.utcnow(),
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_reply_to_email_addresses', side_effect=_get)
@pytest.fixture(scope='function')
def no_reply_to_email_addresses(mocker):
def _get(service_id):
return []
return mocker.patch('app.service_api_client.get_reply_to_email_addresses', side_effect=_get)
@pytest.fixture(scope='function')
def single_reply_to_email_address(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'email_address': 'test@example.com',
'is_default': True,
'created_at': datetime.utcnow(),
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_reply_to_email_addresses', side_effect=_get)
@pytest.fixture(scope='function')
def get_default_reply_to_email_address(mocker):
def _get(service_id, reply_to_email_id):
return {
'id': '1234',
'service_id': service_id,
'email_address': 'test@example.com',
'is_default': True,
'created_at': datetime.utcnow(),
'updated_at': None
}
return mocker.patch('app.service_api_client.get_reply_to_email_address', side_effect=_get)
@pytest.fixture(scope='function')
def get_non_default_reply_to_email_address(mocker):
def _get(service_id, reply_to_email_id):
return {
'id': '1234',
'service_id': service_id,
'email_address': 'test@example.com',
'is_default': False,
'created_at': datetime.utcnow(),
'updated_at': None
}
return mocker.patch('app.service_api_client.get_reply_to_email_address', side_effect=_get)
@pytest.fixture(scope='function')
def mock_add_reply_to_email_address(mocker):
def _add_reply_to(service_id, email_address, is_default=False):
return
return mocker.patch('app.service_api_client.add_reply_to_email_address', side_effect=_add_reply_to)
@pytest.fixture(scope='function')
def mock_update_reply_to_email_address(mocker):
def _update_reply_to(service_id, reply_to_email_id, email_address=None, active=None, is_default=False):
return
return mocker.patch('app.service_api_client.update_reply_to_email_address', side_effect=_update_reply_to)
@pytest.fixture(scope='function')
def multiple_letter_contact_blocks(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'contact_block': '1 Example Street',
'is_default': True,
'created_at': datetime.utcnow(),
'updated_at': None
}, {
'id': '5678',
'service_id': service_id,
'contact_block': '2 Example Street',
'is_default': False,
'created_at': datetime.utcnow(),
'updated_at': None
}, {
'id': '9457',
'service_id': service_id,
'contact_block': '3 Example Street',
'is_default': False,
'created_at': datetime.utcnow(),
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_letter_contacts', side_effect=_get)
@pytest.fixture(scope='function')
def no_letter_contact_blocks(mocker):
def _get(service_id):
return []
return mocker.patch('app.service_api_client.get_letter_contacts', side_effect=_get)
@pytest.fixture(scope='function')
def single_letter_contact_block(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'contact_block': '1 Example Street',
'is_default': True,
'created_at': datetime.utcnow(),
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_letter_contacts', side_effect=_get)
@pytest.fixture(scope='function')
def injected_letter_contact_block(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'contact_block': 'foo\nbar',
'is_default': True,
'created_at': datetime.utcnow(),
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_letter_contacts', side_effect=_get)
@pytest.fixture(scope='function')
def get_default_letter_contact_block(mocker):
def _get(service_id, letter_contact_id):
return {
'id': '1234',
'service_id': service_id,
'contact_block': '1 Example Street',
'is_default': True,
'created_at': datetime.utcnow(),
'updated_at': None
}
return mocker.patch('app.service_api_client.get_letter_contact', side_effect=_get)
@pytest.fixture(scope='function')
def get_non_default_letter_contact_block(mocker):
def _get(service_id, letter_contact_id):
return {
'id': '1234',
'service_id': service_id,
'contact_block': '1 Example Street',
'is_default': False,
'created_at': datetime.utcnow(),
'updated_at': None
}
return mocker.patch('app.service_api_client.get_letter_contact', side_effect=_get)
@pytest.fixture(scope='function')
def mock_add_letter_contact(mocker):
def _add_letter_contact(service_id, contact_block, is_default=False):
return
return mocker.patch('app.service_api_client.add_letter_contact', side_effect=_add_letter_contact)
@pytest.fixture(scope='function')
def mock_update_letter_contact(mocker):
def _update_letter_contact(service_id, letter_contact_id, contact_block, is_default=False):
return
return mocker.patch('app.service_api_client.update_letter_contact', side_effect=_update_letter_contact)
@pytest.fixture(scope='function')
def multiple_sms_senders(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'sms_sender': 'Example',
'is_default': True,
'created_at': datetime.utcnow(),
'inbound_number_id': '1234',
'updated_at': None
}, {
'id': '5678',
'service_id': service_id,
'sms_sender': 'Example 2',
'is_default': False,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}, {
'id': '9457',
'service_id': service_id,
'sms_sender': 'Example 3',
'is_default': False,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_sms_senders', side_effect=_get)
@pytest.fixture(scope='function')
def multiple_sms_senders_with_diff_default(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'sms_sender': 'Example',
'is_default': True,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}, {
'id': '5678',
'service_id': service_id,
'sms_sender': 'Example 2',
'is_default': False,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}, {
'id': '9457',
'service_id': service_id,
'sms_sender': 'Example 3',
'is_default': False,
'created_at': datetime.utcnow(),
'inbound_number_id': '12354',
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_sms_senders', side_effect=_get)
@pytest.fixture(scope='function')
def multiple_sms_senders_no_inbound(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'sms_sender': 'Example',
'is_default': True,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}, {
'id': '5678',
'service_id': service_id,
'sms_sender': 'Example 2',
'is_default': False,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_sms_senders', side_effect=_get)
@pytest.fixture(scope='function')
def no_sms_senders(mocker):
def _get(service_id):
return []
return mocker.patch('app.service_api_client.get_sms_senders', side_effect=_get)
@pytest.fixture(scope='function')
def single_sms_sender(mocker):
def _get(service_id):
return [
{
'id': '1234',
'service_id': service_id,
'sms_sender': 'GOVUK',
'is_default': True,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}
]
return mocker.patch('app.service_api_client.get_sms_senders', side_effect=_get)
@pytest.fixture(scope='function')
def get_default_sms_sender(mocker):
def _get(service_id, sms_sender_id):
return {
'id': '1234',
'service_id': service_id,
'sms_sender': 'GOVUK',
'is_default': True,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}
return mocker.patch('app.service_api_client.get_sms_sender', side_effect=_get)
@pytest.fixture(scope='function')
def get_non_default_sms_sender(mocker):
def _get(service_id, sms_sender_id):
return {
'id': '1234',
'service_id': service_id,
'sms_sender': 'GOVUK',
'is_default': False,
'created_at': datetime.utcnow(),
'inbound_number_id': None,
'updated_at': None
}
return mocker.patch('app.service_api_client.get_sms_sender', side_effect=_get)
@pytest.fixture(scope='function')
def get_inbound_number_sms_sender(mocker):
def _get(service_id, sms_sender_id):
return {
'id': '1234',
'service_id': service_id,
'sms_sender': 'GOVUK',
'is_default': False,
'created_at': datetime.utcnow(),
'inbound_number_id': '1234',
'updated_at': None
}
return mocker.patch('app.service_api_client.get_sms_sender', side_effect=_get)
@pytest.fixture(scope='function')
def mock_add_sms_sender(mocker):
def _add_sms_sender(service_id, sms_sender, is_default=False, inbound_number_id=None):
return
return mocker.patch('app.service_api_client.add_sms_sender', side_effect=_add_sms_sender)
@pytest.fixture(scope='function')
def mock_update_sms_sender(mocker):
def _update_sms_sender(service_id, sms_sender_id, sms_sender=None, active=None, is_default=False):
return
return mocker.patch('app.service_api_client.update_sms_sender', side_effect=_update_sms_sender)
@pytest.fixture(scope='function')
def multiple_available_inbound_numbers(mocker):
def _get():
return {'data': [
{
'active': True,
'created_at': '2017-10-18T16:57:14.154185Z',
'id': '781d9c60-7a7e-46b7-9896-7b045b992fa7',
'number': '0712121214',
'provider': 'mmg',
'service': None,
'updated_at': None
}, {
'active': True,
'created_at': '2017-10-18T16:57:22.585806Z',
'id': '781d9c60-7a7e-46b7-9896-7b045b992fa5',
'number': '0712121215',
'provider': 'mmg',
'service': None,
'updated_at': None
}, {
'active': True,
'created_at': '2017-10-18T16:57:38.585806Z',
'id': '781d9c61-7a7e-46b7-9896-7b045b992fa5',
'number': '0712121216',
'provider': 'mmg',
'service': None,
'updated_at': None
}
]}
return mocker.patch('app.inbound_number_client.get_available_inbound_sms_numbers', side_effect=_get)
@pytest.fixture(scope='function')
def no_available_inbound_numbers(mocker):
def _get():
return {'data': []}
return mocker.patch('app.inbound_number_client.get_available_inbound_sms_numbers', side_effect=_get)
@pytest.fixture(scope='function')
def fake_uuid():
return sample_uuid()
@pytest.fixture(scope='function')
def mock_get_service(mocker, api_user_active):
def _get(service_id):
service = service_json(service_id, users=[api_user_active.id], message_limit=50)
return {'data': service}
return mocker.patch('app.service_api_client.get_service', side_effect=_get)
@pytest.fixture(scope='function')
def mock_get_international_service(mocker, api_user_active):
def _get(service_id):
service = service_json(service_id, users=[api_user_active.id], permissions=['sms', 'international_sms'])
return {'data': service}
return mocker.patch('app.service_api_client.get_service', side_effect=_get)
@pytest.fixture(scope='function')
def mock_get_service_statistics(mocker, api_user_active):
def _get(service_id, today_only, limit_days=None):
return {
'email': {'requested': 0, 'delivered': 0, 'failed': 0},
'sms': {'requested': 0, 'delivered': 0, 'failed': 0},
'letter': {'requested': 0, 'delivered': 0, 'failed': 0}
}
return mocker.patch('app.service_api_client.get_service_statistics', side_effect=_get)
@pytest.fixture(scope='function')
def mock_get_service_data_retention_by_notification_type(mocker, api_user_active):
def _get(service_id, notification_type):
return {}
return mocker.patch('app.service_api_client.get_service_data_retention_by_notification_type', side_effect=_get)
@pytest.fixture(scope='function')
def mock_get_detailed_services(mocker, fake_uuid):
service_one = service_json(
id_=SERVICE_ONE_ID,
name="service_one",
users=[fake_uuid],
message_limit=1000,
active=True,
restricted=False,
)
service_two = service_json(
id_=fake_uuid,
name="service_two",
users=[fake_uuid],
message_limit=1000,
active=True,
restricted=True,
)
service_one['statistics'] = {
'email': {'requested': 0, 'delivered': 0, 'failed': 0},
'sms': {'requested': 0, 'delivered': 0, 'failed': 0},
'letter': {'requested': 0, 'delivered': 0, 'failed': 0}
}
service_two['statistics'] = {
'email': {'requested': 0, 'delivered': 0, 'failed': 0},
'sms': {'requested': 0, 'delivered': 0, 'failed': 0},
'letter': {'requested': 0, 'delivered': 0, 'failed': 0}
}
services = {'data': [service_one, service_two]}
return mocker.patch('app.service_api_client.get_services', return_value=services)
@pytest.fixture(scope='function')
def mock_service_name_is_not_unique(mocker):
return mocker.patch('app.service_api_client.is_service_name_unique', return_value=False)
@pytest.fixture(scope='function')
def mock_service_name_is_unique(mocker):
return mocker.patch('app.service_api_client.is_service_name_unique', return_value=True)
@pytest.fixture(scope='function')
def mock_get_live_service(mocker, api_user_active):
def _get(service_id):
service = service_json(
service_id,
users=[api_user_active.id],
restricted=False)
return {'data': service}
return mocker.patch('app.service_api_client.get_service', side_effect=_get)
@pytest.fixture(scope='function')
def mock_get_service_with_letters(mocker, api_user_active):
def _get(service_id):
return {'data': service_json(
service_id,
users=[api_user_active.id],
restricted=False,
permissions=['email', 'sms', 'letter']
)}
return mocker.patch('app.service_api_client.get_service', side_effect=_get)
@pytest.fixture(scope='function')
def mock_create_service(mocker):
def _create(
service_name,
organisation_type,
message_limit,
restricted,
user_id,
email_from,
):
service = service_json(
101, service_name, [user_id], message_limit=message_limit, restricted=restricted, email_from=email_from)
return service['id']
return mocker.patch(
'app.service_api_client.create_service', side_effect=_create)
@pytest.fixture(scope='function')
def mock_create_duplicate_service(mocker):
def _create(
service_name,
organisation_type,
message_limit,
restricted,
user_id,
email_from,
):
json_mock = Mock(return_value={'message': {'name': ["Duplicate service name '{}'".format(service_name)]}})
resp_mock = Mock(status_code=400, json=json_mock)
http_error = HTTPError(response=resp_mock, message="Default message")
raise http_error
return mocker.patch(
'app.service_api_client.create_service', side_effect=_create)
@pytest.fixture(scope='function')
def mock_update_service(mocker):
def _update(service_id, **kwargs):
service = service_json(
service_id,
**{key: kwargs[key] for key in kwargs if key in [
'name',
'users',
'message_limit',
'active',
'restricted',
'email_from',
'sms_sender',
'permissions'
]}
)
return {'data': service}
return mocker.patch(
'app.service_api_client.update_service', side_effect=_update, autospec=True)
@pytest.fixture(scope='function')
def mock_update_service_raise_httperror_duplicate_name(mocker):
def _update(
service_id,
**kwargs
):
json_mock = Mock(return_value={'message': {'name': ["Duplicate service name '{}'".format(kwargs.get('name'))]}})
resp_mock = Mock(status_code=400, json=json_mock)
http_error = HTTPError(response=resp_mock, message="Default message")
raise http_error
return mocker.patch(
'app.service_api_client.update_service', side_effect=_update)
SERVICE_ONE_ID = "596364a0-858e-42c8-9062-a8fe822260eb"
SERVICE_TWO_ID = "147ad62a-2951-4fa1-9ca0-093cd1a52c52"
ORGANISATION_ID = "c011fa40-4cbe-4524-b415-dde2f421bd9c"
TEMPLATE_ONE_ID = "b22d7d94-2197-4a7d-a8e7-fd5f9770bf48"
@pytest.fixture(scope='function')
def mock_get_services(mocker, fake_uuid, user=None):
if user is None:
user = active_user_with_permissions(fake_uuid)
def _get_services(params_dict=None):
service_one = service_json(
SERVICE_ONE_ID, "service_one", [user.id], 1000, True, False)
service_two = service_json(
SERVICE_TWO_ID, "service_two", [user.id], 1000, True, False)
return {'data': [service_one, service_two]}
return mocker.patch(
'app.service_api_client.get_services', side_effect=_get_services)
@pytest.fixture(scope='function')
def mock_get_services_with_no_services(mocker, fake_uuid, user=None):
if user is None:
user = active_user_with_permissions(fake_uuid)
def _get_services(params_dict=None):
return {'data': []}
return mocker.patch(
'app.service_api_client.get_services', side_effect=_get_services)
@pytest.fixture(scope='function')
def mock_get_services_with_one_service(mocker, fake_uuid, user=None):
if user is None:
user = api_user_active(fake_uuid)
def _get_services(params_dict=None):
return {'data': [service_json(
SERVICE_ONE_ID, "service_one", [user.id], 1000, True, True
)]}
return mocker.patch(
'app.service_api_client.get_services', side_effect=_get_services)
@pytest.fixture(scope='function')
def mock_get_service_template(mocker):
def _get(service_id, template_id, version=None):
template = template_json(
service_id, template_id, "Two week reminder", "sms", "Template content with & entity")
if version:
template.update({'version': version})
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_service_template_with_priority(mocker):
def _get(service_id, template_id, version=None):
template = template_json(
service_id, template_id, "Two week reminder", "sms", "Template content with & entity",
process_type='priority')
if version:
template.update({'version': version})
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_deleted_template(mocker):
def _get(service_id, template_id, version=None):
template = template_json(
service_id,
template_id,
"Two week reminder",
"sms",
"Template content with & entity",
archived=True
)
if version:
template.update({'version': version})
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_template_version(mocker, fake_uuid, user=None):
if user is None:
user = api_user_active(fake_uuid)
def _get(service_id, template_id, version):
template_version = template_version_json(
service_id,
template_id,
user,
version=version
)
return {'data': template_version}
return mocker.patch(
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_template_versions(mocker, fake_uuid, user=None):
if user is None:
user = api_user_active(fake_uuid)
def _get(service_id, template_id):
template_version = template_version_json(
service_id,
template_id,
user,
version=1
)
return {'data': [template_version]}
return mocker.patch(
'app.service_api_client.get_service_template_versions',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_service_template_with_placeholders(mocker):
def _get(service_id, template_id):
template = template_json(
service_id, template_id, "Two week reminder", "sms", "((name)), Template content with & entity"
)
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_service_template_with_placeholders_same_as_recipient(mocker):
def _get(service_id, template_id):
template = template_json(
service_id, template_id, "Two week reminder", "sms", "((name)) ((date)) ((PHONENUMBER))"
)
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_service_email_template(mocker, content=None, subject=None, redact_personalisation=False):
def _get(service_id, template_id, version=None):
template = template_json(
service_id,
template_id,
"Two week reminder",
"email",
content or "Your vehicle tax expires on ((date))",
subject or "Your ((thing)) is due soon",
redact_personalisation=redact_personalisation,
)
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template', side_effect=_get)
@pytest.fixture(scope='function')
def mock_get_service_email_template_without_placeholders(mocker):
return mock_get_service_email_template(
mocker,
content="Your vehicle tax expires soon",
subject="Your thing is due soon",
)
@pytest.fixture(scope='function')
def mock_get_service_letter_template(mocker, content=None, subject=None):
def _get(service_id, template_id, version=None):
template = template_json(
service_id,
template_id,
"Two week reminder",
"letter",
content or "Template content with & entity",
subject or "Subject",
)
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template', side_effect=_get
)
@pytest.fixture(scope='function')
def mock_create_service_template(mocker, fake_uuid):
def _create(name, type_, content, service, subject=None, process_type=None):
template = template_json(fake_uuid, name, type_, content, service, process_type)
return {'data': template}
return mocker.patch(
'app.service_api_client.create_service_template',
side_effect=_create)
@pytest.fixture(scope='function')
def mock_update_service_template(mocker):
def _update(id_, name, type_, content, service, subject=None, process_type=None):
template = template_json(service, id_, name, type_, content, subject, process_type)
return {'data': template}
return mocker.patch(
'app.service_api_client.update_service_template',
side_effect=_update)
@pytest.fixture(scope='function')
def mock_create_service_template_content_too_big(mocker):
def _create(name, type_, content, service, subject=None, process_type=None):
json_mock = Mock(return_value={
'message': {'content': ["Content has a character count greater than the limit of 459"]},
'result': 'error'
})
resp_mock = Mock(status_code=400, json=json_mock)
http_error = HTTPError(
response=resp_mock,
message={'content': ["Content has a character count greater than the limit of 459"]})
raise http_error
return mocker.patch(
'app.service_api_client.create_service_template',
side_effect=_create)
@pytest.fixture(scope='function')
def mock_update_service_template_400_content_too_big(mocker):
def _update(id_, name, type_, content, service, subject=None, process_type=None):
json_mock = Mock(return_value={
'message': {'content': ["Content has a character count greater than the limit of 459"]},
'result': 'error'
})
resp_mock = Mock(status_code=400, json=json_mock)
http_error = HTTPError(
response=resp_mock,
message={'content': ["Content has a character count greater than the limit of 459"]})
raise http_error
return mocker.patch(
'app.service_api_client.update_service_template',
side_effect=_update)
def create_service_templates(service_id, number_of_templates=6):
template_types = ["sms", "sms", "email", "email", "letter", "letter"]
service_templates = []
for _ in range(1, number_of_templates + 1):
template_number = "two" if _ % 2 == 0 else "one"
template_type = template_types[(_ % 6) - 1]
service_templates.append(template_json(
service_id,
TEMPLATE_ONE_ID if _ == 1 else str(generate_uuid),
"{}_template_{}".format(template_type, template_number),
template_type,
"{} template {} content".format(template_type, template_number),
subject="{} template {} subject".format(template_type, template_number)
if template_type in ["email", "letter"] else None
))
return {'data': service_templates}
@pytest.fixture(scope='function')
def mock_get_service_templates(mocker):
def _create(service_id):
return create_service_templates(service_id)
return mocker.patch(
'app.service_api_client.get_service_templates',
side_effect=_create)
@pytest.fixture(scope='function')
def mock_get_more_service_templates_than_can_fit_onscreen(mocker):
def _create(service_id):
return create_service_templates(service_id, number_of_templates=20)
return mocker.patch(
'app.service_api_client.get_service_templates',
side_effect=_create)
@pytest.fixture(scope='function')
def mock_get_service_templates_when_no_templates_exist(mocker):
def _create(service_id):
return {'data': []}
return mocker.patch(
'app.service_api_client.get_service_templates',
side_effect=_create)
@pytest.fixture(scope='function')
def mock_get_service_templates_with_only_one_template(mocker):
def _get(service_id):
return {'data': [
template_json(
service_id, generate_uuid(), "sms_template_one", "sms", "sms template one content"
)
]}
return mocker.patch(
'app.service_api_client.get_service_templates',
side_effect=_get)
@pytest.fixture(scope='function')
def mock_delete_service_template(mocker):
def _delete(service_id, template_id):
template = template_json(
service_id, template_id, "Template to delete", "sms", "content to be deleted")
return {'data': template}
return mocker.patch(
'app.service_api_client.delete_service_template', side_effect=_delete)
@pytest.fixture(scope='function')
def mock_redact_template(mocker):
return mocker.patch('app.service_api_client.redact_service_template')
@pytest.fixture(scope='function')
def mock_update_service_template_sender(mocker):
def _update(service_id, template_id, reply_to):
return
return mocker.patch(
'app.service_api_client.update_service_template_sender',
side_effect=_update
)
@pytest.fixture(scope='function')
def api_user_pending(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'pending',
'failed_login_count': 0,
'permissions': {},
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def platform_admin_user(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Platform admin user',
'password': 'somepassword',
'email_address': 'platform@admin.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: ['send_texts',
'send_emails',
'send_letters',
'manage_users',
'manage_templates',
'manage_settings',
'manage_api_keys',
'view_activity']},
'platform_admin': True,
'auth_type': 'sms_auth',
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def api_user_active(fake_uuid, email_address='test@user.gov.uk'):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'email_address': email_address,
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {},
'platform_admin': False,
'auth_type': 'sms_auth',
'password_changed_at': str(datetime.utcnow()),
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def api_user_active_email_auth(fake_uuid, email_address='test@user.gov.uk'):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'email_address': email_address,
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {},
'platform_admin': False,
'auth_type': 'email_auth',
'password_changed_at': str(datetime.utcnow()),
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def api_nongov_user_active(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'email_address': 'someuser@notonwhitelist.com',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {},
'platform_admin': False,
'auth_type': 'sms_auth',
'password_changed_at': str(datetime.utcnow()),
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def active_user_with_permissions(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'password_changed_at': str(datetime.utcnow()),
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: ['send_texts',
'send_emails',
'send_letters',
'manage_users',
'manage_templates',
'manage_settings',
'manage_api_keys',
'view_activity']},
'platform_admin': False,
'auth_type': 'sms_auth',
'organisations': [ORGANISATION_ID]
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def active_caseworking_user(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {
'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'password_changed_at': str(datetime.utcnow()),
'email_address': 'caseworker@example.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: [
'send_texts',
'send_emails',
'send_letters',
]},
'platform_admin': False,
'auth_type': 'sms_auth',
'organisations': [],
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def active_user_no_mobile(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'password_changed_at': str(datetime.utcnow()),
'email_address': 'test@user.gov.uk',
'mobile_number': None,
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: ['send_texts',
'send_emails',
'send_letters',
'manage_users',
'manage_templates',
'manage_settings',
'manage_api_keys',
'view_activity']},
'platform_admin': False,
'auth_type': 'email_auth',
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture
def active_user_view_permissions(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User With Permissions',
'password': 'somepassword',
'password_changed_at': str(datetime.utcnow()),
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: ['view_activity']},
'platform_admin': False,
'auth_type': 'sms_auth',
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture
def active_user_empty_permissions(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User With Empty Permissions',
'password': 'somepassword',
'password_changed_at': str(datetime.utcnow()),
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900763',
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: []},
'platform_admin': False,
'auth_type': 'sms_auth',
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture
def active_user_manage_template_permission(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {
'id': fake_uuid,
'name': 'Test User With Permissions',
'password': 'somepassword',
'password_changed_at': str(datetime.utcnow()),
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: [
'manage_templates',
'view_activity',
]},
'platform_admin': False,
'auth_type': 'sms_auth',
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture
def active_user_no_api_key_permission(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {
'id': fake_uuid,
'name': 'Test User With Permissions',
'password': 'somepassword',
'password_changed_at': str(datetime.utcnow()),
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: [
'manage_templates',
'manage_settings',
'view_activity',
]},
'platform_admin': False,
'auth_type': 'sms_auth',
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture
def active_user_no_settings_permission(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {
'id': fake_uuid,
'name': 'Test User With Permissions',
'password': 'somepassword',
'password_changed_at': str(datetime.utcnow()),
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 0,
'permissions': {SERVICE_ONE_ID: [
'manage_templates',
'manage_api_keys',
'view_activity',
]},
'platform_admin': False,
'auth_type': 'sms_auth'
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def api_user_locked(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 5,
'permissions': {},
'auth_type': 'sms_auth',
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def api_user_request_password_reset(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 5,
'permissions': {},
'password_changed_at': None,
'auth_type': 'sms_auth',
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def api_user_changed_password(fake_uuid):
from app.notify_client.user_api_client import User
user_data = {'id': fake_uuid,
'name': 'Test User',
'password': 'somepassword',
'email_address': 'test@user.gov.uk',
'mobile_number': '07700 900762',
'state': 'active',
'failed_login_count': 5,
'permissions': {},
'auth_type': 'sms_auth',
'password_changed_at': str(datetime.utcnow() + timedelta(minutes=1)),
'organisations': []
}
user = User(user_data)
return user
@pytest.fixture(scope='function')
def mock_send_change_email_verification(mocker):
return mocker.patch('app.user_api_client.send_change_email_verification')
@pytest.fixture(scope='function')
def mock_register_user(mocker, api_user_pending):
def _register(name, email_address, mobile_number, password, auth_type):
api_user_pending.name = name
api_user_pending.email_address = email_address
api_user_pending.mobile_number = mobile_number
api_user_pending.password = password
api_user_pending.auth_type = auth_type
return api_user_pending
return mocker.patch('app.user_api_client.register_user', side_effect=_register)
@pytest.fixture(scope='function')
def mock_get_non_govuser(mocker, user=None):
if user is None:
user = api_user_active(sample_uuid(), email_address='someuser@notonwhitelist.com')
def _get_user(id_):
user.id = id_
return user
return mocker.patch(
'app.user_api_client.get_user', side_effect=_get_user)
@pytest.fixture(scope='function')
def mock_get_user(mocker, user=None):
if user is None:
user = api_user_active(sample_uuid())
def _get_user(id_):
user.id = id_
return user
return mocker.patch(
'app.user_api_client.get_user', side_effect=_get_user)
@pytest.fixture(scope='function')
def mock_get_organisation_user(mocker, user=None):
if user is None:
user = api_user_active(sample_uuid())
def _get_user(id_):
user.id = id_
return user
return mocker.patch(
'app.user_api_client.get_user', side_effect=_get_user)
@pytest.fixture(scope='function')
def mock_get_locked_user(mocker, api_user_locked):
return mock_get_user(mocker, user=api_user_locked)
@pytest.fixture(scope='function')
def mock_get_user_locked(mocker, api_user_locked):
return mocker.patch(
'app.user_api_client.get_user', return_value=api_user_locked)
@pytest.fixture(scope='function')
def mock_get_user_pending(mocker, api_user_pending):
return mocker.patch(
'app.user_api_client.get_user', return_value=api_user_pending)
@pytest.fixture(scope='function')
def mock_get_user_by_email(mocker, user=None):
if user is None:
user = api_user_active(sample_uuid())
def _get_user(email_address):
user.email_address = email_address
return user
return mocker.patch('app.user_api_client.get_user_by_email', side_effect=_get_user)
@pytest.fixture(scope='function')
def mock_get_locked_user_by_email(mocker, api_user_locked):
return mock_get_user_by_email(mocker, user=api_user_locked)
@pytest.fixture(scope='function')
def mock_get_user_with_permissions(mocker, api_user_active):
def _get_user(id):
api_user_active._permissions[''] = ['manage_users', 'manage_templates', 'manage_settings']
return api_user_active
return mocker.patch(
'app.user_api_client.get_user', side_effect=_get_user)
@pytest.fixture(scope='function')
def mock_dont_get_user_by_email(mocker):
def _get_user(email_address):
return None
return mocker.patch(
'app.user_api_client.get_user_by_email',
side_effect=_get_user,
autospec=True
)
@pytest.fixture(scope='function')
def mock_get_user_by_email_request_password_reset(mocker, api_user_request_password_reset):
return mocker.patch(
'app.user_api_client.get_user_by_email',
return_value=api_user_request_password_reset)
@pytest.fixture(scope='function')
def mock_get_user_by_email_user_changed_password(mocker, api_user_changed_password):
return mocker.patch(
'app.user_api_client.get_user_by_email',
return_value=api_user_changed_password)
@pytest.fixture(scope='function')
def mock_get_user_by_email_locked(mocker, api_user_locked):
return mocker.patch(
'app.user_api_client.get_user_by_email', return_value=api_user_locked)
@pytest.fixture(scope='function')
def mock_get_user_by_email_inactive(mocker, api_user_pending):
return mocker.patch('app.user_api_client.get_user_by_email', return_value=api_user_pending)
@pytest.fixture(scope='function')
def mock_get_user_by_email_pending(mocker, api_user_pending):
return mocker.patch(
'app.user_api_client.get_user_by_email',
return_value=api_user_pending)
@pytest.fixture(scope='function')
def mock_get_user_by_email_not_found(mocker, api_user_active):
def _get_user(email):
json_mock = Mock(return_value={'message': "Not found", 'result': 'error'})
resp_mock = Mock(status_code=404, json=json_mock)
http_error = HTTPError(response=resp_mock, message="Default message")
raise http_error
return mocker.patch(
'app.user_api_client.get_user_by_email',
side_effect=_get_user)
@pytest.fixture(scope='function')
def mock_verify_password(mocker):
def _verify_password(user, password):
return True
return mocker.patch(
'app.user_api_client.verify_password',
side_effect=_verify_password)
@pytest.fixture(scope='function')
def mock_update_user_password(mocker, api_user_active):
def _update(user_id, **kwargs):
return api_user_active
return mocker.patch('app.user_api_client.update_password', side_effect=_update)
@pytest.fixture(scope='function')
def mock_update_user_attribute(mocker, api_user_active):
def _update(user_id, **kwargs):
return api_user_active
return mocker.patch('app.user_api_client.update_user_attribute', side_effect=_update)
@pytest.fixture
def mock_activate_user(mocker):
def _activate(user):
user.state = 'active'
return user
return mocker.patch('app.user_api_client.activate_user', side_effect=_activate)
@pytest.fixture(scope='function')
def mock_email_is_already_in_use(mocker):
return mocker.patch('app.user_api_client.is_email_already_in_use', return_value=True)
@pytest.fixture(scope='function')
def mock_email_is_not_already_in_use(mocker):
return mocker.patch('app.user_api_client.is_email_already_in_use', return_value=False)
@pytest.fixture(scope='function')
def mock_get_all_users_from_api(mocker):
return mocker.patch('app.user_api_client.get_users', return_value={'data': []})
@pytest.fixture(scope='function')
def mock_create_api_key(mocker):
def _create(service_id, key_name):
return str(generate_uuid())
return mocker.patch('app.api_key_api_client.create_api_key', side_effect=_create)
@pytest.fixture(scope='function')
def mock_revoke_api_key(mocker):
def _revoke(service_id, key_id):
return {}
return mocker.patch(
'app.api_key_api_client.revoke_api_key',
side_effect=_revoke)
@pytest.fixture(scope='function')
def mock_get_api_keys(mocker):
def _get_keys(service_id, key_id=None):
keys = {'apiKeys': [api_key_json(service_id, 'some key name'),
api_key_json(service_id, 'another key name', expiry_date=str(date.fromtimestamp(0)))]}
return keys
return mocker.patch('app.api_key_api_client.get_api_keys', side_effect=_get_keys)
@pytest.fixture(scope='function')
def mock_get_no_api_keys(mocker):
def _get_keys(service_id):
keys = {'apiKeys': []}
return keys
return mocker.patch('app.api_key_api_client.get_api_keys', side_effect=_get_keys)
@pytest.fixture(scope='function')
def mock_login(mocker, mock_get_user, mock_update_user_attribute, mock_events):
def _verify_code(user_id, code, code_type):
return True, ''
def _no_services(params_dict=None):
return {'data': []}
return (
mocker.patch(
'app.user_api_client.check_verify_code',
side_effect=_verify_code
),
mocker.patch(
'app.service_api_client.get_services',
side_effect=_no_services
)
)
@pytest.fixture(scope='function')
def mock_send_verify_code(mocker):
return mocker.patch('app.user_api_client.send_verify_code')
@pytest.fixture(scope='function')
def mock_send_verify_email(mocker):
return mocker.patch('app.user_api_client.send_verify_email')
@pytest.fixture(scope='function')
def mock_check_verify_code(mocker):
def _verify(user_id, code, code_type):
return True, ''
return mocker.patch(
'app.user_api_client.check_verify_code',
side_effect=_verify)
@pytest.fixture(scope='function')
def mock_check_verify_code_code_not_found(mocker):
def _verify(user_id, code, code_type):
return False, 'Code not found'
return mocker.patch(
'app.user_api_client.check_verify_code',
side_effect=_verify)
@pytest.fixture(scope='function')
def mock_check_verify_code_code_expired(mocker):
def _verify(user_id, code, code_type):
return False, 'Code has expired'
return mocker.patch(
'app.user_api_client.check_verify_code',
side_effect=_verify)
@pytest.fixture(scope='function')
def mock_create_job(mocker, api_user_active):
def _create(job_id, service_id, scheduled_for=None):
return job_json(
service_id,
api_user_active,
job_id=job_id,
)
return mocker.patch('app.job_api_client.create_job', side_effect=_create)
@pytest.fixture(scope='function')
def mock_get_job(mocker, api_user_active):
def _get_job(service_id, job_id):
return {"data": job_json(service_id, api_user_active, job_id=job_id)}
return mocker.patch('app.job_api_client.get_job', side_effect=_get_job)
@pytest.fixture
def mock_get_job_doesnt_exist(mocker):
def _get_job(service_id, job_id):
raise HTTPError(response=Mock(status_code=404, json={}), message={})
return mocker.patch('app.job_api_client.get_job', side_effect=_get_job)
@pytest.fixture(scope='function')
def mock_get_scheduled_job(mocker, api_user_active):
def _get_job(service_id, job_id):
return {"data": job_json(
service_id,
api_user_active,
job_id=job_id,
job_status='scheduled',
scheduled_for='2016-01-02T00:00:00.061258'
)}
return mocker.patch('app.job_api_client.get_job', side_effect=_get_job)
@pytest.fixture(scope='function')
def mock_get_cancelled_job(mocker, api_user_active):
def _get_job(service_id, job_id):
return {"data": job_json(
service_id,
api_user_active,
job_id=job_id,
job_status='cancelled',
scheduled_for='2016-01-01T00:00:00.061258'
)}
return mocker.patch('app.job_api_client.get_job', side_effect=_get_job)
@pytest.fixture(scope='function')
def mock_get_job_in_progress(mocker, api_user_active):
def _get_job(service_id, job_id):
return {"data": job_json(
service_id, api_user_active, job_id=job_id,
notification_count=10,
notifications_requested=5
)}
return mocker.patch('app.job_api_client.get_job', side_effect=_get_job)
@pytest.fixture(scope='function')
def mock_has_jobs(mocker):
mocker.patch('app.job_api_client.has_jobs', return_value=True)
@pytest.fixture(scope='function')
def mock_has_no_jobs(mocker):
mocker.patch('app.job_api_client.has_jobs', return_value=False)
@pytest.fixture(scope='function')
def mock_get_jobs(mocker, api_user_active):
def _get_jobs(service_id, limit_days=None, statuses=None, page=1):
if statuses is None:
statuses = ['', 'scheduled', 'pending', 'cancelled']
jobs = [
job_json(
service_id,
api_user_active,
original_file_name=filename,
scheduled_for=scheduled_for,
job_status=job_status
)
for filename, scheduled_for, job_status in (
('export 1/1/2016.xls', '', 'finished'),
('all email addresses.xlsx', '', 'pending'),
('applicants.ods', '', 'finished'),
('thisisatest.csv', '', 'finished'),
('send_me_later.csv', '2016-01-01 11:09:00.061258', 'scheduled'),
('even_later.csv', '2016-01-01 23:09:00.061258', 'scheduled'),
('full_of_regret.csv', '2016-01-01 23:09:00.061258', 'cancelled')
)
]
return {
'data': [job for job in jobs if job['job_status'] in statuses],
'links': {
'prev': 'services/{}/jobs?page={}'.format(service_id, page - 1),
'next': 'services/{}/jobs?page={}'.format(service_id, page + 1)
}
}
return mocker.patch('app.job_api_client.get_jobs', side_effect=_get_jobs)
@pytest.fixture(scope='function')
def mock_get_notifications(
mocker,
api_user_active,
template_content=None,
diff_template_type=None,
personalisation=None,
redact_personalisation=False,
is_precompiled_letter=False,
client_reference=None,
noti_status=None,
postage=None,
):
def _get_notifications(
service_id,
job_id=None,
page=1,
page_size=50,
template_type=None,
status=None,
limit_days=None,
rows=5,
include_jobs=None,
include_from_test_key=None,
to=None,
include_one_off=None,
):
job = None
if job_id is not None:
job = job_json(service_id, api_user_active, job_id=job_id)
if diff_template_type or template_type:
template = template_json(
service_id,
id_=str(generate_uuid()),
type_=diff_template_type or template_type[0],
content=template_content,
redact_personalisation=redact_personalisation,
is_precompiled_letter=is_precompiled_letter,
)
else:
template = template_json(
service_id,
id_=str(generate_uuid()),
content=template_content,
redact_personalisation=redact_personalisation,
)
return notification_json(
service_id,
template=template,
rows=rows,
job=job,
personalisation=personalisation,
template_type=diff_template_type,
client_reference=client_reference,
status=noti_status,
created_by_name='Firstname Lastname',
postage=postage
)
return mocker.patch(
'app.notification_api_client.get_notifications_for_service',
side_effect=_get_notifications
)
@pytest.fixture(scope='function')
def mock_get_notifications_with_previous_next(mocker):
def _get_notifications(service_id,
job_id=None,
page=1,
template_type=None,
status=None,
limit_days=None,
include_jobs=None,
include_from_test_key=None,
to=None,
include_one_off=None
):
return notification_json(service_id, with_links=True)
return mocker.patch(
'app.notification_api_client.get_notifications_for_service',
side_effect=_get_notifications
)
@pytest.fixture(scope='function')
def mock_get_notifications_with_no_notifications(mocker):
def _get_notifications(service_id,
job_id=None,
page=1,
template_type=None,
status=None,
limit_days=None,
include_jobs=None,
include_from_test_key=None,
to=None,
include_one_off=None
):
return notification_json(service_id, rows=0)
return mocker.patch(
'app.notification_api_client.get_notifications_for_service',
side_effect=_get_notifications
)
@pytest.fixture(scope='function')
def mock_get_inbound_sms(mocker):
def _get_inbound_sms(
service_id,
user_number=None,
page=1
):
return {
'has_next': True,
'data': [{
'user_number': '0790090000' + str(i),
'notify_number': '07900000002',
'content': 'message-{}'.format(index + 1),
'created_at': (datetime.utcnow() - timedelta(minutes=60 * (i + 1), seconds=index)).isoformat(),
'id': sample_uuid(),
} for index, i in enumerate([0, 0, 0, 2, 4, 6, 8, 8])]
}
return mocker.patch(
'app.service_api_client.get_inbound_sms',
side_effect=_get_inbound_sms,
)
@pytest.fixture
def mock_get_inbound_sms_by_id_with_no_messages(mocker):
def _get_inbound_sms_by_id(
service_id,
notification_id
):
raise HTTPError(response=Mock(status_code=404))
return mocker.patch(
'app.service_api_client.get_inbound_sms_by_id',
side_effect=_get_inbound_sms_by_id,
)
@pytest.fixture(scope='function')
def mock_get_most_recent_inbound_sms(mocker):
def _get_most_recent_inbound_sms(
service_id,
user_number=None,
page=1
):
return {
'has_next': True,
'data': [{
'user_number': '0790090000' + str(i),
'notify_number': '07900000002',
'content': 'message-{}'.format(index + 1),
'created_at': (datetime.utcnow() - timedelta(minutes=60 * (i + 1), seconds=index)).isoformat(),
'id': sample_uuid(),
} for index, i in enumerate([0, 0, 0, 2, 4, 6, 8, 8])]
}
return mocker.patch(
'app.service_api_client.get_most_recent_inbound_sms',
side_effect=_get_most_recent_inbound_sms,
)
@pytest.fixture(scope='function')
def mock_get_most_recent_inbound_sms_with_no_messages(mocker):
def _get_most_recent_inbound_sms(
service_id,
user_number=None,
page=1
):
return {
'has_next': False,
'data': []
}
return mocker.patch(
'app.service_api_client.get_most_recent_inbound_sms',
side_effect=_get_most_recent_inbound_sms,
)
@pytest.fixture(scope='function')
def mock_get_inbound_sms_summary(mocker):
def _get_inbound_sms_summary(
service_id,
):
return {
'count': 99,
'most_recent': datetime.utcnow().isoformat()
}
return mocker.patch(
'app.service_api_client.get_inbound_sms_summary',
side_effect=_get_inbound_sms_summary,
)
@pytest.fixture(scope='function')
def mock_get_inbound_sms_summary_with_no_messages(mocker):
def _get_inbound_sms_summary(
service_id,
):
return {
'count': 0,
'latest_message': None
}
return mocker.patch(
'app.service_api_client.get_inbound_sms_summary',
side_effect=_get_inbound_sms_summary,
)
@pytest.fixture(scope='function')
def mock_get_inbound_number_for_service(mocker):
return mocker.patch(
'app.inbound_number_client.get_inbound_sms_number_for_service',
return_value={'data': {'number': '0781239871'}})
@pytest.fixture(scope='function')
def mock_no_inbound_number_for_service(mocker):
return mocker.patch(
'app.inbound_number_client.get_inbound_sms_number_for_service',
return_value={'data': {}})
@pytest.fixture(scope='function')
def mock_has_permissions(mocker):
def _has_permission(*permissions, restrict_admin_usage=False):
return True
return mocker.patch(
'app.notify_client.user_api_client.User.has_permissions',
side_effect=_has_permission)
@pytest.fixture(scope='function')
def mock_get_users_by_service(mocker):
def _get_users_for_service(service_id):
data = [{'id': 1,
'logged_in_at': None,
'mobile_number': '+447700900986',
'permissions': {SERVICE_ONE_ID: ['send_texts',
'send_emails',
'send_letters',
'manage_users',
'manage_templates',
'manage_settings',
'manage_api_keys']},
'state': 'active',
'password_changed_at': None,
'name': 'Test User',
'email_address': 'notify@digital.cabinet-office.gov.uk',
'auth_type': 'sms_auth',
'failed_login_count': 0,
'organisations': []}]
return [User(data[0])]
return mocker.patch('app.user_api_client.get_users_for_service', side_effect=_get_users_for_service, autospec=True)
@pytest.fixture(scope='function')
def mock_s3_upload(mocker):
def _upload(service_id, filedata, region):
return sample_uuid()
return mocker.patch('app.main.views.send.s3upload', side_effect=_upload)
@pytest.fixture(scope='function')
def mock_s3_download(mocker, content=None):
if not content:
content = """
phone number,name
+447700900986,John
+447700900986,Smith
"""
def _download(service_id, upload_id):
return content
return mocker.patch('app.main.views.send.s3download', side_effect=_download)
@pytest.fixture(scope='function')
def mock_s3_set_metadata(mocker, content=None):
return mocker.patch('app.main.views.send.set_metadata_on_csv_upload')
@pytest.fixture(scope='function')
def sample_invite(mocker, service_one, status='pending'):
id_ = str(generate_uuid())
from_user = service_one['users'][0]
email_address = 'invited_user@test.gov.uk'
service_id = service_one['id']
permissions = 'view_activity,send_messages,manage_service,manage_api_keys'
created_at = str(datetime.utcnow())
auth_type = 'sms_auth'
return invite_json(id_, from_user, service_id, email_address, permissions, created_at, status, auth_type)
@pytest.fixture(scope='function')
def sample_invited_user(mocker, sample_invite):
return InvitedUser(**sample_invite)
@pytest.fixture(scope='function')
def mock_create_invite(mocker, sample_invite):
def _create_invite(from_user, service_id, email_address, permissions):
sample_invite['from_user'] = from_user
sample_invite['service'] = service_id
sample_invite['email_address'] = email_address
sample_invite['status'] = 'pending'
sample_invite['permissions'] = permissions
return InvitedUser(**sample_invite)
return mocker.patch('app.invite_api_client.create_invite', side_effect=_create_invite)
@pytest.fixture(scope='function')
def mock_get_invites_for_service(mocker, service_one, sample_invite):
import copy
def _get_invites(service_id):
data = []
for i in range(0, 5):
invite = copy.copy(sample_invite)
invite['email_address'] = 'user_{}@testnotify.gov.uk'.format(i)
data.append(InvitedUser(**invite))
return data
return mocker.patch('app.invite_api_client.get_invites_for_service', side_effect=_get_invites)
@pytest.fixture(scope='function')
def mock_check_invite_token(mocker, sample_invite):
def _check_token(token):
return InvitedUser(**sample_invite)
return mocker.patch('app.invite_api_client.check_token', side_effect=_check_token)
@pytest.fixture(scope='function')
def mock_accept_invite(mocker, sample_invite):
def _accept(service_id, invite_id):
return InvitedUser(**sample_invite)
return mocker.patch('app.invite_api_client.accept_invite', side_effect=_accept)
@pytest.fixture(scope='function')
def mock_add_user_to_service(mocker, service_one, api_user_active):
def _add_user(service_id, user_id, permissions):
return
return mocker.patch('app.user_api_client.add_user_to_service', side_effect=_add_user)
@pytest.fixture(scope='function')
def mock_set_user_permissions(mocker):
return mocker.patch('app.user_api_client.set_user_permissions', return_value=None)
@pytest.fixture(scope='function')
def mock_remove_user_from_service(mocker):
return mocker.patch('app.service_api_client.remove_user_from_service', return_value=None)
@pytest.fixture(scope='function')
def mock_get_template_statistics(mocker, service_one, fake_uuid):
template = template_json(service_one['id'], fake_uuid, "Test template", "sms", "Something very interesting")
data = {
"count": 1,
"template_name": template['name'],
"template_type": template['template_type'],
"template_id": template['id'],
"day": "2016-04-04"
}
def _get_stats(service_id, limit_days=None):
return [data]
return mocker.patch(
'app.template_statistics_client.get_template_statistics_for_service', side_effect=_get_stats)
@pytest.fixture(scope='function')
def mock_get_monthly_template_usage(mocker, service_one, fake_uuid):
def _stats(service_id, year):
return [{
"template_id": fake_uuid,
"month": 4,
"year": year,
"count": 2,
"name": 'My first template',
"type": 'sms'
}]
return mocker.patch(
'app.template_statistics_client.get_monthly_template_usage_for_service',
side_effect=_stats
)
@pytest.fixture(scope='function')
def mock_get_monthly_notification_stats(mocker, service_one, fake_uuid):
def _stats(service_id, year):
return {'data': {
datetime.utcnow().strftime('%Y-%m'): {
"email": {
"sending": 1,
"delivered": 1,
},
"sms": {
"sending": 1,
"delivered": 1,
},
"letter": {
"sending": 1,
"delivered": 1,
}
}
}}
return mocker.patch(
'app.service_api_client.get_monthly_notification_stats',
side_effect=_stats
)
@pytest.fixture(scope='function')
def mock_get_template_statistics_for_template(mocker, service_one):
def _get_stats(service_id, template_id):
template = template_json(service_id, template_id, "Test template", "sms", "Something very interesting")
notification = single_notification_json(service_id, template=template)
return notification
return mocker.patch(
'app.template_statistics_client.get_template_statistics_for_template', side_effect=_get_stats)
@pytest.fixture(scope='function')
def mock_get_usage(mocker, service_one, fake_uuid):
def _get_usage(service_id, year=None):
return [
{"notification_type": "email", "billing_units": 1000, "rate": 0.00, "letter_total": 0},
{"notification_type": "sms", "billing_units": 251500, "rate": 0.0165, "letter_total": 0},
{"notification_type": "sms", "billing_units": 300, "rate": 0.0165, "letter_total": 0},
{"notification_type": "sms", "billing_units": 300, "rate": 0.0165, "letter_total": 0},
{"notification_type": "sms", "billing_units": 90, "rate": 0.0165, "letter_total": 0}
]
return mocker.patch(
'app.billing_api_client.get_service_usage_ft', side_effect=_get_usage)
@pytest.fixture(scope='function')
def mock_get_billable_units(mocker):
def _get_usage(service_id, year):
return [
{
'month': 'April',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 249500,
'postage': 'none',
},
{
'month': 'April',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 100,
'postage': 'none',
},
{
'month': 'April',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 200,
'postage': 'none',
},
{
'month': 'April',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 60,
'postage': 'none',
},
{
'month': 'March',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 1000,
'postage': 'none',
},
{
'month': 'March',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 100,
'postage': 'none',
},
{
'month': 'March',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 100,
'postage': 'none',
},
{
'month': 'March',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 30,
'postage': 'none',
},
{
'month': 'February',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 1000,
'postage': 'none',
},
{
'month': 'February',
'notification_type': 'sms',
'rate': 0.0165,
'billing_units': 100,
'postage': 'none',
},
{
'month': 'February',
'notification_type': 'letter',
'rate': 0.31,
'billing_units': 10,
'postage': 'second',
},
{
'month': 'February',
'notification_type': 'letter',
'rate': 0.33,
'billing_units': 5,
'postage': 'first',
}
]
return mocker.patch(
'app.billing_api_client.get_billable_units_ft', side_effect=_get_usage)
@pytest.fixture(scope='function')
def mock_get_future_usage(mocker, service_one, fake_uuid):
def _get_usage(service_id, year=None):
return [
{
'notification_type': 'sms', 'billing_units': 0,
'rate': 0.0158, 'letter_total': 0
},
{
'notification_type': 'email', 'billing_units': 0,
'rate': 0.0, 'letter_total': 0
}
]
return mocker.patch(
'app.billing_api_client.get_service_usage_ft', side_effect=_get_usage)
@pytest.fixture(scope='function')
def mock_get_future_billable_units(mocker):
def _get_usage(service_id, year):
return []
return mocker.patch(
'app.billing_api_client.get_billable_units_ft', side_effect=_get_usage)
@pytest.fixture(scope='function')
def mock_events(mocker):
def _create_event(event_type, event_data):
return {'some': 'data'}
return mocker.patch('app.events_api_client.create_event', side_effect=_create_event)
@pytest.fixture(scope='function')
def mock_send_already_registered_email(mocker):
return mocker.patch('app.user_api_client.send_already_registered_email')
def create_email_brandings(number_of_brandings, non_standard_values={}, shuffle=False):
brandings = [
{
'id': str(idx),
'name': 'org {}'.format(idx),
'text': 'org {}'.format(idx),
'colour': None,
'logo': 'logo{}.png'.format(idx),
'brand_type': 'org',
} for idx in range(1, number_of_brandings + 1)]
for idx, row in enumerate(non_standard_values):
brandings[row['idx']].update(non_standard_values[idx])
if shuffle:
brandings.insert(3, brandings.pop(4))
return brandings
@pytest.fixture(scope='function')
def mock_get_all_email_branding(mocker):
def _get_all_email_branding(sort_key=None):
non_standard_values = [
{'idx': 1, 'colour': 'red'},
{'idx': 2, 'colour': 'orange'},
{'idx': 3, 'text': None, 'domain': 'nhs.uk'},
{'idx': 4, 'colour': 'blue', 'domain': 'voa.gov.uk'},
]
shuffle = sort_key is None
return create_email_brandings(5, non_standard_values=non_standard_values, shuffle=shuffle)
return mocker.patch(
'app.email_branding_client.get_all_email_branding', side_effect=_get_all_email_branding
)
@pytest.fixture(scope='function')
def mock_get_more_email_branding_than_can_fit_onscreen(mocker):
def _get_more_email_branding_than_can_fit_onscreen():
return create_email_brandings(8)
return mocker.patch(
'app.email_branding_client.get_all_email_branding',
side_effect=_get_more_email_branding_than_can_fit_onscreen
)
@pytest.fixture(scope='function')
def mock_get_email_branding_that_can_fit_onscreen(mocker):
def _get_email_branding_that_can_fit_onscreen():
return create_email_brandings(4)
return mocker.patch(
'app.email_branding_client.get_all_email_branding',
side_effect=_get_email_branding_that_can_fit_onscreen
)
@pytest.fixture(scope='function')
def mock_get_letter_email_branding(mocker):
def _get_letter_email_branding():
return {
'001': 'HM Government',
'500': 'Land Registry',
}
return mocker.patch(
'app.email_branding_client.get_letter_email_branding', side_effect=_get_letter_email_branding
)
@pytest.fixture(scope='function')
def mock_no_email_branding(mocker):
def _get_email_branding():
return []
return mocker.patch(
'app.email_branding_client.get_letter_email_branding', side_effect=_get_email_branding
)
def create_email_branding(id, non_standard_values={}):
branding = {
'logo': 'example.png',
'name': 'Organisation name',
'text': 'Organisation text',
'id': id,
'colour': '#f00',
'domain': 'sample.com',
'brand_type': 'org',
}
if bool(non_standard_values):
branding.update(non_standard_values)
return {'email_branding': branding}
@pytest.fixture(scope='function')
def mock_get_email_branding(mocker, fake_uuid):
def _get_email_branding(id):
return create_email_branding(fake_uuid)
return mocker.patch(
'app.email_branding_client.get_email_branding', side_effect=_get_email_branding
)
@pytest.fixture(scope='function')
def mock_get_email_branding_with_govuk_brand_type(mocker, fake_uuid):
def _get_email_branding(id):
return create_email_branding(fake_uuid, {'brand_type': 'govuk'})
return mocker.patch(
'app.email_branding_client.get_email_branding', side_effect=_get_email_branding
)
@pytest.fixture(scope='function')
def mock_get_email_branding_with_both_brand_type(mocker, fake_uuid):
def _get_email_branding(id):
return create_email_branding(fake_uuid, {'brand_type': 'both'})
return mocker.patch(
'app.email_branding_client.get_email_branding', side_effect=_get_email_branding
)
@pytest.fixture(scope='function')
def mock_get_email_branding_with_org_banner_brand_type(mocker, fake_uuid):
def _get_email_branding(id):
return create_email_branding(fake_uuid, {'brand_type': 'org_banner'})
return mocker.patch(
'app.email_branding_client.get_email_branding', side_effect=_get_email_branding
)
@pytest.fixture(scope='function')
def mock_get_email_branding_without_brand_text(mocker, fake_uuid):
def _get_email_branding_without_brand_text(id):
return create_email_branding(fake_uuid, {'text': '', 'brand_type': 'org_banner'})
return mocker.patch(
'app.email_branding_client.get_email_branding',
side_effect=_get_email_branding_without_brand_text
)
@pytest.fixture(scope='function')
def mock_create_email_branding(mocker):
def _create_email_branding(logo, name, text, colour, domain, brand_type):
return
return mocker.patch(
'app.email_branding_client.create_email_branding', side_effect=_create_email_branding
)
@pytest.fixture(scope='function')
def mock_update_email_branding(mocker):
def _update_email_branding(branding_id, logo, name, text, colour, domain, brand_type):
return
return mocker.patch(
'app.email_branding_client.update_email_branding', side_effect=_update_email_branding
)
@pytest.fixture(scope='function')
def mock_get_whitelist(mocker):
def _get_whitelist(service_id):
return {
'email_addresses': ['test@example.com'],
'phone_numbers': ['07900900000']
}
return mocker.patch(
'app.service_api_client.get_whitelist', side_effect=_get_whitelist
)
@pytest.fixture(scope='function')
def mock_update_whitelist(mocker):
return mocker.patch(
'app.service_api_client.update_whitelist'
)
@pytest.fixture(scope='function')
def mock_reset_failed_login_count(mocker):
return mocker.patch('app.user_api_client.reset_failed_login_count')
@pytest.fixture
def mock_get_notification(
mocker,
fake_uuid,
notification_status='delivered',
redact_personalisation=False,
template_type=None,
template_name='sample template',
is_precompiled_letter=False,
key_type=None,
postage=None
):
def _get_notification(
service_id,
notification_id,
):
noti = notification_json(
service_id,
rows=1,
status=notification_status,
template_type=template_type,
postage=postage
)['notifications'][0]
noti['id'] = notification_id
noti['created_by'] = {
'id': fake_uuid,
'name': 'Test User',
'email_address': 'test@user.gov.uk'
}
noti['personalisation'] = {'name': 'Jo'}
noti['template'] = template_json(
service_id,
'5407f4db-51c7-4150-8758-35412d42186a',
content='hello ((name))',
subject='blah',
redact_personalisation=redact_personalisation,
type_=template_type,
is_precompiled_letter=is_precompiled_letter,
name=template_name
)
if key_type:
noti['key_type'] = key_type
return noti
return mocker.patch(
'app.notification_api_client.get_notification',
side_effect=_get_notification
)
@pytest.fixture
def mock_send_notification(mocker, fake_uuid):
def _send_notification(
service_id, *, template_id, recipient, personalisation, sender_id
):
return {'id': fake_uuid}
return mocker.patch(
'app.notification_api_client.send_notification',
side_effect=_send_notification
)
@pytest.fixture(scope='function')
def client(app_):
with app_.test_request_context(), app_.test_client() as client:
yield client
@pytest.fixture(scope='function')
def logged_in_client(
client,
active_user_with_permissions,
mocker,
service_one,
mock_login
):
client.login(active_user_with_permissions, mocker, service_one)
yield client
@pytest.fixture(scope='function')
def logged_in_platform_admin_client(
client,
platform_admin_user,
mocker,
service_one,
mock_login,
):
mock_get_user(mocker, user=platform_admin_user)
client.login(platform_admin_user, mocker, service_one)
yield client
@pytest.fixture
def os_environ():
"""
clear os.environ, and restore it after the test runs
"""
# for use whenever you expect code to edit environment variables
old_env = os.environ.copy()
os.environ = {}
yield
os.environ = old_env
@pytest.fixture
def client_request(
logged_in_client,
active_user_with_permissions,
mocker,
service_one,
fake_uuid,
):
class ClientRequest:
@staticmethod
@contextmanager
def session_transaction():
with logged_in_client.session_transaction() as session:
yield session
def login(user, service=service_one):
logged_in_client.login(user, mocker, service)
@staticmethod
def get(
endpoint,
_expected_status=200,
_follow_redirects=False,
_expected_redirect=None,
_test_page_title=True,
**endpoint_kwargs
):
return ClientRequest.get_url(
url_for(endpoint, **(endpoint_kwargs or {})),
_expected_status=_expected_status,
_follow_redirects=_follow_redirects,
_expected_redirect=_expected_redirect,
_test_page_title=_test_page_title,
)
@staticmethod
def get_url(
url,
_expected_status=200,
_follow_redirects=False,
_expected_redirect=None,
_test_page_title=True,
**endpoint_kwargs
):
resp = logged_in_client.get(
url,
follow_redirects=_follow_redirects,
)
assert resp.status_code == _expected_status, resp.location
if _expected_redirect:
assert resp.location == _expected_redirect
page = BeautifulSoup(resp.data.decode('utf-8'), 'html.parser')
if _test_page_title:
page_title, h1 = (
normalize_spaces(page.find(selector).text) for selector in ('title', 'h1')
)
if not normalize_spaces(page_title).startswith(h1):
raise AssertionError('Page title ‘{}’ does not start with H1 ‘{}’'.format(page_title, h1))
return page
@staticmethod
def post(
endpoint,
_data=None,
_expected_status=None,
_follow_redirects=False,
_expected_redirect=None,
**endpoint_kwargs
):
if _expected_status is None:
_expected_status = 200 if _follow_redirects else 302
resp = logged_in_client.post(
url_for(endpoint, **(endpoint_kwargs or {})),
data=_data,
follow_redirects=_follow_redirects,
)
assert resp.status_code == _expected_status
if _expected_redirect:
assert resp.location == _expected_redirect
return BeautifulSoup(resp.data.decode('utf-8'), 'html.parser')
return ClientRequest
def normalize_spaces(input):
if isinstance(input, str):
return ' '.join(input.split())
return normalize_spaces(' '.join(item.text for item in input))
@pytest.fixture(scope='function')
def mock_get_service_data_retention(mocker):
data = {"id": str(fake_uuid),
"service_id": str(fake_uuid),
"service_name": "service name",
"notification_type": "email",
"days_of_retention": 5,
"created_at": datetime.now(),
"updated_at": None,
}
return mocker.patch('app.service_api_client.get_service_data_retention',
return_value=[data])
@pytest.fixture(scope='function')
def mock_get_service_data_retention_by_id(mocker):
data = {"id": str(fake_uuid),
"service_id": str(fake_uuid),
"service_name": "service name",
"notification_type": "email",
"days_of_retention": 5,
"created_at": datetime.now(),
"updated_at": None,
}
return mocker.patch('app.service_api_client.get_service_data_retention_by_id',
return_value=data)
@pytest.fixture(scope='function')
def mock_create_service_data_retention(mocker):
return mocker.patch('app.service_api_client.create_service_data_retention')
@pytest.fixture(scope='function')
def mock_update_service_data_retention(mocker):
return mocker.patch('app.service_api_client.update_service_data_retention')
@pytest.fixture(scope='function')
def mock_get_free_sms_fragment_limit(mocker):
sample_limit = 250000
return mocker.patch('app.billing_api_client.get_free_sms_fragment_limit_for_year',
return_value=sample_limit)
@pytest.fixture(scope='function')
def mock_create_or_update_free_sms_fragment_limit(mocker):
sample_limit = 250000
return mocker.patch('app.billing_api_client.create_or_update_free_sms_fragment_limit',
return_value=sample_limit)
@pytest.fixture(scope='function')
def mock_get_free_sms_fragment_limit_for_all_years(mocker):
sample_limit = [{'financial_year_start': 2016, 'free_sms_fragment_limit': 250000},
{'financial_year_start': 2017, 'free_sms_fragment_limit': 500000}]
return mocker.patch('app.billing_api_client.get_free_sms_fragment_limit_for_all_years',
return_value=sample_limit)
@contextmanager
def set_config(app, name, value):
old_val = app.config.get(name)
app.config[name] = value
yield
app.config[name] = old_val
@contextmanager
def set_config_values(app, dict):
old_values = {}
for key in dict:
old_values[key] = app.config.get(key)
app.config[key] = dict[key]
yield
for key in dict:
app.config[key] = old_values[key]
@pytest.fixture(scope='function')
def valid_token(app_, fake_uuid):
return generate_token(
json.dumps({'user_id': fake_uuid, 'secret_code': 'my secret'}),
app_.config['SECRET_KEY'],
app_.config['DANGEROUS_SALT']
)
@pytest.fixture(scope='function')
def mock_get_valid_service_inbound_api(mocker):
def _get(service_id, inbound_api_id):
return {
'created_at': '2017-12-04T10:52:55.289026Z',
'updated_by_id': fake_uuid,
'id': inbound_api_id,
'url': 'https://hello3.gov.uk',
'service_id': service_id,
'updated_at': '2017-12-04T11:28:42.575153Z'
}
return mocker.patch('app.service_api_client.get_service_inbound_api', side_effect=_get)
@pytest.fixture(scope='function')
def mock_get_valid_service_callback_api(mocker):
def _get(service_id, callback_api_id):
return {
'created_at': '2017-12-04T10:52:55.289026Z',
'updated_by_id': fake_uuid,
'id': callback_api_id,
'url': 'https://hello2.gov.uk',
'service_id': service_id,
'updated_at': '2017-12-04T11:28:42.575153Z'
}
return mocker.patch('app.service_api_client.get_service_callback_api', side_effect=_get)
@pytest.fixture(scope='function')
def mock_get_empty_service_inbound_api(mocker):
return mocker.patch(
'app.service_api_client.get_service_inbound_api',
side_effect=lambda service_id, callback_api_id: None,
)
@pytest.fixture(scope='function')
def mock_get_empty_service_callback_api(mocker):
return mocker.patch(
'app.service_api_client.get_service_callback_api',
side_effect=lambda service_id, callback_api_id: None,
)
@pytest.fixture(scope='function')
def mock_create_service_inbound_api(mocker):
def _create_service_inbound_api(service_id, url, bearer_token, user_id):
return
return mocker.patch('app.service_api_client.create_service_inbound_api', side_effect=_create_service_inbound_api)
@pytest.fixture(scope='function')
def mock_delete_service_inbound_api(mocker):
return mocker.patch(
'app.service_api_client.delete_service_callback_api',
side_effect=lambda service_id: None
)
@pytest.fixture(scope='function')
def mock_update_service_inbound_api(mocker):
def _update_service_inbound_api(service_id, url, bearer_token, user_id, inbound_api_id):
return
return mocker.patch('app.service_api_client.update_service_inbound_api', side_effect=_update_service_inbound_api)
@pytest.fixture(scope='function')
def mock_create_service_callback_api(mocker):
def _create_service_callback_api(service_id, url, bearer_token, user_id):
return
return mocker.patch('app.service_api_client.create_service_callback_api', side_effect=_create_service_callback_api)
@pytest.fixture(scope='function')
def mock_delete_service_callback_api(mocker):
return mocker.patch(
'app.service_api_client.delete_service_callback_api',
side_effect=lambda service_id: None
)
@pytest.fixture(scope='function')
def mock_update_service_callback_api(mocker):
def _update_service_callback_api(service_id, url, bearer_token, user_id, callback_api_id):
return
return mocker.patch('app.service_api_client.update_service_callback_api', side_effect=_update_service_callback_api)
@pytest.fixture(scope='function')
def organisation_one(api_user_active):
return organisation_json(ORGANISATION_ID, 'organisation one', [api_user_active.id])
@pytest.fixture(scope='function')
def mock_get_organisations(mocker):
def _get_organisations():
return [
{
'name': 'Org 1',
'id': '7aa5d4e9-4385-4488-a489-07812ba13383',
'active': True
},
{
'name': 'Org 2',
'id': '7aa5d4e9-4385-4488-a489-07812ba13384',
'active': True
},
{
'name': 'Org 3',
'id': '7aa5d4e9-4385-4488-a489-07812ba13385',
'active': True
}
]
return mocker.patch('app.organisations_client.get_organisations', side_effect=_get_organisations)
@pytest.fixture(scope='function')
def mock_get_organisation(mocker):
def _get_organisation(org_id):
return {
'name': 'Org 1',
'id': org_id,
'active': True
}
return mocker.patch('app.organisations_client.get_organisation', side_effect=_get_organisation)
@pytest.fixture(scope='function')
def mock_get_service_organisation(mocker):
def _get_service_organisation(service_id):
return {
'name': 'Org 1',
'id': '7aa5d4e9-4385-4488-a489-07812ba13383',
'active': True
}
return mocker.patch('app.organisations_client.get_service_organisation', side_effect=_get_service_organisation)
@pytest.fixture(scope='function')
def mock_update_service_organisation(mocker):
def _update_service_organisation(service_id, organisation_id):
return
return mocker.patch(
'app.organisations_client.update_service_organisation',
side_effect=_update_service_organisation
)
@pytest.fixture(scope='function')
def mock_get_organisation_services(mocker, api_user_active):
def _get_organisation_services(organisation_id):
return [
service_json('12345', 'service one'),
service_json('67890', 'service two'),
service_json(SERVICE_ONE_ID, 'service one', [api_user_active.id])
]
return mocker.patch(
'app.organisations_client.get_organisation_services',
side_effect=_get_organisation_services
)
@pytest.fixture(scope='function')
def mock_get_users_for_organisation(mocker):
def _get_users_for_organisation(org_id):
return [
User(user_json(id_='1234', name='Test User 1')),
User(user_json(id_='5678', name='Test User 2', email_address='testt@gov.uk'))
]
return mocker.patch(
'app.user_api_client.get_users_for_organisation',
side_effect=_get_users_for_organisation
)
@pytest.fixture(scope='function')
def mock_get_invited_users_for_organisation(mocker):
def _get_invited_invited_users_for_organisation(org_id):
return [
invited_user(organisation='1234')
]
return mocker.patch(
'app.org_invite_api_client.get_invites_for_organisation',
side_effect=_get_invited_invited_users_for_organisation
)
@pytest.fixture(scope='function')
def sample_org_invite(mocker, organisation_one, status='pending'):
id_ = str(generate_uuid())
invited_by = organisation_one['users'][0]
email_address = 'invited_user@test.gov.uk'
organisation = organisation_one['id']
created_at = str(datetime.utcnow())
return org_invite_json(id_, invited_by, organisation, email_address, created_at, status)
@pytest.fixture(scope='function')
def mock_check_org_invite_token(mocker, sample_org_invite):
def _check_org_token(token):
return InvitedOrgUser(**sample_org_invite)
return mocker.patch('app.org_invite_api_client.check_token', side_effect=_check_org_token)
@pytest.fixture(scope='function')
def mock_check_org_cancelled_invite_token(mocker, sample_org_invite):
def _check_org_token(token):
sample_org_invite['status'] = 'cancelled'
return InvitedOrgUser(**sample_org_invite)
return mocker.patch('app.org_invite_api_client.check_token', side_effect=_check_org_token)
@pytest.fixture(scope='function')
def mock_check_org_accepted_invite_token(mocker, sample_org_invite):
sample_org_invite['status'] = 'accepted'
def _check_org_token(token):
return InvitedOrgUser(**sample_org_invite)
return mocker.patch('app.org_invite_api_client.check_token', side_effect=_check_org_token)
@pytest.fixture(scope='function')
def mock_accept_org_invite(mocker, sample_org_invite):
def _accept(organisation_id, invite_id):
return InvitedOrgUser(**sample_org_invite)
return mocker.patch('app.org_invite_api_client.accept_invite', side_effect=_accept)
@pytest.fixture(scope='function')
def mock_add_user_to_organisation(mocker, organisation_one, api_user_active):
def _add_user(organisation_id, user_id):
return api_user_active
return mocker.patch('app.user_api_client.add_user_to_organisation', side_effect=_add_user)
@pytest.fixture(scope='function')
def mock_organisation_name_is_not_unique(mocker):
return mocker.patch('app.organisations_client.is_organisation_name_unique', return_value=False)
@pytest.fixture(scope='function')
def mock_organisation_name_is_unique(mocker):
return mocker.patch('app.organisations_client.is_organisation_name_unique', return_value=True)
@pytest.fixture(scope='function')
def mock_update_organisation_name(mocker):
def _update_org_name(organisation_id, name):
return
return mocker.patch('app.organisations_client.update_organisation_name', side_effect=_update_org_name)
@pytest.fixture
def mock_get_organisations_and_services_for_user(mocker, organisation_one, api_user_active):
def _get_orgs_and_services(user_id):
return {
'organisations': [],
'services_without_organisations': []
}
return mocker.patch(
'app.user_api_client.get_organisations_and_services_for_user',
side_effect=_get_orgs_and_services
)
@pytest.fixture
def mock_get_non_empty_organisations_and_services_for_user(mocker, organisation_one, api_user_active):
def _make_services(name):
return [{
'name': '{} {}'.format(name, i),
'id': SERVICE_TWO_ID,
} for i in range(1, 3)]
def _get_orgs_and_services(user_id):
return {
'organisations': [
{'name': 'Org 1', 'services': _make_services('Org 1 service')},
{'name': 'Org 2', 'services': _make_services('Org 2 service')},
],
'services_without_organisations': _make_services('Service')
}
return mocker.patch(
'app.user_api_client.get_organisations_and_services_for_user',
side_effect=_get_orgs_and_services
)
@pytest.fixture
def mock_create_event(mocker):
"""
This should be used whenever your code is calling `flask_login.login_user`
"""
def _add_event(event_type, event_data):
return
return mocker.patch('app.events_api_client.create_event', side_effect=_add_event)