예제 #1
0
def test_get_broadcast_messages_for_service(admin_request, sample_service):
    t = create_template(sample_service, BROADCAST_TYPE)

    with freeze_time('2020-01-01 12:00'):
        bm1 = create_broadcast_message(t, personalisation={'foo': 'bar'})
    with freeze_time('2020-01-01 13:00'):
        bm2 = create_broadcast_message(t, personalisation={'foo': 'baz'})

    response = admin_request.get(
        'broadcast_message.get_broadcast_messages_for_service',
        service_id=t.service_id,
        _expected_status=200)

    assert response['broadcast_messages'][0]['id'] == str(bm1.id)
    assert response['broadcast_messages'][1]['id'] == str(bm2.id)
예제 #2
0
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,
    )
예제 #3
0
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_send_broadcast_message_sends_old_version_of_template(sample_service):
    template = create_template(sample_service,
                               BROADCAST_TYPE,
                               content='first content')
    broadcast_message = create_broadcast_message(
        template, areas=['london'], status=BroadcastStatusType.BROADCASTING)

    template.content = 'second content'
    dao_update_template(template)
    assert template.version == 2

    with requests_mock.Mocker() as request_mock:
        request_mock.post("http://test-cbc-proxy/broadcasts/stub-1",
                          json={'valid': 'true'},
                          status_code=200)
        send_broadcast_message(broadcast_message_id=str(broadcast_message.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['template']['id'] == str(template.id)
    assert cbc_json['template']['version'] == 1
    assert cbc_json['template']['content'] == 'first content'
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,
    )
예제 #6
0
def test_update_broadcast_message_status_allows_platform_admin_to_approve_own_message(
        notify_db, admin_request, sample_service, mocker):
    user = sample_service.created_by
    user.platform_admin = True
    t = create_template(sample_service, BROADCAST_TYPE)
    bm = create_broadcast_message(t,
                                  status=BroadcastStatusType.PENDING_APPROVAL)
    mock_task = mocker.patch(
        'app.celery.broadcast_message_tasks.send_broadcast_event.apply_async')

    response = admin_request.post(
        'broadcast_message.update_broadcast_message_status',
        _data={
            'status': BroadcastStatusType.BROADCASTING,
            'created_by': str(user.id)
        },
        service_id=t.service_id,
        broadcast_message_id=bm.id,
        _expected_status=200)

    assert response['status'] == BroadcastStatusType.BROADCASTING
    assert response['approved_at'] is not None
    assert response['created_by_id'] == str(user.id)
    assert response['approved_by_id'] == str(user.id)
    mock_task.assert_called_once_with(
        kwargs={'broadcast_event_id': str(bm.events[0].id)},
        queue='notify-internal-tasks')
예제 #7
0
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")
예제 #8
0
def test_update_broadcast_message_status_allows_trial_mode_services_to_approve_own_message(
        notify_db, admin_request, sample_broadcast_service, mocker):
    sample_broadcast_service.restricted = True
    t = create_template(sample_broadcast_service, BROADCAST_TYPE)
    bm = create_broadcast_message(t,
                                  status=BroadcastStatusType.PENDING_APPROVAL,
                                  areas={
                                      "areas": ["london"],
                                      "simple_polygons": [[[51.30, 0.7],
                                                           [51.28, 0.8],
                                                           [51.25, -0.7]]]
                                  })
    mock_task = mocker.patch(
        'app.celery.broadcast_message_tasks.send_broadcast_event.apply_async')

    response = admin_request.post(
        'broadcast_message.update_broadcast_message_status',
        _data={
            'status': BroadcastStatusType.BROADCASTING,
            'created_by': str(t.created_by_id)
        },
        service_id=t.service_id,
        broadcast_message_id=bm.id,
        _expected_status=200)

    assert response['status'] == BroadcastStatusType.BROADCASTING
    assert response['approved_at'] is not None
    assert response['created_by_id'] == str(t.created_by_id)
    assert response['approved_by_id'] == str(t.created_by_id)
    mock_task.assert_called_once_with(kwargs={'broadcast_event_id': ANY},
                                      queue='notify-internal-tasks')
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')
    ]
예제 #10
0
def test_update_broadcast_message_allows_edit_while_not_yet_live(
        admin_request, sample_broadcast_service, status):
    t = create_template(sample_broadcast_service, BROADCAST_TYPE)
    bm = create_broadcast_message(t,
                                  areas={
                                      "areas": ['manchester'],
                                      "simple_polygons": [[[50.12, 1.2],
                                                           [50.13, 1.2],
                                                           [50.14, 1.21]]]
                                  },
                                  status=status)

    response = admin_request.post('broadcast_message.update_broadcast_message',
                                  _data={
                                      'starts_at':
                                      '2020-06-01 20:00:01',
                                      'areas': ['london', 'glasgow'],
                                      "simple_polygons": [[[51.12, 0.2],
                                                           [50.13, 0.4],
                                                           [50.14, 0.45]]]
                                  },
                                  service_id=t.service_id,
                                  broadcast_message_id=bm.id,
                                  _expected_status=200)

    assert response['starts_at'] == '2020-06-01T20:00:01.000000Z'
    assert response['areas'] == ['london', 'glasgow']
    assert response['simple_polygons'] == [[[51.12, 0.2], [50.13, 0.4],
                                            [50.14, 0.45]]]
    assert response['updated_at'] is not None
예제 #11
0
def test_get_broadcast_message_without_template(admin_request,
                                                sample_broadcast_service):
    bm = create_broadcast_message(
        service=sample_broadcast_service,
        content='emergency broadcast content',
        areas={
            "areas": ['place A', 'region B'],
            "simple_polygons": [[[50.1, 1.2], [50.12, 1.2], [50.13, 1.2]]],
        },
    )

    response = admin_request.get('broadcast_message.get_broadcast_message',
                                 service_id=sample_broadcast_service.id,
                                 broadcast_message_id=bm.id,
                                 _expected_status=200)

    assert response['id'] == str(bm.id)
    assert response['template_id'] is None
    assert response['template_version'] is None
    assert response['template_name'] is None
    assert response['content'] == 'emergency broadcast content'
    assert response['status'] == BroadcastStatusType.DRAFT
    assert response['created_at'] is not None
    assert response['starts_at'] is None
    assert response['areas'] == ['place A', 'region B']
    assert response['personalisation'] is None
예제 #12
0
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')
    ]
예제 #13
0
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_get_earlier_events_for_broadcast_event(sample_service):
    t = create_template(sample_service, BROADCAST_TYPE)
    bm = create_broadcast_message(t)

    events = [
        create_broadcast_event(bm,
                               sent_at=datetime(2020, 1, 1, 12, 0, 0),
                               message_type=BroadcastEventMessageType.ALERT,
                               transmitted_content={'body':
                                                    'Initial content'}),
        create_broadcast_event(bm,
                               sent_at=datetime(2020, 1, 1, 13, 0, 0),
                               message_type=BroadcastEventMessageType.UPDATE,
                               transmitted_content={'body':
                                                    'Updated content'}),
        create_broadcast_event(bm,
                               sent_at=datetime(2020, 1, 1, 14, 0, 0),
                               message_type=BroadcastEventMessageType.UPDATE,
                               transmitted_content={'body': 'Updated content'},
                               transmitted_areas=['wales']),
        create_broadcast_event(
            bm,
            sent_at=datetime(2020, 1, 1, 15, 0, 0),
            message_type=BroadcastEventMessageType.CANCEL,
            transmitted_finishes_at=datetime(2020, 1, 1, 15, 0, 0),
        )
    ]

    # only fetches earlier events, and they're in time order
    earlier_events = get_earlier_events_for_broadcast_event(events[2].id)
    assert earlier_events == [events[0], events[1]]
예제 #15
0
def test_get_broadcast_message(admin_request, sample_broadcast_service):
    t = create_template(sample_broadcast_service,
                        BROADCAST_TYPE,
                        content='This is a ((thing))')
    bm = create_broadcast_message(
        t,
        areas={
            "areas": ['place A', 'region B'],
            "simple_polygons": [[[50.1, 1.2], [50.12, 1.2], [50.13, 1.2]]],
        },
        personalisation={
            'thing': 'test',
        },
    )

    response = admin_request.get('broadcast_message.get_broadcast_message',
                                 service_id=t.service_id,
                                 broadcast_message_id=bm.id,
                                 _expected_status=200)

    assert response['id'] == str(bm.id)
    assert response['template_id'] == str(t.id)
    assert response['content'] == 'This is a test'
    assert response['template_name'] == t.name
    assert response['status'] == BroadcastStatusType.DRAFT
    assert response['created_at'] is not None
    assert response['starts_at'] is None
    assert response['areas'] == ['place A', 'region B']
    assert response['personalisation'] == {'thing': 'test'}
예제 #16
0
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]]]
    }
예제 #17
0
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
예제 #18
0
def test_check_provider_message_should_send_raises_if_older_event_hasnt_started_sending_yet(sample_template):
    broadcast_message = create_broadcast_message(sample_template)
    # event approved at midnight
    past_succesful_event = create_broadcast_event(
        broadcast_message,
        message_type='alert',
        sent_at=datetime(2021, 1, 1, 0, 0),
    )
    # event updated at 5am
    past_still_sending_event = create_broadcast_event(
        broadcast_message,
        message_type='update',
        sent_at=datetime(2021, 1, 1, 5, 0),
    )
    # event updated at 7am
    current_event = create_broadcast_event(
        broadcast_message,
        message_type='update',
        sent_at=datetime(2021, 1, 1, 7, 0),
    )

    # no provider message for past_still_sending_event
    create_broadcast_provider_message(past_succesful_event, provider='ee', status=BroadcastProviderMessageStatus.ACK)

    # we shouldn't send the update now, because a previous event is still stuck in sending
    with pytest.raises(CBCProxyFatalException) as exc:
        check_provider_message_should_send(current_event, 'ee')

    assert f'Previous event {past_still_sending_event.id} (type update) has no provider_message for provider ee' in str(exc.value)  # noqa
예제 #19
0
def test_check_provider_message_should_send_raises_if_older_event_still_sending(sample_template):
    broadcast_message = create_broadcast_message(sample_template)
    # event approved at midnight
    past_succesful_event = create_broadcast_event(
        broadcast_message,
        message_type='alert',
        sent_at=datetime(2021, 1, 1, 0, 0),
    )
    # event updated at 5am (this event is still sending)
    past_still_sending_event = create_broadcast_event(
        broadcast_message,
        message_type='update',
        sent_at=datetime(2021, 1, 1, 5, 0),
    )
    # event updated again at 7am
    current_event = create_broadcast_event(
        broadcast_message,
        message_type='update',
        sent_at=datetime(2021, 1, 1, 7, 0),
    )

    create_broadcast_provider_message(past_succesful_event, provider='ee', status=BroadcastProviderMessageStatus.ACK)
    create_broadcast_provider_message(past_still_sending_event, provider='ee', status=BroadcastProviderMessageStatus.SENDING)  # noqa

    # we havent sent the previous update yet - it's still in sending - so don't try and send this one.
    with pytest.raises(CBCProxyFatalException) as exc:
        check_provider_message_should_send(current_event, 'ee')

    assert f'Previous event {past_still_sending_event.id} (type update) has not finished sending to provider ee' in str(exc.value)  # noqa
예제 #20
0
def test_check_provider_message_should_send_doesnt_raise_if_event_hasnt_expired_yet(sample_template):
    broadcast_message = create_broadcast_message(sample_template)
    current_event = create_broadcast_event(
        broadcast_message,
        transmitted_starts_at=datetime(2021, 1, 1, 0, 0),
        transmitted_finishes_at=datetime(2021, 1, 1, 12, 1),
    )
    check_provider_message_should_send(current_event, 'ee')
예제 #21
0
def test_check_provider_message_should_send_raises_if_event_has_expired(sample_template):
    broadcast_message = create_broadcast_message(sample_template)
    current_event = create_broadcast_event(
        broadcast_message,
        transmitted_starts_at=datetime(2021, 1, 1, 0, 0),
        transmitted_finishes_at=datetime(2021, 1, 1, 11, 59),
    )
    with pytest.raises(CBCProxyFatalException) as exc:
        check_provider_message_should_send(current_event, 'ee')
    assert 'The expiry time of 2021-01-01 11:59:00 has already passed' in str(exc.value)
예제 #22
0
def test_check_provider_message_should_send_raises_if_current_event_already_has_provider_message_not_in_sending(
    sample_template,
    existing_message_status
):
    broadcast_message = create_broadcast_message(sample_template)
    current_event = create_broadcast_event(broadcast_message, message_type='alert')

    create_broadcast_provider_message(current_event, provider='ee', status=existing_message_status)

    check_provider_message_should_send(current_event, 'ee')
예제 #23
0
def test_get_broadcast_message_404s_if_message_is_for_different_service(
        admin_request, sample_broadcast_service):
    other_service = create_service(service_name='other')
    other_template = create_template(other_service, BROADCAST_TYPE)
    bm = create_broadcast_message(other_template)

    err = admin_request.get('broadcast_message.get_broadcast_message',
                            service_id=sample_broadcast_service.id,
                            broadcast_message_id=bm.id,
                            _expected_status=404)
    assert err == {'message': 'No result found', 'result': 'error'}
예제 #24
0
def test_update_broadcast_message_doesnt_allow_edits_after_broadcast_goes_live(
        admin_request, sample_broadcast_service, status):
    t = create_template(sample_broadcast_service, BROADCAST_TYPE)
    bm = create_broadcast_message(t, areas=['manchester'], status=status)

    response = admin_request.post('broadcast_message.update_broadcast_message',
                                  _data={'areas': ['london', 'glasgow']},
                                  service_id=t.service_id,
                                  broadcast_message_id=bm.id,
                                  _expected_status=400)
    assert f'status {status}' in response['message']
예제 #25
0
def test_update_broadcast_message_doesnt_let_you_update_areas_but_not_polygons(
        admin_request, sample_broadcast_service, incomplete_area_data):
    template = create_template(sample_broadcast_service, BROADCAST_TYPE)
    broadcast_message = create_broadcast_message(template)

    response = admin_request.post('broadcast_message.update_broadcast_message',
                                  _data=incomplete_area_data,
                                  service_id=template.service_id,
                                  broadcast_message_id=broadcast_message.id,
                                  _expected_status=400)

    assert response[
        'message'] == f'Cannot update broadcast_message {broadcast_message.id}, areas or polygons are missing.'
예제 #26
0
def test_update_broadcast_message_allows_sensible_datetime_formats(
        admin_request, sample_broadcast_service, input_dt):
    t = create_template(sample_broadcast_service, BROADCAST_TYPE)
    bm = create_broadcast_message(t)

    response = admin_request.post('broadcast_message.update_broadcast_message',
                                  _data={'starts_at': input_dt},
                                  service_id=t.service_id,
                                  broadcast_message_id=bm.id,
                                  _expected_status=200)

    assert response['starts_at'] == '2020-06-01T20:00:01.000000Z'
    assert response['updated_at'] is not None
예제 #27
0
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
예제 #28
0
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",
    )
예제 #29
0
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
예제 #30
0
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