mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-04 10:21:14 -05:00
@@ -45,6 +45,7 @@ class CBCProxyClient:
|
|||||||
proxy_classes = {
|
proxy_classes = {
|
||||||
'canary': CBCProxyCanary,
|
'canary': CBCProxyCanary,
|
||||||
BroadcastProvider.EE: CBCProxyEE,
|
BroadcastProvider.EE: CBCProxyEE,
|
||||||
|
BroadcastProvider.THREE: CBCProxyThree,
|
||||||
BroadcastProvider.VODAFONE: CBCProxyVodafone,
|
BroadcastProvider.VODAFONE: CBCProxyVodafone,
|
||||||
}
|
}
|
||||||
return proxy_classes[provider](self._lambda_client)
|
return proxy_classes[provider](self._lambda_client)
|
||||||
@@ -231,6 +232,66 @@ class CBCProxyEE(CBCProxyClientBase):
|
|||||||
self._invoke_lambda_with_failover(payload=payload)
|
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 <msgType> 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):
|
class CBCProxyVodafone(CBCProxyClientBase):
|
||||||
lambda_name = 'vodafone-1-proxy'
|
lambda_name = 'vodafone-1-proxy'
|
||||||
failover_lambda_name = 'vodafone-2-proxy'
|
failover_lambda_name = 'vodafone-2-proxy'
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ class Config(object):
|
|||||||
|
|
||||||
CBC_PROXY_ENABLED = bool(CBC_PROXY_AWS_ACCESS_KEY_ID)
|
CBC_PROXY_ENABLED = bool(CBC_PROXY_AWS_ACCESS_KEY_ID)
|
||||||
|
|
||||||
ENABLED_CBCS = {BroadcastProvider.EE, BroadcastProvider.VODAFONE}
|
ENABLED_CBCS = {BroadcastProvider.EE, BroadcastProvider.THREE, BroadcastProvider.VODAFONE}
|
||||||
|
|
||||||
|
|
||||||
######################
|
######################
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ from unittest.mock import Mock, call
|
|||||||
|
|
||||||
import pytest
|
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
|
from app.utils import DATETIME_FORMAT
|
||||||
|
|
||||||
EXAMPLE_AREAS = [{
|
EXAMPLE_AREAS = [{
|
||||||
@@ -38,6 +40,11 @@ def cbc_proxy_ee(cbc_proxy_client):
|
|||||||
return cbc_proxy_client.get_proxy('ee')
|
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
|
@pytest.fixture
|
||||||
def cbc_proxy_vodafone(cbc_proxy_client):
|
def cbc_proxy_vodafone(cbc_proxy_client):
|
||||||
return cbc_proxy_client.get_proxy('vodafone')
|
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', [
|
@pytest.mark.parametrize('provider_name, expected_provider_class', [
|
||||||
('ee', CBCProxyEE),
|
('ee', CBCProxyEE),
|
||||||
|
('three', CBCProxyThree),
|
||||||
|
('vodafone', CBCProxyVodafone),
|
||||||
('canary', CBCProxyCanary),
|
('canary', CBCProxyCanary),
|
||||||
])
|
])
|
||||||
def test_cbc_proxy_client_returns_correct_client(provider_name, expected_provider_class):
|
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'),
|
('my-description', 'en-GB'),
|
||||||
('mŷ-description', 'cy-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,
|
mocker,
|
||||||
cbc_proxy_ee,
|
cbc_proxy_ee,
|
||||||
|
cbc_proxy_three,
|
||||||
description,
|
description,
|
||||||
|
cbc,
|
||||||
expected_language,
|
expected_language,
|
||||||
):
|
):
|
||||||
|
cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_three
|
||||||
|
|
||||||
identifier = 'my-identifier'
|
identifier = 'my-identifier'
|
||||||
headline = 'my-headline'
|
headline = 'my-headline'
|
||||||
|
|
||||||
@@ -87,7 +101,7 @@ def test_cbc_proxy_ee_create_and_send_invokes_function(
|
|||||||
expires = 'a-passed-through-expires-value'
|
expires = 'a-passed-through-expires-value'
|
||||||
|
|
||||||
ld_client_mock = mocker.patch.object(
|
ld_client_mock = mocker.patch.object(
|
||||||
cbc_proxy_ee,
|
cbc_proxy,
|
||||||
'_lambda_client',
|
'_lambda_client',
|
||||||
create=True,
|
create=True,
|
||||||
)
|
)
|
||||||
@@ -96,7 +110,7 @@ def test_cbc_proxy_ee_create_and_send_invokes_function(
|
|||||||
'StatusCode': 200,
|
'StatusCode': 200,
|
||||||
}
|
}
|
||||||
|
|
||||||
cbc_proxy_ee.create_and_send_broadcast(
|
cbc_proxy.create_and_send_broadcast(
|
||||||
identifier=identifier,
|
identifier=identifier,
|
||||||
message_number='0000007b',
|
message_number='0000007b',
|
||||||
headline=headline,
|
headline=headline,
|
||||||
@@ -106,7 +120,7 @@ def test_cbc_proxy_ee_create_and_send_invokes_function(
|
|||||||
)
|
)
|
||||||
|
|
||||||
ld_client_mock.invoke.assert_called_once_with(
|
ld_client_mock.invoke.assert_called_once_with(
|
||||||
FunctionName='bt-ee-1-proxy',
|
FunctionName=f'{cbc}-1-proxy',
|
||||||
InvocationType='RequestResponse',
|
InvocationType='RequestResponse',
|
||||||
Payload=mocker.ANY,
|
Payload=mocker.ANY,
|
||||||
)
|
)
|
||||||
@@ -127,7 +141,10 @@ def test_cbc_proxy_ee_create_and_send_invokes_function(
|
|||||||
assert payload['language'] == expected_language
|
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'
|
identifier = 'my-identifier'
|
||||||
MockProviderMessage = namedtuple(
|
MockProviderMessage = namedtuple(
|
||||||
'BroadcastProviderMessage', ['id', 'message_number', 'created_at']
|
'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'
|
sent = '2020-12-17 14:19:44.130585'
|
||||||
|
|
||||||
ld_client_mock = mocker.patch.object(
|
ld_client_mock = mocker.patch.object(
|
||||||
cbc_proxy_ee,
|
cbc_proxy,
|
||||||
'_lambda_client',
|
'_lambda_client',
|
||||||
create=True,
|
create=True,
|
||||||
)
|
)
|
||||||
@@ -149,7 +166,7 @@ def test_cbc_proxy_ee_cancel_invokes_function(mocker, cbc_proxy_ee):
|
|||||||
'StatusCode': 200,
|
'StatusCode': 200,
|
||||||
}
|
}
|
||||||
|
|
||||||
cbc_proxy_ee.cancel_broadcast(
|
cbc_proxy.cancel_broadcast(
|
||||||
identifier=identifier,
|
identifier=identifier,
|
||||||
message_number='00000050',
|
message_number='00000050',
|
||||||
previous_provider_messages=provider_messages,
|
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(
|
ld_client_mock.invoke.assert_called_once_with(
|
||||||
FunctionName='bt-ee-1-proxy',
|
FunctionName=f'{cbc}-1-proxy',
|
||||||
InvocationType='RequestResponse',
|
InvocationType='RequestResponse',
|
||||||
Payload=mocker.ANY,
|
Payload=mocker.ANY,
|
||||||
)
|
)
|
||||||
@@ -299,14 +316,13 @@ def test_cbc_proxy_vodafone_cancel_invokes_function(mocker, cbc_proxy_vodafone):
|
|||||||
assert payload['sent'] == sent
|
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(
|
def test_cbc_proxy_will_failover_to_second_lambda_if_function_error(
|
||||||
mocker,
|
mocker,
|
||||||
cbc_proxy_ee,
|
cbc_proxy_client,
|
||||||
cbc_proxy_vodafone,
|
|
||||||
cbc
|
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(
|
ld_client_mock = mocker.patch.object(
|
||||||
cbc_proxy,
|
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(
|
def test_cbc_proxy_will_failover_to_second_lambda_if_invoke_error(
|
||||||
mocker,
|
mocker,
|
||||||
cbc_proxy_ee,
|
cbc_proxy_client,
|
||||||
cbc_proxy_vodafone,
|
|
||||||
cbc
|
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(
|
ld_client_mock = mocker.patch.object(
|
||||||
cbc_proxy,
|
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(
|
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(
|
ld_client_mock = mocker.patch.object(
|
||||||
cbc_proxy,
|
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(
|
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(
|
ld_client_mock = mocker.patch.object(
|
||||||
cbc_proxy,
|
cbc_proxy,
|
||||||
@@ -523,11 +538,14 @@ def test_cbc_proxy_send_canary_invokes_function(mocker, cbc_proxy_client):
|
|||||||
assert payload['identifier'] == identifier
|
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())
|
identifier = str(uuid.uuid4())
|
||||||
|
|
||||||
ld_client_mock = mocker.patch.object(
|
ld_client_mock = mocker.patch.object(
|
||||||
cbc_proxy_ee,
|
cbc_proxy,
|
||||||
'_lambda_client',
|
'_lambda_client',
|
||||||
create=True,
|
create=True,
|
||||||
)
|
)
|
||||||
@@ -536,13 +554,13 @@ def test_cbc_proxy_ee_send_link_test_invokes_function(mocker, cbc_proxy_ee):
|
|||||||
'StatusCode': 200,
|
'StatusCode': 200,
|
||||||
}
|
}
|
||||||
|
|
||||||
cbc_proxy_ee.send_link_test(
|
cbc_proxy.send_link_test(
|
||||||
identifier=identifier,
|
identifier=identifier,
|
||||||
sequential_number='0000007b',
|
sequential_number='0000007b',
|
||||||
)
|
)
|
||||||
|
|
||||||
ld_client_mock.invoke.assert_called_once_with(
|
ld_client_mock.invoke.assert_called_once_with(
|
||||||
FunctionName='bt-ee-1-proxy',
|
FunctionName=f'{cbc}-1-proxy',
|
||||||
InvocationType='RequestResponse',
|
InvocationType='RequestResponse',
|
||||||
Payload=mocker.ANY,
|
Payload=mocker.ANY,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user