mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-01 15:46:07 -05:00
add template folder CRUD
* create template folder * rename template folder * get list of template folders for service (not nested/presented in any particular way) * delete template folder Also removed `lazy=dynamic` from the `template_folder.templates` relationship. lazy=dynamic returns a query object (which you can then filter further). We just want to return the entire fetched list, at least for now.
This commit is contained in:
@@ -48,7 +48,8 @@ from app.models import (
|
||||
FactBilling,
|
||||
FactNotificationStatus,
|
||||
Complaint,
|
||||
InvitedUser
|
||||
InvitedUser,
|
||||
TemplateFolder,
|
||||
)
|
||||
|
||||
|
||||
@@ -690,3 +691,10 @@ def create_invited_user(service=None,
|
||||
invited_user = InvitedUser(**data)
|
||||
save_invited_user(invited_user)
|
||||
return invited_user
|
||||
|
||||
|
||||
def create_template_folder(service, name='foo', parent=None):
|
||||
tf = TemplateFolder(name=name, service=service, parent=parent)
|
||||
db.session.add(tf)
|
||||
db.session.commit()
|
||||
return tf
|
||||
|
||||
178
tests/app/template_folder/test_template_folder_rest.py
Normal file
178
tests/app/template_folder/test_template_folder_rest.py
Normal file
@@ -0,0 +1,178 @@
|
||||
import uuid
|
||||
|
||||
import pytest
|
||||
|
||||
from app.models import TemplateFolder
|
||||
|
||||
from tests.app.db import create_service, create_template_folder
|
||||
|
||||
|
||||
def test_get_folders_for_service(admin_request, notify_db_session):
|
||||
s1 = create_service(service_name='a')
|
||||
s2 = create_service(service_name='b')
|
||||
|
||||
tf1 = create_template_folder(s1)
|
||||
tf2 = create_template_folder(s1)
|
||||
|
||||
create_template_folder(s2)
|
||||
|
||||
resp = admin_request.get('template_folder.get_template_folders_for_service', service_id=s1.id)
|
||||
assert set(resp.keys()) == {'template_folders'}
|
||||
assert sorted(resp['template_folders'], key=lambda x: x['id']) == sorted([
|
||||
{'id': str(tf1.id), 'name': 'foo', 'service_id': str(s1.id), 'parent_id': None},
|
||||
{'id': str(tf2.id), 'name': 'foo', 'service_id': str(s1.id), 'parent_id': None},
|
||||
], key=lambda x: x['id'])
|
||||
|
||||
|
||||
def test_get_folders_for_service_with_no_folders(sample_service, admin_request):
|
||||
resp = admin_request.get('template_folder.get_template_folders_for_service', service_id=sample_service.id)
|
||||
assert resp == {'template_folders': []}
|
||||
|
||||
|
||||
@pytest.mark.parametrize('has_parent', [True, False])
|
||||
def test_create_template_folder(admin_request, sample_service, has_parent):
|
||||
existing_folder = create_template_folder(sample_service)
|
||||
|
||||
parent_id = str(existing_folder.id) if has_parent else None
|
||||
|
||||
resp = admin_request.post(
|
||||
'template_folder.create_template_folder',
|
||||
service_id=sample_service.id,
|
||||
_data={
|
||||
'name': 'foo',
|
||||
'parent_id': parent_id
|
||||
},
|
||||
_expected_status=201
|
||||
)
|
||||
|
||||
assert resp['data']['name'] == 'foo'
|
||||
assert resp['data']['service_id'] == str(sample_service.id)
|
||||
assert resp['data']['parent_id'] == parent_id
|
||||
|
||||
|
||||
@pytest.mark.parametrize('missing_field', ['name', 'parent_id'])
|
||||
def test_create_template_folder_fails_if_missing_fields(admin_request, sample_service, missing_field):
|
||||
data = {
|
||||
'name': 'foo',
|
||||
'parent_id': None
|
||||
}
|
||||
data.pop(missing_field)
|
||||
|
||||
resp = admin_request.post(
|
||||
'template_folder.create_template_folder',
|
||||
service_id=sample_service.id,
|
||||
_data=data,
|
||||
_expected_status=400
|
||||
)
|
||||
|
||||
assert resp == {
|
||||
'status_code': 400,
|
||||
'errors': [
|
||||
{'error': 'ValidationError', 'message': '{} is a required property'.format(missing_field)}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
def test_create_template_folder_fails_if_unknown_parent_id(admin_request, sample_service):
|
||||
# create existing folder
|
||||
create_template_folder(sample_service)
|
||||
|
||||
resp = admin_request.post(
|
||||
'template_folder.create_template_folder',
|
||||
service_id=sample_service.id,
|
||||
_data={'name': 'bar', 'parent_id': str(uuid.uuid4())},
|
||||
_expected_status=400
|
||||
)
|
||||
|
||||
assert resp['result'] == 'error'
|
||||
assert resp['message'] == 'parent_id not found'
|
||||
|
||||
|
||||
def test_rename_template_folder(admin_request, sample_service):
|
||||
existing_folder = create_template_folder(sample_service)
|
||||
|
||||
resp = admin_request.post(
|
||||
'template_folder.rename_template_folder',
|
||||
service_id=sample_service.id,
|
||||
template_folder_id=existing_folder.id,
|
||||
_data={
|
||||
'name': 'bar'
|
||||
}
|
||||
)
|
||||
|
||||
assert resp['data']['name'] == 'bar'
|
||||
assert existing_folder.name == 'bar'
|
||||
|
||||
|
||||
@pytest.mark.parametrize('data, err', [
|
||||
({}, 'name is a required property'),
|
||||
({'name': None}, 'name None is not of type string'),
|
||||
({'name': ''}, 'name is too short'),
|
||||
])
|
||||
def test_rename_template_folder_fails_if_missing_name(admin_request, sample_service, data, err):
|
||||
existing_folder = create_template_folder(sample_service)
|
||||
|
||||
resp = admin_request.post(
|
||||
'template_folder.rename_template_folder',
|
||||
service_id=sample_service.id,
|
||||
template_folder_id=existing_folder.id,
|
||||
_data=data,
|
||||
_expected_status=400
|
||||
)
|
||||
|
||||
assert resp == {
|
||||
'status_code': 400,
|
||||
'errors': [
|
||||
{'error': 'ValidationError', 'message': err}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
def test_delete_template_folder(admin_request, sample_service):
|
||||
existing_folder = create_template_folder(sample_service)
|
||||
|
||||
admin_request.delete(
|
||||
'template_folder.delete_template_folder',
|
||||
service_id=sample_service.id,
|
||||
template_folder_id=existing_folder.id,
|
||||
)
|
||||
|
||||
assert TemplateFolder.query.all() == []
|
||||
|
||||
|
||||
def test_delete_template_folder_fails_if_folder_has_subfolders(admin_request, sample_service):
|
||||
existing_folder = create_template_folder(sample_service)
|
||||
existing_subfolder = create_template_folder(sample_service, parent=existing_folder) # noqa
|
||||
|
||||
resp = admin_request.delete(
|
||||
'template_folder.delete_template_folder',
|
||||
service_id=sample_service.id,
|
||||
template_folder_id=existing_folder.id,
|
||||
_expected_status=400
|
||||
)
|
||||
|
||||
assert resp == {
|
||||
'result': 'error',
|
||||
'message': 'Folder is not empty'
|
||||
}
|
||||
|
||||
assert TemplateFolder.query.count() == 2
|
||||
|
||||
|
||||
def test_delete_template_folder_fails_if_folder_contains_templates(admin_request, sample_service, sample_template):
|
||||
existing_folder = create_template_folder(sample_service)
|
||||
sample_template.folder = existing_folder
|
||||
|
||||
resp = admin_request.delete(
|
||||
'template_folder.delete_template_folder',
|
||||
service_id=sample_service.id,
|
||||
template_folder_id=existing_folder.id,
|
||||
_expected_status=400
|
||||
)
|
||||
|
||||
assert resp == {
|
||||
'result': 'error',
|
||||
'message': 'Folder is not empty'
|
||||
}
|
||||
|
||||
assert TemplateFolder.query.count() == 1
|
||||
Reference in New Issue
Block a user