Merge pull request #3535 from alphagov/try-introducing-govuk-checkboxes-again

Try introducing govuk checkboxes again
This commit is contained in:
Tom Byers
2020-08-04 14:39:54 +01:00
committed by GitHub
31 changed files with 1036 additions and 395 deletions

View File

@@ -288,11 +288,15 @@ def test_service_without_caseworking_doesnt_show_admin_vs_caseworker(
service_id=SERVICE_ONE_ID,
**extra_args
)
assert page.select('input[type=checkbox]')[0]['name'] == 'view_activity'
assert page.select('input[type=checkbox]')[1]['name'] == 'send_messages'
assert page.select('input[type=checkbox]')[2]['name'] == 'manage_templates'
assert page.select('input[type=checkbox]')[3]['name'] == 'manage_service'
assert page.select('input[type=checkbox]')[4]['name'] == 'manage_api_keys'
permission_checkboxes = page.select('input[type=checkbox]')
for idx in range(len(permission_checkboxes)):
assert permission_checkboxes[idx]['name'] == 'permissions_field'
assert permission_checkboxes[0]['value'] == 'view_activity'
assert permission_checkboxes[1]['value'] == 'send_messages'
assert permission_checkboxes[2]['value'] == 'manage_templates'
assert permission_checkboxes[3]['value'] == 'manage_service'
assert permission_checkboxes[4]['value'] == 'manage_api_keys'
@pytest.mark.parametrize('endpoint, extra_args', [
@@ -320,11 +324,11 @@ def test_broadcast_service_only_shows_relevant_permissions(
**extra_args
)
assert [
field['name'] for field in page.select('input[type=checkbox]')
(field['name'], field['value']) for field in page.select('input[type=checkbox]')
] == [
'send_messages',
'manage_templates',
'manage_service',
('permissions_field', 'send_messages'),
('permissions_field', 'manage_templates'),
('permissions_field', 'manage_service'),
]
@@ -432,8 +436,9 @@ def test_should_show_page_for_one_user(
assert len(checkboxes) == 5
for index, expected in enumerate(expected_checkboxes):
expected_input_name, expected_checked = expected
assert checkboxes[index]['name'] == expected_input_name
expected_input_value, expected_checked = expected
assert checkboxes[index]['name'] == 'permissions_field'
assert checkboxes[index]['value'] == expected_input_value
assert checkboxes[index].has_attr('checked') == expected_checked
@@ -475,11 +480,13 @@ def test_should_not_show_page_for_non_team_member(
@pytest.mark.parametrize('submitted_permissions, permissions_sent_to_api', [
(
{
'view_activity': 'y',
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
'manage_api_keys': 'y',
'permissions_field': [
'view_activity',
'send_messages',
'manage_templates',
'manage_service',
'manage_api_keys',
]
},
{
'view_activity',
@@ -491,19 +498,38 @@ def test_should_not_show_page_for_non_team_member(
),
(
{
'view_activity': 'y',
'send_messages': 'y',
'manage_templates': '',
'permissions_field': [
'view_activity',
'send_messages',
'manage_templates',
]
},
{
'view_activity',
'send_messages',
'manage_templates',
}
),
(
{},
set(),
),
( # should be able to handle permissions being sent as booleans, until changeover to a list is complete
{
'view_activity': 'y',
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
'manage_api_keys': 'y',
},
{
'view_activity',
'send_messages',
'manage_templates',
'manage_service',
'manage_api_keys',
}
),
])
def test_edit_user_permissions(
client_request,
@@ -542,11 +568,12 @@ def test_edit_user_permissions(
@pytest.mark.parametrize('submitted_permissions, permissions_sent_to_api', [
(
{
'view_activity': 'y',
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
'manage_api_keys': 'y',
'permissions_field': [
'send_messages',
'manage_templates',
'manage_service',
'manage_api_keys',
]
},
{
'view_activity',
@@ -557,8 +584,9 @@ def test_edit_user_permissions(
),
(
{
'view_activity': 'y',
'send_messages': 'y',
'permissions_field': [
'send_messages',
]
},
{
'view_activity',
@@ -572,6 +600,20 @@ def test_edit_user_permissions(
'view_activity',
}
),
( # should be able to handle permissions being sent as booleans, until changeover to a list is complete
{
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
'manage_api_keys': 'y',
},
{
'view_activity',
'send_messages',
'manage_service',
'manage_templates',
}
),
])
def test_edit_user_permissions_for_broadcast_service(
client_request,
@@ -748,10 +790,12 @@ def test_edit_user_permissions_including_authentication_with_email_auth_service(
user_id=active_user_with_permissions['id'],
_data={
'email_address': active_user_with_permissions['email_address'],
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
'manage_api_keys': 'y',
'permissions_field': [
'send_messages',
'manage_templates',
'manage_service',
'manage_api_keys',
],
'login_authentication': auth_type,
},
_expected_status=302,
@@ -810,13 +854,14 @@ def test_should_show_folder_permission_form_if_service_has_folder_permissions_en
assert 'Invite a team member' in page.find('h1').text.strip()
folder_checkboxes = page.find('div', class_='checkboxes-nested').find_all('li')
folder_checkboxes = page.find('div', class_='selection-wrapper').find_all('li')
assert len(folder_checkboxes) == 3
@pytest.mark.parametrize('email_address, gov_user', [
('test@example.gov.uk', True),
('test@example.com', False)
@pytest.mark.parametrize('email_address, gov_user, old_permissions', [
('test@example.gov.uk', True, False),
('test@example.com', False, False),
('test@example.gov.uk', True, True)
])
def test_invite_user(
client_request,
@@ -825,6 +870,7 @@ def test_invite_user(
sample_invite,
email_address,
gov_user,
old_permissions,
mock_get_template_folders,
mock_get_organisations,
):
@@ -834,17 +880,25 @@ def test_invite_user(
mocker.patch('app.models.user.InvitedUsers.client_method', return_value=[sample_invite])
mocker.patch('app.models.user.Users.client_method', return_value=[active_user_with_permissions])
mocker.patch('app.invite_api_client.create_invite', return_value=sample_invite)
data = {'email_address': email_address}
if old_permissions:
data['view_activity'] = 'y'
data['send_messages'] = 'y'
data['manage_templates'] = 'y'
data['manage_service'] = 'y'
data['manage_api_keys'] = 'y'
else:
data['permissions_field'] = [
'view_activity',
'send_messages',
'manage_templates',
'manage_service',
'manage_api_keys',
]
page = client_request.post(
'main.invite_user',
service_id=SERVICE_ONE_ID,
_data={
'email_address': email_address,
'view_activity': 'y',
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
'manage_api_keys': 'y',
},
_data=data,
_follow_redirects=True,
)
assert page.h1.string.strip() == 'Team members'
@@ -894,11 +948,13 @@ def test_invite_user_with_email_auth_service(
service_id=SERVICE_ONE_ID,
_data={
'email_address': email_address,
'view_activity': 'y',
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
'manage_api_keys': 'y',
'permissions_field': [
'view_activity',
'send_messages',
'manage_templates',
'manage_service',
'manage_api_keys',
],
'login_authentication': auth_type,
},
_follow_redirects=True,
@@ -922,9 +978,11 @@ def test_invite_user_with_email_auth_service(
@pytest.mark.parametrize('post_data, expected_permissions_to_api', (
(
{
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
'permissions_field': [
'send_messages',
'manage_templates',
'manage_service',
]
},
{
'view_activity',
@@ -935,14 +993,29 @@ def test_invite_user_with_email_auth_service(
),
(
{
'view_activity': 'y',
'manage_api_keys': 'y',
'foo': 'y',
'permissions_field': [
'view_activity',
'manage_api_keys',
'foo',
]
},
{
'view_activity',
},
),
( # should be able to handle permissions being sent as booleans, until changeover to a list is complete
{
'send_messages': 'y',
'manage_templates': 'y',
'manage_service': 'y',
},
{
'view_activity',
'send_messages',
'manage_templates',
'manage_service',
},
)
))
def test_invite_user_to_broadcast_service(
client_request,
@@ -1084,9 +1157,11 @@ def test_user_cant_invite_themselves(
service_id=SERVICE_ONE_ID,
_data={
'email_address': active_user_with_permissions['email_address'],
'send_messages': 'y',
'manage_service': 'y',
'manage_api_keys': 'y',
'permissions_field': [
'send_messages',
'manage_service',
'manage_api_keys'
]
},
_follow_redirects=True,
_expected_status=200,

View File

@@ -54,29 +54,43 @@ def _folder(name, folder_id=None, parent=None, users_with_permission=None):
{},
['Email', 'Text message', 'Letter'],
[
'folder_one 2 folders',
'folder_one folder_one_one 1 template, 1 folder',
'folder_one folder_one_one folder_one_one_one 1 template',
'folder_one folder_one_one folder_one_one_one sms_template_nested Text message template',
'folder_one folder_one_one letter_template_nested Letter template',
'folder_one folder_one_two Empty',
'folder_two Empty',
'sms_template_one Text message template',
'sms_template_two Text message template',
'email_template_one Email template',
'email_template_two Email template',
'letter_template_one Letter template',
'letter_template_two Letter template',
'folder_one folder_one 2 folders',
('folder_one folder_one_one '
'folder_one folder_one_one '
'1 template, 1 folder'),
('folder_one folder_one_one folder_one_one_one '
'folder_one folder_one_one folder_one_one_one '
'1 template'),
('folder_one folder_one_one folder_one_one_one sms_template_nested '
'folder_one folder_one_one folder_one_one_one sms_template_nested '
'Text message template'),
('folder_one folder_one_one letter_template_nested '
'folder_one folder_one_one letter_template_nested '
'Letter template'),
('folder_one folder_one_two '
'folder_one folder_one_two '
'Empty'),
'folder_two folder_two Empty',
('sms_template_one '
'sms_template_one '
'Text message template'),
('sms_template_two '
'sms_template_two '
'Text message template'),
'email_template_one email_template_one Email template',
'email_template_two email_template_two Email template',
'letter_template_one letter_template_one Letter template',
'letter_template_two letter_template_two Letter template',
],
[
'folder_one 2 folders',
'folder_two Empty',
'sms_template_one Text message template',
'sms_template_two Text message template',
'email_template_one Email template',
'email_template_two Email template',
'letter_template_one Letter template',
'letter_template_two Letter template',
'folder_one folder_one 2 folders',
'folder_two folder_two Empty',
'sms_template_one sms_template_one Text message template',
'sms_template_two sms_template_two Text message template',
'email_template_one email_template_one Email template',
'email_template_two email_template_two Email template',
'letter_template_one letter_template_one Letter template',
'letter_template_two letter_template_two Letter template',
],
[
'folder_one',
@@ -102,29 +116,39 @@ def _folder(name, folder_id=None, parent=None, users_with_permission=None):
{'template_type': 'all'},
['Email', 'Text message', 'Letter'],
[
'folder_one 2 folders',
'folder_one folder_one_one 1 template, 1 folder',
'folder_one folder_one_one folder_one_one_one 1 template',
'folder_one folder_one_one folder_one_one_one sms_template_nested Text message template',
'folder_one folder_one_one letter_template_nested Letter template',
'folder_one folder_one_two Empty',
'folder_two Empty',
'sms_template_one Text message template',
'sms_template_two Text message template',
'email_template_one Email template',
'email_template_two Email template',
'letter_template_one Letter template',
'letter_template_two Letter template',
'folder_one folder_one 2 folders',
('folder_one folder_one_one '
'folder_one folder_one_one '
'1 template, 1 folder'),
('folder_one folder_one_one folder_one_one_one '
'folder_one folder_one_one folder_one_one_one '
'1 template'),
('folder_one folder_one_one folder_one_one_one sms_template_nested '
'folder_one folder_one_one folder_one_one_one sms_template_nested '
'Text message template'),
('folder_one folder_one_one letter_template_nested '
'folder_one folder_one_one letter_template_nested '
'Letter template'),
('folder_one folder_one_two '
'folder_one folder_one_two '
'Empty'),
'folder_two folder_two Empty',
'sms_template_one sms_template_one Text message template',
'sms_template_two sms_template_two Text message template',
'email_template_one email_template_one Email template',
'email_template_two email_template_two Email template',
'letter_template_one letter_template_one Letter template',
'letter_template_two letter_template_two Letter template',
],
[
'folder_one 2 folders',
'folder_two Empty',
'sms_template_one Text message template',
'sms_template_two Text message template',
'email_template_one Email template',
'email_template_two Email template',
'letter_template_one Letter template',
'letter_template_two Letter template',
'folder_one folder_one 2 folders',
'folder_two folder_two Empty',
'sms_template_one sms_template_one Text message template',
'sms_template_two sms_template_two Text message template',
'email_template_one email_template_one Email template',
'email_template_two email_template_two Email template',
'letter_template_one letter_template_one Letter template',
'letter_template_two letter_template_two Letter template',
],
[
'folder_one',
@@ -150,17 +174,23 @@ def _folder(name, folder_id=None, parent=None, users_with_permission=None):
{'template_type': 'sms'},
['All', 'Email', 'Letter'],
[
'folder_one 1 folder',
'folder_one folder_one_one 1 folder',
'folder_one folder_one_one folder_one_one_one 1 template',
'folder_one folder_one_one folder_one_one_one sms_template_nested Text message template',
'sms_template_one Text message template',
'sms_template_two Text message template',
'folder_one folder_one 1 folder',
('folder_one folder_one_one '
'folder_one folder_one_one '
'1 folder'),
('folder_one folder_one_one folder_one_one_one '
'folder_one folder_one_one folder_one_one_one '
'1 template'),
('folder_one folder_one_one folder_one_one_one sms_template_nested '
'folder_one folder_one_one folder_one_one_one sms_template_nested '
'Text message template'),
'sms_template_one sms_template_one Text message template',
'sms_template_two sms_template_two Text message template',
],
[
'folder_one 1 folder',
'sms_template_one Text message template',
'sms_template_two Text message template',
'folder_one folder_one 1 folder',
'sms_template_one sms_template_one Text message template',
'sms_template_two sms_template_two Text message template',
],
[
'folder_one',
@@ -179,15 +209,21 @@ def _folder(name, folder_id=None, parent=None, users_with_permission=None):
{'template_folder_id': PARENT_FOLDER_ID},
['Email', 'Text message', 'Letter'],
[
'folder_one_one 1 template, 1 folder',
'folder_one_one folder_one_one_one 1 template',
'folder_one_one folder_one_one_one sms_template_nested Text message template',
'folder_one_one letter_template_nested Letter template',
'folder_one_two Empty',
'folder_one_one folder_one_one 1 template, 1 folder',
('folder_one_one folder_one_one_one '
'folder_one_one folder_one_one_one '
'1 template'),
('folder_one_one folder_one_one_one sms_template_nested '
'folder_one_one folder_one_one_one sms_template_nested '
'Text message template'),
('folder_one_one letter_template_nested '
'folder_one_one letter_template_nested '
'Letter template'),
'folder_one_two folder_one_two Empty',
],
[
'folder_one_one 1 template, 1 folder',
'folder_one_two Empty',
'folder_one_one folder_one_one 1 template, 1 folder',
'folder_one_two folder_one_two Empty',
],
[
'folder_one_one',
@@ -205,12 +241,16 @@ def _folder(name, folder_id=None, parent=None, users_with_permission=None):
{'template_type': 'sms', 'template_folder_id': PARENT_FOLDER_ID},
['All', 'Email', 'Letter'],
[
'folder_one_one 1 folder',
'folder_one_one folder_one_one_one 1 template',
'folder_one_one folder_one_one_one sms_template_nested Text message template',
'folder_one_one folder_one_one 1 folder',
('folder_one_one folder_one_one_one '
'folder_one_one folder_one_one_one '
'1 template'),
('folder_one_one folder_one_one_one sms_template_nested '
'folder_one_one folder_one_one_one sms_template_nested '
'Text message template'),
],
[
'folder_one_one 1 folder',
'folder_one_one folder_one_one 1 folder',
],
[
'folder_one_one',
@@ -240,13 +280,15 @@ def _folder(name, folder_id=None, parent=None, users_with_permission=None):
{'template_folder_id': CHILD_FOLDER_ID},
['Email', 'Text message', 'Letter'],
[
'folder_one_one_one 1 template',
'folder_one_one_one sms_template_nested Text message template',
'letter_template_nested Letter template',
'folder_one_one_one folder_one_one_one 1 template',
('folder_one_one_one sms_template_nested '
'folder_one_one_one sms_template_nested '
'Text message template'),
'letter_template_nested letter_template_nested Letter template',
],
[
'folder_one_one_one 1 template',
'letter_template_nested Letter template',
'folder_one_one_one folder_one_one_one 1 template',
'letter_template_nested letter_template_nested Letter template',
],
[
'folder_one_one_one',
@@ -266,10 +308,10 @@ def _folder(name, folder_id=None, parent=None, users_with_permission=None):
{'template_folder_id': GRANDCHILD_FOLDER_ID},
['Email', 'Text message', 'Letter'],
[
'sms_template_nested Text message template',
'sms_template_nested sms_template_nested Text message template',
],
[
'sms_template_nested Text message template',
'sms_template_nested sms_template_nested Text message template',
],
[
'sms_template_nested',
@@ -395,7 +437,7 @@ def test_should_show_templates_folder_page(
assert links_in_page[index].text.strip() == expected_link
all_page_items = page.select('.template-list-item')
all_page_items_styled_with_checkboxes = page.select('.template-list-item-with-checkbox')
all_page_items_styled_with_checkboxes = page.select('.template-list-item.govuk-checkboxes__item')
assert len(all_page_items) == len(all_page_items_styled_with_checkboxes)
@@ -527,7 +569,7 @@ def test_get_manage_folder_viewing_permissions_for_users(
assert normalize_spaces(page.select_one('title').text) == (
'folder_two Templates service one GOV.UK Notify'
)
form_labels = page.select('legend[class=form-label]')
form_labels = page.select('legend.govuk-fieldset__legend')
assert normalize_spaces(form_labels[0].text) == "Team members who can see this folder"
checkboxes = page.select('input[name=users_with_permission]')
@@ -538,7 +580,7 @@ def test_get_manage_folder_viewing_permissions_for_users(
assert checkboxes[1]['value'] == team_member_2['id']
assert "checked" in checkboxes[1].attrs
assert "Test User" in page.find_all('label', {'for': 'users_with_permission-0'})[0].text
assert "Test User" in page.find_all('label', {'for': 'users_with_permission-1'})[0].text
def test_get_manage_folder_viewing_permissions_for_users_not_visible_when_no_manage_settings_permission(
@@ -1462,45 +1504,70 @@ def test_show_custom_error_message(
(
{},
[
['folder_A', '1 template, 2 folders'],
['folder_E folder_F folder_G', '1 template'],
['email_template_root', 'Email template'],
['folder_A', 'folder_A', '1 template, 2 folders'],
['folder_E folder_F folder_G',
'folder_E', 'folder_F', 'folder_G',
'1 template'],
['email_template_root', 'email_template_root', 'Email template'],
],
[
['folder_A', '1 template, 2 folders'],
['folder_A', 'folder_C', '1 template'],
['folder_A', 'folder_C', 'sms_template_C', 'Text message template'],
['folder_A', 'folder_D', 'Empty'],
['folder_A', 'sms_template_A', 'Text message template'],
['folder_E folder_F folder_G', '1 template'],
['folder_E folder_F folder_G', 'email_template_G', 'Email template'],
['email_template_root', 'Email template'],
['folder_A', 'folder_A', '1 template, 2 folders'],
['folder_A folder_C',
'folder_A', 'folder_C',
'1 template'],
['folder_A folder_C sms_template_C',
'folder_A', 'folder_C', 'sms_template_C',
'Text message template'],
['folder_A folder_D',
'folder_A', 'folder_D',
'Empty'],
['folder_A sms_template_A',
'folder_A', 'sms_template_A',
'Text message template'],
['folder_E folder_F folder_G',
'folder_E', 'folder_F', 'folder_G',
'1 template'],
['folder_E folder_F folder_G email_template_G',
'folder_E', 'folder_F', 'folder_G', 'email_template_G',
'Email template'],
['email_template_root', 'email_template_root', 'Email template'],
],
None,
),
(
{'template_type': 'email'},
[
['folder_E folder_F folder_G', '1 template'],
['email_template_root', 'Email template'],
['folder_E folder_F folder_G',
'folder_E', 'folder_F', 'folder_G',
'1 template'],
['email_template_root', 'email_template_root', 'Email template'],
],
[
['folder_E folder_F folder_G', '1 template'],
['folder_E folder_F folder_G', 'email_template_G', 'Email template'],
['email_template_root', 'Email template'],
['folder_E folder_F folder_G',
'folder_E', 'folder_F', 'folder_G',
'1 template'],
['folder_E folder_F folder_G email_template_G',
'folder_E', 'folder_F', 'folder_G', 'email_template_G',
'Email template'],
['email_template_root', 'email_template_root', 'Email template'],
],
None,
),
(
{'template_type': 'sms'},
[
['folder_A', '1 template, 1 folder'],
['folder_A', 'folder_A', '1 template, 1 folder'],
],
[
['folder_A', '1 template, 1 folder'],
['folder_A', 'folder_C', '1 template'],
['folder_A', 'folder_C', 'sms_template_C', 'Text message template'],
['folder_A', 'sms_template_A', 'Text message template'],
['folder_A', 'folder_A', '1 template, 1 folder'],
['folder_A folder_C',
'folder_A', 'folder_C',
'1 template'],
['folder_A folder_C sms_template_C',
'folder_A', 'folder_C', 'sms_template_C',
'Text message template'],
['folder_A sms_template_A', 'folder_A', 'sms_template_A',
'Text message template'],
],
None,
),

View File

@@ -188,7 +188,7 @@ def test_should_show_page_for_choosing_a_template(
for index, expected_link in enumerate(expected_nav_links):
assert links_in_page[index].text.strip() == expected_link
template_links = page.select('.message-name a')
template_links = page.select('#template-list .govuk-label a, .message-name a')
assert len(template_links) == len(expected_templates)
@@ -257,7 +257,7 @@ def test_should_show_live_search_if_list_of_templates_taller_than_screen(
assert search['data-module'] == 'live-search'
assert search['data-targets'] == '#template-list .template-list-item'
assert len(page.select(search['data-targets'])) == len(page.select('.message-name')) == 14
assert len(page.select(search['data-targets'])) == len(page.select('#template-list .govuk-label')) == 14
def test_should_show_live_search_if_service_has_lots_of_folders(
@@ -278,8 +278,8 @@ def test_should_show_live_search_if_service_has_lots_of_folders(
service_id=SERVICE_ONE_ID,
)
count_of_templates_and_folders = len(page.select('.message-name'))
count_of_folders = len(page.select('.template-list-folder:first-child'))
count_of_templates_and_folders = len(page.select('#template-list .govuk-label'))
count_of_folders = len(page.select('.template-list-folder:first-of-type'))
count_of_templates = count_of_templates_and_folders - count_of_folders
assert len(page.select('.live-search')) == 1

View File

@@ -14,49 +14,52 @@ afterAll(() => {
describe('Collapsible fieldset', () => {
const _checkboxes = (start, end) => {
result = '';
for (let num = start; num <= end; num++) {
let id = `folder-permissions-${num}`;
result += `<li class="govuk-checkboxes__item">
<input class="govuk-checkboxes__input" id="${id}" name="folder-permissions" type="checkbox" value="${id}">
<label class="govuk-label govuk-checkboxes__label" for="${id}">
Folder ${id}
</label>
</li>`;
}
return result;
};
let wrapper;
let formGroup;
let fieldset;
let checkboxesContainer;
let checkboxes;
beforeEach(() => {
const _checkboxes = (start, end, descendents) => {
result = '';
for (let num = start; num <= end; num++) {
let id = `folder-permissions-${num}`;
if (!descendents) { descendents = ''; }
result += `<li class="multiple-choice">
<input id="${id}" name="folder_permissions" type="checkbox" value="${id}">
<label class="block-label" for="{id}">
Folder 18
</label>
${descendents}
</li>`;
}
return result;
};
// set up DOM
document.body.innerHTML =
`<div class="form-group" data-module="collapsible-checkboxes" data-field-label="folder">
<div class="selection-summary"></div>
<fieldset id="folder_permissions">
<legend class="form-label heading-small">
Folders this team member can see
</legend>
<div class="checkboxes-nested">
<ul>
`<div class="selection-wrapper" data-module="collapsible-checkboxes" data-field-label="folder">
<div class="govuk-form-group">
<fieldset class="govuk-fieldset" id="folder_permissions">
<legend class="govuk-fieldset__legend govuk-fieldset__legend--s">
Folders this team member can see
<span class="govuk-hint">
<div class="selection-summary" role="region" aria-live="polite"></div>
</span>
</legend>
<ul class="govuk-checkboxes">
${_checkboxes(1, 10)}
</ul>
</div>
</fieldset>
</fieldset>
</div>
</div>`;
formGroup = document.querySelector('.form-group');
wrapper = document.querySelector('.selection-wrapper');
formGroup = wrapper.querySelector('.govuk-form-group');
fieldset = formGroup.querySelector('fieldset');
checkboxesContainer = fieldset.querySelector('.checkboxes-nested');
checkboxesContainer = fieldset.querySelector('.govuk-checkboxes');
checkboxes = checkboxesContainer.querySelectorAll('input[type=checkbox]');
});
@@ -141,6 +144,12 @@ describe('Collapsible fieldset', () => {
});
test("removes the hint", () => {
expect(document.querySelector('.govuk-hint')).toBeNull();
});
});
test('has the right summary text when started with no checkboxes selected', () => {
@@ -187,7 +196,7 @@ describe('Collapsible fieldset', () => {
test("the summary doesn't have a folder icon if fields aren't called 'folder'", () => {
formGroup.dataset.fieldLabel = 'team member';
wrapper.dataset.fieldLabel = 'team member';
// start module
window.GOVUK.modules.start();
@@ -277,35 +286,74 @@ describe('Collapsible fieldset', () => {
describe("the footer (that wraps the button)", () => {
beforeEach(() => {
describe("is inserted", () => {
// track calls to sticky JS
window.GOVUK.stickAtBottomWhenScrolling.recalculate = jest.fn(() => {});
test("after the fieldset", () => {
// start module
window.GOVUK.modules.start();
// start module
window.GOVUK.modules.start();
// show the checkboxes
helpers.triggerEvent(formGroup.querySelector('.govuk-button'), 'click');
// show the checkboxes
helpers.triggerEvent(formGroup.querySelector('.govuk-button'), 'click');
expect(formGroup.querySelector('.selection-footer').previousElementSibling.nodeName).toBe('FIELDSET');
});
test("after the root fieldset if the checkboxes are nested", () => {
// add a nested list of checkboxes to the first checkbox item
const nestedCheckboxes = document.createElement('div');
nestedCheckboxes.className = 'govuk-form-group govuk-form-group--nested';
nestedCheckboxes.innerHTML = _checkboxes(11, 20);
checkboxesContainer.querySelector('.govuk-checkboxes__item').appendChild(nestedCheckboxes);
// start module
window.GOVUK.modules.start();
// show the checkboxes
helpers.triggerEvent(formGroup.querySelector('.govuk-button'), 'click');
expect(formGroup.querySelector('.selection-footer').previousElementSibling.nodeName).toBe('FIELDSET');
});
});
test("is made sticky when the fieldset is expanded", () => {
describe("its stickiness", () => {
expect(formGroup.querySelector('.selection-footer').classList.contains('js-stick-at-bottom-when-scrolling')).toBe(true);
expect(window.GOVUK.stickAtBottomWhenScrolling.recalculate.mock.calls.length).toBe(1);
beforeEach(() => {
// track calls to sticky JS
window.GOVUK.stickAtBottomWhenScrolling.recalculate = jest.fn(() => {});
// start module
window.GOVUK.modules.start();
// show the checkboxes
helpers.triggerEvent(formGroup.querySelector('.govuk-button'), 'click');
});
test("is added when the fieldset is expanded", () => {
expect(formGroup.querySelector('.selection-footer').classList.contains('js-stick-at-bottom-when-scrolling')).toBe(true);
expect(window.GOVUK.stickAtBottomWhenScrolling.recalculate.mock.calls.length).toBe(1);
});
test("is removed when the fieldset is collapsed", () => {
// click the button to collapse the fieldset
helpers.triggerEvent(formGroup.querySelector('.govuk-button'), 'click');
expect(formGroup.querySelector('.selection-footer').classList.contains('js-stick-at-bottom-when-scrolling')).toBe(false);
expect(window.GOVUK.stickAtBottomWhenScrolling.recalculate.mock.calls.length).toBe(2);
});
});
test("has its stickiness removed when the fieldset is collapsed", () => {
// click the button to collapse the fieldset
helpers.triggerEvent(formGroup.querySelector('.govuk-button'), 'click');
expect(formGroup.querySelector('.selection-footer').classList.contains('js-stick-at-bottom-when-scrolling')).toBe(false);
expect(window.GOVUK.stickAtBottomWhenScrolling.recalculate.mock.calls.length).toBe(2);
});
});
describe("when the selection changes", () => {
@@ -339,7 +387,7 @@ describe('Collapsible fieldset', () => {
test("if fields are called 'folders'", () => {
formGroup.dataset.fieldLabel = 'folder';
wrapper.dataset.fieldLabel = 'folder';
checkFirstCheckbox();
@@ -359,7 +407,7 @@ describe('Collapsible fieldset', () => {
test("if fields are called 'team member'", () => {
formGroup.dataset.fieldLabel = 'team member';
wrapper.dataset.fieldLabel = 'team member';
checkFirstCheckbox();
@@ -379,7 +427,7 @@ describe('Collapsible fieldset', () => {
test("if fields are called 'arbitrary thing'", () => {
formGroup.dataset.fieldLabel = 'arbitrary thing';
wrapper.dataset.fieldLabel = 'arbitrary thing';
checkFirstCheckbox();
@@ -403,7 +451,7 @@ describe('Collapsible fieldset', () => {
test("if fields are called 'folder'", () => {
formGroup.dataset.fieldLabel = 'folder';
wrapper.dataset.fieldLabel = 'folder';
checkAllCheckboxes();
@@ -423,7 +471,7 @@ describe('Collapsible fieldset', () => {
test("if fields are called 'team member'", () => {
formGroup.dataset.fieldLabel = 'team member';
wrapper.dataset.fieldLabel = 'team member';
checkAllCheckboxes();
@@ -447,7 +495,7 @@ describe('Collapsible fieldset', () => {
test("if fields are called 'folder'", () => {
formGroup.dataset.fieldLabel = 'folder';
wrapper.dataset.fieldLabel = 'folder';
checkAllCheckboxesButTheLast();
@@ -466,7 +514,7 @@ describe('Collapsible fieldset', () => {
test("if fields are called 'team member'", () => {
formGroup.dataset.fieldLabel = 'team member';
wrapper.dataset.fieldLabel = 'team member';
checkAllCheckboxesButTheLast();