diff --git a/addons/rose/addon/components/rose/pagination/index.hbs b/addons/rose/addon/components/rose/pagination/index.hbs index c7efbb142..3c7363f57 100644 --- a/addons/rose/addon/components/rose/pagination/index.hbs +++ b/addons/rose/addon/components/rose/pagination/index.hbs @@ -4,6 +4,7 @@ }} - `.hds-form-toggle input[name="${name}"]`; - const SCOPE_CHECKBOX_SELECTOR = (type, id) => - `tbody [data-test-${type}-scopes-table-row="${id}"] input`; - const GRANT_SCOPE_ROW_SELECTOR = (id) => - `tbody [data-test-grant-scope-row="${id}"]`; - const FILTER_DROPDOWN_SELECTOR = (name) => - `.search-filtering [name="${name}"] button`; - const FILTER_APPLY_BUTTON_SELECTOR = - '.search-filtering [data-test-dropdown-apply-button]'; - const TABLE_ROW_SELECTOR = 'tbody tr'; - const TABLE_SCOPE_SELECTOR = 'tbody tr:nth-child(2) a'; - const TABLE_PARENT_SCOPE_SELECTOR = 'tbody tr:nth-child(2) td:nth-child(3) a'; - const SAVE_BTN_SELECTOR = 'form [type="submit"]'; - const CANCEL_BTN_SELECTOR = '.rose-form-actions [type="button"]'; - const MANAGE_DROPDOWN_SELECTOR = '.hds-dropdown-toggle-button'; - const MANAGE_SCOPES_SELECTOR = '[data-test-manage-dropdown-scopes]'; - const SEARCH_INPUT_SELECTOR = '.search-filtering [type="search"]'; - const NO_RESULTS_MSG_SELECTOR = '[data-test-no-grant-scope-results]'; - const NO_SCOPES_MSG_SELECTOR = '.role-grant-scopes div'; - const NO_SCOPES_MSG_LINK_SELECTOR = - '.role-grant-scopes div div:nth-child(3) a'; - const BUTTON_ICON_SELECTOR = - '.hds-button__icon [data-test-icon="check-circle"]'; - const PAGINATION_SELECTOR = '.hds-pagination'; - const REMOVE_ORG_MODAL = (name) => - `[data-test-manage-scopes-remove-${name}-modal]`; - const REMOVE_ORG_PROJECTS_BUTTON = '.hds-modal .hds-button--color-primary'; - const REMOVE_ORG_ONLY_BUTTON = '.hds-modal .hds-button--color-secondary'; - const TABLE_ALL_CHECKBOX = 'thead tr [type="checkbox"]'; - const instances = { scopes: { global: null, @@ -72,11 +42,11 @@ module('Acceptance | roles | global-scope', function (hooks) { role: null, }; const urls = { - orgScope: null, roles: null, role: null, roleScopes: null, manageScopes: null, + manageScopesOrg: null, manageCustomScopes: null, }; @@ -105,6 +75,7 @@ module('Acceptance | roles | global-scope', function (hooks) { urls.role = `${urls.roles}/${instances.role.id}`; urls.roleScopes = `${urls.role}/scopes`; urls.manageScopes = `${urls.role}/manage-scopes`; + urls.manageScopesOrg = `${urls.manageScopes}/${instances.scopes.org.id}`; urls.manageCustomScopes = `${urls.manageScopes}/manage-custom-scopes`; }); @@ -117,125 +88,135 @@ module('Acceptance | roles | global-scope', function (hooks) { session.set('data.theme', 'light'); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); await a11yAudit(); assert.strictEqual(currentURL(), urls.roleScopes); assert - .dom(TABLE_ROW_SELECTOR) + .dom(commonSelectors.TABLE_ROW) .exists({ count: instances.role.grant_scope_ids.length }); }); test('user can navigate to scope from role grant scopes', async function (assert) { + const grantScopeUrl = `/scopes/${instances.role.grant_scope_ids[1]}`; await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); - await click(TABLE_SCOPE_SELECTOR); + await click(commonSelectors.HREF(urls.roleScopes)); + await click(commonSelectors.TABLE_RESOURCE_LINK(grantScopeUrl)); - assert.strictEqual( - currentURL(), - `/scopes/${instances.role.grant_scope_ids[1]}/scopes`, - ); + assert.strictEqual(currentURL(), `${grantScopeUrl}/scopes`); }); test('user can search for existing grant scope on a role', async function (assert) { await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[0])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[0])) + .isVisible(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) + .isVisible(); - await fillIn(SEARCH_INPUT_SELECTOR, instances.role.grant_scope_ids[0]); + await fillIn( + commonSelectors.SEARCH_INPUT, + instances.role.grant_scope_ids[0], + ); await waitUntil( () => - findAll(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) + findAll(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) .length === 0, ); - assert.dom(PAGINATION_SELECTOR).exists(); + assert.dom(commonSelectors.PAGINATION).isVisible(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[0])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[0])) + .isVisible(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) .doesNotExist(); }); test('user can search for grant scopes on a role and get no results', async function (assert) { await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[0])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[0])) + .isVisible(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) + .isVisible(); - await fillIn(SEARCH_INPUT_SELECTOR, 'fake scope that does not exist'); - await waitUntil(() => findAll(NO_RESULTS_MSG_SELECTOR).length === 1); + await fillIn( + commonSelectors.SEARCH_INPUT, + 'fake scope that does not exist', + ); + await waitUntil( + () => findAll(selectors.NO_RESULTS_GRANT_SCOPE_MSG).length === 1, + ); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[0])) + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[0])) .doesNotExist(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) .doesNotExist(); - assert.dom(NO_RESULTS_MSG_SELECTOR).includesText('No results found'); + assert + .dom(selectors.NO_RESULTS_GRANT_SCOPE_MSG) + .includesText('No results found'); }); test('user can filter for grant scopes on a role by parent scope', async function (assert) { await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[0])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[0])) + .isVisible(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) + .isVisible(); - await click(FILTER_DROPDOWN_SELECTOR('parent-scope')); - await click(`input[value="${instances.scopes.global.id}"]`); - await click(FILTER_APPLY_BUTTON_SELECTOR); + await click(commonSelectors.FILTER_DROPDOWN('parent-scope')); + await click( + commonSelectors.FILTER_DROPDOWN_ITEM(instances.scopes.global.id), + ); + await click(commonSelectors.FILTER_DROPDOWN_ITEM_APPLY_BTN('parent-scope')); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[0])) + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[0])) .doesNotExist(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) + .isVisible(); }); test('user can filter for grant scopes on a role by type', async function (assert) { await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[0])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[0])) + .isVisible(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) + .isVisible(); - await click(FILTER_DROPDOWN_SELECTOR('type')); - await click(`input[value="${TYPE_SCOPE_ORG}"]`); - await click(FILTER_APPLY_BUTTON_SELECTOR); + await click(commonSelectors.FILTER_DROPDOWN('type')); + await click(commonSelectors.FILTER_DROPDOWN_ITEM(TYPE_SCOPE_ORG)); + await click(commonSelectors.FILTER_DROPDOWN_ITEM_APPLY_BTN('type')); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[0])) + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[0])) .doesNotExist(); assert - .dom(GRANT_SCOPE_ROW_SELECTOR(instances.role.grant_scope_ids[1])) - .exists(); + .dom(selectors.GRANT_SCOPE_ROW(instances.role.grant_scope_ids[1])) + .isVisible(); }); test('user can navigate to parent scope from role grant scopes', async function (assert) { @@ -244,8 +225,8 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); - await click(TABLE_PARENT_SCOPE_SELECTOR); + await click(commonSelectors.HREF(urls.roleScopes)); + await click(selectors.GRANT_SCOPE_PARENT_SCOPE); assert.strictEqual( currentURL(), @@ -257,10 +238,10 @@ module('Acceptance | roles | global-scope', function (hooks) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); - assert.dom(NO_SCOPES_MSG_SELECTOR).includesText('No scopes added'); - assert.dom(NO_SCOPES_MSG_LINK_SELECTOR).isVisible(); + assert.dom(selectors.NO_SCOPES_MSG).includesText('No scopes added'); + assert.dom(selectors.NO_SCOPES_MSG_LINK).isVisible(); }); test('user does not see action to add scopes when role has no grant scopes without proper permissions', async function (assert) { @@ -272,68 +253,68 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); - assert.dom(NO_SCOPES_MSG_LINK_SELECTOR).doesNotExist(); + assert.dom(selectors.NO_SCOPES_MSG_LINK).doesNotExist(); }); test('correct toggles are visible for global level role on manage scopes page', async function (assert) { await visit(urls.role); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)).isVisible(); - assert.dom(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_CHILDREN)).isVisible(); - assert.dom(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_DESCENDANTS)).isVisible(); + assert.dom(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)).isVisible(); + assert.dom(selectors.SCOPE_TOGGLE(GRANT_SCOPE_CHILDREN)).isVisible(); + assert.dom(selectors.SCOPE_TOGGLE(GRANT_SCOPE_DESCENDANTS)).isVisible(); }); test('user can save scope keywords to add on manage scopes page', async function (assert) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); - assert.strictEqual(findAll(TABLE_ROW_SELECTOR).length, 0); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); await a11yAudit(); assert.strictEqual(currentURL(), urls.manageScopes); // Click three times to select, unselect, then reselect (for coverage) - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(SAVE_BTN_SELECTOR); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.strictEqual(findAll(TABLE_ROW_SELECTOR).length, 1); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 1 }); }); test('user can cancel scope keywords to add on manage scopes page', async function (assert) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); - assert.strictEqual(findAll(TABLE_ROW_SELECTOR).length, 0); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); assert.strictEqual(currentURL(), urls.manageScopes); // Click three times to select, unselect, then reselect (for coverage) - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(CANCEL_BTN_SELECTOR); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(commonSelectors.CANCEL_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.strictEqual(findAll(TABLE_ROW_SELECTOR).length, 0); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); }); test('shows error message on scope save on manage scopes page', async function (assert) { @@ -352,10 +333,10 @@ module('Acceptance | roles | global-scope', function (hooks) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(SAVE_BTN_SELECTOR); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(commonSelectors.SAVE_BTN); assert.dom(commonSelectors.ALERT_TOAST_BODY).isVisible(); }); @@ -365,10 +346,10 @@ module('Acceptance | roles | global-scope', function (hooks) { confirmService.enabled = true; await visit(urls.role); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(`[href="${urls.roles}"]`); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(commonSelectors.HREF(urls.roles)); assert.dom(commonSelectors.MODAL_WARNING).isVisible(); @@ -382,10 +363,10 @@ module('Acceptance | roles | global-scope', function (hooks) { confirmService.enabled = true; await visit(urls.role); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(SCOPE_TOGGLE_SELECTOR(GRANT_SCOPE_THIS)); - await click(`[href="${urls.roles}"]`); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(selectors.SCOPE_TOGGLE(GRANT_SCOPE_THIS)); + await click(commonSelectors.HREF(urls.roles)); assert.dom(commonSelectors.MODAL_WARNING).isVisible(); @@ -404,62 +385,62 @@ module('Acceptance | roles | global-scope', function (hooks) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); assert.strictEqual(currentURL(), urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); await a11yAudit(); assert.strictEqual(currentURL(), urls.manageCustomScopes); // Click three times to select, unselect, then reselect (for coverage) - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); - await click(SAVE_BTN_SELECTOR); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(BUTTON_ICON_SELECTOR).isVisible(); + assert.dom(selectors.MANAGE_CUSTOM_SCOPES_BUTTON_ICON).isVisible(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 1 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 1 }); }); test('user can cancel custom scopes to add on manage custom scopes page', async function (assert) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); assert.strictEqual(currentURL(), urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); // Click three times to select, unselect, then reselect (for coverage) - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); - await click(CANCEL_BTN_SELECTOR); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); + await click(commonSelectors.CANCEL_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - await click(CANCEL_BTN_SELECTOR); + await click(commonSelectors.CANCEL_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); }); test('shows error message on custom scope save on manage custom scopes page', async function (assert) { @@ -478,11 +459,11 @@ module('Acceptance | roles | global-scope', function (hooks) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(`[href="${urls.manageCustomScopes}"]`); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); - await click(SAVE_BTN_SELECTOR); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); + await click(commonSelectors.SAVE_BTN); assert.dom(commonSelectors.ALERT_TOAST_BODY).isVisible(); }); @@ -492,10 +473,10 @@ module('Acceptance | roles | global-scope', function (hooks) { confirmService.enabled = true; await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); - await click(`[href="${urls.roles}"]`); + await click(commonSelectors.HREF(urls.roles)); assert.dom(commonSelectors.MODAL_WARNING).isVisible(); @@ -509,10 +490,10 @@ module('Acceptance | roles | global-scope', function (hooks) { confirmService.enabled = true; await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); - await click(`[href="${urls.roles}"]`); + await click(commonSelectors.HREF(urls.roles)); assert.dom(commonSelectors.MODAL_WARNING).isVisible(); @@ -527,21 +508,21 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); - assert.dom(REMOVE_ORG_MODAL('org')).isVisible(); + assert.dom(selectors.REMOVE_ORG_MODAL('org')).isVisible(); - await click(REMOVE_ORG_ONLY_BUTTON); - await click(SAVE_BTN_SELECTOR); + await click(selectors.REMOVE_ORG_ONLY_BTN('org')); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(BUTTON_ICON_SELECTOR).isVisible(); + assert.dom(selectors.MANAGE_CUSTOM_SCOPES_BUTTON_ICON).isVisible(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 1 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 1 }); }); test('user can choose to deselect an org and projects using modal on manage custom scopes page', async function (assert) { @@ -550,41 +531,41 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); - assert.dom(REMOVE_ORG_MODAL('org')).isVisible(); + assert.dom(selectors.REMOVE_ORG_MODAL('org')).isVisible(); - await click(REMOVE_ORG_PROJECTS_BUTTON); - await click(SAVE_BTN_SELECTOR); + await click(selectors.REMOVE_ORG_PROJECTS_BTN('org')); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(BUTTON_ICON_SELECTOR).isVisible(); + assert.dom(selectors.MANAGE_CUSTOM_SCOPES_BUTTON_ICON).isVisible(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); }); test('user cannot trigger modal when deselecting an org with no projects selected on manage custom scopes page', async function (assert) { instances.role.update({ grant_scope_ids: [instances.scopes.org.id] }); await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); - await click(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)); - assert.dom(REMOVE_ORG_MODAL('org')).doesNotExist(); + assert.dom(selectors.REMOVE_ORG_MODAL('org')).doesNotExist(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(BUTTON_ICON_SELECTOR).isVisible(); + assert.dom(selectors.MANAGE_CUSTOM_SCOPES_BUTTON_ICON).isVisible(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); }); test('user can choose to only deselect all orgs using modal on manage custom scopes page', async function (assert) { @@ -593,24 +574,24 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); // Click once to select all - await click(TABLE_ALL_CHECKBOX); + await click(selectors.TABLE_ALL_CHECKBOX); // Click once more to deselect all - await click(TABLE_ALL_CHECKBOX); + await click(selectors.TABLE_ALL_CHECKBOX); - assert.dom(REMOVE_ORG_MODAL('all-orgs')).isVisible(); + assert.dom(selectors.REMOVE_ORG_MODAL('all-orgs')).isVisible(); - await click(REMOVE_ORG_ONLY_BUTTON); - await click(SAVE_BTN_SELECTOR); + await click(selectors.REMOVE_ORG_ONLY_BTN('all-orgs')); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(BUTTON_ICON_SELECTOR).isVisible(); + assert.dom(selectors.MANAGE_CUSTOM_SCOPES_BUTTON_ICON).isVisible(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 1 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 1 }); }); test('user can choose to deselect all orgs and projects using modal on manage custom scopes page', async function (assert) { @@ -619,47 +600,47 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); // Click once to select all - await click(TABLE_ALL_CHECKBOX); + await click(selectors.TABLE_ALL_CHECKBOX); // Click once more to deselect all - await click(TABLE_ALL_CHECKBOX); + await click(selectors.TABLE_ALL_CHECKBOX); - assert.dom(REMOVE_ORG_MODAL('all-orgs')).isVisible(); + assert.dom(selectors.REMOVE_ORG_MODAL('all-orgs')).isVisible(); - await click(REMOVE_ORG_PROJECTS_BUTTON); - await click(SAVE_BTN_SELECTOR); + await click(selectors.REMOVE_ORG_PROJECTS_BTN('all-orgs')); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(BUTTON_ICON_SELECTOR).isVisible(); + assert.dom(selectors.MANAGE_CUSTOM_SCOPES_BUTTON_ICON).isVisible(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); }); test('user cannot trigger modal when deselecting all orgs with no projects selected on manage custom scopes page', async function (assert) { instances.role.update({ grant_scope_ids: [instances.scopes.org.id] }); await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); // Click once to select all - await click(TABLE_ALL_CHECKBOX); + await click(selectors.TABLE_ALL_CHECKBOX); // Click once more to deselect all - await click(TABLE_ALL_CHECKBOX); + await click(selectors.TABLE_ALL_CHECKBOX); - assert.dom(REMOVE_ORG_MODAL('all-orgs')).doesNotExist(); + assert.dom(selectors.REMOVE_ORG_MODAL('all-orgs')).doesNotExist(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(BUTTON_ICON_SELECTOR).isVisible(); + assert.dom(selectors.MANAGE_CUSTOM_SCOPES_BUTTON_ICON).isVisible(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); }); test('user can search for a specific org scope by id on manage custom scopes page', async function (assert) { @@ -669,22 +650,23 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); assert - .dom(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)) - .exists(); - assert.dom(SCOPE_CHECKBOX_SELECTOR('org', anotherOrg.id)).exists(); + .dom(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)) + .isVisible(); + assert.dom(selectors.SCOPE_CHECKBOX('org', anotherOrg.id)).isVisible(); - await fillIn(SEARCH_INPUT_SELECTOR, instances.scopes.org.id); + await fillIn(commonSelectors.SEARCH_INPUT, instances.scopes.org.id); await waitUntil( - () => findAll(SCOPE_CHECKBOX_SELECTOR('org', anotherOrg.id)).length === 0, + () => + findAll(selectors.SCOPE_CHECKBOX('org', anotherOrg.id)).length === 0, ); assert - .dom(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)) - .exists(); - assert.dom(SCOPE_CHECKBOX_SELECTOR('org', anotherOrg.id)).doesNotExist(); + .dom(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)) + .isVisible(); + assert.dom(selectors.SCOPE_CHECKBOX('org', anotherOrg.id)).doesNotExist(); }); test('user can search for org scopes and get no results on manage custom scopes page', async function (assert) { @@ -694,101 +676,104 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); assert - .dom(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)) - .exists(); - assert.dom(SCOPE_CHECKBOX_SELECTOR('org', anotherOrg.id)).exists(); + .dom(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)) + .isVisible(); + assert.dom(selectors.SCOPE_CHECKBOX('org', anotherOrg.id)).isVisible(); - await fillIn(SEARCH_INPUT_SELECTOR, 'fake scope that does not exist'); - await waitUntil(() => findAll(NO_RESULTS_MSG_SELECTOR).length === 1); + await fillIn( + commonSelectors.SEARCH_INPUT, + 'fake scope that does not exist', + ); + await waitUntil( + () => findAll(selectors.NO_RESULTS_GRANT_SCOPE_MSG).length === 1, + ); assert - .dom(SCOPE_CHECKBOX_SELECTOR('org', instances.scopes.org.id)) + .dom(selectors.SCOPE_CHECKBOX('org', instances.scopes.org.id)) .doesNotExist(); - assert.dom(SCOPE_CHECKBOX_SELECTOR('org', anotherOrg.id)).doesNotExist(); - assert.dom(NO_RESULTS_MSG_SELECTOR).includesText('No results found'); + assert.dom(selectors.SCOPE_CHECKBOX('org', anotherOrg.id)).doesNotExist(); + assert + .dom(selectors.NO_RESULTS_GRANT_SCOPE_MSG) + .includesText('No results found'); }); test('user can save custom scopes to add on manage org projects page', async function (assert) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(`[href="${urls.manageCustomScopes}"]`); - await click( - `tbody [href="${urls.manageScopes}/${instances.scopes.org.id}"]`, - ); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(commonSelectors.TABLE_RESOURCE_LINK(urls.manageScopesOrg)); await a11yAudit(); // Click three times to select, unselect, then reselect (for coverage) await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageCustomScopes); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - assert.dom(BUTTON_ICON_SELECTOR).isVisible(); + assert.dom(selectors.MANAGE_CUSTOM_SCOPES_BUTTON_ICON).isVisible(); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 1 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 1 }); }); test('user can cancel custom scopes to add on manage org projects page', async function (assert) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(`[href="${urls.roleScopes}"]`); + await click(commonSelectors.HREF(urls.roleScopes)); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(`[href="${urls.manageCustomScopes}"]`); - await click( - `tbody [href="${urls.manageScopes}/${instances.scopes.org.id}"]`, - ); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(commonSelectors.TABLE_RESOURCE_LINK(urls.manageScopesOrg)); // Click three times to select, unselect, then reselect (for coverage) await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); - await click(CANCEL_BTN_SELECTOR); + await click(commonSelectors.CANCEL_BTN); assert.strictEqual(currentURL(), urls.manageCustomScopes); - await click(CANCEL_BTN_SELECTOR); + await click(commonSelectors.CANCEL_BTN); assert.strictEqual(currentURL(), urls.manageScopes); - await click(CANCEL_BTN_SELECTOR); + await click(commonSelectors.CANCEL_BTN); assert.strictEqual(currentURL(), urls.roleScopes); - assert.dom(TABLE_ROW_SELECTOR).exists({ count: 0 }); + assert.dom(commonSelectors.TABLE_ROW).exists({ count: 0 }); }); test('shows error message on custom scope save on manage org projects page', async function (assert) { @@ -807,16 +792,14 @@ module('Acceptance | roles | global-scope', function (hooks) { instances.role.update({ grant_scope_ids: [] }); await visit(urls.role); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(commonSelectors.TABLE_RESOURCE_LINK(urls.manageScopesOrg)); await click( - `tbody [href="${urls.manageScopes}/${instances.scopes.org.id}"]`, + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); - await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), - ); - await click(SAVE_BTN_SELECTOR); + await click(commonSelectors.SAVE_BTN); assert.dom(commonSelectors.ALERT_TOAST_BODY).isVisible(); }); @@ -826,14 +809,12 @@ module('Acceptance | roles | global-scope', function (hooks) { confirmService.enabled = true; await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(commonSelectors.TABLE_RESOURCE_LINK(urls.manageScopesOrg)); await click( - `tbody [href="${urls.manageScopes}/${instances.scopes.org.id}"]`, + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); - await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), - ); - await click(`[href="${urls.roles}"]`); + await click(commonSelectors.HREF(urls.roles)); assert.dom(commonSelectors.MODAL_WARNING).isVisible(); @@ -847,14 +828,12 @@ module('Acceptance | roles | global-scope', function (hooks) { confirmService.enabled = true; await visit(urls.manageScopes); - await click(`[href="${urls.manageCustomScopes}"]`); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(commonSelectors.TABLE_RESOURCE_LINK(urls.manageScopesOrg)); await click( - `tbody [href="${urls.manageScopes}/${instances.scopes.org.id}"]`, + selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id), ); - await click( - SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id), - ); - await click(`[href="${urls.roles}"]`); + await click(commonSelectors.HREF(urls.roles)); assert.dom(commonSelectors.MODAL_WARNING).isVisible(); @@ -873,30 +852,30 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.role); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(`[href="${urls.manageCustomScopes}"]`); - await click( - `tbody [href="${urls.manageScopes}/${instances.scopes.org.id}"]`, - ); + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(commonSelectors.TABLE_RESOURCE_LINK(urls.manageScopesOrg)); assert - .dom(SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id)) - .exists(); - assert.dom(SCOPE_CHECKBOX_SELECTOR('project', anotherProject.id)).exists(); + .dom(selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id)) + .isVisible(); + assert + .dom(selectors.SCOPE_CHECKBOX('project', anotherProject.id)) + .isVisible(); - await fillIn(SEARCH_INPUT_SELECTOR, instances.scopes.project.id); + await fillIn(commonSelectors.SEARCH_INPUT, instances.scopes.project.id); await waitUntil( () => - findAll(SCOPE_CHECKBOX_SELECTOR('project', anotherProject.id)) + findAll(selectors.SCOPE_CHECKBOX('project', anotherProject.id)) .length === 0, ); assert - .dom(SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id)) - .exists(); + .dom(selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id)) + .isVisible(); assert - .dom(SCOPE_CHECKBOX_SELECTOR('project', anotherProject.id)) + .dom(selectors.SCOPE_CHECKBOX('project', anotherProject.id)) .doesNotExist(); }); @@ -907,27 +886,34 @@ module('Acceptance | roles | global-scope', function (hooks) { }); await visit(urls.role); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(MANAGE_SCOPES_SELECTOR); - await click(`[href="${urls.manageCustomScopes}"]`); - await click( - `tbody [href="${urls.manageScopes}/${instances.scopes.org.id}"]`, + await click(selectors.MANAGE_DROPDOWN_ROLES); + await click(selectors.MANAGE_DROPDOWN_ROLES_SCOPES); + await click(commonSelectors.HREF(urls.manageCustomScopes)); + await click(commonSelectors.TABLE_RESOURCE_LINK(urls.manageScopesOrg)); + + assert + .dom(selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id)) + .isVisible(); + assert + .dom(selectors.SCOPE_CHECKBOX('project', anotherProject.id)) + .isVisible(); + + await fillIn( + commonSelectors.SEARCH_INPUT, + 'fake scope that does not exist', + ); + await waitUntil( + () => findAll(selectors.NO_RESULTS_GRANT_SCOPE_MSG).length === 1, ); assert - .dom(SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id)) - .exists(); - assert.dom(SCOPE_CHECKBOX_SELECTOR('project', anotherProject.id)).exists(); - - await fillIn(SEARCH_INPUT_SELECTOR, 'fake scope that does not exist'); - await waitUntil(() => findAll(NO_RESULTS_MSG_SELECTOR).length === 1); - - assert - .dom(SCOPE_CHECKBOX_SELECTOR('project', instances.scopes.project.id)) + .dom(selectors.SCOPE_CHECKBOX('project', instances.scopes.project.id)) .doesNotExist(); assert - .dom(SCOPE_CHECKBOX_SELECTOR('project', anotherProject.id)) + .dom(selectors.SCOPE_CHECKBOX('project', anotherProject.id)) .doesNotExist(); - assert.dom(NO_RESULTS_MSG_SELECTOR).includesText('No results found'); + assert + .dom(selectors.NO_RESULTS_GRANT_SCOPE_MSG) + .includesText('No results found'); }); }); diff --git a/ui/admin/tests/acceptance/roles/list-test.js b/ui/admin/tests/acceptance/roles/list-test.js index 131463aa9..c1f36ce2e 100644 --- a/ui/admin/tests/acceptance/roles/list-test.js +++ b/ui/admin/tests/acceptance/roles/list-test.js @@ -17,21 +17,14 @@ import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; import { authenticateSession } from 'ember-simple-auth/test-support'; import { GRANT_SCOPE_THIS } from 'api/models/role'; +import * as selectors from './selectors'; +import * as commonSelectors from 'admin/tests/helpers/selectors'; module('Acceptance | roles | list', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); setupIndexedDb(hooks); - const ROLE_BADGE_SELECTOR = (id) => - `tbody [data-test-role-row="${id}"] td:nth-child(2) .hds-badge__text`; - const ROLE_TOOLTIP_BTN_SELECTOR = (id) => - `tbody [data-test-role-row="${id}"] td:nth-child(2) .hds-tooltip-button`; - const ROLE_TOOLTIP_CONTENT_SELECTOR = (id) => - `tbody [data-test-role-row="${id}"] td:nth-child(2) [data-tippy-root]`; - const SEARCH_INPUT_SELECTOR = '.search-filtering [type="search"]'; - const NO_RESULTS_MSG_SELECTOR = '[data-test-no-role-results]'; - const instances = { scopes: { global: null, @@ -72,64 +65,66 @@ module('Acceptance | roles | list', function (hooks) { test('users can navigate to roles with proper authorization', async function (assert) { await visit(urls.globalScope); - await click(`[href="${urls.orgScope}"]`); + await click(commonSelectors.HREF(urls.orgScope)); assert.true( instances.scopes.org.authorized_collection_actions.roles.includes('list'), ); - assert.dom(`[href="${urls.roles}"]`).exists(); + assert.dom(commonSelectors.HREF(urls.roles)).isVisible(); }); test('users cannot navigate to index without either list or create actions', async function (assert) { instances.scopes.org.authorized_collection_actions.roles = []; await visit(urls.globalScope); - await click(`[href="${urls.orgScope}"]`); + await click(commonSelectors.HREF(urls.orgScope)); assert.false( instances.scopes.org.authorized_collection_actions.roles.includes('list'), ); - assert.dom(`[href="${urls.roles}"]`).doesNotExist(); + assert.dom(commonSelectors.HREF(urls.roles)).doesNotExist(); }); test('users can navigate to index with only create action', async function (assert) { instances.scopes.org.authorized_collection_actions.roles = ['create']; await visit(urls.globalScope); - await click(`[href="${urls.orgScope}"]`); + await click(commonSelectors.HREF(urls.orgScope)); - assert.dom(`[href="${urls.roles}"]`).exists(); + assert.dom(commonSelectors.HREF(urls.roles)).isVisible(); }); - test('user can search for a specifc role by id', async function (assert) { + test('user can search for a specific role by id', async function (assert) { await visit(urls.orgScope); - await click(`[href="${urls.roles}"]`); + await click(commonSelectors.HREF(urls.roles)); - assert.dom(`[href="${urls.role1}"]`).exists(); - assert.dom(`[href="${urls.role2}"]`).exists(); + assert.dom(commonSelectors.HREF(urls.role1)).isVisible(); + assert.dom(commonSelectors.HREF(urls.role2)).isVisible(); - await fillIn(SEARCH_INPUT_SELECTOR, instances.role1.id); - await waitUntil(() => findAll(`[href="${urls.role2}"]`).length === 0); + await fillIn(commonSelectors.SEARCH_INPUT, instances.role1.id); + await waitUntil( + () => findAll(commonSelectors.HREF(urls.role2)).length === 0, + ); - assert.dom(`[href="${urls.role1}"]`).exists(); - assert.dom(`[href="${urls.role2}"]`).doesNotExist(); + assert.dom(commonSelectors.HREF(urls.role1)).isVisible(); + assert.dom(commonSelectors.HREF(urls.role2)).doesNotExist(); }); test('user can search for roles and get no results', async function (assert) { await visit(urls.orgScope); - await click(`[href="${urls.roles}"]`); + await click(commonSelectors.HREF(urls.roles)); - assert.dom(`[href="${urls.role1}"]`).exists(); - assert.dom(`[href="${urls.role2}"]`).exists(); + assert.dom(commonSelectors.HREF(urls.role1)).isVisible(); + assert.dom(commonSelectors.HREF(urls.role2)).isVisible(); - await fillIn(SEARCH_INPUT_SELECTOR, 'fake role that does not exist'); - await waitUntil(() => findAll(NO_RESULTS_MSG_SELECTOR).length === 1); + await fillIn(commonSelectors.SEARCH_INPUT, 'fake role that does not exist'); + await waitUntil(() => findAll(selectors.NO_RESULTS_MSG).length === 1); - assert.dom(`[href="${urls.role1}"]`).doesNotExist(); - assert.dom(`[href="${urls.role2}"]`).doesNotExist(); - assert.dom(NO_RESULTS_MSG_SELECTOR).includesText('No results found'); + assert.dom(commonSelectors.HREF(urls.role1)).doesNotExist(); + assert.dom(commonSelectors.HREF(urls.role2)).doesNotExist(); + assert.dom(selectors.NO_RESULTS_MSG).includesText('No results found'); }); test('correct badge in grants applied column is visible to user', async function (assert) { @@ -138,22 +133,22 @@ module('Acceptance | roles | list', function (hooks) { ); await visit(urls.orgScope); - await click(`[href="${urls.roles}"]`); + await click(commonSelectors.HREF(urls.roles)); assert.true(instances.role2.grant_scope_ids.includes(GRANT_SCOPE_THIS)); - assert.dom(ROLE_BADGE_SELECTOR(instances.role1.id)).hasText('No'); - assert.dom(ROLE_BADGE_SELECTOR(instances.role2.id)).hasText('Yes'); + assert.dom(selectors.ROLE_BADGE(instances.role1.id)).hasText('No'); + assert.dom(selectors.ROLE_BADGE(instances.role2.id)).hasText('Yes'); - await focus(ROLE_TOOLTIP_BTN_SELECTOR(instances.role1.id)); + await focus(selectors.ROLE_TOOLTIP_BTN(instances.role1.id)); assert - .dom(ROLE_TOOLTIP_CONTENT_SELECTOR(instances.role1.id)) + .dom(selectors.ROLE_TOOLTIP_CONTENT(instances.role1.id)) .hasText('The grants on this role have not been applied to this scope.'); - await focus(ROLE_TOOLTIP_BTN_SELECTOR(instances.role2.id)); + await focus(selectors.ROLE_TOOLTIP_BTN(instances.role2.id)); assert - .dom(ROLE_TOOLTIP_CONTENT_SELECTOR(instances.role2.id)) + .dom(selectors.ROLE_TOOLTIP_CONTENT(instances.role2.id)) .hasText('The grants on this role have been applied to this scope.'); }); }); diff --git a/ui/admin/tests/acceptance/roles/selectors.js b/ui/admin/tests/acceptance/roles/selectors.js index 4dbdc3fcb..4283610eb 100644 --- a/ui/admin/tests/acceptance/roles/selectors.js +++ b/ui/admin/tests/acceptance/roles/selectors.js @@ -12,3 +12,34 @@ export const MANAGE_DROPDOWN_ROLES_SCOPES = '[data-test-manage-dropdown-scopes]'; export const MANAGE_DROPDOWN_ROLES_REMOVE = '[data-test-manage-roles-dropdown] div:last-child button'; + +export const ROLE_BADGE = (id) => + `tbody [data-test-role-row="${id}"] td:nth-child(2) .hds-badge__text`; +export const ROLE_TOOLTIP_BTN = (id) => + `tbody [data-test-role-row="${id}"] td:nth-child(2) .hds-tooltip-button`; +export const ROLE_TOOLTIP_CONTENT = (id) => + `tbody [data-test-role-row="${id}"] td:nth-child(2) [data-tippy-root]`; +export const GRANT_SCOPE_ROW = (id) => + `tbody [data-test-grant-scope-row="${id}"]`; +export const GRANT_SCOPE_PARENT_SCOPE = + 'tbody tr:nth-child(2) td:nth-child(3) a'; +export const TABLE_ALL_CHECKBOX = 'thead input[type="checkbox"]'; + +export const NO_RESULTS_MSG = '[data-test-no-role-results]'; +export const NO_RESULTS_GRANT_SCOPE_MSG = '[data-test-no-grant-scope-results]'; + +export const NO_SCOPES_MSG = '.role-grant-scopes div'; +export const NO_SCOPES_MSG_LINK = '.role-grant-scopes div div:nth-child(3) a'; + +// Manage scopes selectors +export const SCOPE_TOGGLE = (name) => `.hds-form-toggle input[name="${name}"]`; +export const SCOPE_CHECKBOX = (type, id) => + `tbody [data-test-${type}-scopes-table-row="${id}"] input`; +export const MANAGE_CUSTOM_SCOPES_BUTTON_ICON = + '[data-test-manage-custom-scopes-button] [data-test-icon="check-circle"]'; +export const REMOVE_ORG_MODAL = (name) => + `[data-test-manage-scopes-remove-${name}-modal]`; +export const REMOVE_ORG_ONLY_BTN = (name) => + `[data-test-manage-scopes-remove-${name}-modal] div:nth-child(3) button:last-of-type`; +export const REMOVE_ORG_PROJECTS_BTN = (name) => + `[data-test-manage-scopes-remove-${name}-modal] div:nth-child(3) button`; diff --git a/ui/admin/tests/helpers/selectors.js b/ui/admin/tests/helpers/selectors.js index 34a6f187b..026c99a72 100644 --- a/ui/admin/tests/helpers/selectors.js +++ b/ui/admin/tests/helpers/selectors.js @@ -62,3 +62,5 @@ export const FILTER_DROPDOWN = (filterName) => export const FILTER_DROPDOWN_ITEM = (itemList) => `input[value="${itemList}"]`; export const FILTER_DROPDOWN_ITEM_APPLY_BTN = (filterName) => `.search-filtering [name="${filterName}"] .hds-dropdown__footer button`; + +export const PAGINATION = '[data-test-pagination]';