mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-07-19 22:13:48 -04:00
In the same way, and for the same reasons that we’re caching the service
object.
Here’s a sample of the data returned by the API – so we should make sure
that any changes to this data invalidate the cache.
If we ever change a user’s phone number (for example) directly in the
database, then we will need to invalidate this cache manually.
```python
{
'data':{
'organisations':[
'4c707b81-4c6d-4d33-9376-17f0de6e0405'
],
'logged_in_at':'2018-04-10T11:41:03.781990Z',
'id':'2c45486e-177e-40b8-997d-5f4f81a461ca',
'email_address':'test@example.gov.uk',
'platform_admin':False,
'password_changed_at':'2018-01-01 10:10:10.100000',
'permissions':{
'42a9d4f2-1444-4e22-9133-52d9e406213f':[
'manage_api_keys',
'send_letters',
'manage_users',
'manage_templates',
'view_activity',
'send_texts',
'send_emails',
'manage_settings'
],
'a928eef8-0f25-41ca-b480-0447f29b2c20':[
'manage_users',
'manage_templates',
'manage_settings',
'send_texts',
'send_emails',
'send_letters',
'manage_api_keys',
'view_activity'
],
},
'state':'active',
'mobile_number':'07700900123',
'failed_login_count':0,
'name':'Example',
'services':[
'6078a8c0-52f5-4c4f-b724-d7d1ff2d3884',
'6afe3c1c-7fda-4d8d-aa8d-769c4bdf7803',
],
'current_session_id':'fea2ade1-db0a-4c90-93e7-c64a877ce83e',
'auth_type':'sms_auth'
}
}
```
242 lines
7.4 KiB
Python
242 lines
7.4 KiB
Python
from unittest.mock import call
|
||
|
||
import pytest
|
||
from tests.conftest import SERVICE_ONE_ID, fake_uuid
|
||
|
||
from app import service_api_client, user_api_client
|
||
from app.notify_client.service_api_client import ServiceAPIClient
|
||
|
||
|
||
def test_client_posts_archived_true_when_deleting_template(mocker):
|
||
service_id = fake_uuid
|
||
template_id = fake_uuid
|
||
mocker.patch('app.notify_client.current_user', id='1')
|
||
|
||
expected_data = {
|
||
'archived': True,
|
||
'created_by': '1'
|
||
}
|
||
expected_url = '/service/{}/template/{}'.format(service_id, template_id)
|
||
|
||
client = ServiceAPIClient()
|
||
mock_post = mocker.patch('app.notify_client.service_api_client.ServiceAPIClient.post')
|
||
|
||
client.delete_service_template(service_id, template_id)
|
||
mock_post.assert_called_once_with(expected_url, data=expected_data)
|
||
|
||
|
||
@pytest.mark.parametrize(
|
||
'function,params', [
|
||
(ServiceAPIClient.get_service, {}),
|
||
(ServiceAPIClient.get_detailed_service, {'detailed': True}),
|
||
(ServiceAPIClient.get_detailed_service_for_today, {'detailed': True, 'today_only': True})
|
||
],
|
||
ids=lambda x: x.__name__
|
||
)
|
||
def test_client_gets_service(mocker, function, params):
|
||
client = ServiceAPIClient()
|
||
mock_get = mocker.patch.object(client, 'get', return_value={})
|
||
|
||
function(client, 'foo')
|
||
mock_get.assert_called_once_with('/service/foo', params=params)
|
||
|
||
|
||
def test_client_only_updates_allowed_attributes(mocker):
|
||
mocker.patch('app.notify_client.current_user', id='1')
|
||
with pytest.raises(TypeError) as error:
|
||
ServiceAPIClient().update_service('service_id', foo='bar')
|
||
assert str(error.value) == 'Not allowed to update service attributes: foo'
|
||
|
||
|
||
def test_client_creates_service_with_correct_data(
|
||
mocker,
|
||
active_user_with_permissions,
|
||
fake_uuid,
|
||
):
|
||
client = ServiceAPIClient()
|
||
mock_post = mocker.patch.object(client, 'post', return_value={'data': {'id': None}})
|
||
mocker.patch('app.notify_client.current_user', id='123')
|
||
|
||
client.create_service(
|
||
service_name='My first service',
|
||
organisation_type='central_government',
|
||
message_limit=1,
|
||
restricted=True,
|
||
user_id=fake_uuid,
|
||
email_from='test@example.com',
|
||
)
|
||
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',
|
||
),
|
||
)
|
||
|
||
|
||
@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
|
||
|
||
|
||
@pytest.mark.parametrize(
|
||
(
|
||
'expected_cache_get_calls,'
|
||
'cache_value,'
|
||
'expected_api_calls,'
|
||
'expected_cache_set_calls,'
|
||
'expected_return_value,'
|
||
),
|
||
[
|
||
(
|
||
[
|
||
call('service-{}'.format(SERVICE_ONE_ID))
|
||
],
|
||
b'{"data_from": "cache"}',
|
||
[],
|
||
[],
|
||
{'data_from': 'cache'},
|
||
),
|
||
(
|
||
[
|
||
call('service-{}'.format(SERVICE_ONE_ID))
|
||
],
|
||
None,
|
||
[
|
||
call('/service/{}'.format(SERVICE_ONE_ID), params={})
|
||
],
|
||
[
|
||
call(
|
||
'service-{}'.format(SERVICE_ONE_ID),
|
||
'{"data_from": "api"}',
|
||
ex=86400
|
||
)
|
||
],
|
||
{'data_from': 'api'},
|
||
),
|
||
]
|
||
)
|
||
def test_returns_value_from_cache(
|
||
mocker,
|
||
expected_cache_get_calls,
|
||
cache_value,
|
||
expected_return_value,
|
||
expected_api_calls,
|
||
expected_cache_set_calls,
|
||
):
|
||
|
||
mock_redis_get = mocker.patch(
|
||
'app.notify_client.RedisClient.get',
|
||
return_value=cache_value,
|
||
)
|
||
mock_api_get = mocker.patch(
|
||
'app.notify_client.NotifyAdminAPIClient.get',
|
||
return_value={'data_from': 'api'},
|
||
)
|
||
mock_redis_set = mocker.patch(
|
||
'app.notify_client.RedisClient.set',
|
||
)
|
||
|
||
assert service_api_client.get_service(SERVICE_ONE_ID) == expected_return_value
|
||
|
||
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': {}}),
|
||
(service_api_client, 'archive_service', [SERVICE_ONE_ID], {}),
|
||
(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, ''], {}),
|
||
(service_api_client, 'update_whitelist', [SERVICE_ONE_ID, {}], {}),
|
||
(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, {}),
|
||
(service_api_client, 'add_letter_contact', [SERVICE_ONE_ID, ''], {}),
|
||
(service_api_client, 'update_letter_contact', [SERVICE_ONE_ID] + [''] * 2, {}),
|
||
(service_api_client, 'add_sms_sender', [SERVICE_ONE_ID, ''], {}),
|
||
(service_api_client, 'update_sms_sender', [SERVICE_ONE_ID] + [''] * 2, {}),
|
||
(service_api_client, 'update_service_callback_api', [SERVICE_ONE_ID] + [''] * 4, {}),
|
||
(service_api_client, 'create_service_callback_api', [SERVICE_ONE_ID] + [''] * 3, {}),
|
||
(user_api_client, 'add_user_to_service', [SERVICE_ONE_ID, fake_uuid(), []], {}),
|
||
])
|
||
def test_deletes_service_cache(
|
||
app_,
|
||
mock_get_user,
|
||
mocker,
|
||
client,
|
||
method,
|
||
extra_args,
|
||
extra_kwargs,
|
||
):
|
||
mocker.patch('app.notify_client.current_user', id='1')
|
||
mock_redis_delete = mocker.patch('app.notify_client.RedisClient.delete')
|
||
mock_request = mocker.patch('notifications_python_client.base.BaseAPIClient.request')
|
||
|
||
getattr(client, method)(*extra_args, **extra_kwargs)
|
||
|
||
assert call('service-{}'.format(SERVICE_ONE_ID)) in mock_redis_delete.call_args_list
|
||
assert len(mock_request.call_args_list) == 1
|