mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-02-24 04:10:57 -05:00
Before, the delete decorator would delete the keys from Redis and then we made the request to api to change the data. However, it is possible that the cache could get re-populated in between these two things happening, and so would cache outdated data. This changes the order to send the api request first. We then always delete the specified keys from Redis. Changing the order of the code in the decorator changes the order in which the cache keys get deleted, so the tests have been updated.
195 lines
5.3 KiB
Python
195 lines
5.3 KiB
Python
from unittest.mock import call
|
|
|
|
import pytest
|
|
|
|
from app import organisations_client
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
(
|
|
'client_method,'
|
|
'expected_cache_get_calls,'
|
|
'cache_value,'
|
|
'expected_api_calls,'
|
|
'expected_cache_set_calls,'
|
|
'expected_return_value,'
|
|
),
|
|
[
|
|
(
|
|
'get_domains',
|
|
[
|
|
call('domains'),
|
|
],
|
|
b"""
|
|
[
|
|
{"name": "org 1", "domains": ["a", "b", "c"]},
|
|
{"name": "org 2", "domains": ["c", "d", "e"]}
|
|
]
|
|
""",
|
|
[],
|
|
[],
|
|
['a', 'b', 'c', 'd', 'e'],
|
|
),
|
|
(
|
|
'get_domains',
|
|
[
|
|
call('domains'),
|
|
call('organisations'),
|
|
],
|
|
None,
|
|
[
|
|
call(url='/organisations')
|
|
],
|
|
[
|
|
call(
|
|
'organisations',
|
|
'[{"domains": ["x", "y", "z"]}]',
|
|
ex=604800,
|
|
),
|
|
call(
|
|
'domains',
|
|
'["x", "y", "z"]',
|
|
ex=604800
|
|
),
|
|
],
|
|
'from api',
|
|
),
|
|
(
|
|
'get_organisations',
|
|
[
|
|
call('organisations'),
|
|
],
|
|
b"""
|
|
[
|
|
{"name": "org 1", "domains": ["a", "b", "c"]},
|
|
{"name": "org 2", "domains": ["c", "d", "e"]}
|
|
]
|
|
""",
|
|
[],
|
|
[],
|
|
[
|
|
{"name": "org 1", "domains": ["a", "b", "c"]},
|
|
{"name": "org 2", "domains": ["c", "d", "e"]}
|
|
],
|
|
),
|
|
(
|
|
'get_organisations',
|
|
[
|
|
call('organisations'),
|
|
],
|
|
None,
|
|
[
|
|
call(url='/organisations')
|
|
],
|
|
[
|
|
call(
|
|
'organisations',
|
|
'[{"domains": ["x", "y", "z"]}]',
|
|
ex=604800,
|
|
),
|
|
],
|
|
'from api',
|
|
),
|
|
]
|
|
)
|
|
def test_returns_value_from_cache(
|
|
app_,
|
|
mocker,
|
|
client_method,
|
|
expected_cache_get_calls,
|
|
cache_value,
|
|
expected_return_value,
|
|
expected_api_calls,
|
|
expected_cache_set_calls,
|
|
):
|
|
|
|
mock_redis_get = mocker.patch(
|
|
'app.extensions.RedisClient.get',
|
|
return_value=cache_value,
|
|
)
|
|
mock_api_get = mocker.patch(
|
|
'app.notify_client.NotifyAdminAPIClient.get',
|
|
return_value=[
|
|
{'domains': ['x', 'y', 'z']}
|
|
],
|
|
)
|
|
mock_redis_set = mocker.patch(
|
|
'app.extensions.RedisClient.set',
|
|
)
|
|
|
|
getattr(organisations_client, client_method)()
|
|
|
|
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
|
|
|
|
|
|
def test_deletes_domain_cache(
|
|
app_,
|
|
mock_get_user,
|
|
mocker,
|
|
fake_uuid,
|
|
):
|
|
mocker.patch('app.notify_client.current_user', id='1')
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
|
mock_request = mocker.patch('notifications_python_client.base.BaseAPIClient.request')
|
|
|
|
organisations_client.update_organisation(fake_uuid, foo='bar')
|
|
|
|
assert call('domains') in mock_redis_delete.call_args_list
|
|
assert len(mock_request.call_args_list) == 1
|
|
|
|
|
|
def test_update_organisation_when_not_updating_org_type(mocker, fake_uuid):
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
|
mock_post = mocker.patch('app.notify_client.organisations_api_client.OrganisationsClient.post')
|
|
|
|
organisations_client.update_organisation(fake_uuid, foo='bar')
|
|
|
|
mock_post.assert_called_with(
|
|
url='/organisations/{}'.format(fake_uuid),
|
|
data={'foo': 'bar'}
|
|
)
|
|
assert mock_redis_delete.call_args_list == [call('organisations'), call('domains')]
|
|
|
|
|
|
def test_update_organisation_when_updating_org_type_and_org_has_services(mocker, fake_uuid):
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
|
mock_post = mocker.patch('app.notify_client.organisations_api_client.OrganisationsClient.post')
|
|
|
|
organisations_client.update_organisation(
|
|
fake_uuid,
|
|
cached_service_ids=['a', 'b', 'c'],
|
|
organisation_type='central',
|
|
)
|
|
|
|
mock_post.assert_called_with(
|
|
url='/organisations/{}'.format(fake_uuid),
|
|
data={'organisation_type': 'central'}
|
|
)
|
|
assert mock_redis_delete.call_args_list == [
|
|
call('service-a', 'service-b', 'service-c'),
|
|
call('organisations'),
|
|
call('domains'),
|
|
]
|
|
|
|
|
|
def test_update_organisation_when_updating_org_type_but_org_has_no_services(mocker, fake_uuid):
|
|
mock_redis_delete = mocker.patch('app.extensions.RedisClient.delete')
|
|
mock_post = mocker.patch('app.notify_client.organisations_api_client.OrganisationsClient.post')
|
|
|
|
organisations_client.update_organisation(
|
|
fake_uuid,
|
|
cached_service_ids=[],
|
|
organisation_type='central',
|
|
)
|
|
|
|
mock_post.assert_called_with(
|
|
url='/organisations/{}'.format(fake_uuid),
|
|
data={'organisation_type': 'central'}
|
|
)
|
|
assert mock_redis_delete.call_args_list == [
|
|
call('organisations'),
|
|
call('domains'),
|
|
]
|