diff --git a/ui/admin/tests/acceptance/scopes/add-storage-policy-test.js b/ui/admin/tests/acceptance/scopes/add-storage-policy-test.js index 8f7d83aed..1798229d7 100644 --- a/ui/admin/tests/acceptance/scopes/add-storage-policy-test.js +++ b/ui/admin/tests/acceptance/scopes/add-storage-policy-test.js @@ -4,13 +4,14 @@ */ import { module, test } from 'qunit'; -import { visit, find, click, currentURL } from '@ember/test-helpers'; +import { visit, click, currentURL } from '@ember/test-helpers'; import { setupApplicationTest } from 'admin/tests/helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import a11yAudit from 'ember-a11y-testing/test-support/audit'; import { authenticateSession } from 'ember-simple-auth/test-support'; - import select from '@ember/test-helpers/dom/select'; +import * as commonSelectors from 'admin/tests/helpers/selectors'; +import * as selectors from './selectors'; module('Acceptance | scope | add storage policy', function (hooks) { setupApplicationTest(hooks); @@ -20,16 +21,6 @@ module('Acceptance | scope | add storage policy', function (hooks) { let policyOne; let policyTwo; - const SETTINGS_LINK_SELECTOR = '.policy-sidebar .hds-link-standalone'; - const ENABLE_BUTTON_SELECTOR = '.policy-sidebar .hds-button'; - const DROPDOWN_SELECTOR = '[name=policy_id]'; - - const LINK_LIST_SELECTOR_ITEM_TEXT = '.link-list-item__text'; - - const LINK_TO_NEW_STORAGE_POLICY = '.hds-link-standalone'; - const SAVE_BTN_SELECTOR = '.hds-button--color-primary'; - const CANCEL_BTN_SELECTOR = '.hds-button--color-secondary'; - // Instances const instances = { scopes: { @@ -79,16 +70,21 @@ module('Acceptance | scope | add storage policy', function (hooks) { test('cannot attach policy on a scope without proper authorization', async function (assert) { assert.false(featuresService.isEnabled('ssh-session-recording')); + await visit(urls.orgScopeEdit); await a11yAudit(); - assert.dom('.policy-sidebar a').doesNotExist(); + + assert.dom(selectors.STORAGE_POLICY_SIDEBAR).doesNotExist(); }); test('users can click on add storage policy button in the sidebar and it takes them to add a policy', async function (assert) { featuresService.enable('ssh-session-recording'); await visit(urls.orgScopeEdit); - assert.dom(SETTINGS_LINK_SELECTOR).doesNotExist(); - await click(ENABLE_BUTTON_SELECTOR); + + assert.dom(selectors.ADD_STORAGE_POLICY_LINK).doesNotExist(); + + await click(selectors.ADD_STORAGE_POLICY_BTN); + assert.strictEqual(currentURL(), urls.addStoragePolicy); }); @@ -98,38 +94,42 @@ module('Acceptance | scope | add storage policy', function (hooks) { storagePolicyId: policyOne.id, }); await visit(urls.orgScopeEdit); - await click(SETTINGS_LINK_SELECTOR); + + await click(selectors.ADD_STORAGE_POLICY_LINK); + assert.strictEqual(currentURL(), urls.addStoragePolicy); }); test('link to add new storage policy should be displayed and redirect to new storage policy form', async function (assert) { featuresService.enable('ssh-session-recording'); await visit(urls.orgScopeEdit); - await click(ENABLE_BUTTON_SELECTOR); + await click(selectors.ADD_STORAGE_POLICY_BTN); + assert.strictEqual(currentURL(), urls.addStoragePolicy); - assert.dom(LINK_TO_NEW_STORAGE_POLICY).isVisible(); - await click(LINK_TO_NEW_STORAGE_POLICY); + assert.dom(commonSelectors.HREF(urls.newPolicy)).isVisible(); + + await click(commonSelectors.HREF(urls.newPolicy)); + assert.strictEqual(currentURL(), urls.newPolicy); }); test('can assign a storage policy for the scope', async function (assert) { featuresService.enable('ssh-session-recording'); await visit(urls.orgScopeEdit); - await click(ENABLE_BUTTON_SELECTOR); + await click(selectors.ADD_STORAGE_POLICY_BTN); assert.strictEqual(currentURL(), urls.addStoragePolicy); - assert.dom(DROPDOWN_SELECTOR).hasNoValue(); - await select(DROPDOWN_SELECTOR, policyTwo.id); - assert.dom(DROPDOWN_SELECTOR).hasValue(); - await click(SAVE_BTN_SELECTOR); + assert.dom(selectors.FIELD_STORAGE_POLICY_SELECT).hasNoValue(); + + await select(selectors.FIELD_STORAGE_POLICY_SELECT, policyTwo.id); + + assert.dom(selectors.FIELD_STORAGE_POLICY_SELECT).hasValue(); + + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.orgScopeEdit); - - assert.strictEqual( - find(LINK_LIST_SELECTOR_ITEM_TEXT).textContent.trim(), - policyTwo.name, - ); + assert.dom(commonSelectors.LINK_LIST_ITEM_TEXT).hasText(policyTwo.name); }); test('can cancel changes to an existing storage policy selection', async function (assert) { @@ -139,18 +139,16 @@ module('Acceptance | scope | add storage policy', function (hooks) { }); await visit(urls.orgScopeEdit); - await click(SETTINGS_LINK_SELECTOR); + await click(selectors.ADD_STORAGE_POLICY_LINK); + assert.strictEqual(currentURL(), urls.addStoragePolicy); //update the storage policy selection - await select(DROPDOWN_SELECTOR, policyTwo); + await select(selectors.FIELD_STORAGE_POLICY_SELECT, policyTwo); + + await click(commonSelectors.CANCEL_BTN); - await click(CANCEL_BTN_SELECTOR); assert.strictEqual(currentURL(), urls.orgScopeEdit); - - assert.strictEqual( - find(LINK_LIST_SELECTOR_ITEM_TEXT).textContent.trim(), - policyOne.name, - ); + assert.dom(commonSelectors.LINK_LIST_ITEM_TEXT).hasText(policyOne.name); }); }); diff --git a/ui/admin/tests/acceptance/scopes/delete-test.js b/ui/admin/tests/acceptance/scopes/delete-test.js index 3cd6e88ba..b7091dbfb 100644 --- a/ui/admin/tests/acceptance/scopes/delete-test.js +++ b/ui/admin/tests/acceptance/scopes/delete-test.js @@ -11,6 +11,7 @@ import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; import { Response } from 'miragejs'; import { authenticateSession } from 'ember-simple-auth/test-support'; import * as commonSelectors from 'admin/tests/helpers/selectors'; +import * as selectors from './selectors'; module('Acceptance | scopes | delete', function (hooks) { setupApplicationTest(hooks); @@ -18,10 +19,7 @@ module('Acceptance | scopes | delete', function (hooks) { setupIndexedDb(hooks); let getScopeCount; - const MANAGE_DROPDOWN_SELECTOR = - '[data-test-manage-projects-dropdown] button:first-child'; - const DELETE_ACTION_SELECTOR = - '[data-test-manage-projects-dropdown] ul li button'; + let confirmService; const instances = { scopes: { @@ -56,6 +54,7 @@ module('Acceptance | scopes | delete', function (hooks) { urls.projectScope = `/scopes/${instances.scopes.project.id}`; // Generate resource counter getScopeCount = (type) => this.server.schema.scopes.where({ type }).length; + confirmService = this.owner.lookup('service:confirm'); await authenticateSession({ isGlobal: true }); }); @@ -63,9 +62,9 @@ module('Acceptance | scopes | delete', function (hooks) { const orgScopeCount = getScopeCount('org'); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(DELETE_ACTION_SELECTOR); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(selectors.MANAGE_PROJECTS_DROPDOWN); + await click(selectors.MANAGE_PROJECTS_DROPDOWN_DELETE); assert.strictEqual(getScopeCount('org'), orgScopeCount - 1); }); @@ -78,21 +77,20 @@ module('Acceptance | scopes | delete', function (hooks) { }); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); + await click(commonSelectors.HREF(urls.orgScopeEdit)); assert.false(instances.scopes.org.authorized_actions.includes('delete')); - assert.dom(MANAGE_DROPDOWN_SELECTOR).doesNotExist(); + assert.dom(selectors.MANAGE_PROJECTS_DROPDOWN).doesNotExist(); }); test('can accept delete scope via dialog', async function (assert) { - const confirmService = this.owner.lookup('service:confirm'); confirmService.enabled = true; const orgScopeCount = getScopeCount('org'); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(DELETE_ACTION_SELECTOR); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(selectors.MANAGE_PROJECTS_DROPDOWN); + await click(selectors.MANAGE_PROJECTS_DROPDOWN_DELETE); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN); assert.strictEqual(getScopeCount('org'), orgScopeCount - 1); @@ -100,14 +98,13 @@ module('Acceptance | scopes | delete', function (hooks) { }); test('can cancel delete scope via dialog', async function (assert) { - const confirmService = this.owner.lookup('service:confirm'); confirmService.enabled = true; const orgScopeCount = getScopeCount('org'); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(DELETE_ACTION_SELECTOR); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(selectors.MANAGE_PROJECTS_DROPDOWN); + await click(selectors.MANAGE_PROJECTS_DROPDOWN_DELETE); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN); assert.strictEqual(getScopeCount('org'), orgScopeCount); @@ -128,9 +125,9 @@ module('Acceptance | scopes | delete', function (hooks) { ); }); - await click(`[href="${urls.orgScopeEdit}"]`); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(DELETE_ACTION_SELECTOR); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(selectors.MANAGE_PROJECTS_DROPDOWN); + await click(selectors.MANAGE_PROJECTS_DROPDOWN_DELETE); assert.dom(commonSelectors.ALERT_TOAST_BODY).hasText('Oops.'); }); diff --git a/ui/admin/tests/acceptance/scopes/list-test.js b/ui/admin/tests/acceptance/scopes/list-test.js index 7f185dd7b..57c3411f3 100644 --- a/ui/admin/tests/acceptance/scopes/list-test.js +++ b/ui/admin/tests/acceptance/scopes/list-test.js @@ -9,17 +9,14 @@ import { setupApplicationTest } from 'admin/tests/helpers'; 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 * as commonSelectors from 'admin/tests/helpers/selectors'; +import * as selectors from './selectors'; module('Acceptance | scopes | list', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); setupIndexedDb(hooks); - const SEARCH_INPUT_SELECTOR = '.search-filtering [type="search"]'; - const NO_RESULTS_MSG_SELECTOR = '[data-test-no-scope-results]'; - const SCOPE_LINK_SELECTOR = (id) => - `tbody [data-test-scopes-table-row="${id}"] a`; - const instances = { scopes: { global: null, @@ -61,60 +58,97 @@ module('Acceptance | scopes | list', function (hooks) { test('user can search for a specifc org scope by id', async function (assert) { await visit(urls.globalScope); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.org1.id)).exists(); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.org2.id)).exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org1.id)) + .exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org2.id)) + .exists(); - await fillIn(SEARCH_INPUT_SELECTOR, instances.scopes.org1.id); - await waitFor(SCOPE_LINK_SELECTOR(instances.scopes.org2.id), { count: 0 }); + await fillIn(commonSelectors.SEARCH_INPUT, instances.scopes.org1.id); + await waitFor(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org2.id), { + count: 0, + }); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.org1.id)).exists(); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.org2.id)).doesNotExist(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org1.id)) + .exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org2.id)) + .doesNotExist(); }); test('user can search for org scopes and get no results', async function (assert) { await visit(urls.globalScope); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.org1.id)).exists(); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.org2.id)).exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org1.id)) + .exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org2.id)) + .exists(); - await fillIn(SEARCH_INPUT_SELECTOR, 'fake org scope that does not exist'); - await waitFor(NO_RESULTS_MSG_SELECTOR, { count: 1 }); + await fillIn( + commonSelectors.SEARCH_INPUT, + 'fake org scope that does not exist', + ); + await waitFor(selectors.NO_SCOPE_RESULTS_MSG, { count: 1 }); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.org1.id)).doesNotExist(); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.org2.id)).doesNotExist(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org1.id)) + .doesNotExist(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.org2.id)) + .doesNotExist(); }); test('user can search for a specifc project scope by id', async function (assert) { await visit(urls.orgScope); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.project1.id)).exists(); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.project2.id)).exists(); - - await fillIn(SEARCH_INPUT_SELECTOR, instances.scopes.project1.id); - await waitFor(SCOPE_LINK_SELECTOR(instances.scopes.project2.id), { - count: 0, - }); - - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.project1.id)).exists(); assert - .dom(SCOPE_LINK_SELECTOR(instances.scopes.project2.id)) + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project1.id)) + .exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project2.id)) + .exists(); + + await fillIn(commonSelectors.SEARCH_INPUT, instances.scopes.project1.id); + await waitFor( + selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project2.id), + { + count: 0, + }, + ); + + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project1.id)) + .exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project2.id)) .doesNotExist(); }); test('user can search for project scopes and get no results', async function (assert) { await visit(urls.orgScope); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.project1.id)).exists(); - assert.dom(SCOPE_LINK_SELECTOR(instances.scopes.project2.id)).exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project1.id)) + .exists(); + assert + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project2.id)) + .exists(); - await fillIn(SEARCH_INPUT_SELECTOR, 'fake org scope that does not exist'); - await waitFor(NO_RESULTS_MSG_SELECTOR, { count: 1 }); + await fillIn( + commonSelectors.SEARCH_INPUT, + 'fake org scope that does not exist', + ); + await waitFor(selectors.NO_SCOPE_RESULTS_MSG, { count: 1 }); assert - .dom(SCOPE_LINK_SELECTOR(instances.scopes.project1.id)) + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project1.id)) .doesNotExist(); assert - .dom(SCOPE_LINK_SELECTOR(instances.scopes.project2.id)) + .dom(selectors.TABLE_ROW_SCOPE_LINK(instances.scopes.project2.id)) .doesNotExist(); }); }); diff --git a/ui/admin/tests/acceptance/scopes/read-test.js b/ui/admin/tests/acceptance/scopes/read-test.js index ce1a4be6c..6d43d42bd 100644 --- a/ui/admin/tests/acceptance/scopes/read-test.js +++ b/ui/admin/tests/acceptance/scopes/read-test.js @@ -10,6 +10,8 @@ import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; import a11yAudit from 'ember-a11y-testing/test-support/audit'; import { authenticateSession } from 'ember-simple-auth/test-support'; +import * as commonSelectors from 'admin/tests/helpers/selectors'; +import * as selectors from './selectors'; module('Acceptance | scopes | read', function (hooks) { setupApplicationTest(hooks); @@ -19,13 +21,6 @@ module('Acceptance | scopes | read', function (hooks) { let features; let featureEdition; - const FORM_SELECTOR = 'main .rose-form'; - const MANAGE_DROPDOWN_SELECTOR = - '[data-test-manage-projects-dropdown] button:first-child'; - const DELETE_ACTION_SELECTOR = - '[data-test-manage-projects-dropdown] ul li button'; - const STORAGE_POLICY_SIDEBAR = '.policy-sidebar'; - const instances = { scopes: { global: null, @@ -60,12 +55,12 @@ module('Acceptance | scopes | read', function (hooks) { await visit(urls.orgScope); await a11yAudit(); - await click(`[href="${urls.orgScopeEdit}"]`); + await click(commonSelectors.HREF(urls.orgScopeEdit)); await a11yAudit(); assert.strictEqual(currentURL(), urls.orgScopeEdit); - assert.dom(FORM_SELECTOR).exists(); - assert.dom(MANAGE_DROPDOWN_SELECTOR).exists(); + assert.dom(commonSelectors.FORM).isVisible(); + assert.dom(selectors.MANAGE_PROJECTS_DROPDOWN).isVisible(); }); test('visiting global scope settings when feature flag is enabled', async function (assert) { @@ -79,40 +74,39 @@ module('Acceptance | scopes | read', function (hooks) { await visit(urls.globalScope); await a11yAudit(); - await click(`[href="${urls.globalScopeEdit}"]`); + await click(commonSelectors.HREF(urls.globalScopeEdit)); await a11yAudit(); assert.strictEqual(currentURL(), urls.globalScopeEdit); - assert.dom(FORM_SELECTOR).exists(); - assert.dom(MANAGE_DROPDOWN_SELECTOR).doesNotExist(); - assert.dom(DELETE_ACTION_SELECTOR).doesNotExist(); + assert.dom(commonSelectors.FORM).isVisible(); + assert.dom(selectors.MANAGE_PROJECTS_DROPDOWN).doesNotExist(); }); test('user cannot visit global scope settings when feature flag is not enabled', async function (assert) { await visit(urls.globalScope); assert.strictEqual(currentURL(), urls.globalScope); - assert.dom(`[href="${urls.globalScopeEdit}"]`).doesNotExist(); + assert.dom(commonSelectors.HREF(urls.globalScopeEdit)).doesNotExist(); }); test('user can attatch a storage policy to a scope in enterprise edition', async function (assert) { featureEdition.setEdition('enterprise', ['ssh-session-recording']); await visit(urls.globalScope); - await click(`[href="${urls.globalScopeEdit}"]`); + await click(commonSelectors.HREF(urls.globalScopeEdit)); assert.strictEqual(currentURL(), urls.globalScopeEdit); - assert.dom(STORAGE_POLICY_SIDEBAR).exists(); + assert.dom(selectors.STORAGE_POLICY_SIDEBAR).isVisible(); }); test('user can attatch a storage policy to a scope in hcp edition', async function (assert) { featureEdition.setEdition('hcp', ['ssh-session-recording']); await visit(urls.globalScope); - await click(`[href="${urls.globalScopeEdit}"]`); + await click(commonSelectors.HREF(urls.globalScopeEdit)); assert.strictEqual(currentURL(), urls.globalScopeEdit); - assert.dom(STORAGE_POLICY_SIDEBAR).exists(); + assert.dom(selectors.STORAGE_POLICY_SIDEBAR).isVisible(); }); test('visiting org scope edit without read permission results in no form displayed', async function (assert) { @@ -123,8 +117,8 @@ module('Acceptance | scopes | read', function (hooks) { }); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); + await click(commonSelectors.HREF(urls.orgScopeEdit)); assert.strictEqual(currentURL(), urls.orgScopeEdit); - assert.dom(FORM_SELECTOR).doesNotExist(); + assert.dom(commonSelectors.FORM).doesNotExist(); }); }); diff --git a/ui/admin/tests/acceptance/scopes/selectors.js b/ui/admin/tests/acceptance/scopes/selectors.js new file mode 100644 index 000000000..957069c75 --- /dev/null +++ b/ui/admin/tests/acceptance/scopes/selectors.js @@ -0,0 +1,20 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: BUSL-1.1 + */ + +export const SCOPE_FORM = 'main form'; +export const FIELD_STORAGE_POLICY_SELECT = '[name=policy_id]'; + +export const MANAGE_PROJECTS_DROPDOWN = + '[data-test-manage-projects-dropdown] button:first-child'; +export const MANAGE_PROJECTS_DROPDOWN_DELETE = + '[data-test-manage-projects-dropdown] ul li button'; + +export const STORAGE_POLICY_SIDEBAR = '.policy-sidebar'; +export const ADD_STORAGE_POLICY_BTN = '.policy-sidebar .hds-button'; +export const ADD_STORAGE_POLICY_LINK = '.policy-sidebar .hds-link-standalone'; + +export const NO_SCOPE_RESULTS_MSG = '[data-test-no-scope-results]'; +export const TABLE_ROW_SCOPE_LINK = (id) => + `tbody [data-test-scopes-table-row="${id}"] a`; diff --git a/ui/admin/tests/acceptance/scopes/update-test.js b/ui/admin/tests/acceptance/scopes/update-test.js index d2f807a67..0fb9f2a98 100644 --- a/ui/admin/tests/acceptance/scopes/update-test.js +++ b/ui/admin/tests/acceptance/scopes/update-test.js @@ -17,6 +17,8 @@ module('Acceptance | scopes | update', function (hooks) { setupMirage(hooks); setupIndexedDb(hooks); + let confirmService; + const instances = { scopes: { global: null, @@ -51,22 +53,27 @@ module('Acceptance | scopes | update', function (hooks) { urls.orgScope = `/scopes/${instances.scopes.org.id}/scopes`; urls.orgScopeEdit = `/scopes/${instances.scopes.org.id}/edit`; urls.projectScope = `/scopes/${instances.scopes.project.id}`; + confirmService = this.owner.lookup('service:confirm'); + await authenticateSession({ isGlobal: true }); }); test('can save changes to existing scope', async function (assert) { - assert.notEqual(instances.scopes.org.name, 'random string'); + assert.notEqual( + instances.scopes.org.name, + commonSelectors.FIELD_NAME_VALUE, + ); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); - await click('form [type="button"]', 'Activate edit mode'); - await fillIn('[name="name"]', 'random string'); - await click('.rose-form-actions [type="submit"]'); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(commonSelectors.EDIT_BTN, 'Activate edit mode'); + await fillIn(commonSelectors.FIELD_NAME, commonSelectors.FIELD_NAME_VALUE); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(currentURL(), urls.orgScopeEdit); assert.strictEqual( this.server.schema.scopes.where({ type: 'org' }).models[0].name, - 'random string', + commonSelectors.FIELD_NAME_VALUE, ); }); @@ -78,25 +85,30 @@ module('Acceptance | scopes | update', function (hooks) { }); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); + await click(commonSelectors.HREF(urls.orgScopeEdit)); assert.false(instances.scopes.org.authorized_actions.includes('update')); - assert.dom('form [type="button"]').doesNotExist(); + assert.dom(commonSelectors.SAVE_BTN).doesNotExist(); }); test('can cancel changes to existing scope', async function (assert) { await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); - await click('form [type="button"]', 'Activate edit mode'); - await fillIn('[name="name"]', 'random string'); - await click('.rose-form-actions [type="button"]'); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(commonSelectors.EDIT_BTN, 'Activate edit mode'); + await fillIn(commonSelectors.FIELD_NAME, commonSelectors.FIELD_NAME_VALUE); + await click(commonSelectors.CANCEL_BTN); - assert.notEqual(instances.scopes.org.name, 'random string'); - assert.dom('[name="name"]').hasValue(instances.scopes.org.name); + assert.notEqual( + instances.scopes.org.name, + commonSelectors.FIELD_NAME_VALUE, + ); + assert.dom(commonSelectors.FIELD_NAME).hasValue(instances.scopes.org.name); }); test('saving an existing scope with invalid fields displays error messages', async function (assert) { + const errorMessage = + 'Invalid request. Request attempted to make second resource with the same field value that must be unique.'; await visit(urls.orgScope); this.server.patch('/scopes/:id', () => { return new Response( @@ -105,69 +117,70 @@ module('Acceptance | scopes | update', function (hooks) { { status: 400, code: 'invalid_argument', - message: 'The request was invalid.', - details: { - request_fields: [ - { - name: 'name', - description: 'Name is required.', - }, - ], - }, + message: errorMessage, }, ); }); - await click(`[href="${urls.orgScopeEdit}"]`); - await click('form [type="button"]', 'Activate edit mode'); - await fillIn('[name="name"]', 'random string'); - await click('[type="submit"]'); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(commonSelectors.EDIT_BTN, 'Activate edit mode'); + await fillIn(commonSelectors.FIELD_NAME, commonSelectors.FIELD_NAME_VALUE); + await click(commonSelectors.SAVE_BTN); - assert - .dom(commonSelectors.ALERT_TOAST_BODY) - .hasText('The request was invalid.'); - assert.dom('.hds-form-error__message').hasText('Name is required.'); + assert.dom(commonSelectors.ALERT_TOAST_BODY).hasText(errorMessage); }); test('can discard unsaved scope changes via dialog', async function (assert) { - const confirmService = this.owner.lookup('service:confirm'); confirmService.enabled = true; - assert.notEqual(instances.scopes.org.name, 'random string'); + assert.notEqual( + instances.scopes.org.name, + commonSelectors.FIELD_NAME_VALUE, + ); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); - await click('form [type="button"]', 'Activate edit mode'); - await fillIn('[name="name"]', 'random string'); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(commonSelectors.EDIT_BTN, 'Activate edit mode'); + await fillIn(commonSelectors.FIELD_NAME, commonSelectors.FIELD_NAME_VALUE); + assert.strictEqual(currentURL(), urls.orgScopeEdit); - await click(`[href="${urls.globalScope}"]`); - assert.dom(commonSelectors.MODAL_WARNING).exists(); + + await click(commonSelectors.HREF(urls.globalScope)); + + assert.dom(commonSelectors.MODAL_WARNING).isVisible(); + await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN); assert.strictEqual(currentURL(), urls.globalScope); assert.notEqual( this.server.schema.scopes.where({ type: 'org' }).models[0].name, - 'random string', + commonSelectors.FIELD_NAME_VALUE, ); }); test('can click cancel on discard dialog box for unsaved scope changes', async function (assert) { - const confirmService = this.owner.lookup('service:confirm'); confirmService.enabled = true; - assert.notEqual(instances.scopes.org.name, 'random string'); + assert.notEqual( + instances.scopes.org.name, + commonSelectors.FIELD_NAME_VALUE, + ); await visit(urls.orgScope); - await click(`[href="${urls.orgScopeEdit}"]`); - await click('form [type="button"]', 'Activate edit mode'); - await fillIn('[name="name"]', 'random string'); + await click(commonSelectors.HREF(urls.orgScopeEdit)); + await click(commonSelectors.EDIT_BTN, 'Activate edit mode'); + await fillIn(commonSelectors.FIELD_NAME, commonSelectors.FIELD_NAME_VALUE); + assert.strictEqual(currentURL(), urls.orgScopeEdit); - await click(`[href="${urls.globalScope}"]`); - assert.dom(commonSelectors.MODAL_WARNING).exists(); + + await click(commonSelectors.HREF(urls.globalScope)); + + assert.dom(commonSelectors.MODAL_WARNING).isVisible(); + await click(commonSelectors.MODAL_WARNING_CANCEL_BTN); assert.strictEqual(currentURL(), urls.orgScopeEdit); assert.notEqual( this.server.schema.scopes.where({ type: 'org' }).models[0].name, - 'random string', + commonSelectors.FIELD_NAME_VALUE, ); }); }); diff --git a/ui/admin/tests/helpers/selectors.js b/ui/admin/tests/helpers/selectors.js index 026c99a72..7806f375c 100644 --- a/ui/admin/tests/helpers/selectors.js +++ b/ui/admin/tests/helpers/selectors.js @@ -64,3 +64,5 @@ export const FILTER_DROPDOWN_ITEM_APPLY_BTN = (filterName) => `.search-filtering [name="${filterName}"] .hds-dropdown__footer button`; export const PAGINATION = '[data-test-pagination]'; +export const LINK_LIST_ITEM_TEXT = '.link-list-item__text'; +export const FORM = 'main form';