From 4f7afa3fbe6b8e51123bb2bef02507d805082a2a Mon Sep 17 00:00:00 2001 From: David McDonald Date: Tue, 9 Feb 2021 14:47:36 +0000 Subject: [PATCH] Set provider restriction --- app/dao/service_broadcast_settings_dao.py | 2 + app/service/rest.py | 4 +- .../service_broadcast_settings_schema.py | 5 +- tests/app/service/test_rest.py | 116 +++++++++++++++++- 4 files changed, 121 insertions(+), 6 deletions(-) diff --git a/app/dao/service_broadcast_settings_dao.py b/app/dao/service_broadcast_settings_dao.py index 768b0d194..8835fbae9 100644 --- a/app/dao/service_broadcast_settings_dao.py +++ b/app/dao/service_broadcast_settings_dao.py @@ -9,7 +9,9 @@ def insert_or_update_service_broadcast_settings(service, channel, provider_restr settings = ServiceBroadcastSettings() settings.service = service settings.channel = channel + settings.provider = provider_restriction db.session.add(settings) else: service.service_broadcast_settings.channel = channel + service.service_broadcast_settings.provider = provider_restriction db.session.add(service.service_broadcast_settings) diff --git a/app/service/rest.py b/app/service/rest.py index 91a3951b9..5e3754e1b 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -1105,7 +1105,9 @@ def set_as_broadcast_service(service_id): data = validate(request.get_json(), service_broadcast_settings_schema) service = dao_fetch_service_by_id(service_id) - insert_or_update_service_broadcast_settings(service, channel=data["broadcast_channel"]) + insert_or_update_service_broadcast_settings( + service, channel=data["broadcast_channel"], provider_restriction=data.get("provider_restriction") + ) current_service_permissions = dao_fetch_service_permissions(service.id) for permission in current_service_permissions: diff --git a/app/service/service_broadcast_settings_schema.py b/app/service/service_broadcast_settings_schema.py index 3ca492f4f..bc18af07d 100644 --- a/app/service/service_broadcast_settings_schema.py +++ b/app/service/service_broadcast_settings_schema.py @@ -5,7 +5,8 @@ service_broadcast_settings_schema = { "title": "Set a services broadcast settings", "properties": { "broadcast_channel": {"enum": ["test", "severe"]}, - "service_mode": {"enum": ["training", "live"]} + "service_mode": {"enum": ["training", "live"]}, + "provider_restriction": {"enum": [None, "three", "o2", "vodafone", "ee"]} }, - "required": ["broadcast_channel", "service_mode"] + "required": ["broadcast_channel", "service_mode", "provider_restriction"] } diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 961d1567c..6d20d1508 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -3659,6 +3659,7 @@ def test_set_as_broadcast_service_sets_broadcast_channel( data = { 'broadcast_channel': channel, 'service_mode': 'live', + 'provider_restriction': None, } resp = client.post( @@ -3687,6 +3688,7 @@ def test_set_as_broadcast_service_updates_channel_for_broadcast_service( data=json.dumps({ 'broadcast_channel': "test", 'service_mode': 'training', + 'provider_restriction': None, }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3708,6 +3710,7 @@ def test_set_as_broadcast_service_rejects_unknown_channels( data = { 'broadcast_channel': channel, 'service_mode': 'live', + 'provider_restriction': None, } resp = client.post( @@ -3719,7 +3722,10 @@ 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 = {'service_mode': 'training'} + data = { + 'service_mode': 'training', + 'provider_restriction': None, + } resp = client.post( '/service/{}/set-as-broadcast-service'.format(sample_service.id), @@ -3741,6 +3747,7 @@ def test_set_as_broadcast_service_gives_broadcast_permission_and_removes_other_p data=json.dumps({ 'broadcast_channel': "severe", 'service_mode': 'training', + 'provider_restriction': None, }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3763,6 +3770,7 @@ def test_set_as_broadcast_service_maintains_broadcast_permission_for_existing_br data=json.dumps({ 'broadcast_channel': "severe", 'service_mode': 'live', + 'provider_restriction': None, }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3782,6 +3790,7 @@ def test_set_as_broadcast_service_sets_count_as_live_to_false(client, notify_db, data=json.dumps({ 'broadcast_channel': "severe", 'service_mode': 'live', + 'provider_restriction': None, }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3801,6 +3810,7 @@ def test_set_as_broadcast_service_sets_service_org_to_broadcast_org(client, noti data=json.dumps({ 'broadcast_channel': "severe", 'service_mode': 'training', + 'provider_restriction': None, }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3820,7 +3830,8 @@ 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" + 'service_mode': "live", + 'provider_restriction': None, }), headers=[('Content-Type', 'application/json'), create_authorization_header()] ) @@ -3838,6 +3849,7 @@ def test_set_as_broadcast_service_sets_service_to_live_mode( data = { 'broadcast_channel': 'severe', 'service_mode': 'live', + 'provider_restriction': None, } resp = client.post( @@ -3862,6 +3874,7 @@ def test_set_as_broadcast_service_sets_service_to_training_mode( data = { 'broadcast_channel': 'severe', 'service_mode': 'training', + 'provider_restriction': None, } resp = client.post( @@ -3882,6 +3895,7 @@ def test_set_as_broadcast_service_rejects_unknown_service_mode( data = { 'broadcast_channel': 'severe', 'service_mode': service_mode, + 'provider_restriction': None, } resp = client.post( @@ -3893,7 +3907,103 @@ def test_set_as_broadcast_service_rejects_unknown_service_mode( def test_set_as_broadcast_service_rejects_if_no_service_mode(client, notify_db, sample_service, broadcast_organisation): - data = {'broadcast_channel': 'severe'} + data = { + 'broadcast_channel': 'severe', + 'provider_restriction': None, + } + + 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 == 400 + + +@pytest.mark.parametrize('provider', [None, "three", "ee", "vodafone", "o2"]) +def test_set_as_broadcast_service_sets_mobile_provider_restriction( + client, notify_db, sample_service, broadcast_organisation, provider +): + assert sample_service.service_broadcast_settings is None + data = { + 'broadcast_channel': 'severe', + 'service_mode': 'live', + 'provider_restriction': provider + } + + 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']['allowed_broadcast_provider'] == provider + + records = ServiceBroadcastSettings.query.filter_by(service_id=sample_service.id).all() + assert len(records) == 1 + assert records[0].service_id == sample_service.id + assert records[0].provider == provider + + +@pytest.mark.parametrize('provider', [None, "vodafone"]) +def test_set_as_broadcast_service_updates_mobile_provider_restriction( + client, notify_db, sample_broadcast_service, broadcast_organisation, provider +): + sample_broadcast_service.service_broadcast_settings.provider = "o2" + notify_db.session.add(sample_broadcast_service) + notify_db.session.commit() + assert sample_broadcast_service.service_broadcast_settings.provider == "o2" + + data = { + 'broadcast_channel': 'severe', + 'service_mode': 'live', + 'provider_restriction': provider + } + + 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']['allowed_broadcast_provider'] == provider + + records = ServiceBroadcastSettings.query.filter_by(service_id=sample_broadcast_service.id).all() + assert len(records) == 1 + assert records[0].service_id == sample_broadcast_service.id + assert records[0].provider == provider + + +@pytest.mark.parametrize('provider', ["three, o2", "giffgaff", "", "None"]) +def test_set_as_broadcast_service_rejects_unknown_provider_restriction( + client, notify_db, sample_service, broadcast_organisation, provider +): + data = { + 'broadcast_channel': 'test', + 'service_mode': 'live', + 'provider_restriction': provider + } + + 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_errors_if_no_mobile_provider_restriction( + client, notify_db, sample_service, broadcast_organisation +): + data = { + 'broadcast_channel': 'severe', + 'service_mode': 'live', + } resp = client.post( '/service/{}/set-as-broadcast-service'.format(sample_service.id),