def test_send_broadcast_provider_message_uses_channel_set_on_broadcast_service( notify_db, mocker, sample_broadcast_service, provider, provider_capitalised, channel ): sample_broadcast_service.broadcast_channel = channel template = create_template(sample_broadcast_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, areas={ 'areas': ['london', 'glasgow'], 'simple_polygons': [ [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]], [[-4.53, 55.72], [-3.88, 55.72], [-3.88, 55.96], [-4.53, 55.96]], ], }, status=BroadcastStatusType.BROADCASTING ) event = create_broadcast_event(broadcast_message) mock_create_broadcast = mocker.patch( f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.create_and_send_broadcast', ) send_broadcast_provider_message(provider=provider, broadcast_event_id=str(event.id)) mock_create_broadcast.assert_called_once_with( identifier=mocker.ANY, message_number=mocker.ANY, headline='GOV.UK Notify Broadcast', description='this is an emergency broadcast message', areas=mocker.ANY, sent=mocker.ANY, expires=mocker.ANY, channel=channel, )
def test_send_broadcast_provider_message_sends_data_correctly_when_broadcast_message_has_no_template( mocker, sample_broadcast_service, provider, provider_capitalised): broadcast_message = create_broadcast_message( service=sample_broadcast_service, template=None, content='this is an emergency broadcast message', areas={ 'areas': ['london', 'glasgow'], 'simple_polygons': [ [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]], [[-4.53, 55.72], [-3.88, 55.72], [-3.88, 55.96], [-4.53, 55.96]], ], }, status=BroadcastStatusType.BROADCASTING) event = create_broadcast_event(broadcast_message) mock_create_broadcast = mocker.patch( f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.create_and_send_broadcast', ) send_broadcast_provider_message(provider=provider, broadcast_event_id=str(event.id)) broadcast_provider_message = event.get_provider_message(provider) 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=mocker.ANY, sent=mocker.ANY, expires=mocker.ANY, channel="severe")
def test_send_broadcast_provider_message_does_nothing_if_cbc_proxy_disabled(mocker, notify_api, sample_template): mock_proxy_client_getter = mocker.patch( 'app.celery.broadcast_message_tasks.cbc_proxy_client', ) mock_client = Mock() mock_proxy_client_getter.get_proxy.return_value = mock_client broadcast_message = create_broadcast_message(sample_template) broadcast_event = create_broadcast_event(broadcast_message, message_type='alert') with set_config(notify_api, 'ENABLED_CBCS', ['ee', 'vodafone']), set_config(notify_api, 'CBC_PROXY_ENABLED', False): send_broadcast_provider_message(broadcast_event.id, 'ee') assert mock_client.create_and_send_broadcast.called is False
def test_send_broadcast_provider_message_errors(mocker, sample_broadcast_service, provider, provider_capitalised): template = create_template(sample_broadcast_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, areas={ 'areas': ['london'], 'simple_polygons': [ [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]], ], }, status=BroadcastStatusType.BROADCASTING ) event = create_broadcast_event(broadcast_message) mock_create_broadcast = mocker.patch( f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.create_and_send_broadcast', side_effect=CBCProxyRetryableException('oh no'), ) mock_retry = mocker.patch( 'app.celery.broadcast_message_tasks.send_broadcast_provider_message.retry', side_effect=Retry ) with pytest.raises(Retry): send_broadcast_provider_message(provider=provider, broadcast_event_id=str(event.id)) 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=[{ 'polygon': [ [50.12, 1.2], [50.13, 1.2], [50.14, 1.21], ], }], sent=event.sent_at_as_cap_datetime_string, expires=event.transmitted_finishes_at_as_cap_datetime_string, channel="severe" ) mock_retry.assert_called_once_with( countdown=1, exc=mock_create_broadcast.side_effect, queue='broadcast-tasks' ) broadcast_provider_message = event.get_provider_message(provider) assert broadcast_provider_message.status == BroadcastProviderMessageStatus.SENDING
def test_send_broadcast_provider_message_sends_data_correctly( mocker, sample_broadcast_service, provider, provider_capitalised): template = create_template(sample_broadcast_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, areas={ 'areas': ['london', 'glasgow'], 'simple_polygons': [ [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]], [[-4.53, 55.72], [-3.88, 55.72], [-3.88, 55.96], [-4.53, 55.96]], ], }, status=BroadcastStatusType.BROADCASTING) event = create_broadcast_event(broadcast_message) mock_create_broadcast = mocker.patch( f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.create_and_send_broadcast', ) assert event.get_provider_message(provider) is None send_broadcast_provider_message(provider=provider, broadcast_event_id=str(event.id)) broadcast_provider_message = event.get_provider_message(provider) assert broadcast_provider_message.status == BroadcastProviderMessageStatus.ACK 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=[{ 'polygon': [ [50.12, 1.2], [50.13, 1.2], [50.14, 1.21], ], }, { 'polygon': [ [-4.53, 55.72], [-3.88, 55.72], [-3.88, 55.96], [-4.53, 55.96], ], }], sent=event.sent_at_as_cap_datetime_string, expires=event.transmitted_finishes_at_as_cap_datetime_string, channel="severe", )
def test_send_broadcast_provider_message_sends_cancel_with_references( mocker, sample_broadcast_service, provider, provider_capitalised): template = create_template(sample_broadcast_service, BROADCAST_TYPE, content='content') broadcast_message = create_broadcast_message( template, areas={ 'areas': ['london'], 'simple_polygons': [ [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]], ], }, status=BroadcastStatusType.BROADCASTING) alert_event = create_broadcast_event( broadcast_message, message_type=BroadcastEventMessageType.ALERT) 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, provider, status=BroadcastProviderMessageStatus.ACK) create_broadcast_provider_message( update_event, provider, status=BroadcastProviderMessageStatus.ACK) mock_cancel_broadcast = mocker.patch( f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.cancel_broadcast', ) send_broadcast_provider_message(provider=provider, broadcast_event_id=str(cancel_event.id)) broadcast_provider_message = cancel_event.get_provider_message(provider) assert broadcast_provider_message.status == BroadcastProviderMessageStatus.ACK mock_cancel_broadcast.assert_called_once_with( identifier=str(broadcast_provider_message.id), message_number=mocker.ANY, previous_provider_messages=[ alert_event.get_provider_message(provider), update_event.get_provider_message(provider) ], sent=cancel_event.sent_at_as_cap_datetime_string, )
def test_send_broadcast_provider_message_sends_update_with_references( mocker, sample_broadcast_service, provider, provider_capitalised): template = create_template(sample_broadcast_service, BROADCAST_TYPE, content='content') broadcast_message = create_broadcast_message( template, areas={ 'areas': ['london'], 'simple_polygons': [ [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]], ], }, status=BroadcastStatusType.BROADCASTING) alert_event = create_broadcast_event( broadcast_message, message_type=BroadcastEventMessageType.ALERT) create_broadcast_provider_message( alert_event, provider, status=BroadcastProviderMessageStatus.ACK) update_event = create_broadcast_event( broadcast_message, message_type=BroadcastEventMessageType.UPDATE) mock_update_broadcast = mocker.patch( f'app.clients.cbc_proxy.CBCProxy{provider_capitalised}.update_and_send_broadcast', ) send_broadcast_provider_message(provider=provider, broadcast_event_id=str(update_event.id)) broadcast_provider_message = update_event.get_provider_message(provider) assert broadcast_provider_message.status == BroadcastProviderMessageStatus.ACK 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(provider) ], sent=update_event.sent_at_as_cap_datetime_string, expires=update_event.transmitted_finishes_at_as_cap_datetime_string, channel="severe")
def test_send_broadcast_provider_message_delays_retry_exponentially( mocker, sample_broadcast_service, num_retries, expected_countdown ): template = create_template(sample_broadcast_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message(template, status=BroadcastStatusType.BROADCASTING) event = create_broadcast_event(broadcast_message) mock_create_broadcast = mocker.patch( 'app.clients.cbc_proxy.CBCProxyEE.create_and_send_broadcast', side_effect=CBCProxyRetryableException('oh no'), ) mock_retry = mocker.patch( 'app.celery.broadcast_message_tasks.send_broadcast_provider_message.retry', side_effect=Retry ) # patch celery request context as shown here: https://stackoverflow.com/a/59870468 mock_celery_task_request_context = mocker.patch("celery.app.task.Task.request") mock_celery_task_request_context.retries = num_retries with pytest.raises(Retry): send_broadcast_provider_message(provider='ee', broadcast_event_id=str(event.id)) 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=[], sent=event.sent_at_as_cap_datetime_string, expires=event.transmitted_finishes_at_as_cap_datetime_string, channel='severe', ) mock_retry.assert_called_once_with( countdown=expected_countdown, exc=mock_create_broadcast.side_effect, queue='broadcast-tasks' )
def test_send_broadcast_provider_message_works_if_we_retried_previously( mocker, sample_broadcast_service): template = create_template(sample_broadcast_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 create_broadcast_provider_message( broadcast_event=event, provider='ee', status=BroadcastProviderMessageStatus.SENDING) mock_create_broadcast = mocker.patch( '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') assert broadcast_provider_message.status == BroadcastProviderMessageStatus.ACK assert broadcast_provider_message.updated_at is not 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='severe', )
def test_send_broadcast_provider_message_errors(mocker, sample_service): template = create_template(sample_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, areas={ 'areas': ['london'], 'simple_polygons': [ [[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]], ], }, status=BroadcastStatusType.BROADCASTING) event = create_broadcast_event(broadcast_message) mock_create_broadcast = mocker.patch( 'app.clients.cbc_proxy.CBCProxyEE.create_and_send_broadcast', side_effect=Exception('oh no'), ) with pytest.raises(Exception) as ex: send_broadcast_provider_message(provider='ee', broadcast_event_id=str(event.id)) assert ex.match('oh no') 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=[{ 'polygon': [ [50.12, 1.2], [50.13, 1.2], [50.14, 1.21], ], }], sent=event.sent_at_as_cap_datetime_string, expires=event.transmitted_finishes_at_as_cap_datetime_string, )