diff --git a/app/clients/cbc_proxy.py b/app/clients/cbc_proxy.py index 21126c783..f46caaa40 100644 --- a/app/clients/cbc_proxy.py +++ b/app/clients/cbc_proxy.py @@ -62,13 +62,12 @@ class CBCProxyClientBase: def send_link_test( self, identifier, - sequential_number, - message_format + sequential_number ): pass def create_and_send_broadcast( - self, identifier, message_number, message_format, headline, description, areas, sent, expires, + self, identifier, headline, description, areas, sent, expires, message_number=None ): pass @@ -76,7 +75,7 @@ class CBCProxyClientBase: def update_and_send_broadcast( self, identifier, previous_provider_messages, headline, description, areas, - sent, expires, message_number, message_format + sent, expires, message_number=None ): pass @@ -84,7 +83,7 @@ class CBCProxyClientBase: def cancel_broadcast( self, identifier, previous_provider_messages, headline, description, areas, - sent, expires, message_number, message_format + sent, expires, message_number=None ): pass @@ -134,7 +133,6 @@ class CBCProxyEE(CBCProxyClientBase): identifier, sequential_number=None, ): - pass """ link test - open up a connection to a specific provider, and send them an xml payload with a of test. @@ -150,7 +148,6 @@ class CBCProxyEE(CBCProxyClientBase): def create_and_send_broadcast( self, identifier, headline, description, areas, sent, expires, message_number=None ): - pass payload = { 'message_type': 'alert', 'identifier': identifier, @@ -163,6 +160,22 @@ class CBCProxyEE(CBCProxyClientBase): } self._invoke_lambda(payload=payload) + def cancel_broadcast( + self, + identifier, previous_provider_messages, + sent, message_number=None + ): + payload = { + 'message_type': 'cancel', + 'identifier': identifier, + 'message_format': 'cap', + "references": [ + {"message_id": str(message.id), "sent": message.created_at} for message in previous_provider_messages + ], + 'sent': sent, + } + self._invoke_lambda(payload=payload) + class CBCProxyVodafone(CBCProxyClientBase): lambda_name = 'vodafone-1-proxy' @@ -172,7 +185,6 @@ class CBCProxyVodafone(CBCProxyClientBase): identifier, sequential_number, ): - pass """ link test - open up a connection to a specific provider, and send them an xml payload with a of test. @@ -189,7 +201,6 @@ class CBCProxyVodafone(CBCProxyClientBase): def create_and_send_broadcast( self, identifier, message_number, headline, description, areas, sent, expires, ): - pass payload = { 'message_type': 'alert', 'identifier': identifier, @@ -202,3 +213,22 @@ class CBCProxyVodafone(CBCProxyClientBase): 'expires': expires, } self._invoke_lambda(payload=payload) + + def cancel_broadcast( + self, identifier, previous_provider_messages, sent, message_number + ): + payload = { + 'message_type': 'cancel', + 'identifier': identifier, + 'message_number': message_number, + 'message_format': 'ibag', + "references": [ + { + "message_id": str(message.id), + "message_number": message.message_number, + "sent": message.created_at + } for message in previous_provider_messages + ], + 'sent': sent, + } + self._invoke_lambda(payload=payload) diff --git a/tests/app/clients/test_cbc_proxy.py b/tests/app/clients/test_cbc_proxy.py index 5c16fb781..4e0b491a6 100644 --- a/tests/app/clients/test_cbc_proxy.py +++ b/tests/app/clients/test_cbc_proxy.py @@ -1,5 +1,6 @@ import json import uuid +from collections import namedtuple from unittest.mock import Mock import pytest @@ -116,6 +117,60 @@ def test_cbc_proxy_ee_create_and_send_invokes_function(mocker, cbc_proxy_ee): assert payload['expires'] == expires +def test_cbc_proxy_ee_cancel_invokes_function(mocker, cbc_proxy_ee): + identifier = 'my-identifier' + MockProviderMessage = namedtuple('BroadcastProviderMessage', ['id', 'message_number', 'created_at']) + + provider_messages = [ + MockProviderMessage(uuid.uuid4(), '0000007b', '2020-12-10 11:19:44.130585'), + MockProviderMessage(uuid.uuid4(), '0000004e', '2020-12-10 12:19:44.130585') + ] + sent = '2020-12-10 14:19:44.130585' + + ld_client_mock = mocker.patch.object( + cbc_proxy_ee, + '_lambda_client', + create=True, + ) + + ld_client_mock.invoke.return_value = { + 'StatusCode': 200, + } + + cbc_proxy_ee.cancel_broadcast( + identifier=identifier, + message_number='00000050', + previous_provider_messages=provider_messages, + sent=sent + ) + + 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 'message_number' not in payload + assert payload['message_format'] == 'cap' + assert payload['message_type'] == 'cancel' + assert payload['references'] == [ + { + "message_id": str(provider_messages[0].id), + "sent": provider_messages[0].created_at + }, + { + "message_id": str(provider_messages[1].id), + "sent": provider_messages[1].created_at + }, + ] + assert payload['sent'] == sent + + def test_cbc_proxy_vodafone_create_and_send_invokes_function(mocker, cbc_proxy_vodafone): identifier = 'my-identifier' headline = 'my-headline' @@ -176,6 +231,62 @@ def test_cbc_proxy_vodafone_create_and_send_invokes_function(mocker, cbc_proxy_v assert payload['expires'] == expires +def test_cbc_proxy_vodafone_cancel_invokes_function(mocker, cbc_proxy_vodafone): + identifier = 'my-identifier' + MockProviderMessage = namedtuple('BroadcastProviderMessage', ['id', 'message_number', 'created_at']) + + provider_messages = [ + MockProviderMessage(uuid.uuid4(), '0000007b', '2020-12-10 11:19:44.130585'), + MockProviderMessage(uuid.uuid4(), '0000004e', '2020-12-10 12:19:44.130585') + ] + sent = '2020-12-10 14:19:44.130585' + + ld_client_mock = mocker.patch.object( + cbc_proxy_vodafone, + '_lambda_client', + create=True, + ) + + ld_client_mock.invoke.return_value = { + 'StatusCode': 200, + } + + cbc_proxy_vodafone.cancel_broadcast( + identifier=identifier, + message_number='00000050', + previous_provider_messages=provider_messages, + sent=sent + ) + + ld_client_mock.invoke.assert_called_once_with( + FunctionName='vodafone-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_number'] == '00000050' + assert payload['message_format'] == 'ibag' + assert payload['message_type'] == 'cancel' + assert payload['references'] == [ + { + "message_id": str(provider_messages[0].id), + "message_number": provider_messages[0].message_number, + "sent": provider_messages[0].created_at + }, + { + "message_id": str(provider_messages[1].id), + "message_number": provider_messages[1].message_number, + "sent": provider_messages[1].created_at + }, + ] + assert payload['sent'] == sent + + def test_cbc_proxy_create_and_send_handles_invoke_error(mocker, cbc_proxy_ee): identifier = 'my-identifier' headline = 'my-headline'