def test_send_broadcast_event_sends_data_correctly(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) with requests_mock.Mocker() as request_mock: request_mock.post("http://test-cbc-proxy/broadcasts/events/stub-1", json={'valid': 'true'}, status_code=200) send_broadcast_event(broadcast_event_id=str(event.id)) assert request_mock.call_count == 1 assert request_mock.request_history[0].method == 'POST' assert request_mock.request_history[0].headers[ "Content-type"] == "application/json" cbc_json = request_mock.request_history[0].json() assert cbc_json['id'] == str(event.id) assert cbc_json['broadcast_message_id'] == str(broadcast_message.id) assert cbc_json['sent_at'] == '2020-08-01T12:00:00.000000Z' assert cbc_json['transmitted_starts_at'] is None assert cbc_json['transmitted_areas'] == { "areas": ['london'], "simple_polygons": [[[50.12, 1.2], [50.13, 1.2], [50.14, 1.21]]] }
def test_send_broadcast_event_queues_up_for_active_providers( mocker, notify_api, sample_service): template = create_template(sample_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, status=BroadcastStatusType.BROADCASTING) event = create_broadcast_event(broadcast_message) mock_send_broadcast_provider_message = mocker.patch( 'app.celery.broadcast_message_tasks.send_broadcast_provider_message', ) with set_config(notify_api, 'ENABLED_CBCS', ['ee', 'vodafone']): send_broadcast_event(event.id) assert mock_send_broadcast_provider_message.apply_async.call_args_list == [ call(kwargs={ 'broadcast_event_id': event.id, 'provider': 'ee' }, queue='notify-internal-tasks'), call(kwargs={ 'broadcast_event_id': event.id, 'provider': 'vodafone' }, queue='notify-internal-tasks') ]
def test_send_broadcast_event_sends_references(sample_service): template = create_template(sample_service, BROADCAST_TYPE, content='content') broadcast_message = create_broadcast_message( template, areas=['london'], status=BroadcastStatusType.BROADCASTING) alert_event = create_broadcast_event( broadcast_message, message_type=BroadcastEventMessageType.ALERT) cancel_event = create_broadcast_event( broadcast_message, message_type=BroadcastEventMessageType.CANCEL) with requests_mock.Mocker() as request_mock: request_mock.post("http://test-cbc-proxy/broadcasts/events/stub-1", json={'valid': 'true'}, status_code=200) send_broadcast_event(broadcast_event_id=str(cancel_event.id)) assert request_mock.call_count == 1 assert request_mock.request_history[0].method == 'POST' assert request_mock.request_history[0].headers[ "Content-type"] == "application/json" cbc_json = request_mock.request_history[0].json() assert cbc_json['id'] == str(cancel_event.id) assert cbc_json['message_type'] == cancel_event.message_type assert cbc_json['previous_event_references'] == [alert_event.reference]
def test_send_broadcast_event_creates_zendesk_p1(mocker, notify_api, sample_broadcast_service): template = create_template(sample_broadcast_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, status=BroadcastStatusType.BROADCASTING, areas={'areas': ['wd20-S13002775', 'wd20-S13002773'], 'simple_polygons': []}, ) event = create_broadcast_event(broadcast_message) mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket") mocker.patch('app.celery.broadcast_message_tasks.send_broadcast_provider_message') with set_config(notify_api, 'NOTIFY_ENVIRONMENT', 'live'): send_broadcast_event(event.id) assert mock_create_ticket.call_count == 1 zendesk_args = mock_create_ticket.call_args[1] assert zendesk_args['p1'] is True assert zendesk_args['ticket_type'] == 'incident' assert str(broadcast_message.id) in zendesk_args['message'] assert 'channel severe' in zendesk_args['message'] assert "areas ['wd20-S13002775', 'wd20-S13002773']" in zendesk_args['message'] # the start of the content from the broadcast template assert "Dear Sir/Madam" in zendesk_args['message']
def test_cancel_broadcast_event_sends_references(mocker, sample_service): template = create_template(sample_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) mock_cancel_broadcast = mocker.patch( 'app.cbc_proxy_client.cancel_broadcast', ) send_broadcast_event(broadcast_event_id=str(cancel_event.id)) mock_cancel_broadcast.assert_called_once_with( identifier=str(cancel_event.id), 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]], }], references=[alert_event.reference, update_event.reference], sent=cancel_event.sent_at_as_cap_datetime_string, expires=cancel_event.transmitted_finishes_at_as_cap_datetime_string, )
def test_send_broadcast_event_doesnt_p1_when_cancelling( mocker, notify_api, sample_broadcast_service): template = create_template(sample_broadcast_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, status=BroadcastStatusType.BROADCASTING, areas={ 'areas': ['wd20-S13002775', 'wd20-S13002773'], 'simple_polygons': [] }, ) create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.ALERT) cancel_event = create_broadcast_event( broadcast_message, message_type=BroadcastEventMessageType.CANCEL) mock_create_ticket = mocker.patch( "app.celery.broadcast_message_tasks.zendesk_client.create_ticket") mocker.patch( 'app.celery.broadcast_message_tasks.send_broadcast_provider_message') with set_config(notify_api, 'NOTIFY_ENVIRONMENT', 'live'): send_broadcast_event(cancel_event.id) assert mock_create_ticket.called is False
def test_send_broadcast_event_only_sends_to_one_provider_if_set_on_service( mocker, notify_db, notify_api, sample_service): settings = ServiceBroadcastSettings(service=sample_service, channel="test", provider="vodafone") notify_db.session.add(settings) template = create_template(sample_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, status=BroadcastStatusType.BROADCASTING) event = create_broadcast_event(broadcast_message) mock_send_broadcast_provider_message = mocker.patch( 'app.celery.broadcast_message_tasks.send_broadcast_provider_message', ) with set_config(notify_api, 'ENABLED_CBCS', ['ee', 'vodafone']): send_broadcast_event(event.id) assert mock_send_broadcast_provider_message.apply_async.call_args_list == [ call(kwargs={ 'broadcast_event_id': event.id, 'provider': 'vodafone' }, queue='broadcast-tasks') ]
def test_send_broadcast_event_does_nothing_if_cbc_proxy_disabled(mocker, notify_api): mock_send_broadcast_provider_message = mocker.patch( 'app.celery.broadcast_message_tasks.send_broadcast_provider_message', ) event_id = uuid.uuid4() with set_config(notify_api, 'ENABLED_CBCS', ['ee', 'vodafone']), set_config(notify_api, 'CBC_PROXY_ENABLED', False): send_broadcast_event(event_id) assert mock_send_broadcast_provider_message.apply_async.called is False
def test_send_broadcast_event_errors(sample_service): template = create_template(sample_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, status=BroadcastStatusType.BROADCASTING) event = create_broadcast_event(broadcast_message) with requests_mock.Mocker() as request_mock: request_mock.post("http://test-cbc-proxy/broadcasts/events/stub-1", text='503 bad gateway', status_code=503) # we're not retrying or anything for the moment - but this'll ensure any exception gets logged with pytest.raises(RequestException) as ex: send_broadcast_event(broadcast_event_id=str(event.id)) assert ex.value.response.status_code == 503
def test_send_broadcast_event_doesnt_create_zendesk_on_staging(mocker, notify_api, sample_broadcast_service): 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_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket") mock_send_broadcast_provider_message = mocker.patch( 'app.celery.broadcast_message_tasks.send_broadcast_provider_message', ) with set_config(notify_api, 'NOTIFY_ENVIRONMENT', 'staging'): send_broadcast_event(event.id) assert mock_send_broadcast_provider_message.apply_async.called is True assert mock_create_ticket.called is False
def test_send_broadcast_event_does_nothing_if_provider_set_on_service_isnt_enabled_globally( mocker, notify_db, notify_api, sample_broadcast_service): sample_broadcast_service.allowed_broadcast_provider = "three" template = create_template(sample_broadcast_service, BROADCAST_TYPE) broadcast_message = create_broadcast_message( template, status=BroadcastStatusType.BROADCASTING) event = create_broadcast_event(broadcast_message) mock_send_broadcast_provider_message = mocker.patch( 'app.celery.broadcast_message_tasks.send_broadcast_provider_message', ) with set_config(notify_api, 'ENABLED_CBCS', ['ee', 'vodafone']): send_broadcast_event(event.id) assert mock_send_broadcast_provider_message.apply_async.called is False
def test_send_broadcast_event_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.cbc_proxy_client.create_and_send_broadcast', side_effect=Exception('oh no'), ) with pytest.raises(Exception) as ex: send_broadcast_event(broadcast_event_id=str(event.id)) assert ex.match('oh no') mock_create_broadcast.assert_called_once_with( identifier=str(event.id), 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, )
def test_create_broadcast_event_sends_data_correctly(mocker, sample_service): template = create_template(sample_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( 'app.cbc_proxy_client.create_and_send_broadcast', ) send_broadcast_event(broadcast_event_id=str(event.id)) mock_create_broadcast.assert_called_once_with( identifier=str(event.id), 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, )