mirror of
https://github.com/GSA/notifications-api.git
synced 2026-08-16 20:48:37 -04:00
Merge pull request #3053 from alphagov/ibag-message-number
Add sequential message number to broadcast provider messages
This commit is contained in:
@@ -105,7 +105,13 @@ def test_send_broadcast_event_does_nothing_if_cbc_proxy_disabled(mocker, notify_
|
||||
|
||||
|
||||
@freeze_time('2020-08-01 12:00')
|
||||
def test_send_broadcast_provider_message_sends_data_correctly(mocker, sample_service):
|
||||
@pytest.mark.parametrize('provider,provider_capitalised', [
|
||||
['ee', 'EE'],
|
||||
['vodafone', 'Vodafone'],
|
||||
])
|
||||
def test_send_broadcast_provider_message_sends_data_correctly(
|
||||
mocker, sample_service, provider, provider_capitalised
|
||||
):
|
||||
template = create_template(sample_service, BROADCAST_TYPE)
|
||||
broadcast_message = create_broadcast_message(
|
||||
template,
|
||||
@@ -121,18 +127,19 @@ def test_send_broadcast_provider_message_sends_data_correctly(mocker, sample_ser
|
||||
event = create_broadcast_event(broadcast_message)
|
||||
|
||||
mock_create_broadcast = mocker.patch(
|
||||
'app.clients.cbc_proxy.CBCProxyEE.create_and_send_broadcast',
|
||||
f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.create_and_send_broadcast',
|
||||
)
|
||||
|
||||
assert event.get_provider_message('ee') is None
|
||||
assert event.get_provider_message(provider) is None
|
||||
|
||||
send_broadcast_provider_message(provider='ee', broadcast_event_id=str(event.id))
|
||||
send_broadcast_provider_message(provider=provider, broadcast_event_id=str(event.id))
|
||||
|
||||
broadcast_provider_message = event.get_provider_message('ee')
|
||||
broadcast_provider_message = event.get_provider_message(provider)
|
||||
assert broadcast_provider_message.status == BroadcastProviderMessageStatus.SENDING
|
||||
|
||||
mock_create_broadcast.assert_called_once_with(
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
message_number=mocker.ANY,
|
||||
headline='GOV.UK Notify Broadcast',
|
||||
description='this is an emergency broadcast message',
|
||||
areas=[{
|
||||
@@ -149,7 +156,13 @@ def test_send_broadcast_provider_message_sends_data_correctly(mocker, sample_ser
|
||||
)
|
||||
|
||||
|
||||
def test_send_broadcast_provider_message_sends_update_with_references(mocker, sample_service):
|
||||
@pytest.mark.parametrize('provider,provider_capitalised', [
|
||||
['ee', 'EE'],
|
||||
['vodafone', 'Vodafone'],
|
||||
])
|
||||
def test_send_broadcast_provider_message_sends_update_with_references(
|
||||
mocker, sample_service, provider, provider_capitalised
|
||||
):
|
||||
template = create_template(sample_service, BROADCAST_TYPE, content='content')
|
||||
|
||||
broadcast_message = create_broadcast_message(
|
||||
@@ -164,34 +177,41 @@ def test_send_broadcast_provider_message_sends_update_with_references(mocker, sa
|
||||
)
|
||||
|
||||
alert_event = create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.ALERT)
|
||||
create_broadcast_provider_message(alert_event, 'ee')
|
||||
create_broadcast_provider_message(alert_event, provider)
|
||||
update_event = create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.UPDATE)
|
||||
|
||||
mock_update_broadcast = mocker.patch(
|
||||
'app.clients.cbc_proxy.CBCProxyEE.update_and_send_broadcast',
|
||||
f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.update_and_send_broadcast',
|
||||
)
|
||||
|
||||
send_broadcast_provider_message(provider='ee', broadcast_event_id=str(update_event.id))
|
||||
send_broadcast_provider_message(provider=provider, broadcast_event_id=str(update_event.id))
|
||||
|
||||
broadcast_provider_message = update_event.get_provider_message('ee')
|
||||
broadcast_provider_message = update_event.get_provider_message(provider)
|
||||
assert broadcast_provider_message.status == BroadcastProviderMessageStatus.SENDING
|
||||
|
||||
mock_update_broadcast.assert_called_once_with(
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
message_number=mocker.ANY,
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description='this is an emergency broadcast message',
|
||||
areas=[{
|
||||
"polygon": [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]],
|
||||
}],
|
||||
previous_provider_messages=[
|
||||
alert_event.get_provider_message('ee')
|
||||
alert_event.get_provider_message(provider)
|
||||
],
|
||||
sent=update_event.sent_at_as_cap_datetime_string,
|
||||
expires=update_event.transmitted_finishes_at_as_cap_datetime_string,
|
||||
)
|
||||
|
||||
|
||||
def test_send_broadcast_provider_message_sends_cancel_with_references(mocker, sample_service):
|
||||
@pytest.mark.parametrize('provider,provider_capitalised', [
|
||||
['ee', 'EE'],
|
||||
['vodafone', 'Vodafone'],
|
||||
])
|
||||
def test_send_broadcast_provider_message_sends_cancel_with_references(
|
||||
mocker, sample_service, provider, provider_capitalised
|
||||
):
|
||||
template = create_template(sample_service, BROADCAST_TYPE, content='content')
|
||||
|
||||
broadcast_message = create_broadcast_message(
|
||||
@@ -209,28 +229,29 @@ def test_send_broadcast_provider_message_sends_cancel_with_references(mocker, sa
|
||||
update_event = create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.UPDATE)
|
||||
cancel_event = create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.CANCEL)
|
||||
|
||||
create_broadcast_provider_message(alert_event, 'ee')
|
||||
create_broadcast_provider_message(update_event, 'ee')
|
||||
create_broadcast_provider_message(alert_event, provider)
|
||||
create_broadcast_provider_message(update_event, provider)
|
||||
|
||||
mock_cancel_broadcast = mocker.patch(
|
||||
'app.clients.cbc_proxy.CBCProxyEE.cancel_broadcast',
|
||||
f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.cancel_broadcast',
|
||||
)
|
||||
|
||||
send_broadcast_provider_message(provider='ee', broadcast_event_id=str(cancel_event.id))
|
||||
send_broadcast_provider_message(provider=provider, broadcast_event_id=str(cancel_event.id))
|
||||
|
||||
broadcast_provider_message = cancel_event.get_provider_message('ee')
|
||||
broadcast_provider_message = cancel_event.get_provider_message(provider)
|
||||
assert broadcast_provider_message.status == BroadcastProviderMessageStatus.SENDING
|
||||
|
||||
mock_cancel_broadcast.assert_called_once_with(
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
message_number=mocker.ANY,
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description='this is an emergency broadcast message',
|
||||
areas=[{
|
||||
"polygon": [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]],
|
||||
}],
|
||||
previous_provider_messages=[
|
||||
alert_event.get_provider_message('ee'),
|
||||
update_event.get_provider_message('ee')
|
||||
alert_event.get_provider_message(provider),
|
||||
update_event.get_provider_message(provider)
|
||||
],
|
||||
sent=cancel_event.sent_at_as_cap_datetime_string,
|
||||
expires=cancel_event.transmitted_finishes_at_as_cap_datetime_string,
|
||||
@@ -265,6 +286,7 @@ def test_send_broadcast_provider_message_errors(mocker, sample_service):
|
||||
|
||||
mock_create_broadcast.assert_called_once_with(
|
||||
identifier=ANY,
|
||||
message_number=mocker.ANY,
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description='this is an emergency broadcast message',
|
||||
areas=[{
|
||||
@@ -279,14 +301,18 @@ def test_send_broadcast_provider_message_errors(mocker, sample_service):
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("provider,provider_capitalised", [
|
||||
["ee", "EE"],
|
||||
["vodafone", "Vodafone"]
|
||||
])
|
||||
def test_trigger_link_tests_invokes_cbc_proxy_client(
|
||||
mocker,
|
||||
mocker, provider, provider_capitalised
|
||||
):
|
||||
mock_send_link_test = mocker.patch(
|
||||
'app.clients.cbc_proxy.CBCProxyEE.send_link_test',
|
||||
f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.send_link_test',
|
||||
)
|
||||
|
||||
trigger_link_test('ee')
|
||||
trigger_link_test(provider)
|
||||
|
||||
assert mock_send_link_test.called
|
||||
# the 0th argument of the call to send_link_test
|
||||
@@ -296,3 +322,10 @@ def test_trigger_link_tests_invokes_cbc_proxy_client(
|
||||
uuid.UUID(identifier)
|
||||
except BaseException:
|
||||
pytest.fail(f"{identifier} is not a valid uuid")
|
||||
|
||||
# testing sequential number:
|
||||
if provider == 'vodafone':
|
||||
assert type(mock_send_link_test.mock_calls[0][1][1]) is str
|
||||
assert len(mock_send_link_test.mock_calls[0][1][1]) == 8
|
||||
else:
|
||||
assert not mock_send_link_test.mock_calls[0][1][1]
|
||||
|
||||
@@ -24,6 +24,11 @@ def cbc_proxy_ee(cbc_proxy_client):
|
||||
return cbc_proxy_client.get_proxy('ee')
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def cbc_proxy_vodafone(cbc_proxy_client):
|
||||
return cbc_proxy_client.get_proxy('vodafone')
|
||||
|
||||
|
||||
@pytest.mark.parametrize('provider_name, expected_provider_class', [
|
||||
('ee', CBCProxyEE),
|
||||
('canary', CBCProxyCanary),
|
||||
@@ -51,7 +56,7 @@ def test_cbc_proxy_lambda_client_has_correct_keys(cbc_proxy_ee):
|
||||
assert secret == 'cbc-proxy-aws-secret-access-key'
|
||||
|
||||
|
||||
def test_cbc_proxy_create_and_send_invokes_function(mocker, cbc_proxy_ee):
|
||||
def test_cbc_proxy_ee_create_and_send_invokes_function(mocker, cbc_proxy_ee):
|
||||
identifier = 'my-identifier'
|
||||
headline = 'my-headline'
|
||||
description = 'my-description'
|
||||
@@ -83,6 +88,7 @@ def test_cbc_proxy_create_and_send_invokes_function(mocker, cbc_proxy_ee):
|
||||
|
||||
cbc_proxy_ee.create_and_send_broadcast(
|
||||
identifier=identifier,
|
||||
message_number='0000007b',
|
||||
headline=headline,
|
||||
description=description,
|
||||
areas=areas,
|
||||
@@ -100,6 +106,68 @@ def test_cbc_proxy_create_and_send_invokes_function(mocker, cbc_proxy_ee):
|
||||
payload = json.loads(payload_bytes)
|
||||
|
||||
assert payload['identifier'] == identifier
|
||||
assert 'message_number' not in payload
|
||||
assert payload['message_format'] == 'cbc'
|
||||
assert payload['message_type'] == 'alert'
|
||||
assert payload['headline'] == headline
|
||||
assert payload['description'] == description
|
||||
assert payload['areas'] == areas
|
||||
assert payload['sent'] == sent
|
||||
assert payload['expires'] == expires
|
||||
|
||||
|
||||
def test_cbc_proxy_vodafone_create_and_send_invokes_function(mocker, cbc_proxy_vodafone):
|
||||
identifier = 'my-identifier'
|
||||
headline = 'my-headline'
|
||||
description = 'my-description'
|
||||
|
||||
sent = 'a-passed-through-sent-value'
|
||||
expires = 'a-passed-through-expires-value'
|
||||
|
||||
# a single area which is a square including london
|
||||
areas = [{
|
||||
'description': 'london',
|
||||
'polygon': [
|
||||
[51.12, -1.2],
|
||||
[51.12, 1.2],
|
||||
[51.74, 1.2],
|
||||
[51.74, -1.2],
|
||||
[51.12, -1.2],
|
||||
],
|
||||
}]
|
||||
|
||||
ld_client_mock = mocker.patch.object(
|
||||
cbc_proxy_vodafone,
|
||||
'_lambda_client',
|
||||
create=True,
|
||||
)
|
||||
|
||||
ld_client_mock.invoke.return_value = {
|
||||
'StatusCode': 200,
|
||||
}
|
||||
|
||||
cbc_proxy_vodafone.create_and_send_broadcast(
|
||||
identifier=identifier,
|
||||
message_number='0000007b',
|
||||
headline=headline,
|
||||
description=description,
|
||||
areas=areas,
|
||||
sent=sent, expires=expires,
|
||||
)
|
||||
|
||||
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'] == '0000007b'
|
||||
assert payload['message_format'] == 'ibag'
|
||||
assert payload['message_type'] == 'alert'
|
||||
assert payload['headline'] == headline
|
||||
assert payload['description'] == description
|
||||
@@ -141,6 +209,7 @@ def test_cbc_proxy_create_and_send_handles_invoke_error(mocker, cbc_proxy_ee):
|
||||
with pytest.raises(CBCProxyException) as e:
|
||||
cbc_proxy_ee.create_and_send_broadcast(
|
||||
identifier=identifier,
|
||||
message_number='0000007b',
|
||||
headline=headline,
|
||||
description=description,
|
||||
areas=areas,
|
||||
@@ -190,6 +259,7 @@ def test_cbc_proxy_create_and_send_handles_function_error(mocker, cbc_proxy_ee):
|
||||
with pytest.raises(CBCProxyException) as e:
|
||||
cbc_proxy_ee.create_and_send_broadcast(
|
||||
identifier=identifier,
|
||||
message_number='0000007b',
|
||||
headline=headline,
|
||||
description=description,
|
||||
areas=areas,
|
||||
@@ -237,7 +307,7 @@ def test_cbc_proxy_send_canary_invokes_function(mocker, cbc_proxy_client):
|
||||
assert payload['identifier'] == identifier
|
||||
|
||||
|
||||
def test_cbc_proxy_send_link_test_invokes_function(mocker, cbc_proxy_ee):
|
||||
def test_cbc_proxy_ee_send_link_test_invokes_function(mocker, cbc_proxy_ee):
|
||||
identifier = str(uuid.uuid4())
|
||||
|
||||
ld_client_mock = mocker.patch.object(
|
||||
@@ -252,6 +322,7 @@ def test_cbc_proxy_send_link_test_invokes_function(mocker, cbc_proxy_ee):
|
||||
|
||||
cbc_proxy_ee.send_link_test(
|
||||
identifier=identifier,
|
||||
sequential_number='0000007b',
|
||||
)
|
||||
|
||||
ld_client_mock.invoke.assert_called_once_with(
|
||||
@@ -266,3 +337,39 @@ def test_cbc_proxy_send_link_test_invokes_function(mocker, cbc_proxy_ee):
|
||||
|
||||
assert payload['identifier'] == identifier
|
||||
assert payload['message_type'] == 'test'
|
||||
assert 'message_number' not in payload
|
||||
assert payload['message_format'] == 'cbc'
|
||||
|
||||
|
||||
def test_cbc_proxy_vodafone_send_link_test_invokes_function(mocker, cbc_proxy_vodafone):
|
||||
identifier = str(uuid.uuid4())
|
||||
|
||||
ld_client_mock = mocker.patch.object(
|
||||
cbc_proxy_vodafone,
|
||||
'_lambda_client',
|
||||
create=True,
|
||||
)
|
||||
|
||||
ld_client_mock.invoke.return_value = {
|
||||
'StatusCode': 200,
|
||||
}
|
||||
|
||||
cbc_proxy_vodafone.send_link_test(
|
||||
identifier=identifier,
|
||||
sequential_number='0000007b',
|
||||
)
|
||||
|
||||
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_type'] == 'test'
|
||||
assert payload['message_number'] == '0000007b'
|
||||
assert payload['message_format'] == 'ibag'
|
||||
|
||||
@@ -63,7 +63,9 @@ from app.models import (
|
||||
BroadcastMessage,
|
||||
BroadcastStatusType,
|
||||
BroadcastEvent,
|
||||
BroadcastProviderMessage
|
||||
BroadcastProvider,
|
||||
BroadcastProviderMessage,
|
||||
BroadcastProviderMessageNumber
|
||||
)
|
||||
|
||||
|
||||
@@ -1058,11 +1060,20 @@ def create_broadcast_provider_message(
|
||||
provider,
|
||||
status='sending'
|
||||
):
|
||||
broadcast_provider_message_id = uuid.uuid4()
|
||||
provider_message = BroadcastProviderMessage(
|
||||
id=broadcast_provider_message_id,
|
||||
broadcast_event=broadcast_event,
|
||||
provider=provider,
|
||||
status=status
|
||||
status=status,
|
||||
)
|
||||
db.session.add(provider_message)
|
||||
db.session.commit()
|
||||
return provider_message
|
||||
|
||||
provider_message_number = None
|
||||
if provider == BroadcastProvider.VODAFONE:
|
||||
provider_message_number = BroadcastProviderMessageNumber(
|
||||
broadcast_provider_message_id=broadcast_provider_message_id)
|
||||
db.session.add(provider_message_number)
|
||||
db.session.commit()
|
||||
return provider_message, provider_message_number
|
||||
|
||||
@@ -4,10 +4,11 @@ import pytest
|
||||
from freezegun import freeze_time
|
||||
|
||||
from app.utils import (
|
||||
format_sequential_number,
|
||||
get_london_midnight_in_utc,
|
||||
get_midnight_for_day_before,
|
||||
midnight_n_days_ago,
|
||||
get_notification_table_to_use,
|
||||
midnight_n_days_ago
|
||||
)
|
||||
from app.models import Notification, NotificationHistory
|
||||
|
||||
@@ -99,3 +100,7 @@ def test_get_notification_table_to_use_checks_service_data_retention(sample_serv
|
||||
# falls back to 7 days if not specified
|
||||
assert get_notification_table_to_use(sample_service, 'sms', date(2019, 1, 1), False) == NotificationHistory
|
||||
assert get_notification_table_to_use(sample_service, 'sms', date(2019, 1, 2), False) == Notification
|
||||
|
||||
|
||||
def test_format_sequential_number():
|
||||
assert format_sequential_number(123) == '0000007b'
|
||||
|
||||
Reference in New Issue
Block a user