Ejemplo n.º 1
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,
    )
Ejemplo n.º 2
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")
Ejemplo n.º 3
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
Ejemplo n.º 4
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
Ejemplo n.º 5
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",
    )
Ejemplo n.º 6
0
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,
    )
Ejemplo n.º 7
0
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")
Ejemplo n.º 8
0
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'
    )
Ejemplo n.º 9
0
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,
    )