diff --git a/app/celery/broadcast_message_tasks.py b/app/celery/broadcast_message_tasks.py index 8a2b6376d..7abbedddd 100644 --- a/app/celery/broadcast_message_tasks.py +++ b/app/celery/broadcast_message_tasks.py @@ -70,7 +70,11 @@ def send_broadcast_event(broadcast_event_id): def send_broadcast_provider_message(self, broadcast_event_id, provider): broadcast_event = dao_get_broadcast_event_by_id(broadcast_event_id) - broadcast_provider_message = create_broadcast_provider_message(broadcast_event, provider) + # the broadcast_provider_message will already exist if we retried previously + broadcast_provider_message = broadcast_event.get_provider_message(provider) + if broadcast_provider_message is None: + broadcast_provider_message = create_broadcast_provider_message(broadcast_event, provider) + formatted_message_number = None if provider == BroadcastProvider.VODAFONE: formatted_message_number = format_sequential_number(broadcast_provider_message.message_number) diff --git a/tests/app/celery/test_broadcast_message_tasks.py b/tests/app/celery/test_broadcast_message_tasks.py index d2f3344ed..dc3720e21 100644 --- a/tests/app/celery/test_broadcast_message_tasks.py +++ b/tests/app/celery/test_broadcast_message_tasks.py @@ -254,6 +254,48 @@ def test_send_broadcast_provider_message_defaults_to_test_channel_if_no_service_ ) +def test_send_broadcast_provider_message_works_if_we_retried_previously(mocker, sample_service): + template = create_template(sample_service, BROADCAST_TYPE) + broadcast_message = create_broadcast_message( + template, + areas={'areas': [], 'simple_polygons': [],}, + status=BroadcastStatusType.BROADCASTING + ) + event = create_broadcast_event(broadcast_message) + + # an existing provider message already exists, and previously failed + existing_provider_message = create_broadcast_provider_message( + broadcast_event=event, + provider='ee', + status=BroadcastProviderMessageStatus.TECHNICAL_FAILURE + ) + + mock_create_broadcast = mocker.patch( + f'app.clients.cbc_proxy.CBCProxyEE.create_and_send_broadcast', + ) + + send_broadcast_provider_message(provider='ee', broadcast_event_id=str(event.id)) + + # make sure we haven't completed a duplicate event - we shouldn't record the failure + assert len(event.provider_messages) == 1 + + broadcast_provider_message = event.get_provider_message('ee') + # TODO: Should be ACK, and should have an updated_at + assert broadcast_provider_message.status == BroadcastProviderMessageStatus.TECHNICAL_FAILURE + assert broadcast_provider_message.updated_at is None + + 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=[], + sent=event.sent_at_as_cap_datetime_string, + expires=event.transmitted_finishes_at_as_cap_datetime_string, + channel='test', + ) + + @freeze_time('2020-08-01 12:00') @pytest.mark.parametrize('provider,provider_capitalised', [ ['ee', 'EE'],