New dao and endpoints to create and update service data retention.

This commit is contained in:
Rebecca Law
2018-07-11 17:02:49 +01:00
parent e4cc90e585
commit e2a1dfeb31
7 changed files with 302 additions and 1 deletions

View File

@@ -0,0 +1,78 @@
import uuid
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.models import ServiceDataRetention
def test_insert_service_data_retention(sample_service):
insert_service_data_retention(
service_id=sample_service.id,
notification_type='email',
days_of_retention=3
)
results = ServiceDataRetention.query.all()
assert len(results) == 1
assert results[0].service_id == sample_service.id
assert results[0].notification_type == 'email'
assert results[0].days_of_retention == 3
assert results[0].created_at.date() == datetime.utcnow().date()
def test_insert_service_data_retention_throws_unique_constraint(sample_service):
insert_service_data_retention(service_id=sample_service.id,
notification_type='email',
days_of_retention=3
)
with pytest.raises(expected_exception=IntegrityError):
insert_service_data_retention(service_id=sample_service.id,
notification_type='email',
days_of_retention=5
)
def test_update_service_data_retention(sample_service):
data_retention = insert_service_data_retention(service_id=sample_service.id,
notification_type='sms',
days_of_retention=3
)
updated_count = update_service_data_retention(service_data_retention_id=data_retention.id,
service_id=sample_service.id,
days_of_retention=5
)
assert updated_count == 1
results = ServiceDataRetention.query.all()
assert len(results) == 1
assert results[0].id == data_retention.id
assert results[0].service_id == sample_service.id
assert results[0].notification_type == 'sms'
assert results[0].days_of_retention == 5
assert results[0].created_at.date() == datetime.utcnow().date()
assert results[0].updated_at.date() == datetime.utcnow().date()
def test_update_service_data_retention_does_not_update_if_row_does_not_exist(sample_service):
updated_count = update_service_data_retention(
service_data_retention_id=uuid.uuid4(),
service_id=sample_service.id,
days_of_retention=5
)
assert updated_count == 0
assert len(ServiceDataRetention.query.all()) == 0
def test_update_service_data_retention_does_not_update_row_if_data_retention_is_for_different_service(
sample_service
):
data_retention = insert_service_data_retention(service_id=sample_service.id,
notification_type='email',
days_of_retention=3
)
updated_count = update_service_data_retention(service_data_retention_id=data_retention.id,
service_id=uuid.uuid4(),
days_of_retention=5)
assert updated_count == 0

View File

@@ -3,6 +3,7 @@ import uuid
from app import db
from app.dao.jobs_dao import dao_create_job
from app.dao.service_data_retention_dao import insert_service_data_retention
from app.dao.service_inbound_api_dao import save_service_inbound_api
from app.dao.service_callback_api_dao import save_service_callback_api
from app.dao.service_sms_sender_dao import update_existing_sms_sender_with_inbound_number, dao_update_service_sms_sender
@@ -35,7 +36,7 @@ from app.models import (
InvitedOrganisationUser,
FactBilling,
FactNotificationStatus,
Complaint
Complaint,
)
from app.dao.users_dao import save_model_user
from app.dao.notifications_dao import (
@@ -663,3 +664,16 @@ def ses_notification_callback():
'dd426d95ee9390147a5624348ee.pem",' \
'\n "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&S' \
'subscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"\n}'
def create_service_data_retention(
service_id,
notification_type='sms',
days_of_retention=3
):
data_retention = insert_service_data_retention(
service_id=service_id,
notification_type=notification_type,
days_of_retention=days_of_retention
)
return data_retention

View File

@@ -0,0 +1,100 @@
import json
import uuid
from app.models import ServiceDataRetention
from tests import create_authorization_header
from tests.app.db import create_service_data_retention
def test_create_service_data_retention(client, sample_service):
data = {
"notification_type": 'sms',
"days_of_retention": 3
}
response = client.post(
'/service/{}/data-retention'.format(str(sample_service.id)),
headers=[('Content-Type', 'application/json'), create_authorization_header()],
data=json.dumps(data)
)
assert response.status_code == 201
json_resp = json.loads(response.get_data(as_text=True))['result']
results = ServiceDataRetention.query.all()
assert len(results) == 1
data_retention = results[0]
assert json_resp == data_retention.serialize()
def test_create_service_data_retention_returns_400_when_notification_type_is_invalid(client):
data = {
"notification_type": 'unknown',
"days_of_retention": 3
}
response = client.post(
'/service/{}/data-retention'.format(str(uuid.uuid4())),
headers=[('Content-Type', 'application/json'), create_authorization_header()],
data=json.dumps(data)
)
json_resp = json.loads(response.get_data(as_text=True))
assert response.status_code == 400
assert json_resp['errors'][0]['error'] == 'ValidationError'
assert json_resp['errors'][0]['message'] == 'notification_type unknown is not one of [sms, letter, email]'
def test_create_service_data_retention_returns_400_when_data_retention_for_notification_type_already_exists(
client, sample_service
):
create_service_data_retention(service_id=sample_service.id)
data = {
"notification_type": "sms",
"days_of_retention": 3
}
response = client.post(
'/service/{}/data-retention'.format(str(uuid.uuid4())),
headers=[('Content-Type', 'application/json'), create_authorization_header()],
data=json.dumps(data)
)
assert response.status_code == 400
json_resp = json.loads(response.get_data(as_text=True))
assert json_resp['result'] == 'error'
assert json_resp['message'] == 'Service already has data retention for sms notification type'
def test_modify_service_data_retention(client, sample_service):
data_retention = create_service_data_retention(service_id=sample_service.id)
data = {
"days_of_retention": 3
}
response = client.post(
'/service/{}/data-retention/{}'.format(sample_service.id, data_retention.id),
headers=[('Content-Type', 'application/json'), create_authorization_header()],
data=json.dumps(data)
)
assert response.status_code == 204
assert response.get_data(as_text=True) == ''
def test_modify_service_data_retention_returns_400_when_data_retention_does_not_exist(client, sample_service):
data = {
"days_of_retention": 3
}
response = client.post(
'/service/{}/data-retention/{}'.format(sample_service.id, uuid.uuid4()),
headers=[('Content-Type', 'application/json'), create_authorization_header()],
data=json.dumps(data)
)
assert response.status_code == 404
def test_modify_service_data_retention_returns_400_when_data_is_invalid(client):
data = {
"bad_key": 3
}
response = client.post(
'/service/{}/data-retention/{}'.format(uuid.uuid4(), uuid.uuid4()),
headers=[('Content-Type', 'application/json'), create_authorization_header()],
data=json.dumps(data)
)
assert response.status_code == 400