diff --git a/app/dao/broadcast_message_dao.py b/app/dao/broadcast_message_dao.py index 8adb9b681..5903f7fbe 100644 --- a/app/dao/broadcast_message_dao.py +++ b/app/dao/broadcast_message_dao.py @@ -1,4 +1,7 @@ import uuid +from datetime import datetime + +from sqlalchemy import desc from app import db from app.dao.dao_utils import autocommit @@ -9,6 +12,8 @@ from app.models import ( BroadcastProviderMessage, BroadcastProviderMessageNumber, BroadcastProviderMessageStatus, + BroadcastStatusType, + ServiceBroadcastSettings, ) @@ -29,6 +34,27 @@ def dao_get_broadcast_messages_for_service(service_id): ).order_by(BroadcastMessage.created_at) +def dao_get_all_broadcast_messages(): + return db.session.query( + BroadcastMessage.id, + BroadcastMessage.reference, + ServiceBroadcastSettings.channel, + BroadcastMessage.content, + BroadcastMessage.areas, + BroadcastMessage.status, + BroadcastMessage.starts_at, + BroadcastMessage.finishes_at, + BroadcastMessage.approved_at, + BroadcastMessage.cancelled_at, + ).join( + ServiceBroadcastSettings, ServiceBroadcastSettings.service_id == BroadcastMessage.service_id + ).filter( + BroadcastMessage.starts_at >= datetime(2021, 5, 25, 0, 0, 0), + BroadcastMessage.stubbed == False, # noqa + BroadcastMessage.status.in_(BroadcastStatusType.LIVE_STATUSES) + ).order_by(desc(BroadcastMessage.starts_at)).all() + + def get_earlier_events_for_broadcast_event(broadcast_event_id): """ This is used to build up the references list. diff --git a/app/v2/govuk_alerts/get_broadcasts.py b/app/v2/govuk_alerts/get_broadcasts.py index 290b01d8d..acf6da04a 100644 --- a/app/v2/govuk_alerts/get_broadcasts.py +++ b/app/v2/govuk_alerts/get_broadcasts.py @@ -1,8 +1,23 @@ from flask import jsonify +from app.dao.broadcast_message_dao import dao_get_all_broadcast_messages +from app.utils import get_dt_string_or_none from app.v2.govuk_alerts import v2_govuk_alerts_blueprint @v2_govuk_alerts_blueprint.route('') def get_broadcasts(): - return jsonify({}) + broadcasts = dao_get_all_broadcast_messages() + broadcasts_dict = {"alerts": [{ + "id": broadcast.id, + "reference": broadcast.reference, + "channel": broadcast.channel, + "content": broadcast.content, + "areas": broadcast.areas, + "status": broadcast.status, + "starts_at": get_dt_string_or_none(broadcast.starts_at), + "finishes_at": get_dt_string_or_none(broadcast.finishes_at), + "approved_at": get_dt_string_or_none(broadcast.approved_at), + "cancelled_at": get_dt_string_or_none(broadcast.cancelled_at), + } for broadcast in broadcasts]} + return jsonify(broadcasts_dict), 200 diff --git a/tests/app/dao/test_broadcast_message_dao.py b/tests/app/dao/test_broadcast_message_dao.py index 1b0738a0f..fe4b4ebfa 100644 --- a/tests/app/dao/test_broadcast_message_dao.py +++ b/tests/app/dao/test_broadcast_message_dao.py @@ -2,12 +2,17 @@ from datetime import datetime from app.dao.broadcast_message_dao import ( create_broadcast_provider_message, + dao_get_all_broadcast_messages, get_earlier_events_for_broadcast_event, ) +from app.dao.broadcast_service_dao import ( + insert_or_update_service_broadcast_settings, +) from app.models import BROADCAST_TYPE, BroadcastEventMessageType from tests.app.db import ( create_broadcast_event, create_broadcast_message, + create_service, create_template, ) @@ -65,3 +70,62 @@ def test_create_broadcast_provider_message_creates_in_correct_state(sample_broad assert broadcast_provider_message.broadcast_event_id == broadcast_event.id assert broadcast_provider_message.created_at is not None assert broadcast_provider_message.updated_at is None + + +def test_dao_get_all_broadcast_messages(sample_broadcast_service): + template_1 = create_template(sample_broadcast_service, BROADCAST_TYPE) + # older message, should appear second in list + broadcast_message_1 = create_broadcast_message( + template_1, + starts_at=datetime(2021, 6, 15, 12, 0, 0), + status='cancelled') + + service_2 = create_service( + service_name="broadcast service 2", + service_permissions=[BROADCAST_TYPE] + ) + insert_or_update_service_broadcast_settings(service_2, channel="severe") + + template_2 = create_template(service_2, BROADCAST_TYPE) + # newer message, should appear first in list + broadcast_message_2 = create_broadcast_message( + template_2, + stubbed=False, + status='broadcasting', + starts_at=datetime(2021, 6, 20, 12, 0, 0), + ) + + # broadcast_message_stubbed + create_broadcast_message( + template_2, + stubbed=True, + status='broadcasting', + starts_at=datetime(2021, 6, 15, 12, 0, 0), + ) + # broadcast_message_old + create_broadcast_message( + template_2, + stubbed=False, + status='completed', + starts_at=datetime(2021, 5, 20, 12, 0, 0), + ) + # broadcast_message_rejected + create_broadcast_message( + template_2, + stubbed=False, + status='rejected', + starts_at=datetime(2021, 6, 15, 12, 0, 0), + ) + + broadcast_messages = dao_get_all_broadcast_messages() + assert len(broadcast_messages) == 2 + assert broadcast_messages == [ + ( + broadcast_message_2.id, None, 'severe', 'Dear Sir/Madam, Hello. Yours Truly, The Government.', + {'areas': [], 'simple_polygons': []}, 'broadcasting', datetime(2021, 6, 20, 12, 0), + None, None, None), + ( + broadcast_message_1.id, None, 'severe', 'Dear Sir/Madam, Hello. Yours Truly, The Government.', + {'areas': [], 'simple_polygons': []}, 'cancelled', datetime(2021, 6, 15, 12, 0), + None, None, None) + ] diff --git a/tests/app/v2/govuk_alerts/__init__.py b/tests/app/v2/govuk_alerts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/app/v2/govuk_alerts/test_get_broadcasts.py b/tests/app/v2/govuk_alerts/test_get_broadcasts.py new file mode 100644 index 000000000..d0f62efdf --- /dev/null +++ b/tests/app/v2/govuk_alerts/test_get_broadcasts.py @@ -0,0 +1,39 @@ +from datetime import datetime + +from flask import current_app, json + +from app.models import BROADCAST_TYPE +from tests import create_internal_authorization_header +from tests.app.db import create_broadcast_message, create_template + + +def test_get_all_broadcasts_returns_list_of_broadcasts_and_200( + client, sample_broadcast_service +): + template_1 = create_template(sample_broadcast_service, BROADCAST_TYPE) + + broadcast_message_1 = create_broadcast_message( + template_1, + starts_at=datetime(2021, 6, 15, 12, 0, 0), + status='cancelled') + + broadcast_message_2 = create_broadcast_message( + template_1, + starts_at=datetime(2021, 6, 22, 12, 0, 0), + status='broadcasting') + + jwt_client_id = current_app.config['GOVUK_ALERTS_CLIENT_ID'] + header = create_internal_authorization_header(jwt_client_id) + + response = client.get('/v2/govuk-alerts', headers=[header]) + + json_response = json.loads(response.get_data(as_text=True)) + + assert response.status_code == 200 + assert len(json_response['alerts']) == 2 + + assert json_response['alerts'][0]['id'] == str(broadcast_message_2.id) + assert json_response['alerts'][0]['starts_at'] == '2021-06-22T12:00:00.000000Z' + assert json_response['alerts'][0]['finishes_at'] is None + assert json_response['alerts'][1]['id'] == str(broadcast_message_1.id) + assert json_response['alerts'][1]['starts_at'] == '2021-06-15T12:00:00.000000Z'