Merge pull request #3018 from alphagov/link-tests

Link tests
This commit is contained in:
Toby Lorne
2020-10-28 09:58:56 +00:00
committed by GitHub
5 changed files with 161 additions and 0 deletions

View File

@@ -301,3 +301,25 @@ def send_canary_to_cbc_proxy():
message = f"Sending a canary message to CBC proxy with ID {identifier}" message = f"Sending a canary message to CBC proxy with ID {identifier}"
current_app.logger.info(message) current_app.logger.info(message)
cbc_proxy_client.send_canary(identifier) cbc_proxy_client.send_canary(identifier)
@notify_celery.task(name='trigger-link-tests')
def trigger_link_tests():
"""
Currently we only have one hardcoded CBC Proxy, which corresponds to one
CBC, and so currently we do not specify the CBC Proxy name
In future we will have multiple CBC proxies, each proxy corresponding to
one MNO's CBC
This task should invoke other tasks which do the actual link tests, eg:
for cbc_name in app.config.ENABLED_CBCS:
send_link_test_for_cbc(cbc_name)
Alternatively this task could be configured to be a Celery group
"""
for _ in range(1):
identifier = str(uuid.uuid4())
message = f"Sending a link test to CBC proxy with ID {identifier}"
current_app.logger.info(message)
cbc_proxy_client.send_link_test(identifier)

View File

@@ -32,6 +32,12 @@ class CBCProxyNoopClient:
): ):
pass pass
def send_link_test(
self,
identifier,
):
pass
def create_and_send_broadcast( def create_and_send_broadcast(
self, self,
identifier, headline, description, areas identifier, headline, description, areas
@@ -83,11 +89,33 @@ class CBCProxyClient:
if 'FunctionError' in result: if 'FunctionError' in result:
raise Exception('Function exited with unhandled exception') raise Exception('Function exited with unhandled exception')
def send_link_test(
self,
identifier,
):
payload_bytes = bytes(json.dumps({
'message_type': 'test',
'identifier': identifier,
}), encoding='utf8')
result = self._lambda_client.invoke(
FunctionName='bt-ee-1-proxy',
InvocationType='RequestResponse',
Payload=payload_bytes,
)
if result['StatusCode'] > 299:
raise Exception('Could not invoke lambda')
if 'FunctionError' in result:
raise Exception('Function exited with unhandled exception')
def create_and_send_broadcast( def create_and_send_broadcast(
self, self,
identifier, headline, description, areas, identifier, headline, description, areas,
): ):
payload_bytes = bytes(json.dumps({ payload_bytes = bytes(json.dumps({
'message_type': 'alert',
'identifier': identifier, 'identifier': identifier,
'headline': headline, 'headline': headline,
'description': description, 'description': description,

View File

@@ -308,6 +308,11 @@ class Config(object):
'schedule': timedelta(minutes=5), 'schedule': timedelta(minutes=5),
'options': {'queue': QueueNames.PERIODIC} 'options': {'queue': QueueNames.PERIODIC}
}, },
'trigger-link-tests': {
'task': 'trigger-link-tests',
'schedule': timedelta(minutes=5),
'options': {'queue': QueueNames.PERIODIC}
},
} }
CELERY_QUEUES = [] CELERY_QUEUES = []

View File

@@ -575,3 +575,22 @@ def test_send_canary_to_cbc_proxy_invokes_cbc_proxy_client(
uuid.UUID(identifier) uuid.UUID(identifier)
except BaseException: except BaseException:
pytest.fail(f"{identifier} is not a valid uuid") pytest.fail(f"{identifier} is not a valid uuid")
def test_trigger_link_tests_invokes_cbc_proxy_client(
mocker,
):
mock_send_link_test = mocker.patch(
'app.cbc_proxy_client.send_link_test',
)
scheduled_tasks.trigger_link_tests()
mock_send_link_test.assert_called
# the 0th argument of the call to send_link_test
identifier = mock_send_link_test.mock_calls[0][1][0]
try:
uuid.UUID(identifier)
except BaseException:
pytest.fail(f"{identifier} is not a valid uuid")

View File

@@ -74,6 +74,7 @@ def test_cbc_proxy_create_and_send_invokes_function(mocker, cbc_proxy):
payload = json.loads(payload_bytes) payload = json.loads(payload_bytes)
assert payload['identifier'] == identifier assert payload['identifier'] == identifier
assert payload['message_type'] == 'alert'
assert payload['headline'] == headline assert payload['headline'] == headline
assert payload['description'] == description assert payload['description'] == description
assert payload['areas'] == areas assert payload['areas'] == areas
@@ -251,3 +252,89 @@ def test_cbc_proxy_send_canary_handles_function_error(mocker, cbc_proxy):
InvocationType='RequestResponse', InvocationType='RequestResponse',
Payload=mocker.ANY, Payload=mocker.ANY,
) )
def test_cbc_proxy_send_link_test_invokes_function(mocker, cbc_proxy):
identifier = str(uuid.uuid4())
ld_client_mock = mocker.patch.object(
cbc_proxy,
'_lambda_client',
create=True,
)
ld_client_mock.invoke.return_value = {
'StatusCode': 200,
}
cbc_proxy.send_link_test(
identifier=identifier,
)
ld_client_mock.invoke.assert_called_once_with(
FunctionName='bt-ee-1-proxy',
InvocationType='RequestResponse',
Payload=mocker.ANY,
)
kwargs = ld_client_mock.invoke.mock_calls[0][-1]
payload_bytes = kwargs['Payload']
payload = json.loads(payload_bytes)
assert payload['identifier'] == identifier
assert payload['message_type'] == 'test'
def test_cbc_proxy_send_link_test_handles_invoke_error(mocker, cbc_proxy):
identifier = str(uuid.uuid4())
ld_client_mock = mocker.patch.object(
cbc_proxy,
'_lambda_client',
create=True,
)
ld_client_mock.invoke.return_value = {
'StatusCode': 400,
}
with pytest.raises(Exception) as e:
cbc_proxy.send_link_test(
identifier=identifier,
)
assert e.match('Function exited with unhandled exception')
ld_client_mock.invoke.assert_called_once_with(
FunctionName='bt-ee-1-proxy',
InvocationType='RequestResponse',
Payload=mocker.ANY,
)
def test_cbc_proxy_send_link_test_handles_function_error(mocker, cbc_proxy):
identifier = str(uuid.uuid4())
ld_client_mock = mocker.patch.object(
cbc_proxy,
'_lambda_client',
create=True,
)
ld_client_mock.invoke.return_value = {
'StatusCode': 200,
'FunctionError': 'something',
}
with pytest.raises(Exception) as e:
cbc_proxy.send_link_test(
identifier=identifier,
)
assert e.match('Could not invoke lambda')
ld_client_mock.invoke.assert_called_once_with(
FunctionName='bt-ee-1-proxy',
InvocationType='RequestResponse',
Payload=mocker.ANY,
)