2018-04-06 13:37:49 +01:00
|
|
|
|
from unittest.mock import call
|
2018-09-26 16:41:04 +01:00
|
|
|
|
from uuid import uuid4
|
2018-04-06 13:37:49 +01:00
|
|
|
|
|
2016-07-25 15:26:43 +01:00
|
|
|
|
import pytest
|
|
|
|
|
|
|
2018-04-19 13:15:52 +01:00
|
|
|
|
from app import invite_api_client, service_api_client, user_api_client
|
2016-07-15 15:23:23 +01:00
|
|
|
|
from app.notify_client.service_api_client import ServiceAPIClient
|
2018-09-26 16:41:04 +01:00
|
|
|
|
from tests.conftest import SERVICE_ONE_ID
|
2016-05-23 13:59:33 +01:00
|
|
|
|
|
2018-09-26 16:41:04 +01:00
|
|
|
|
FAKE_TEMPLATE_ID = uuid4()
|
2018-04-19 10:24:35 +01:00
|
|
|
|
|
2016-05-23 13:59:33 +01:00
|
|
|
|
|
|
|
|
|
|
def test_client_posts_archived_true_when_deleting_template(mocker):
|
2016-08-11 14:20:43 +01:00
|
|
|
|
mocker.patch('app.notify_client.current_user', id='1')
|
2021-01-25 14:03:16 +00:00
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch('app.extensions.RedisClient.delete_cache_keys_by_pattern')
|
2016-05-23 13:59:33 +01:00
|
|
|
|
expected_data = {
|
|
|
|
|
|
'archived': True,
|
2016-08-11 14:20:43 +01:00
|
|
|
|
'created_by': '1'
|
2016-05-23 13:59:33 +01:00
|
|
|
|
}
|
2018-09-26 16:41:04 +01:00
|
|
|
|
expected_url = '/service/{}/template/{}'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID)
|
2016-05-23 13:59:33 +01:00
|
|
|
|
|
|
|
|
|
|
client = ServiceAPIClient()
|
2016-07-15 15:23:23 +01:00
|
|
|
|
mock_post = mocker.patch('app.notify_client.service_api_client.ServiceAPIClient.post')
|
2021-01-25 14:03:16 +00:00
|
|
|
|
mocker.patch('app.notify_client.service_api_client.ServiceAPIClient.get',
|
|
|
|
|
|
return_value={'data': {'id': str(FAKE_TEMPLATE_ID)}})
|
2016-05-23 13:59:33 +01:00
|
|
|
|
|
2018-09-26 16:41:04 +01:00
|
|
|
|
client.delete_service_template(SERVICE_ONE_ID, FAKE_TEMPLATE_ID)
|
2016-05-23 13:59:33 +01:00
|
|
|
|
mock_post.assert_called_once_with(expected_url, data=expected_data)
|
2021-01-25 14:03:16 +00:00
|
|
|
|
assert call(f'service-{SERVICE_ONE_ID}-template-*') in mock_redis_delete_by_pattern.call_args_list
|
2016-07-21 17:32:28 +01:00
|
|
|
|
|
|
|
|
|
|
|
2018-05-09 13:53:02 +01:00
|
|
|
|
def test_client_gets_service(mocker):
|
2016-07-21 17:32:28 +01:00
|
|
|
|
client = ServiceAPIClient()
|
2018-04-06 13:37:49 +01:00
|
|
|
|
mock_get = mocker.patch.object(client, 'get', return_value={})
|
2016-07-21 17:32:28 +01:00
|
|
|
|
|
2018-05-09 13:53:02 +01:00
|
|
|
|
client.get_service('foo')
|
|
|
|
|
|
mock_get.assert_called_once_with('/service/foo')
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-08-13 17:04:40 +01:00
|
|
|
|
@pytest.mark.parametrize('today_only, limit_days', [
|
|
|
|
|
|
(True, None),
|
|
|
|
|
|
(False, None),
|
|
|
|
|
|
(False, 30),
|
|
|
|
|
|
])
|
|
|
|
|
|
def test_client_gets_service_statistics(mocker, today_only, limit_days):
|
2018-05-09 13:53:02 +01:00
|
|
|
|
client = ServiceAPIClient()
|
|
|
|
|
|
mock_get = mocker.patch.object(client, 'get', return_value={'data': {'a': 'b'}})
|
|
|
|
|
|
|
2018-08-13 17:04:40 +01:00
|
|
|
|
ret = client.get_service_statistics('foo', today_only, limit_days)
|
2018-05-09 13:53:02 +01:00
|
|
|
|
|
|
|
|
|
|
assert ret == {'a': 'b'}
|
2018-08-13 17:04:40 +01:00
|
|
|
|
mock_get.assert_called_once_with('/service/foo/statistics', params={
|
|
|
|
|
|
'today_only': today_only, 'limit_days': limit_days
|
|
|
|
|
|
})
|
2016-08-11 13:55:42 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_only_updates_allowed_attributes(mocker):
|
2016-08-11 14:20:43 +01:00
|
|
|
|
mocker.patch('app.notify_client.current_user', id='1')
|
2016-08-11 13:55:42 +01:00
|
|
|
|
with pytest.raises(TypeError) as error:
|
|
|
|
|
|
ServiceAPIClient().update_service('service_id', foo='bar')
|
|
|
|
|
|
assert str(error.value) == 'Not allowed to update service attributes: foo'
|
2017-10-04 11:49:32 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_creates_service_with_correct_data(
|
|
|
|
|
|
mocker,
|
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
|
fake_uuid,
|
|
|
|
|
|
):
|
|
|
|
|
|
client = ServiceAPIClient()
|
2018-04-06 13:37:49 +01:00
|
|
|
|
mock_post = mocker.patch.object(client, 'post', return_value={'data': {'id': None}})
|
2017-10-04 11:49:32 +01:00
|
|
|
|
mocker.patch('app.notify_client.current_user', id='123')
|
|
|
|
|
|
|
|
|
|
|
|
client.create_service(
|
2018-04-19 13:23:47 +01:00
|
|
|
|
'My first service',
|
|
|
|
|
|
'central_government',
|
|
|
|
|
|
1,
|
|
|
|
|
|
True,
|
|
|
|
|
|
fake_uuid,
|
|
|
|
|
|
'test@example.com',
|
2017-10-04 11:49:32 +01:00
|
|
|
|
)
|
|
|
|
|
|
mock_post.assert_called_once_with(
|
|
|
|
|
|
'/service',
|
|
|
|
|
|
dict(
|
|
|
|
|
|
# Autogenerated arguments
|
|
|
|
|
|
created_by='123',
|
|
|
|
|
|
active=True,
|
|
|
|
|
|
# ‘service_name’ argument is coerced to ‘name’
|
|
|
|
|
|
name='My first service',
|
|
|
|
|
|
# The rest pass through with the same names
|
|
|
|
|
|
organisation_type='central_government',
|
|
|
|
|
|
message_limit=1,
|
|
|
|
|
|
restricted=True,
|
|
|
|
|
|
user_id=fake_uuid,
|
|
|
|
|
|
email_from='test@example.com',
|
|
|
|
|
|
),
|
|
|
|
|
|
)
|
2018-02-21 14:37:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
2019-09-09 10:59:32 +01:00
|
|
|
|
def test_get_precompiled_template(mocker):
|
|
|
|
|
|
client = ServiceAPIClient()
|
|
|
|
|
|
mock_get = mocker.patch.object(client, 'get')
|
|
|
|
|
|
|
|
|
|
|
|
client.get_precompiled_template(SERVICE_ONE_ID)
|
|
|
|
|
|
mock_get.assert_called_once_with('/service/{}/template/precompiled'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-02-21 14:37:27 +00:00
|
|
|
|
@pytest.mark.parametrize('template_data, extra_args, expected_count', (
|
|
|
|
|
|
(
|
|
|
|
|
|
[],
|
|
|
|
|
|
{},
|
|
|
|
|
|
0,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
[],
|
|
|
|
|
|
{'template_type': 'email'},
|
|
|
|
|
|
0,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
[
|
|
|
|
|
|
{'template_type': 'email'},
|
|
|
|
|
|
{'template_type': 'sms'},
|
|
|
|
|
|
],
|
|
|
|
|
|
{},
|
|
|
|
|
|
2,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
[
|
|
|
|
|
|
{'template_type': 'email'},
|
|
|
|
|
|
{'template_type': 'sms'},
|
|
|
|
|
|
],
|
|
|
|
|
|
{'template_type': 'email'},
|
|
|
|
|
|
1,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
[
|
|
|
|
|
|
{'template_type': 'email'},
|
|
|
|
|
|
{'template_type': 'sms'},
|
|
|
|
|
|
],
|
|
|
|
|
|
{'template_type': 'letter'},
|
|
|
|
|
|
0,
|
|
|
|
|
|
),
|
|
|
|
|
|
))
|
|
|
|
|
|
def test_client_returns_count_of_service_templates(
|
|
|
|
|
|
app_,
|
|
|
|
|
|
mocker,
|
|
|
|
|
|
template_data,
|
|
|
|
|
|
extra_args,
|
|
|
|
|
|
expected_count,
|
|
|
|
|
|
):
|
|
|
|
|
|
|
|
|
|
|
|
mocker.patch(
|
|
|
|
|
|
'app.service_api_client.get_service_templates',
|
|
|
|
|
|
return_value={'data': template_data}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert service_api_client.count_service_templates(
|
|
|
|
|
|
SERVICE_ONE_ID, **extra_args
|
|
|
|
|
|
) == expected_count
|
2018-04-06 13:37:49 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
|
(
|
2018-04-19 10:24:35 +01:00
|
|
|
|
'client_method,'
|
|
|
|
|
|
'extra_args,'
|
2018-04-06 13:37:49 +01:00
|
|
|
|
'expected_cache_get_calls,'
|
|
|
|
|
|
'cache_value,'
|
|
|
|
|
|
'expected_api_calls,'
|
|
|
|
|
|
'expected_cache_set_calls,'
|
|
|
|
|
|
'expected_return_value,'
|
|
|
|
|
|
),
|
|
|
|
|
|
[
|
|
|
|
|
|
(
|
2018-04-19 10:24:35 +01:00
|
|
|
|
service_api_client.get_service,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
2018-04-06 13:37:49 +01:00
|
|
|
|
[
|
|
|
|
|
|
call('service-{}'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
b'{"data_from": "cache"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
|
|
|
|
|
{'data_from': 'cache'},
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
2018-04-19 10:24:35 +01:00
|
|
|
|
service_api_client.get_service,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
2018-04-06 13:37:49 +01:00
|
|
|
|
[
|
|
|
|
|
|
call('service-{}'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
2018-05-09 13:53:02 +01:00
|
|
|
|
call('/service/{}'.format(SERVICE_ONE_ID))
|
2018-04-06 13:37:49 +01:00
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
|
|
|
|
|
'service-{}'.format(SERVICE_ONE_ID),
|
|
|
|
|
|
'{"data_from": "api"}',
|
2018-04-23 17:07:41 +01:00
|
|
|
|
ex=604800,
|
2018-04-06 13:37:49 +01:00
|
|
|
|
)
|
|
|
|
|
|
],
|
|
|
|
|
|
{'data_from': 'api'},
|
|
|
|
|
|
),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
2020-09-21 16:29:35 +01:00
|
|
|
|
call('service-{}-template-{}-version-None'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID))
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
b'{"data_from": "cache"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
|
|
|
|
|
{'data_from': 'cache'},
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
2020-09-21 16:29:35 +01:00
|
|
|
|
call('service-{}-template-{}-version-None'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID)),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
|
|
|
|
|
call('/service/{}/template/{}'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
2020-09-21 16:29:35 +01:00
|
|
|
|
'service-{}-template-{}-version-None'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
'{"data_from": "api"}',
|
2018-04-23 17:07:41 +01:00
|
|
|
|
ex=604800,
|
2020-09-21 16:29:35 +01:00
|
|
|
|
),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
{'data_from': 'api'},
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID, 1],
|
|
|
|
|
|
[
|
2020-09-21 16:29:35 +01:00
|
|
|
|
call('service-{}-template-{}-version-1'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID))
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
b'{"data_from": "cache"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
|
|
|
|
|
{'data_from': 'cache'},
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID, 1],
|
|
|
|
|
|
[
|
2020-09-21 16:29:35 +01:00
|
|
|
|
call('service-{}-template-{}-version-1'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID)),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
|
|
|
|
|
call('/service/{}/template/{}/version/1'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
2020-09-21 16:29:35 +01:00
|
|
|
|
'service-{}-template-{}-version-1'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
'{"data_from": "api"}',
|
2018-04-23 17:07:41 +01:00
|
|
|
|
ex=604800,
|
2020-09-21 16:29:35 +01:00
|
|
|
|
),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
{'data_from': 'api'},
|
|
|
|
|
|
),
|
2018-04-20 17:29:06 +01:00
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_templates,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
|
|
|
|
|
[
|
|
|
|
|
|
call('service-{}-templates'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
b'{"data_from": "cache"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
|
|
|
|
|
{'data_from': 'cache'},
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_templates,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
|
|
|
|
|
[
|
|
|
|
|
|
call('service-{}-templates'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
2020-06-19 10:32:44 +01:00
|
|
|
|
call('/service/{}/template?detailed=False'.format(SERVICE_ONE_ID))
|
2018-04-20 17:29:06 +01:00
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
|
|
|
|
|
'service-{}-templates'.format(SERVICE_ONE_ID),
|
|
|
|
|
|
'{"data_from": "api"}',
|
2018-04-23 17:07:41 +01:00
|
|
|
|
ex=604800,
|
2018-04-20 17:29:06 +01:00
|
|
|
|
)
|
|
|
|
|
|
],
|
|
|
|
|
|
{'data_from': 'api'},
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template_versions,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
2020-09-21 16:29:35 +01:00
|
|
|
|
call('service-{}-template-{}-versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID))
|
2018-04-20 17:29:06 +01:00
|
|
|
|
],
|
|
|
|
|
|
b'{"data_from": "cache"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
|
|
|
|
|
{'data_from': 'cache'},
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template_versions,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
2020-09-21 16:29:35 +01:00
|
|
|
|
call('service-{}-template-{}-versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID)),
|
2018-04-20 17:29:06 +01:00
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
|
|
|
|
|
call('/service/{}/template/{}/versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
2020-09-21 16:29:35 +01:00
|
|
|
|
'service-{}-template-{}-versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID),
|
2018-04-20 17:29:06 +01:00
|
|
|
|
'{"data_from": "api"}',
|
2018-04-23 17:07:41 +01:00
|
|
|
|
ex=604800,
|
2020-09-21 16:29:35 +01:00
|
|
|
|
),
|
2018-04-20 17:29:06 +01:00
|
|
|
|
],
|
|
|
|
|
|
{'data_from': 'api'},
|
|
|
|
|
|
),
|
2020-02-12 11:42:06 +00:00
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_returned_letter_summary,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
|
|
|
|
|
[
|
|
|
|
|
|
call('service-{}-returned-letters-summary'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
|
|
|
|
|
call('service/{}/returned-letter-summary'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
|
|
|
|
|
'service-{}-returned-letters-summary'.format(SERVICE_ONE_ID),
|
|
|
|
|
|
'{"data_from": "api"}',
|
|
|
|
|
|
ex=604800,
|
|
|
|
|
|
)
|
|
|
|
|
|
],
|
|
|
|
|
|
{'data_from': 'api'},
|
|
|
|
|
|
),
|
2020-03-03 17:40:50 +00:00
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_returned_letter_statistics,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
|
|
|
|
|
[
|
|
|
|
|
|
call('service-{}-returned-letters-statistics'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
|
|
|
|
|
call('service/{}/returned-letter-statistics'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
|
|
|
|
|
'service-{}-returned-letters-statistics'.format(SERVICE_ONE_ID),
|
|
|
|
|
|
'{"data_from": "api"}',
|
|
|
|
|
|
ex=604800,
|
|
|
|
|
|
)
|
|
|
|
|
|
],
|
|
|
|
|
|
{'data_from': 'api'},
|
|
|
|
|
|
),
|
2018-04-06 13:37:49 +01:00
|
|
|
|
]
|
|
|
|
|
|
)
|
|
|
|
|
|
def test_returns_value_from_cache(
|
|
|
|
|
|
mocker,
|
2018-04-19 10:24:35 +01:00
|
|
|
|
client_method,
|
|
|
|
|
|
extra_args,
|
2018-04-06 13:37:49 +01:00
|
|
|
|
expected_cache_get_calls,
|
|
|
|
|
|
cache_value,
|
|
|
|
|
|
expected_return_value,
|
|
|
|
|
|
expected_api_calls,
|
|
|
|
|
|
expected_cache_set_calls,
|
|
|
|
|
|
):
|
|
|
|
|
|
|
|
|
|
|
|
mock_redis_get = mocker.patch(
|
2019-02-14 14:25:31 +00:00
|
|
|
|
'app.extensions.RedisClient.get',
|
2018-04-06 13:37:49 +01:00
|
|
|
|
return_value=cache_value,
|
|
|
|
|
|
)
|
|
|
|
|
|
mock_api_get = mocker.patch(
|
|
|
|
|
|
'app.notify_client.NotifyAdminAPIClient.get',
|
|
|
|
|
|
return_value={'data_from': 'api'},
|
|
|
|
|
|
)
|
|
|
|
|
|
mock_redis_set = mocker.patch(
|
2019-02-14 14:25:31 +00:00
|
|
|
|
'app.extensions.RedisClient.set',
|
2018-04-06 13:37:49 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-19 10:24:35 +01:00
|
|
|
|
assert client_method(*extra_args) == expected_return_value
|
2018-04-06 13:37:49 +01:00
|
|
|
|
|
|
|
|
|
|
assert mock_redis_get.call_args_list == expected_cache_get_calls
|
|
|
|
|
|
assert mock_api_get.call_args_list == expected_api_calls
|
|
|
|
|
|
assert mock_redis_set.call_args_list == expected_cache_set_calls
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('client, method, extra_args, extra_kwargs', [
|
|
|
|
|
|
(service_api_client, 'update_service', [SERVICE_ONE_ID], {'name': 'foo'}),
|
|
|
|
|
|
(service_api_client, 'update_service_with_properties', [SERVICE_ONE_ID], {'properties': {}}),
|
2020-05-22 11:19:49 +01:00
|
|
|
|
(service_api_client, 'archive_service', [SERVICE_ONE_ID, []], {}),
|
2018-04-06 13:37:49 +01:00
|
|
|
|
(service_api_client, 'suspend_service', [SERVICE_ONE_ID], {}),
|
|
|
|
|
|
(service_api_client, 'resume_service', [SERVICE_ONE_ID], {}),
|
|
|
|
|
|
(service_api_client, 'remove_user_from_service', [SERVICE_ONE_ID, ''], {}),
|
2020-06-12 09:05:26 +01:00
|
|
|
|
(service_api_client, 'update_guest_list', [SERVICE_ONE_ID, {}], {}),
|
2018-04-06 13:37:49 +01:00
|
|
|
|
(service_api_client, 'create_service_inbound_api', [SERVICE_ONE_ID] + [''] * 3, {}),
|
|
|
|
|
|
(service_api_client, 'update_service_inbound_api', [SERVICE_ONE_ID] + [''] * 4, {}),
|
|
|
|
|
|
(service_api_client, 'add_reply_to_email_address', [SERVICE_ONE_ID, ''], {}),
|
|
|
|
|
|
(service_api_client, 'update_reply_to_email_address', [SERVICE_ONE_ID] + [''] * 2, {}),
|
2018-04-26 15:09:37 +01:00
|
|
|
|
(service_api_client, 'delete_reply_to_email_address', [SERVICE_ONE_ID, ''], {}),
|
2018-04-06 13:37:49 +01:00
|
|
|
|
(service_api_client, 'add_letter_contact', [SERVICE_ONE_ID, ''], {}),
|
|
|
|
|
|
(service_api_client, 'update_letter_contact', [SERVICE_ONE_ID] + [''] * 2, {}),
|
2019-07-04 16:11:19 +01:00
|
|
|
|
(service_api_client, 'delete_letter_contact', [SERVICE_ONE_ID, ''], {}),
|
2018-04-06 13:37:49 +01:00
|
|
|
|
(service_api_client, 'add_sms_sender', [SERVICE_ONE_ID, ''], {}),
|
|
|
|
|
|
(service_api_client, 'update_sms_sender', [SERVICE_ONE_ID] + [''] * 2, {}),
|
2018-04-26 15:09:37 +01:00
|
|
|
|
(service_api_client, 'delete_sms_sender', [SERVICE_ONE_ID, ''], {}),
|
2018-04-06 13:37:49 +01:00
|
|
|
|
(service_api_client, 'update_service_callback_api', [SERVICE_ONE_ID] + [''] * 4, {}),
|
|
|
|
|
|
(service_api_client, 'create_service_callback_api', [SERVICE_ONE_ID] + [''] * 3, {}),
|
2019-03-15 14:57:39 +00:00
|
|
|
|
(user_api_client, 'add_user_to_service', [SERVICE_ONE_ID, uuid4(), [], []], {}),
|
2018-09-26 16:41:04 +01:00
|
|
|
|
(invite_api_client, 'accept_invite', [SERVICE_ONE_ID, uuid4()], {}),
|
2018-04-06 13:37:49 +01:00
|
|
|
|
])
|
|
|
|
|
|
def test_deletes_service_cache(
|
|
|
|
|
|
app_,
|
|
|
|
|
|
mock_get_user,
|
2020-08-07 17:31:29 +01:00
|
|
|
|
mock_get_service_templates,
|
2018-04-06 13:37:49 +01:00
|
|
|
|
mocker,
|
|
|
|
|
|
client,
|
|
|
|
|
|
method,
|
|
|
|
|
|
extra_args,
|
|
|
|
|
|
extra_kwargs,
|
|
|
|
|
|
):
|
|
|
|
|
|
mocker.patch('app.notify_client.current_user', id='1')
|
2019-02-14 14:25:31 +00:00
|
|
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
2018-04-06 13:37:49 +01:00
|
|
|
|
mock_request = mocker.patch('notifications_python_client.base.BaseAPIClient.request')
|
|
|
|
|
|
|
|
|
|
|
|
getattr(client, method)(*extra_args, **extra_kwargs)
|
|
|
|
|
|
|
2018-04-10 13:30:52 +01:00
|
|
|
|
assert call('service-{}'.format(SERVICE_ONE_ID)) in mock_redis_delete.call_args_list
|
2018-04-06 13:37:49 +01:00
|
|
|
|
assert len(mock_request.call_args_list) == 1
|
2018-04-19 10:24:35 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('method, extra_args, expected_cache_deletes', [
|
|
|
|
|
|
('create_service_template', ['name', 'type_', 'content', SERVICE_ONE_ID], [
|
2018-04-20 16:32:02 +01:00
|
|
|
|
'service-{}-templates'.format(SERVICE_ONE_ID),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
]),
|
|
|
|
|
|
('update_service_template', [FAKE_TEMPLATE_ID, 'foo', 'sms', 'bar', SERVICE_ONE_ID], [
|
2020-09-21 14:04:10 +01:00
|
|
|
|
'service-{}-template-{}-versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID),
|
2019-07-26 16:19:03 +01:00
|
|
|
|
'service-{}-templates'.format(SERVICE_ONE_ID),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
]),
|
|
|
|
|
|
('redact_service_template', [SERVICE_ONE_ID, FAKE_TEMPLATE_ID], [
|
2020-09-21 14:04:10 +01:00
|
|
|
|
'service-{}-template-{}-versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID),
|
2019-07-26 16:19:03 +01:00
|
|
|
|
'service-{}-templates'.format(SERVICE_ONE_ID),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
]),
|
|
|
|
|
|
('update_service_template_sender', [SERVICE_ONE_ID, FAKE_TEMPLATE_ID, 'foo'], [
|
2020-09-21 14:04:10 +01:00
|
|
|
|
'service-{}-template-{}-versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID),
|
2019-07-26 16:19:03 +01:00
|
|
|
|
'service-{}-templates'.format(SERVICE_ONE_ID),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
]),
|
2019-01-29 15:43:59 +00:00
|
|
|
|
('update_service_template_postage', [SERVICE_ONE_ID, FAKE_TEMPLATE_ID, 'first'], [
|
2020-09-21 14:04:10 +01:00
|
|
|
|
'service-{}-template-{}-versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID),
|
2019-07-26 16:19:03 +01:00
|
|
|
|
'service-{}-templates'.format(SERVICE_ONE_ID),
|
2019-01-29 15:43:59 +00:00
|
|
|
|
]),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
('delete_service_template', [SERVICE_ONE_ID, FAKE_TEMPLATE_ID], [
|
2020-09-21 14:04:10 +01:00
|
|
|
|
'service-{}-template-{}-versions'.format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID),
|
2019-07-26 16:19:03 +01:00
|
|
|
|
'service-{}-templates'.format(SERVICE_ONE_ID),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
]),
|
2020-05-22 11:19:49 +01:00
|
|
|
|
('archive_service', [SERVICE_ONE_ID, []], [
|
|
|
|
|
|
'service-{}-templates'.format(SERVICE_ONE_ID),
|
|
|
|
|
|
'service-{}'.format(SERVICE_ONE_ID),
|
|
|
|
|
|
]),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
])
|
|
|
|
|
|
def test_deletes_caches_when_modifying_templates(
|
|
|
|
|
|
app_,
|
|
|
|
|
|
mock_get_user,
|
|
|
|
|
|
mocker,
|
|
|
|
|
|
method,
|
|
|
|
|
|
extra_args,
|
|
|
|
|
|
expected_cache_deletes,
|
|
|
|
|
|
):
|
|
|
|
|
|
mocker.patch('app.notify_client.current_user', id='1')
|
2019-02-14 14:25:31 +00:00
|
|
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
2021-01-25 14:03:16 +00:00
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch('app.extensions.RedisClient.delete_cache_keys_by_pattern')
|
2018-04-19 10:24:35 +01:00
|
|
|
|
mock_request = mocker.patch('notifications_python_client.base.BaseAPIClient.request')
|
|
|
|
|
|
|
|
|
|
|
|
getattr(service_api_client, method)(*extra_args)
|
|
|
|
|
|
|
2020-08-07 17:31:29 +01:00
|
|
|
|
assert mock_redis_delete.call_args_list == [call(x) for x in expected_cache_deletes]
|
2018-04-19 10:24:35 +01:00
|
|
|
|
assert len(mock_request.call_args_list) == 1
|
2021-01-25 14:03:16 +00:00
|
|
|
|
if method != 'create_service_template':
|
|
|
|
|
|
# no deletes for template cach on create_service_template
|
|
|
|
|
|
assert len(mock_redis_delete_by_pattern.call_args_list) == 1
|
|
|
|
|
|
assert mock_redis_delete_by_pattern.call_args_list[0] == call(f'service-{SERVICE_ONE_ID}-template-*')
|
2020-05-22 17:12:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
2021-01-25 14:03:16 +00:00
|
|
|
|
def test_deletes_cached_users_when_archiving_service(mocker, mock_get_service_templates):
|
|
|
|
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
|
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch('app.extensions.RedisClient.delete_cache_keys_by_pattern')
|
|
|
|
|
|
|
|
|
|
|
|
mocker.patch('notifications_python_client.base.BaseAPIClient.request', return_value={'data': ""})
|
2020-05-22 17:12:00 +01:00
|
|
|
|
|
|
|
|
|
|
service_api_client.archive_service(SERVICE_ONE_ID, ["my-user-id1", "my-user-id2"])
|
|
|
|
|
|
|
2020-05-27 11:56:07 +01:00
|
|
|
|
assert call('user-my-user-id1', 'user-my-user-id2') in mock_redis_delete.call_args_list
|
2021-01-25 14:03:16 +00:00
|
|
|
|
assert call(f'service-{SERVICE_ONE_ID}-template-*') in mock_redis_delete_by_pattern.call_args_list
|
2020-07-27 13:16:52 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_gets_guest_list(mocker):
|
|
|
|
|
|
client = ServiceAPIClient()
|
|
|
|
|
|
mock_get = mocker.patch.object(client, 'get', return_value=['a', 'b', 'c'])
|
|
|
|
|
|
|
|
|
|
|
|
response = client.get_guest_list('foo')
|
|
|
|
|
|
|
|
|
|
|
|
assert response == ['a', 'b', 'c']
|
|
|
|
|
|
mock_get.assert_called_once_with(
|
|
|
|
|
|
url='/service/foo/guest-list',
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_updates_guest_list(mocker):
|
|
|
|
|
|
client = ServiceAPIClient()
|
|
|
|
|
|
mock_put = mocker.patch.object(client, 'put')
|
|
|
|
|
|
|
|
|
|
|
|
client.update_guest_list('foo', data=['a', 'b', 'c'])
|
|
|
|
|
|
|
|
|
|
|
|
mock_put.assert_called_once_with(
|
|
|
|
|
|
url='/service/foo/guest-list',
|
|
|
|
|
|
data=['a', 'b', 'c'],
|
|
|
|
|
|
)
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_doesnt_delete_service_template_cache_when_none_exist(
|
|
|
|
|
|
app_,
|
|
|
|
|
|
mock_get_user,
|
|
|
|
|
|
mock_get_service_templates_when_no_templates_exist,
|
|
|
|
|
|
mocker
|
|
|
|
|
|
):
|
|
|
|
|
|
mocker.patch('app.notify_client.current_user', id='1')
|
|
|
|
|
|
mocker.patch('notifications_python_client.base.BaseAPIClient.request')
|
|
|
|
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
2021-01-25 14:03:16 +00:00
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch('app.extensions.RedisClient.delete_cache_keys_by_pattern')
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
|
|
|
|
|
service_api_client.update_reply_to_email_address(SERVICE_ONE_ID, uuid4(), 'foo@bar.com')
|
|
|
|
|
|
|
|
|
|
|
|
assert len(mock_redis_delete.call_args_list) == 1
|
|
|
|
|
|
assert mock_redis_delete.call_args_list[0] == call('service-{}'.format(SERVICE_ONE_ID))
|
|
|
|
|
|
|
2021-01-25 14:03:16 +00:00
|
|
|
|
assert len(mock_redis_delete_by_pattern.call_args_list) == 1
|
|
|
|
|
|
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
|
|
|
|
|
def test_client_deletes_service_template_cache_when_service_is_updated(
|
|
|
|
|
|
app_,
|
|
|
|
|
|
mock_get_user,
|
|
|
|
|
|
mocker
|
|
|
|
|
|
):
|
|
|
|
|
|
mocker.patch('app.notify_client.current_user', id='1')
|
|
|
|
|
|
mocker.patch('notifications_python_client.base.BaseAPIClient.request')
|
|
|
|
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
2021-01-25 14:03:16 +00:00
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch('app.extensions.RedisClient.delete_cache_keys_by_pattern')
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
|
|
|
|
|
service_api_client.update_reply_to_email_address(SERVICE_ONE_ID, uuid4(), 'foo@bar.com')
|
|
|
|
|
|
|
2021-01-25 14:03:16 +00:00
|
|
|
|
assert len(mock_redis_delete.call_args_list) == 1
|
|
|
|
|
|
assert mock_redis_delete.call_args_list[0] == call(f'service-{SERVICE_ONE_ID}')
|
|
|
|
|
|
assert mock_redis_delete_by_pattern.call_args_list[0] == call(f'service-{SERVICE_ONE_ID}-template-*')
|