diff --git a/app/service/rest.py b/app/service/rest.py index 756828cb5..91a3951b9 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -1095,11 +1095,12 @@ def create_contact_list(service_id): @service_blueprint.route('//set-as-broadcast-service', methods=['POST']) def set_as_broadcast_service(service_id): """ - This route does four things + This route does the following - adds a service broadcast settings to define which channel broadcasts should go out on - removes all current service permissions and adds the broadcast service permission - sets the services `count_as_live` to false - adds the service to the broadcast organisation + - puts the service into training mode or live mode """ data = validate(request.get_json(), service_broadcast_settings_schema) service = dao_fetch_service_by_id(service_id) @@ -1112,6 +1113,11 @@ def set_as_broadcast_service(service_id): dao_add_service_permission(service.id, BROADCAST_TYPE) service.count_as_live = False + + service.restricted = True + if data["service_mode"] == "live": + service.restricted = False + dao_update_service(service) dao_add_service_to_organisation(service, current_app.config['BROADCAST_ORGANISATION_ID']) diff --git a/app/service/service_broadcast_settings_schema.py b/app/service/service_broadcast_settings_schema.py index 63946e860..3ca492f4f 100644 --- a/app/service/service_broadcast_settings_schema.py +++ b/app/service/service_broadcast_settings_schema.py @@ -4,7 +4,8 @@ service_broadcast_settings_schema = { "type": "object", "title": "Set a services broadcast settings", "properties": { - "broadcast_channel": {"enum": ["test", "severe"]} + "broadcast_channel": {"enum": ["test", "severe"]}, + "service_mode": {"enum": ["training", "live"]} }, - "required": ["broadcast_channel"] + "required": ["broadcast_channel", "service_mode"] } diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index aab284edc..961d1567c 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -3658,6 +3658,7 @@ def test_set_as_broadcast_service_sets_broadcast_channel( assert sample_service.service_broadcast_settings is None data = { 'broadcast_channel': channel, + 'service_mode': 'live', } resp = client.post( @@ -3685,6 +3686,7 @@ def test_set_as_broadcast_service_updates_channel_for_broadcast_service( '/service/{}/set-as-broadcast-service'.format(sample_broadcast_service.id), data=json.dumps({ 'broadcast_channel': "test", + 'service_mode': 'training', }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3705,6 +3707,7 @@ def test_set_as_broadcast_service_rejects_unknown_channels( ): data = { 'broadcast_channel': channel, + 'service_mode': 'live', } resp = client.post( @@ -3716,7 +3719,7 @@ def test_set_as_broadcast_service_rejects_unknown_channels( def test_set_as_broadcast_service_rejects_if_no_channel(client, notify_db, sample_service, broadcast_organisation): - data = {} + data = {'service_mode': 'training'} resp = client.post( '/service/{}/set-as-broadcast-service'.format(sample_service.id), @@ -3737,6 +3740,7 @@ def test_set_as_broadcast_service_gives_broadcast_permission_and_removes_other_p '/service/{}/set-as-broadcast-service'.format(sample_service.id), data=json.dumps({ 'broadcast_channel': "severe", + 'service_mode': 'training', }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3758,6 +3762,7 @@ def test_set_as_broadcast_service_maintains_broadcast_permission_for_existing_br '/service/{}/set-as-broadcast-service'.format(sample_broadcast_service.id), data=json.dumps({ 'broadcast_channel': "severe", + 'service_mode': 'live', }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3776,6 +3781,7 @@ def test_set_as_broadcast_service_sets_count_as_live_to_false(client, notify_db, '/service/{}/set-as-broadcast-service'.format(sample_service.id), data=json.dumps({ 'broadcast_channel': "severe", + 'service_mode': 'live', }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3794,6 +3800,7 @@ def test_set_as_broadcast_service_sets_service_org_to_broadcast_org(client, noti '/service/{}/set-as-broadcast-service'.format(sample_service.id), data=json.dumps({ 'broadcast_channel': "severe", + 'service_mode': 'training', }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3813,8 +3820,84 @@ def test_set_as_broadcast_service_does_not_error_if_run_on_a_service_that_is_alr '/service/{}/set-as-broadcast-service'.format(sample_service.id), data=json.dumps({ 'broadcast_channel': "severe", + 'service_mode': "live" }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) result = resp.json assert resp.status_code == 200 + + +def test_set_as_broadcast_service_sets_service_to_live_mode( + client, notify_db, sample_service, broadcast_organisation +): + sample_service.restricted = True + notify_db.session.add(sample_service) + notify_db.session.commit() + assert sample_service.restricted == True + data = { + 'broadcast_channel': 'severe', + 'service_mode': 'live', + } + + resp = client.post( + '/service/{}/set-as-broadcast-service'.format(sample_service.id), + data=json.dumps(data), + headers=[('Content-Type', 'application/json'), create_authorization_header()] + ) + result = resp.json + assert resp.status_code == 200 + assert result['data']['name'] == 'Sample service' + assert result['data']['restricted'] == False + + +def test_set_as_broadcast_service_sets_service_to_training_mode( + client, notify_db, sample_broadcast_service, broadcast_organisation +): + sample_broadcast_service.restricted = False + notify_db.session.add(sample_broadcast_service) + notify_db.session.commit() + assert sample_broadcast_service.restricted == False + + data = { + 'broadcast_channel': 'severe', + 'service_mode': 'training', + } + + resp = client.post( + '/service/{}/set-as-broadcast-service'.format(sample_broadcast_service.id), + data=json.dumps(data), + headers=[('Content-Type', 'application/json'), create_authorization_header()] + ) + result = resp.json + assert resp.status_code == 200 + assert result['data']['name'] == 'Sample broadcast service' + assert result['data']['restricted'] == True + + +@pytest.mark.parametrize('service_mode', ["testing", ""]) +def test_set_as_broadcast_service_rejects_unknown_service_mode( + client, notify_db, sample_service, broadcast_organisation, service_mode +): + data = { + 'broadcast_channel': 'severe', + 'service_mode': service_mode, + } + + resp = client.post( + '/service/{}/set-as-broadcast-service'.format(sample_service.id), + data=json.dumps(data), + headers=[('Content-Type', 'application/json'), create_authorization_header()] + ) + assert resp.status_code == 400 + + +def test_set_as_broadcast_service_rejects_if_no_service_mode(client, notify_db, sample_service, broadcast_organisation): + data = {'broadcast_channel': 'severe'} + + resp = client.post( + '/service/{}/set-as-broadcast-service'.format(sample_service.id), + data=json.dumps(data), + headers=[('Content-Type', 'application/json'), create_authorization_header()] + ) + assert resp.status_code == 400