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):
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mocker.patch("app.notify_client.current_user", id="1")
|
|
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch(
|
|
|
|
|
|
"app.extensions.RedisClient.delete_by_pattern"
|
|
|
|
|
|
)
|
|
|
|
|
|
expected_data = {"archived": True, "created_by": "1"}
|
|
|
|
|
|
expected_url = "/service/{}/template/{}".format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID)
|
2016-05-23 13:59:33 +01:00
|
|
|
|
|
|
|
|
|
|
client = ServiceAPIClient()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_post = mocker.patch(
|
|
|
|
|
|
"app.notify_client.service_api_client.ServiceAPIClient.post"
|
|
|
|
|
|
)
|
|
|
|
|
|
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)
|
2023-08-25 09:12:23 -07: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()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_get = mocker.patch.object(client, "get", return_value={})
|
2016-07-21 17:32:28 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
client.get_service("foo")
|
|
|
|
|
|
mock_get.assert_called_once_with("/service/foo")
|
2018-05-09 13:53:02 +01:00
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize("limit_days", [None, 30])
|
2021-06-28 10:11:22 +01:00
|
|
|
|
def test_client_gets_service_statistics(mocker, limit_days):
|
2018-05-09 13:53:02 +01:00
|
|
|
|
client = ServiceAPIClient()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_get = mocker.patch.object(client, "get", return_value={"data": {"a": "b"}})
|
2018-05-09 13:53:02 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
ret = client.get_service_statistics("foo", limit_days)
|
2018-05-09 13:53:02 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert ret == {"a": "b"}
|
|
|
|
|
|
mock_get.assert_called_once_with(
|
|
|
|
|
|
"/service/foo/statistics", params={"limit_days": limit_days}
|
|
|
|
|
|
)
|
2016-08-11 13:55:42 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_only_updates_allowed_attributes(mocker):
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mocker.patch("app.notify_client.current_user", id="1")
|
2016-08-11 13:55:42 +01:00
|
|
|
|
with pytest.raises(TypeError) as error:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
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()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_post = mocker.patch.object(client, "post", return_value={"data": {"id": None}})
|
|
|
|
|
|
mocker.patch("app.notify_client.current_user", id="123")
|
2017-10-04 11:49:32 +01:00
|
|
|
|
|
|
|
|
|
|
client.create_service(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"My first service",
|
|
|
|
|
|
"central_government",
|
2018-04-19 13:23:47 +01:00
|
|
|
|
1,
|
|
|
|
|
|
True,
|
|
|
|
|
|
fake_uuid,
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"test@example.com",
|
2017-10-04 11:49:32 +01:00
|
|
|
|
)
|
|
|
|
|
|
mock_post.assert_called_once_with(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"/service",
|
2017-10-04 11:49:32 +01:00
|
|
|
|
dict(
|
|
|
|
|
|
# Autogenerated arguments
|
2023-08-25 09:12:23 -07:00
|
|
|
|
created_by="123",
|
2017-10-04 11:49:32 +01:00
|
|
|
|
active=True,
|
|
|
|
|
|
# ‘service_name’ argument is coerced to ‘name’
|
2023-08-25 09:12:23 -07:00
|
|
|
|
name="My first service",
|
2017-10-04 11:49:32 +01:00
|
|
|
|
# The rest pass through with the same names
|
2023-08-25 09:12:23 -07:00
|
|
|
|
organization_type="central_government",
|
2017-10-04 11:49:32 +01:00
|
|
|
|
message_limit=1,
|
|
|
|
|
|
restricted=True,
|
|
|
|
|
|
user_id=fake_uuid,
|
2023-08-25 09:12:23 -07:00
|
|
|
|
email_from="test@example.com",
|
2017-10-04 11:49:32 +01:00
|
|
|
|
),
|
|
|
|
|
|
)
|
2018-02-21 14:37:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
2019-09-09 10:59:32 +01:00
|
|
|
|
def test_get_precompiled_template(mocker):
|
|
|
|
|
|
client = ServiceAPIClient()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_get = mocker.patch.object(client, "get")
|
2019-09-09 10:59:32 +01:00
|
|
|
|
|
|
|
|
|
|
client.get_precompiled_template(SERVICE_ONE_ID)
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_get.assert_called_once_with(
|
|
|
|
|
|
"/service/{}/template/precompiled".format(SERVICE_ONE_ID)
|
|
|
|
|
|
)
|
2019-09-09 10:59:32 +01:00
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
2023-09-08 17:58:06 -04:00
|
|
|
|
("template_data", "extra_args", "expected_count"),
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
(
|
|
|
|
|
|
[],
|
|
|
|
|
|
{},
|
|
|
|
|
|
0,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
[],
|
|
|
|
|
|
{"template_type": "email"},
|
|
|
|
|
|
0,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
[
|
|
|
|
|
|
{"template_type": "email"},
|
|
|
|
|
|
{"template_type": "sms"},
|
|
|
|
|
|
],
|
|
|
|
|
|
{},
|
|
|
|
|
|
2,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
[
|
|
|
|
|
|
{"template_type": "email"},
|
|
|
|
|
|
{"template_type": "sms"},
|
|
|
|
|
|
],
|
|
|
|
|
|
{"template_type": "email"},
|
|
|
|
|
|
1,
|
|
|
|
|
|
),
|
2023-09-08 17:58:06 -04:00
|
|
|
|
],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
)
|
2018-02-21 14:37:27 +00:00
|
|
|
|
def test_client_returns_count_of_service_templates(
|
2021-05-12 14:57:21 +01:00
|
|
|
|
notify_admin,
|
2018-02-21 14:37:27 +00:00
|
|
|
|
mocker,
|
|
|
|
|
|
template_data,
|
|
|
|
|
|
extra_args,
|
|
|
|
|
|
expected_count,
|
|
|
|
|
|
):
|
|
|
|
|
|
mocker.patch(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"app.service_api_client.get_service_templates",
|
|
|
|
|
|
return_value={"data": template_data},
|
2018-02-21 14:37:27 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
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(
|
|
|
|
|
|
(
|
2023-09-08 17:58:06 -04:00
|
|
|
|
"client_method",
|
|
|
|
|
|
"extra_args",
|
|
|
|
|
|
"expected_cache_get_calls",
|
|
|
|
|
|
"cache_value",
|
|
|
|
|
|
"expected_api_calls",
|
|
|
|
|
|
"expected_cache_set_calls",
|
|
|
|
|
|
"expected_return_value",
|
2018-04-06 13:37:49 +01:00
|
|
|
|
),
|
|
|
|
|
|
[
|
|
|
|
|
|
(
|
2018-04-19 10:24:35 +01:00
|
|
|
|
service_api_client.get_service,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[call("service-{}".format(SERVICE_ONE_ID))],
|
2018-04-06 13:37:49 +01:00
|
|
|
|
b'{"data_from": "cache"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "cache"},
|
2018-04-06 13:37:49 +01:00
|
|
|
|
),
|
|
|
|
|
|
(
|
2018-04-19 10:24:35 +01:00
|
|
|
|
service_api_client.get_service,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[call("service-{}".format(SERVICE_ONE_ID))],
|
2018-04-06 13:37:49 +01:00
|
|
|
|
None,
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[call("/service/{}".format(SERVICE_ONE_ID))],
|
2018-04-06 13:37:49 +01:00
|
|
|
|
[
|
|
|
|
|
|
call(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"service-{}".format(SERVICE_ONE_ID),
|
2018-04-06 13:37:49 +01:00
|
|
|
|
'{"data_from": "api"}',
|
2018-04-23 17:07:41 +01:00
|
|
|
|
ex=604800,
|
2018-04-06 13:37:49 +01:00
|
|
|
|
)
|
|
|
|
|
|
],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "api"},
|
2018-04-06 13:37:49 +01:00
|
|
|
|
),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07: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"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "cache"},
|
2018-04-19 10:24:35 +01:00
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
call(
|
|
|
|
|
|
"service-{}-template-{}-version-None".format(
|
|
|
|
|
|
SERVICE_ONE_ID, FAKE_TEMPLATE_ID
|
|
|
|
|
|
)
|
|
|
|
|
|
),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
None,
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[call("/service/{}/template/{}".format(SERVICE_ONE_ID, FAKE_TEMPLATE_ID))],
|
2018-04-19 10:24:35 +01:00
|
|
|
|
[
|
|
|
|
|
|
call(
|
2023-08-25 09:12:23 -07: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
|
|
|
|
],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "api"},
|
2018-04-19 10:24:35 +01:00
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID, 1],
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07: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"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "cache"},
|
2018-04-19 10:24:35 +01:00
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID, 1],
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
call(
|
|
|
|
|
|
"service-{}-template-{}-version-1".format(
|
|
|
|
|
|
SERVICE_ONE_ID, FAKE_TEMPLATE_ID
|
|
|
|
|
|
)
|
|
|
|
|
|
),
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
call(
|
|
|
|
|
|
"/service/{}/template/{}/version/1".format(
|
|
|
|
|
|
SERVICE_ONE_ID, FAKE_TEMPLATE_ID
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
2018-04-19 10:24:35 +01:00
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
2023-08-25 09:12:23 -07: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
|
|
|
|
],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "api"},
|
2018-04-19 10:24:35 +01:00
|
|
|
|
),
|
2018-04-20 17:29:06 +01:00
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_templates,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[call("service-{}-templates".format(SERVICE_ONE_ID))],
|
2018-04-20 17:29:06 +01:00
|
|
|
|
b'{"data_from": "cache"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "cache"},
|
2018-04-20 17:29:06 +01:00
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_templates,
|
|
|
|
|
|
[SERVICE_ONE_ID],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[call("service-{}-templates".format(SERVICE_ONE_ID))],
|
2018-04-20 17:29:06 +01:00
|
|
|
|
None,
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[call("/service/{}/template?detailed=False".format(SERVICE_ONE_ID))],
|
2018-04-20 17:29:06 +01:00
|
|
|
|
[
|
|
|
|
|
|
call(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"service-{}-templates".format(SERVICE_ONE_ID),
|
2018-04-20 17:29:06 +01:00
|
|
|
|
'{"data_from": "api"}',
|
2018-04-23 17:07:41 +01:00
|
|
|
|
ex=604800,
|
2018-04-20 17:29:06 +01:00
|
|
|
|
)
|
|
|
|
|
|
],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "api"},
|
2018-04-20 17:29:06 +01:00
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template_versions,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
call(
|
|
|
|
|
|
"service-{}-template-{}-versions".format(
|
|
|
|
|
|
SERVICE_ONE_ID, FAKE_TEMPLATE_ID
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
2018-04-20 17:29:06 +01:00
|
|
|
|
],
|
|
|
|
|
|
b'{"data_from": "cache"}',
|
|
|
|
|
|
[],
|
|
|
|
|
|
[],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "cache"},
|
2018-04-20 17:29:06 +01:00
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
service_api_client.get_service_template_versions,
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
call(
|
|
|
|
|
|
"service-{}-template-{}-versions".format(
|
|
|
|
|
|
SERVICE_ONE_ID, FAKE_TEMPLATE_ID
|
|
|
|
|
|
)
|
|
|
|
|
|
),
|
2018-04-20 17:29:06 +01:00
|
|
|
|
],
|
|
|
|
|
|
None,
|
|
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
call(
|
|
|
|
|
|
"/service/{}/template/{}/versions".format(
|
|
|
|
|
|
SERVICE_ONE_ID, FAKE_TEMPLATE_ID
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
2018-04-20 17:29:06 +01:00
|
|
|
|
],
|
|
|
|
|
|
[
|
|
|
|
|
|
call(
|
2023-08-25 09:12:23 -07: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
|
|
|
|
],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"data_from": "api"},
|
2018-04-20 17:29:06 +01:00
|
|
|
|
),
|
2023-08-25 09:12:23 -07:00
|
|
|
|
],
|
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(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"app.extensions.RedisClient.get",
|
2018-04-06 13:37:49 +01:00
|
|
|
|
return_value=cache_value,
|
|
|
|
|
|
)
|
|
|
|
|
|
mock_api_get = mocker.patch(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"app.notify_client.NotifyAdminAPIClient.get",
|
|
|
|
|
|
return_value={"data_from": "api"},
|
2018-04-06 13:37:49 +01:00
|
|
|
|
)
|
|
|
|
|
|
mock_redis_set = mocker.patch(
|
2023-08-25 09:12:23 -07: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
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
2023-09-08 17:58:06 -04:00
|
|
|
|
("client", "method", "extra_args", "extra_kwargs"),
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[
|
|
|
|
|
|
(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_guest_list", [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, "delete_reply_to_email_address", [SERVICE_ONE_ID, ""], {}),
|
|
|
|
|
|
(service_api_client, "add_sms_sender", [SERVICE_ONE_ID, ""], {}),
|
|
|
|
|
|
(service_api_client, "update_sms_sender", [SERVICE_ONE_ID] + [""] * 2, {}),
|
|
|
|
|
|
(service_api_client, "delete_sms_sender", [SERVICE_ONE_ID, ""], {}),
|
|
|
|
|
|
(
|
|
|
|
|
|
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, uuid4(), [], []], {}),
|
|
|
|
|
|
(invite_api_client, "accept_invite", [SERVICE_ONE_ID, uuid4()], {}),
|
|
|
|
|
|
],
|
|
|
|
|
|
)
|
2018-04-06 13:37:49 +01:00
|
|
|
|
def test_deletes_service_cache(
|
2021-05-12 14:57:21 +01:00
|
|
|
|
notify_admin,
|
2018-04-06 13:37:49 +01:00
|
|
|
|
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,
|
|
|
|
|
|
):
|
2023-08-25 09:12:23 -07:00
|
|
|
|
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"
|
|
|
|
|
|
)
|
2018-04-06 13:37:49 +01:00
|
|
|
|
|
|
|
|
|
|
getattr(client, method)(*extra_args, **extra_kwargs)
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07: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
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
2023-09-08 17:58:06 -04:00
|
|
|
|
("method", "extra_args", "expected_cache_deletes"),
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[
|
|
|
|
|
|
(
|
|
|
|
|
|
"create_service_template",
|
|
|
|
|
|
["name", "type_", "content", SERVICE_ONE_ID],
|
|
|
|
|
|
[
|
|
|
|
|
|
"service-{}-templates".format(SERVICE_ONE_ID),
|
|
|
|
|
|
],
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
"update_service_template",
|
|
|
|
|
|
[FAKE_TEMPLATE_ID, "foo", "sms", "bar", SERVICE_ONE_ID],
|
|
|
|
|
|
[
|
|
|
|
|
|
"service-{}-templates".format(SERVICE_ONE_ID),
|
|
|
|
|
|
],
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
"redact_service_template",
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
|
|
|
|
|
"service-{}-templates".format(SERVICE_ONE_ID),
|
|
|
|
|
|
],
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
"update_service_template_sender",
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID, "foo"],
|
|
|
|
|
|
[
|
|
|
|
|
|
"service-{}-templates".format(SERVICE_ONE_ID),
|
|
|
|
|
|
],
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
"delete_service_template",
|
|
|
|
|
|
[SERVICE_ONE_ID, FAKE_TEMPLATE_ID],
|
|
|
|
|
|
[
|
|
|
|
|
|
"service-{}-templates".format(SERVICE_ONE_ID),
|
|
|
|
|
|
],
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
"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(
|
2021-05-12 14:57:21 +01:00
|
|
|
|
notify_admin,
|
2018-04-19 10:24:35 +01:00
|
|
|
|
mock_get_user,
|
|
|
|
|
|
mocker,
|
|
|
|
|
|
method,
|
|
|
|
|
|
extra_args,
|
|
|
|
|
|
expected_cache_deletes,
|
|
|
|
|
|
):
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mocker.patch("app.notify_client.current_user", id="1")
|
|
|
|
|
|
mock_redis_delete = mocker.patch("app.extensions.RedisClient.delete")
|
|
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch(
|
|
|
|
|
|
"app.extensions.RedisClient.delete_by_pattern"
|
|
|
|
|
|
)
|
|
|
|
|
|
mock_request = mocker.patch(
|
|
|
|
|
|
"notifications_python_client.base.BaseAPIClient.request"
|
|
|
|
|
|
)
|
2018-04-19 10:24:35 +01:00
|
|
|
|
|
|
|
|
|
|
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
|
2023-08-25 09:12:23 -07:00
|
|
|
|
if method != "create_service_template":
|
2021-01-25 14:03:16 +00:00
|
|
|
|
# no deletes for template cach on create_service_template
|
|
|
|
|
|
assert len(mock_redis_delete_by_pattern.call_args_list) == 1
|
2023-08-25 09:12:23 -07:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
def test_deletes_cached_users_when_archiving_service(
|
|
|
|
|
|
mocker, mock_get_service_templates
|
|
|
|
|
|
):
|
2024-07-11 09:38:32 -07:00
|
|
|
|
mocker.patch(
|
|
|
|
|
|
"app.notify_client.service_api_client.ServiceAPIClient.check_inactive_user"
|
|
|
|
|
|
)
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_redis_delete = mocker.patch("app.extensions.RedisClient.delete")
|
|
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch(
|
|
|
|
|
|
"app.extensions.RedisClient.delete_by_pattern"
|
|
|
|
|
|
)
|
2021-01-25 14:03:16 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
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"])
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert (
|
|
|
|
|
|
call("user-my-user-id1", "user-my-user-id2") in mock_redis_delete.call_args_list
|
|
|
|
|
|
)
|
|
|
|
|
|
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()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_get = mocker.patch.object(client, "get", return_value=["a", "b", "c"])
|
2020-07-27 13:16:52 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
response = client.get_guest_list("foo")
|
2020-07-27 13:16:52 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert response == ["a", "b", "c"]
|
2020-07-27 13:16:52 +01:00
|
|
|
|
mock_get.assert_called_once_with(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
url="/service/foo/guest-list",
|
2020-07-27 13:16:52 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_updates_guest_list(mocker):
|
|
|
|
|
|
client = ServiceAPIClient()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_put = mocker.patch.object(client, "put")
|
2020-07-27 13:16:52 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
client.update_guest_list("foo", data=["a", "b", "c"])
|
2020-07-27 13:16:52 +01:00
|
|
|
|
|
|
|
|
|
|
mock_put.assert_called_once_with(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
url="/service/foo/guest-list",
|
|
|
|
|
|
data=["a", "b", "c"],
|
2020-07-27 13:16:52 +01:00
|
|
|
|
)
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_doesnt_delete_service_template_cache_when_none_exist(
|
2021-05-12 14:57:21 +01:00
|
|
|
|
notify_admin,
|
2020-08-07 17:31:29 +01:00
|
|
|
|
mock_get_user,
|
|
|
|
|
|
mock_get_service_templates_when_no_templates_exist,
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mocker,
|
2020-08-07 17:31:29 +01:00
|
|
|
|
):
|
2023-08-25 09:12:23 -07:00
|
|
|
|
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")
|
|
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch(
|
|
|
|
|
|
"app.extensions.RedisClient.delete_by_pattern"
|
|
|
|
|
|
)
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
service_api_client.update_reply_to_email_address(
|
|
|
|
|
|
SERVICE_ONE_ID, uuid4(), "foo@bar.com"
|
|
|
|
|
|
)
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
|
|
|
|
|
assert len(mock_redis_delete.call_args_list) == 1
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert mock_redis_delete.call_args_list[0] == call(
|
|
|
|
|
|
"service-{}".format(SERVICE_ONE_ID)
|
|
|
|
|
|
)
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
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(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
notify_admin, mock_get_user, mocker
|
2020-08-07 17:31:29 +01:00
|
|
|
|
):
|
2023-08-25 09:12:23 -07:00
|
|
|
|
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")
|
|
|
|
|
|
mock_redis_delete_by_pattern = mocker.patch(
|
|
|
|
|
|
"app.extensions.RedisClient.delete_by_pattern"
|
|
|
|
|
|
)
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
service_api_client.update_reply_to_email_address(
|
|
|
|
|
|
SERVICE_ONE_ID, uuid4(), "foo@bar.com"
|
|
|
|
|
|
)
|
2020-08-07 17:31:29 +01:00
|
|
|
|
|
2021-01-25 14:03:16 +00:00
|
|
|
|
assert len(mock_redis_delete.call_args_list) == 1
|
2023-08-25 09:12:23 -07:00
|
|
|
|
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-*"
|
|
|
|
|
|
)
|
2021-02-01 18:00:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_client_updates_service_with_allowed_attributes(
|
|
|
|
|
|
mocker,
|
|
|
|
|
|
):
|
|
|
|
|
|
client = ServiceAPIClient()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_post = mocker.patch.object(client, "post", return_value={"data": {"id": None}})
|
|
|
|
|
|
mocker.patch("app.notify_client.current_user", id="123")
|
2021-02-01 18:00:43 +00:00
|
|
|
|
|
|
|
|
|
|
allowed_attributes = [
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"active",
|
|
|
|
|
|
"consent_to_research",
|
|
|
|
|
|
"contact_link",
|
|
|
|
|
|
"count_as_live",
|
|
|
|
|
|
"email_from",
|
|
|
|
|
|
"free_sms_fragment_limit",
|
|
|
|
|
|
"go_live_at",
|
|
|
|
|
|
"go_live_user",
|
|
|
|
|
|
"message_limit",
|
|
|
|
|
|
"name",
|
|
|
|
|
|
"notes",
|
|
|
|
|
|
"organization_type",
|
|
|
|
|
|
"permissions",
|
|
|
|
|
|
"prefix_sms",
|
|
|
|
|
|
"rate_limit",
|
|
|
|
|
|
"reply_to_email_address",
|
|
|
|
|
|
"research_mode",
|
|
|
|
|
|
"restricted",
|
|
|
|
|
|
"sms_sender",
|
|
|
|
|
|
"volume_email",
|
|
|
|
|
|
"volume_sms",
|
2021-02-01 18:00:43 +00:00
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
attrs_dict = {}
|
|
|
|
|
|
for attr in allowed_attributes:
|
|
|
|
|
|
attrs_dict[attr] = "value"
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
client.update_service(SERVICE_ONE_ID, **attrs_dict)
|
2021-02-01 18:00:43 +00:00
|
|
|
|
mock_post.assert_called_once_with(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
f"/service/{SERVICE_ONE_ID}", {**{"created_by": "123"}, **attrs_dict}
|
2021-02-01 18:00:43 +00:00
|
|
|
|
)
|