diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index 36095e59b..276b3e2be 100644 --- a/tests/app/main/views/test_manage_users.py +++ b/tests/app/main/views/test_manage_users.py @@ -259,11 +259,11 @@ 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' + assert page.select('input[type=checkbox]')[0]['value'] == 'view_activity' + assert page.select('input[type=checkbox]')[1]['value'] == 'send_messages' + assert page.select('input[type=checkbox]')[2]['value'] == 'manage_templates' + assert page.select('input[type=checkbox]')[3]['value'] == 'manage_service' + assert page.select('input[type=checkbox]')[4]['value'] == 'manage_api_keys' @pytest.mark.parametrize('service_has_email_auth, displays_auth_type', [ @@ -370,8 +370,8 @@ 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]['value'] == expected_input_value assert checkboxes[index].has_attr('checked') == expected_checked @@ -413,11 +413,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', @@ -429,13 +431,16 @@ 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', } ), ( @@ -616,10 +621,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, @@ -678,7 +685,7 @@ 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 @@ -707,11 +714,13 @@ def test_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', + 'permissions_field': [ + 'view_activity', + 'send_messages', + 'manage_templates', + 'manage_service', + 'manage_api_keys', + ] }, _follow_redirects=True, ) @@ -762,11 +771,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, diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 00126e9e8..1b7bed097 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -2202,8 +2202,8 @@ def test_incorrect_sms_sender_input( @pytest.mark.parametrize('reply_to_addresses, data, api_default_args', [ ([], {}, True), - (create_multiple_email_reply_to_addresses(), {}, False), - (create_multiple_email_reply_to_addresses(), {"is_default": "y"}, True) + (create_multiple_email_reply_to_addresses(), {"is_default": []}, False), + (create_multiple_email_reply_to_addresses(), {"is_default": ["y"]}, True) ]) def test_add_reply_to_email_address_sends_test_notification( mocker, client_request, reply_to_addresses, data, api_default_args @@ -2323,8 +2323,8 @@ def test_add_reply_to_email_address_fails_if_notification_not_delivered_in_45_se @pytest.mark.parametrize('letter_contact_blocks, data, api_default_args', [ ([], {}, True), # no existing letter contact blocks - (create_multiple_letter_contact_blocks(), {}, False), - (create_multiple_letter_contact_blocks(), {"is_default": "y"}, True) + (create_multiple_letter_contact_blocks(), {"is_default": []}, False), + (create_multiple_letter_contact_blocks(), {"is_default": ["y"]}, True) ]) def test_add_letter_contact( letter_contact_blocks, @@ -2399,8 +2399,8 @@ def test_add_letter_contact_when_coming_from_template( @pytest.mark.parametrize('sms_senders, data, api_default_args', [ ([], {}, True), - (create_multiple_sms_senders(), {}, False), - (create_multiple_sms_senders(), {"is_default": "y"}, True) + (create_multiple_sms_senders(), {"is_default": []}, False), + (create_multiple_sms_senders(), {"is_default": ["y"]}, True) ]) def test_add_sms_sender( sms_senders, @@ -2466,10 +2466,10 @@ def test_default_box_doesnt_show_on_first_letter_sender( @pytest.mark.parametrize('reply_to_address, data, api_default_args', [ - (create_reply_to_email_address(is_default=True), {"is_default": "y"}, True), - (create_reply_to_email_address(is_default=True), {}, True), - (create_reply_to_email_address(is_default=False), {}, False), - (create_reply_to_email_address(is_default=False), {"is_default": "y"}, True) + (create_reply_to_email_address(is_default=True), {"is_default": ["y"]}, True), + (create_reply_to_email_address(is_default=True), {"is_default": []}, True), + (create_reply_to_email_address(is_default=False), {"is_default": []}, False), + (create_reply_to_email_address(is_default=False), {"is_default": ["y"]}, True) ]) def test_edit_reply_to_email_address_sends_verification_notification_if_address_is_changed( reply_to_address, @@ -2494,10 +2494,10 @@ def test_edit_reply_to_email_address_sends_verification_notification_if_address_ @pytest.mark.parametrize('reply_to_address, data, api_default_args', [ - (create_reply_to_email_address(), {"is_default": "y"}, True), - (create_reply_to_email_address(), {}, True), - (create_reply_to_email_address(is_default=False), {}, False), - (create_reply_to_email_address(is_default=False), {"is_default": "y"}, True) + (create_reply_to_email_address(), {"is_default": ["y"]}, True), + (create_reply_to_email_address(), {"is_default": []}, True), + (create_reply_to_email_address(is_default=False), {"is_default": []}, False), + (create_reply_to_email_address(is_default=False), {"is_default": ["y"]}, True) ]) def test_edit_reply_to_email_address_goes_straight_to_update_if_address_not_changed( reply_to_address, @@ -2554,7 +2554,7 @@ def test_add_edit_reply_to_email_address_goes_straight_to_update_if_address_not_ message=error_message )] ) - data = {"is_default": "y", 'email_address': "reply_to@example.com"} + data = {"is_default": ["y"], 'email_address': "reply_to@example.com"} page = client_request.post( url, service_id=SERVICE_ONE_ID, @@ -2654,10 +2654,10 @@ def test_delete_reply_to_email_address( @pytest.mark.parametrize('letter_contact_block, data, api_default_args', [ - (create_letter_contact_block(), {"is_default": "y"}, True), - (create_letter_contact_block(), {}, True), - (create_letter_contact_block(is_default=False), {}, False), - (create_letter_contact_block(is_default=False), {"is_default": "y"}, True) + (create_letter_contact_block(), {"is_default": ["y"]}, True), + (create_letter_contact_block(), {"is_default": []}, True), + (create_letter_contact_block(is_default=False), {"is_default": []}, False), + (create_letter_contact_block(is_default=False), {"is_default": ["y"]}, True) ]) def test_edit_letter_contact_block( letter_contact_block, @@ -2731,10 +2731,10 @@ def test_delete_letter_contact_block( @pytest.mark.parametrize('sms_sender, data, api_default_args', [ - (create_sms_sender(), {"is_default": "y", "sms_sender": "test"}, True), - (create_sms_sender(), {"sms_sender": "test"}, True), - (create_sms_sender(is_default=False), {"sms_sender": "test"}, False), - (create_sms_sender(is_default=False), {"is_default": "y", "sms_sender": "test"}, True) + (create_sms_sender(), {"is_default": ["y"], "sms_sender": "test"}, True), + (create_sms_sender(), {"is_default": [], "sms_sender": "test"}, True), + (create_sms_sender(is_default=False), {"is_default": [], "sms_sender": "test"}, False), + (create_sms_sender(is_default=False), {"is_default": ["y"], "sms_sender": "test"}, True) ]) def test_edit_sms_sender( sms_sender, diff --git a/tests/app/main/views/test_template_folders.py b/tests/app/main/views/test_template_folders.py index 08db7e007..91da73454 100644 --- a/tests/app/main/views/test_template_folders.py +++ b/tests/app/main/views/test_template_folders.py @@ -395,7 +395,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 +527,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 +538,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( diff --git a/tests/app/main/views/test_templates.py b/tests/app/main/views/test_templates.py index 02fd8365d..29fe54b27 100644 --- a/tests/app/main/views/test_templates.py +++ b/tests/app/main/views/test_templates.py @@ -167,7 +167,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) @@ -236,7 +236,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( @@ -257,7 +257,7 @@ 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_templates_and_folders = len(page.select('#template-list .govuk-label')) count_of_folders = len(page.select('.template-list-folder:first-child')) count_of_templates = count_of_templates_and_folders - count_of_folders diff --git a/tests/javascripts/collapsibleCheckboxes.test.js b/tests/javascripts/collapsibleCheckboxes.test.js index 24eb20239..063283fd1 100644 --- a/tests/javascripts/collapsibleCheckboxes.test.js +++ b/tests/javascripts/collapsibleCheckboxes.test.js @@ -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 += `
  • + + +
  • `; + } + + 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 += `
  • - - - ${descendents} -
  • `; - } - - return result; - }; // set up DOM document.body.innerHTML = - `
    -
    -
    - - Folders this team member can see - -
    -
      + `
      +
      +
      + + Folders this team member can see + +
      +
      +
      +
        ${_checkboxes(1, 10)}
      -
      -
    + +
    `; - 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();