diff --git a/app/clients/cbc_proxy.py b/app/clients/cbc_proxy.py index d53c0131b..df494a298 100644 --- a/app/clients/cbc_proxy.py +++ b/app/clients/cbc_proxy.py @@ -45,6 +45,7 @@ class CBCProxyClient: proxy_classes = { 'canary': CBCProxyCanary, BroadcastProvider.EE: CBCProxyEE, + BroadcastProvider.THREE: CBCProxyThree, BroadcastProvider.VODAFONE: CBCProxyVodafone, } return proxy_classes[provider](self._lambda_client) @@ -231,6 +232,66 @@ class CBCProxyEE(CBCProxyClientBase): self._invoke_lambda_with_failover(payload=payload) +class CBCProxyThree(CBCProxyClientBase): + lambda_name = 'three-1-proxy' + failover_lambda_name = 'three-2-proxy' + + LANGUAGE_ENGLISH = 'en-GB' + LANGUAGE_WELSH = 'cy-GB' + + def send_link_test( + self, + identifier, + sequential_number=None, + ): + """ + link test - open up a connection to a specific provider, and send them an xml payload with a of + test. + """ + payload = { + 'message_type': 'test', + 'identifier': identifier, + 'message_format': 'cap' + } + + self._invoke_lambda_with_failover(payload=payload) + + def create_and_send_broadcast( + self, identifier, headline, description, areas, sent, expires, message_number=None + ): + payload = { + 'message_type': 'alert', + 'identifier': identifier, + 'message_format': 'cap', + 'headline': headline, + 'description': description, + 'areas': areas, + 'sent': sent, + 'expires': expires, + 'language': self.infer_language_from(description), + } + self._invoke_lambda_with_failover(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.strftime(DATETIME_FORMAT) + } for message in previous_provider_messages + ], + 'sent': sent, + } + self._invoke_lambda_with_failover(payload=payload) + + class CBCProxyVodafone(CBCProxyClientBase): lambda_name = 'vodafone-1-proxy' failover_lambda_name = 'vodafone-2-proxy' diff --git a/tests/app/clients/test_cbc_proxy.py b/tests/app/clients/test_cbc_proxy.py index ed5b5a3ca..3570a86e7 100644 --- a/tests/app/clients/test_cbc_proxy.py +++ b/tests/app/clients/test_cbc_proxy.py @@ -6,7 +6,9 @@ from unittest.mock import Mock, call import pytest -from app.clients.cbc_proxy import CBCProxyClient, CBCProxyException, CBCProxyEE, CBCProxyCanary +from app.clients.cbc_proxy import ( + CBCProxyClient, CBCProxyException, CBCProxyEE, CBCProxyCanary, CBCProxyVodafone, CBCProxyThree +) from app.utils import DATETIME_FORMAT EXAMPLE_AREAS = [{ @@ -38,6 +40,11 @@ def cbc_proxy_ee(cbc_proxy_client): return cbc_proxy_client.get_proxy('ee') +@pytest.fixture +def cbc_proxy_three(cbc_proxy_client): + return cbc_proxy_client.get_proxy('three') + + @pytest.fixture def cbc_proxy_vodafone(cbc_proxy_client): return cbc_proxy_client.get_proxy('vodafone') @@ -45,6 +52,8 @@ def cbc_proxy_vodafone(cbc_proxy_client): @pytest.mark.parametrize('provider_name, expected_provider_class', [ ('ee', CBCProxyEE), + ('three', CBCProxyThree), + ('vodafone', CBCProxyVodafone), ('canary', CBCProxyCanary), ]) def test_cbc_proxy_client_returns_correct_client(provider_name, expected_provider_class): @@ -74,12 +83,17 @@ def test_cbc_proxy_lambda_client_has_correct_keys(cbc_proxy_ee): ('my-description', 'en-GB'), ('mŷ-description', 'cy-GB'), )) -def test_cbc_proxy_ee_create_and_send_invokes_function( +@pytest.mark.parametrize('cbc', ['bt-ee', 'three']) +def test_cbc_proxy_one_2_many_create_and_send_invokes_function( mocker, cbc_proxy_ee, + cbc_proxy_three, description, + cbc, expected_language, ): + cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_three + identifier = 'my-identifier' headline = 'my-headline' @@ -87,7 +101,7 @@ def test_cbc_proxy_ee_create_and_send_invokes_function( expires = 'a-passed-through-expires-value' ld_client_mock = mocker.patch.object( - cbc_proxy_ee, + cbc_proxy, '_lambda_client', create=True, ) @@ -96,7 +110,7 @@ def test_cbc_proxy_ee_create_and_send_invokes_function( 'StatusCode': 200, } - cbc_proxy_ee.create_and_send_broadcast( + cbc_proxy.create_and_send_broadcast( identifier=identifier, message_number='0000007b', headline=headline, @@ -106,7 +120,7 @@ def test_cbc_proxy_ee_create_and_send_invokes_function( ) ld_client_mock.invoke.assert_called_once_with( - FunctionName='bt-ee-1-proxy', + FunctionName=f'{cbc}-1-proxy', InvocationType='RequestResponse', Payload=mocker.ANY, ) @@ -127,7 +141,10 @@ def test_cbc_proxy_ee_create_and_send_invokes_function( assert payload['language'] == expected_language -def test_cbc_proxy_ee_cancel_invokes_function(mocker, cbc_proxy_ee): +@pytest.mark.parametrize('cbc', ['bt-ee', 'three']) +def test_cbc_proxy_one_2_many_cancel_invokes_function(mocker, cbc_proxy_ee, cbc_proxy_three, cbc): + cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_three + identifier = 'my-identifier' MockProviderMessage = namedtuple( 'BroadcastProviderMessage', ['id', 'message_number', 'created_at'] @@ -140,7 +157,7 @@ def test_cbc_proxy_ee_cancel_invokes_function(mocker, cbc_proxy_ee): sent = '2020-12-17 14:19:44.130585' ld_client_mock = mocker.patch.object( - cbc_proxy_ee, + cbc_proxy, '_lambda_client', create=True, ) @@ -149,7 +166,7 @@ def test_cbc_proxy_ee_cancel_invokes_function(mocker, cbc_proxy_ee): 'StatusCode': 200, } - cbc_proxy_ee.cancel_broadcast( + cbc_proxy.cancel_broadcast( identifier=identifier, message_number='00000050', previous_provider_messages=provider_messages, @@ -157,7 +174,7 @@ def test_cbc_proxy_ee_cancel_invokes_function(mocker, cbc_proxy_ee): ) ld_client_mock.invoke.assert_called_once_with( - FunctionName='bt-ee-1-proxy', + FunctionName=f'{cbc}-1-proxy', InvocationType='RequestResponse', Payload=mocker.ANY, ) @@ -299,14 +316,13 @@ def test_cbc_proxy_vodafone_cancel_invokes_function(mocker, cbc_proxy_vodafone): assert payload['sent'] == sent -@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone']) +@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three']) def test_cbc_proxy_will_failover_to_second_lambda_if_function_error( mocker, - cbc_proxy_ee, - cbc_proxy_vodafone, + cbc_proxy_client, cbc ): - cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_vodafone + cbc_proxy = cbc_proxy_client.get_proxy('ee') if cbc == 'bt-ee' else cbc_proxy_client.get_proxy(cbc) ld_client_mock = mocker.patch.object( cbc_proxy, @@ -352,14 +368,13 @@ def test_cbc_proxy_will_failover_to_second_lambda_if_function_error( ] -@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone']) +@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three']) def test_cbc_proxy_will_failover_to_second_lambda_if_invoke_error( mocker, - cbc_proxy_ee, - cbc_proxy_vodafone, + cbc_proxy_client, cbc ): - cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_vodafone + cbc_proxy = cbc_proxy_client.get_proxy('ee') if cbc == 'bt-ee' else cbc_proxy_client.get_proxy(cbc) ld_client_mock = mocker.patch.object( cbc_proxy, @@ -400,11 +415,11 @@ def test_cbc_proxy_will_failover_to_second_lambda_if_invoke_error( ] -@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone']) +@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three']) def test_cbc_proxy_create_and_send_tries_failover_lambda_on_invoke_error_and_raises_if_both_invoke_error( - mocker, cbc_proxy_ee, cbc_proxy_vodafone, cbc + mocker, cbc_proxy_client, cbc ): - cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_vodafone + cbc_proxy = cbc_proxy_client.get_proxy('ee') if cbc == 'bt-ee' else cbc_proxy_client.get_proxy(cbc) ld_client_mock = mocker.patch.object( cbc_proxy, @@ -443,11 +458,11 @@ def test_cbc_proxy_create_and_send_tries_failover_lambda_on_invoke_error_and_rai ] -@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone']) +@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three']) def test_cbc_proxy_create_and_send_tries_failover_lambda_on_function_error_and_raises_if_both_function_error( - mocker, cbc_proxy_ee, cbc_proxy_vodafone, cbc + mocker, cbc_proxy_client, cbc ): - cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_vodafone + cbc_proxy = cbc_proxy_client.get_proxy('ee') if cbc == 'bt-ee' else cbc_proxy_client.get_proxy(cbc) ld_client_mock = mocker.patch.object( cbc_proxy, @@ -523,11 +538,14 @@ def test_cbc_proxy_send_canary_invokes_function(mocker, cbc_proxy_client): assert payload['identifier'] == identifier -def test_cbc_proxy_ee_send_link_test_invokes_function(mocker, cbc_proxy_ee): +@pytest.mark.parametrize('cbc', ['bt-ee', 'three']) +def test_cbc_proxy_one_2_many_send_link_test_invokes_function(mocker, cbc_proxy_ee, cbc_proxy_three, cbc): + cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_three + identifier = str(uuid.uuid4()) ld_client_mock = mocker.patch.object( - cbc_proxy_ee, + cbc_proxy, '_lambda_client', create=True, ) @@ -536,13 +554,13 @@ def test_cbc_proxy_ee_send_link_test_invokes_function(mocker, cbc_proxy_ee): 'StatusCode': 200, } - cbc_proxy_ee.send_link_test( + cbc_proxy.send_link_test( identifier=identifier, sequential_number='0000007b', ) ld_client_mock.invoke.assert_called_once_with( - FunctionName='bt-ee-1-proxy', + FunctionName=f'{cbc}-1-proxy', InvocationType='RequestResponse', Payload=mocker.ANY, )