update broadcast provider message status on success/error

so we can distinguish errorring messages that are currently retrying
from those that sent succesfully.
This commit is contained in:
Leo Hemsted
2021-02-01 16:37:22 +00:00
parent 3dcbfc3612
commit 96a0935d1c
3 changed files with 41 additions and 13 deletions

View File

@@ -3,7 +3,7 @@ from datetime import datetime
from unittest.mock import call, ANY
from freezegun import freeze_time
from celery.exceptions import MaxRetriesExceededError
from celery.exceptions import MaxRetriesExceededError, Retry
import pytest
from app.models import (
@@ -147,7 +147,7 @@ def test_send_broadcast_provider_message_sends_data_correctly(
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.SENDING
assert broadcast_provider_message.status == BroadcastProviderMessageStatus.ACK
mock_create_broadcast.assert_called_once_with(
identifier=str(broadcast_provider_message.id),
@@ -280,9 +280,9 @@ def test_send_broadcast_provider_message_works_if_we_retried_previously(mocker,
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
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),
@@ -374,7 +374,7 @@ def test_send_broadcast_provider_message_sends_update_with_references(
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.SENDING
assert broadcast_provider_message.status == BroadcastProviderMessageStatus.ACK
mock_update_broadcast.assert_called_once_with(
identifier=str(broadcast_provider_message.id),
@@ -429,7 +429,7 @@ def test_send_broadcast_provider_message_sends_cancel_with_references(
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.SENDING
assert broadcast_provider_message.status == BroadcastProviderMessageStatus.ACK
mock_cancel_broadcast.assert_called_once_with(
identifier=str(broadcast_provider_message.id),
@@ -468,9 +468,13 @@ def test_send_broadcast_provider_message_errors(mocker, sample_service, provider
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')
mock_retry = mocker.patch(
'app.celery.broadcast_message_tasks.send_broadcast_provider_message.retry',
side_effect=Retry
)
send_broadcast_provider_message(provider=provider, broadcast_event_id=str(event.id))
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,
@@ -493,6 +497,9 @@ def test_send_broadcast_provider_message_errors(mocker, sample_service, provider
exc=mock_create_broadcast.side_effect,
queue='broadcast-tasks'
)
broadcast_provider_message = event.get_provider_message(provider)
assert broadcast_provider_message.status == BroadcastProviderMessageStatus.TECHNICAL_FAILURE
@pytest.mark.parametrize('num_retries, expected_countdown', [
@@ -515,13 +522,17 @@ def test_send_broadcast_provider_message_delays_retry_exponentially(
'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')
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
send_broadcast_provider_message(provider='ee', broadcast_event_id=str(event.id))
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,