Merge pull request #2452 from alphagov/create-template-folders

Create template folders
This commit is contained in:
Alexey Bezhan
2018-11-08 11:58:39 +00:00
committed by GitHub
23 changed files with 428 additions and 44 deletions

View File

@@ -139,6 +139,7 @@ def test_accepting_invite_removes_invite_from_session(
mock_get_template_statistics,
mock_get_jobs,
mock_get_service_statistics,
mock_get_template_folders,
mock_get_usage,
mock_get_inbound_sms_summary,
fake_uuid,
@@ -157,7 +158,7 @@ def test_accepting_invite_removes_invite_from_session(
token='thisisnotarealtoken',
_follow_redirects=True,
)
assert page.h1.string == landing_page_title
assert normalize_spaces(page.h1.string) == landing_page_title
with client_request.session_transaction() as session:
assert 'invited_user' not in session

View File

@@ -56,11 +56,11 @@ def test_letters_lets_in_without_permission(
@pytest.mark.parametrize('permissions, choices', [
(
['email', 'sms', 'letter'],
['Email', 'Text message', 'Letter', 'Copy of an existing template']
['Email template', 'Text message template', 'Letter template', 'Copy of an existing template']
),
(
['email', 'sms'],
['Email', 'Text message', 'Copy of an existing template']
['Email template', 'Text message template', 'Copy of an existing template']
),
])
def test_given_option_to_add_letters_if_allowed(

View File

@@ -2186,7 +2186,6 @@ def test_dont_show_preview_letter_templates_for_bad_filetype(
@pytest.mark.parametrize('route, response_code', [
('main.choose_template', 200),
('main.send_messages', 200),
('main.get_example_csv', 200),
('main.send_test', 302)
@@ -2259,7 +2258,6 @@ def test_route_permissions_send_check_notifications(
@pytest.mark.parametrize('route, expected_status', [
('main.choose_template', 200),
('main.send_messages', 403),
('main.get_example_csv', 403),
('main.send_test', 403),

View File

@@ -563,13 +563,13 @@ def test_should_show_request_to_go_live_checklist(
)
mock_templates = mocker.patch(
'app.models.service.Service.templates',
'app.models.service.Service.all_templates',
new_callable=PropertyMock,
return_value=list(range(0, count_of_templates)),
)
mock_templates_by_type = mocker.patch(
'app.models.service.Service.templates_by_type',
mock_get_templates = mocker.patch(
'app.models.service.Service.get_templates',
side_effect=_templates_by_type,
)
@@ -598,7 +598,7 @@ def test_should_show_request_to_go_live_checklist(
assert mock_templates.call_args_list == [
call(),
]
assert mock_templates_by_type.call_args_list == [
assert mock_get_templates.call_args_list == [
call('email'),
call('sms'),
]
@@ -683,12 +683,12 @@ def test_should_check_for_sms_sender_on_go_live(
return_value=99,
)
mock_templates = mocker.patch(
'app.models.service.Service.templates',
'app.models.service.Service.all_templates',
new_callable=PropertyMock,
side_effect=partial(_templates_by_type, 'all'),
)
mock_templates_by_type = mocker.patch(
'app.models.service.Service.templates_by_type',
mock_get_templates = mocker.patch(
'app.models.service.Service.get_templates',
side_effect=_templates_by_type,
)
@@ -712,7 +712,7 @@ def test_should_check_for_sms_sender_on_go_live(
assert mock_templates.call_args_list == [
call(),
]
assert mock_templates_by_type.call_args_list == [
assert mock_get_templates.call_args_list == [
call('email'),
call('sms'),
]
@@ -747,7 +747,7 @@ def test_should_check_for_mou_on_request_to_go_live(
return_value=0,
)
mocker.patch(
'app.models.service.Service.templates',
'app.models.service.Service.all_templates',
new_callable=PropertyMock,
return_value=[],
)

View File

@@ -0,0 +1,166 @@
import uuid
import pytest
from flask import url_for
from tests.conftest import SERVICE_ONE_ID, normalize_spaces
PARENT_FOLDER_ID = '7e979e79-d970-43a5-ac69-b625a8d147b0'
CHILD_FOLDER_ID = '92ee1ee0-e4ee-4dcc-b1a7-a5da9ebcfa2b'
@pytest.mark.parametrize('parent_folder_id', [None, PARENT_FOLDER_ID])
def test_add_page_shows_option_for_folder(
client_request,
service_one,
parent_folder_id,
mocker,
mock_get_service_templates,
mock_get_organisations_and_services_for_user,
):
service_one['permissions'] += ['edit_folders']
mocker.patch('app.service_api_client.get_service', return_value={"data": service_one})
page = client_request.get(
'main.add_template_by_type',
service_id=service_one['id'],
template_folder_id=parent_folder_id,
_test_page_title=False
)
radios = page.select('input[type=radio]')
labels = page.select('label')
assert [x['value'] for x in radios] == ['email', 'sms', 'copy-existing', 'folder']
assert [x.text.strip() for x in labels] == [
'Email template',
'Text message template',
'Copy of an existing template',
'Folder'
]
@pytest.mark.parametrize('parent_folder_id', [None, PARENT_FOLDER_ID])
def test_get_add_template_folder_page(client_request, service_one, parent_folder_id):
service_one['permissions'] += ['edit_folders']
page = client_request.get(
'main.add_template_folder',
service_id=service_one['id'],
template_folder_id=parent_folder_id
)
assert page.select_one('input[name=name]') is not None
def test_add_template_folder_page_rejects_if_service_doesnt_have_permission(client_request, service_one):
client_request.get('main.add_template_folder', service_id=service_one['id'], _expected_status=403)
client_request.post('main.add_template_folder', service_id=service_one['id'], _expected_status=403)
@pytest.mark.parametrize('parent_folder_id', [None, PARENT_FOLDER_ID])
def test_post_add_template_folder_page(client_request, service_one, mocker, parent_folder_id):
mock_create = mocker.patch('app.template_folder_api_client.create_template_folder')
service_one['permissions'] += ['edit_folders']
client_request.post(
'main.add_template_folder',
service_id=service_one['id'],
template_folder_id=parent_folder_id,
_data={'name': 'foo'},
_expected_redirect=url_for(
'main.choose_template',
service_id=service_one['id'],
template_folder_id=parent_folder_id,
_external=True,
)
)
mock_create.assert_called_once_with(service_one['id'], name='foo', parent_id=parent_folder_id)
@pytest.mark.parametrize(
'expected_page_title, extra_args, expected_nav_links, expected_links',
[
(
'Templates',
{},
['Text message', 'Email', 'Letter'],
[
'folder_one',
'folder_two',
'sms_template_one',
'sms_template_two',
'email_template_one',
'email_template_two',
'letter_template_one',
'letter_template_two',
]
),
(
'Templates',
{'template_type': 'sms'},
['All', 'Email', 'Letter'],
['folder_one', 'folder_two', 'sms_template_one', 'sms_template_two'],
),
(
'Templates / folder_one',
{'template_type': 'sms', 'template_folder_id': PARENT_FOLDER_ID},
['All', 'Email', 'Letter'],
['folder_one_one', 'folder_one_two'],
),
(
'Templates / folder_one / folder_one_one',
{'template_folder_id': CHILD_FOLDER_ID},
['Text message', 'Email', 'Letter'],
[],
),
]
)
def test_should_show_templates_folder_page(
client_request,
mock_get_service_templates,
mock_get_template_folders,
mock_has_no_jobs,
service_one,
mocker,
fake_uuid,
expected_page_title,
extra_args,
expected_nav_links,
expected_links,
):
mock_get_template_folders.return_value = [
{'id': PARENT_FOLDER_ID, 'name': 'folder_one', 'parent_id': None},
{'id': str(uuid.uuid4()), 'name': 'folder_two', 'parent_id': None},
{'id': CHILD_FOLDER_ID, 'name': 'folder_one_one', 'parent_id': PARENT_FOLDER_ID},
{'id': str(uuid.uuid4()), 'name': 'folder_one_two', 'parent_id': PARENT_FOLDER_ID},
]
service_one['permissions'] += ['letter', 'edit_folders']
page = client_request.get(
'main.choose_template',
service_id=SERVICE_ONE_ID,
**extra_args
)
assert normalize_spaces(page.select_one('h1').text) == expected_page_title
links_in_page = page.select('.pill a')
assert len(links_in_page) == len(expected_nav_links)
for index, expected_link in enumerate(expected_nav_links):
assert links_in_page[index].text.strip() == expected_link
page_links = page.select('.message-name a')
assert len(page_links) == len(expected_links)
for index, expected_link in enumerate(expected_links):
assert page_links[index].text.strip() == expected_link
mock_get_service_templates.assert_called_once_with(SERVICE_ONE_ID)

View File

@@ -96,6 +96,7 @@ from tests.conftest import single_letter_contact_block
def test_should_show_page_for_choosing_a_template(
client_request,
mock_get_service_templates,
mock_get_template_folders,
mock_has_no_jobs,
extra_args,
expected_nav_links,
@@ -136,6 +137,7 @@ def test_should_show_page_for_choosing_a_template(
def test_should_not_show_template_nav_if_only_one_type_of_template(
client_request,
mock_get_template_folders,
mock_get_service_templates_with_only_one_template,
):
@@ -149,6 +151,7 @@ def test_should_not_show_template_nav_if_only_one_type_of_template(
def test_should_not_show_live_search_if_list_of_templates_fits_onscreen(
client_request,
mock_get_template_folders,
mock_get_service_templates
):
@@ -162,6 +165,7 @@ def test_should_not_show_live_search_if_list_of_templates_fits_onscreen(
def test_should_show_live_search_if_list_of_templates_taller_than_screen(
client_request,
mock_get_template_folders,
mock_get_more_service_templates_than_can_fit_onscreen
):
@@ -1213,6 +1217,7 @@ def test_route_permissions_for_choose_template(
app_,
client,
api_user_active,
mock_get_template_folders,
service_one,
mock_get_service_templates,
):