From ab695d24d56645ebabe46b8a668113a8859d53b0 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Fri, 13 Jul 2018 15:18:27 +0100 Subject: [PATCH] Added new endpoints to get service data retention for a service. --- app/dao/service_data_retention_dao.py | 14 ++++- app/service/rest.py | 19 ++++++- .../dao/test_service_data_retention_dao.py | 57 ++++++++++++++++++- .../test_service_data_retention_rest.py | 52 +++++++++++++++++ 4 files changed, 138 insertions(+), 4 deletions(-) diff --git a/app/dao/service_data_retention_dao.py b/app/dao/service_data_retention_dao.py index f041ee2d8..1e27c52a1 100644 --- a/app/dao/service_data_retention_dao.py +++ b/app/dao/service_data_retention_dao.py @@ -5,11 +5,21 @@ from app.dao.dao_utils import transactional from app.models import ServiceDataRetention -def get_service_data_retention(service_id): - data_retention = ServiceDataRetention.query.filter_by(service_id=service_id).all() +def fetch_service_data_retention_by_id(service_id, data_retention_id): + data_retention = ServiceDataRetention.query.filter_by(service_id=service_id, id=data_retention_id).first() return data_retention +def fetch_service_data_retention(service_id): + data_retention_list = ServiceDataRetention.query.filter_by( + service_id=service_id + ).order_by( + # in the order that models.notification_types are created (email, sms, letter) + ServiceDataRetention.notification_type + ).all() + return data_retention_list + + @transactional def insert_service_data_retention(service_id, notification_type, days_of_retention): new_data_retention = ServiceDataRetention(service_id=service_id, diff --git a/app/service/rest.py b/app/service/rest.py index 3c82c915e..575e7b613 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -24,7 +24,12 @@ from app.dao.fact_notification_status_dao import ( ) from app.dao.inbound_numbers_dao import dao_allocate_number_for_service from app.dao.organisation_dao import dao_get_organisation_by_service_id -from app.dao.service_data_retention_dao import insert_service_data_retention, update_service_data_retention +from app.dao.service_data_retention_dao import ( + fetch_service_data_retention, + fetch_service_data_retention_by_id, + insert_service_data_retention, + update_service_data_retention, +) from app.dao.service_sms_sender_dao import ( archive_sms_sender, dao_add_sms_sender_for_service, @@ -759,6 +764,18 @@ def is_service_name_unique(): return jsonify(result=result), 200 +@service_blueprint.route('//data-retention', methods=['GET']) +def get_data_retention_for_service(service_id): + data_retention_list = fetch_service_data_retention(service_id) + return jsonify([data_retention.serialize() for data_retention in data_retention_list]), 200 + + +@service_blueprint.route('//data-retention/', methods=['GET']) +def get_data_retention_for_service_by_id(service_id, data_retention_id): + data_retention = fetch_service_data_retention_by_id(service_id, data_retention_id) + return jsonify(data_retention.serialize() if data_retention else {}), 200 + + @service_blueprint.route('//data-retention', methods=['POST']) def create_service_data_retention(service_id): form = validate(request.get_json(), add_service_data_retention_request) diff --git a/tests/app/dao/test_service_data_retention_dao.py b/tests/app/dao/test_service_data_retention_dao.py index 99252d3b3..cbf3661d2 100644 --- a/tests/app/dao/test_service_data_retention_dao.py +++ b/tests/app/dao/test_service_data_retention_dao.py @@ -4,8 +4,63 @@ from datetime import datetime import pytest from sqlalchemy.exc import IntegrityError -from app.dao.service_data_retention_dao import insert_service_data_retention, update_service_data_retention +from app.dao.service_data_retention_dao import ( + fetch_service_data_retention, + insert_service_data_retention, + update_service_data_retention, + fetch_service_data_retention_by_id +) from app.models import ServiceDataRetention +from tests.app.db import create_service + + +def test_fetch_service_data_retention(sample_service): + email_data_retention = insert_service_data_retention(sample_service.id, 'email', 3) + letter_data_retention = insert_service_data_retention(sample_service.id, 'letter', 30) + sms_data_retention = insert_service_data_retention(sample_service.id, 'sms', 5) + + list_of_data_retention = fetch_service_data_retention(sample_service.id) + + assert len(list_of_data_retention) == 3 + assert list_of_data_retention[0] == email_data_retention + assert list_of_data_retention[1] == sms_data_retention + assert list_of_data_retention[2] == letter_data_retention + + +def test_fetch_service_data_retention_only_returns_row_for_service(sample_service): + another_service = create_service(service_name="Another service") + email_data_retention = insert_service_data_retention(sample_service.id, 'email', 3) + letter_data_retention = insert_service_data_retention(sample_service.id, 'letter', 30) + insert_service_data_retention(another_service.id, 'sms', 5) + + list_of_data_retention = fetch_service_data_retention(sample_service.id) + assert len(list_of_data_retention) == 2 + assert list_of_data_retention[0] == email_data_retention + assert list_of_data_retention[1] == letter_data_retention + + +def test_fetch_service_data_retention_returns_empty_list_when_no_rows_for_service(sample_service): + empty_list = fetch_service_data_retention(sample_service.id) + assert not empty_list + + +def test_fetch_service_data_retention_by_id(sample_service): + email_data_retention = insert_service_data_retention(sample_service.id, 'email', 3) + insert_service_data_retention(sample_service.id, 'sms', 13) + result = fetch_service_data_retention_by_id(sample_service.id, email_data_retention.id) + assert result == email_data_retention + + +def test_fetch_service_data_retention_by_id_returns_none_if_not_found(sample_service): + result = fetch_service_data_retention_by_id(sample_service.id, uuid.uuid4()) + assert not result + + +def test_fetch_service_data_retention_by_id_returns_none_if_id_not_for_service(sample_service): + another_service = create_service(service_name="Another service") + email_data_retention = insert_service_data_retention(sample_service.id, 'email', 3) + result = fetch_service_data_retention_by_id(another_service.id, email_data_retention.id) + assert not result def test_insert_service_data_retention(sample_service): diff --git a/tests/app/service/test_service_data_retention_rest.py b/tests/app/service/test_service_data_retention_rest.py index 598fb85bc..da58d597e 100644 --- a/tests/app/service/test_service_data_retention_rest.py +++ b/tests/app/service/test_service_data_retention_rest.py @@ -6,6 +6,58 @@ from tests import create_authorization_header from tests.app.db import create_service_data_retention +def test_get_service_data_retention(client, sample_service): + sms_data_retention = create_service_data_retention(service_id=sample_service.id) + email_data_retention = create_service_data_retention(service_id=sample_service.id, notification_type='email', + days_of_retention=10) + letter_data_retention = create_service_data_retention(service_id=sample_service.id, notification_type='letter', + days_of_retention=30) + + response = client.get( + '/service/{}/data-retention'.format(str(sample_service.id)), + headers=[('Content-Type', 'application/json'), create_authorization_header()], + ) + + assert response.status_code == 200 + json_response = json.loads(response.get_data(as_text=True)) + assert len(json_response) == 3 + assert json_response[0] == email_data_retention.serialize() + assert json_response[1] == sms_data_retention.serialize() + assert json_response[2] == letter_data_retention.serialize() + + +def test_get_service_data_retention_returns_empty_list(client, sample_service): + response = client.get( + '/service/{}/data-retention'.format(str(sample_service.id)), + headers=[('Content-Type', 'application/json'), create_authorization_header()], + ) + assert response.status_code == 200 + assert len(json.loads(response.get_data(as_text=True))) == 0 + + +def test_get_service_data_retention_by_id(client, sample_service): + sms_data_retention = create_service_data_retention(service_id=sample_service.id) + create_service_data_retention(service_id=sample_service.id, notification_type='email', + days_of_retention=10) + create_service_data_retention(service_id=sample_service.id, notification_type='letter', + days_of_retention=30) + response = client.get( + '/service/{}/data-retention/{}'.format(str(sample_service.id), sms_data_retention.id), + headers=[('Content-Type', 'application/json'), create_authorization_header()], + ) + assert response.status_code == 200 + assert json.loads(response.get_data(as_text=True)) == sms_data_retention.serialize() + + +def test_get_service_data_retention_by_id_returns_none_when_no_data_retention_exists(client, sample_service): + response = client.get( + '/service/{}/data-retention/{}'.format(str(sample_service.id), uuid.uuid4()), + headers=[('Content-Type', 'application/json'), create_authorization_header()], + ) + assert response.status_code == 200 + assert json.loads(response.get_data(as_text=True)) == {} + + def test_create_service_data_retention(client, sample_service): data = { "notification_type": 'sms',