diff --git a/ui/admin/tests/acceptance/users/create-test.js b/ui/admin/tests/acceptance/users/create-test.js index cf49fa369..68fdbbaa9 100644 --- a/ui/admin/tests/acceptance/users/create-test.js +++ b/ui/admin/tests/acceptance/users/create-test.js @@ -57,9 +57,9 @@ module('Acceptance | users | create', function (hooks) { const usersCount = getUsersCount(); await visit(urls.users); - await click(`[href="${urls.newUser}"]`); - await fillIn('[name="name"]', 'User name'); - await click('[type="submit"]'); + await click(commonSelectors.HREF(urls.newUser)); + await fillIn(commonSelectors.FIELD_NAME, commonSelectors.FIELD_NAME_VALUE); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(getUsersCount(), usersCount + 1); }); @@ -67,14 +67,14 @@ module('Acceptance | users | create', function (hooks) { test('users can navigate to new users route with proper authorization', async function (assert) { await visit(urls.orgScope); - await click(`[href="${urls.users}"]`); + await click(commonSelectors.HREF(urls.users)); assert.true( instances.scopes.org.authorized_collection_actions.users.includes( 'create', ), ); - assert.dom(`[href="${urls.newUser}"]`).exists(); + assert.dom(commonSelectors.HREF(urls.newUser)).exists(); }); test('users cannot navigate to new users route without proper authorization', async function (assert) { @@ -84,7 +84,7 @@ module('Acceptance | users | create', function (hooks) { ); await visit(urls.orgScope); - await click(`[href="${urls.users}"]`); + await click(commonSelectors.HREF(urls.users)); assert.false( instances.scopes.org.authorized_collection_actions.users.includes( @@ -92,16 +92,16 @@ module('Acceptance | users | create', function (hooks) { ), ); - assert.dom('.rose-button-primary').doesNotExist(); + assert.dom(commonSelectors.HREF(urls.newUser)).doesNotExist(); }); test('can cancel creation of a new user', async function (assert) { const usersCount = getUsersCount(); await visit(urls.users); - await click(`[href="${urls.newUser}"]`); - await fillIn('[name="name"]', 'User name'); - await click('.rose-form-actions [type="button"]'); + await click(commonSelectors.HREF(urls.newUser)); + await fillIn(commonSelectors.FIELD_NAME, commonSelectors.FIELD_NAME_VALUE); + await click(commonSelectors.CANCEL_BTN); assert.strictEqual(currentURL(), urls.users); assert.strictEqual(getUsersCount(), usersCount); @@ -109,6 +109,8 @@ module('Acceptance | users | create', function (hooks) { test('saving a new user with invalid fields displays error messages', async function (assert) { const usersCount = getUsersCount(); + const errorMessage = + 'Invalid request. Request attempted to make second resource with the same field value that must be unique.'; await visit(urls.users); this.server.post('/users', () => { return new Response( @@ -117,28 +119,20 @@ module('Acceptance | users | create', 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.newUser}"]`); - await fillIn('[name="description"]', 'test'); - await click('[type="submit"]'); + await click(commonSelectors.HREF(urls.newUser)); + await fillIn( + commonSelectors.FIELD_DESCRIPTION, + commonSelectors.FIELD_DESCRIPTION_VALUE, + ); + await click(commonSelectors.SAVE_BTN); assert.strictEqual(getUsersCount(), usersCount); - assert - .dom(commonSelectors.ALERT_TOAST_BODY) - .hasText('The request was invalid.'); - assert.dom('[data-test-error-message-name]').hasText('Name is required.'); + assert.dom(commonSelectors.ALERT_TOAST_BODY).hasText(errorMessage); }); test('users cannot directly navigate to new user route without proper authorization', async function (assert) { diff --git a/ui/admin/tests/acceptance/users/delete-test.js b/ui/admin/tests/acceptance/users/delete-test.js index e3b47698e..cf225b66c 100644 --- a/ui/admin/tests/acceptance/users/delete-test.js +++ b/ui/admin/tests/acceptance/users/delete-test.js @@ -11,15 +11,15 @@ 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 | users | delete', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); setupIndexedDb(hooks); - const DELETE_ACTION_SELECTOR = - '[data-test-manage-user-dropdown] ul li button'; - const MANAGE_DROPDOWN_SELECTOR = - '[data-test-manage-user-dropdown] button:first-child'; + + let getUsersCount, confirmService; + const instances = { scopes: { global: null, @@ -46,20 +46,22 @@ module('Acceptance | users | delete', function (hooks) { urls.orgScope = `/scopes/${instances.scopes.org.id}`; urls.users = `${urls.orgScope}/users`; urls.user = `${urls.users}/${instances.user.id}`; + getUsersCount = () => this.server.schema.users.all().models.length; + confirmService = this.owner.lookup('service:confirm'); await authenticateSession({}); }); test('can delete a user', async function (assert) { - const usersCount = this.server.db.users.length; + const usersCount = getUsersCount(); await visit(urls.users); - await click(`[href="${urls.user}"]`); + await click(commonSelectors.HREF(urls.user)); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(DELETE_ACTION_SELECTOR); + await click(selectors.MANAGE_DROPDOWN_USER); + await click(selectors.MANAGE_DROPDOWN_USER_DELETE); - assert.strictEqual(this.server.db.users.length, usersCount - 1); + assert.strictEqual(getUsersCount(), usersCount - 1); }); test('cannot delete a user without proper authorization', async function (assert) { @@ -67,42 +69,40 @@ module('Acceptance | users | delete', function (hooks) { instances.user.authorized_actions.filter((item) => item !== 'delete'); await visit(urls.users); - await click(`[href="${urls.user}"]`); + await click(commonSelectors.HREF(urls.user)); - await click(MANAGE_DROPDOWN_SELECTOR); - assert.dom('[data-test-manage-user-dropdown] ul li button').doesNotExist(); + await click(selectors.MANAGE_DROPDOWN_USER); + assert.dom(selectors.MANAGE_DROPDOWN_USER_DELETE).doesNotExist(); }); test('can accept delete user via dialog', async function (assert) { - const confirmService = this.owner.lookup('service:confirm'); + const usersCount = getUsersCount(); confirmService.enabled = true; - const usersCount = this.server.db.users.length; await visit(urls.users); - await click(`[href="${urls.user}"]`); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(DELETE_ACTION_SELECTOR); + await click(commonSelectors.HREF(urls.user)); + await click(selectors.MANAGE_DROPDOWN_USER); + await click(selectors.MANAGE_DROPDOWN_USER_DELETE); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN); assert .dom(commonSelectors.ALERT_TOAST_BODY) .hasText('Deleted successfully.'); - assert.strictEqual(this.server.db.users.length, usersCount - 1); + assert.strictEqual(getUsersCount(), usersCount - 1); assert.strictEqual(currentURL(), urls.users); }); test('can cancel delete user via dialog', async function (assert) { - const confirmService = this.owner.lookup('service:confirm'); + const usersCount = getUsersCount(); confirmService.enabled = true; - const usersCount = this.server.db.users.length; await visit(urls.users); - await click(`[href="${urls.user}"]`); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(DELETE_ACTION_SELECTOR); + await click(commonSelectors.HREF(urls.user)); + await click(selectors.MANAGE_DROPDOWN_USER); + await click(selectors.MANAGE_DROPDOWN_USER_DELETE); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN); - assert.strictEqual(this.server.db.users.length, usersCount); + assert.strictEqual(getUsersCount(), usersCount); assert.strictEqual(currentURL(), urls.user); }); @@ -120,9 +120,10 @@ module('Acceptance | users | delete', function (hooks) { ); }); - await click(`[href="${urls.user}"]`); - await click(MANAGE_DROPDOWN_SELECTOR); - await click(DELETE_ACTION_SELECTOR); + await click(commonSelectors.HREF(urls.user)); + await click(selectors.MANAGE_DROPDOWN_USER); + await click(selectors.MANAGE_DROPDOWN_USER_DELETE); + assert.dom(commonSelectors.ALERT_TOAST_BODY).hasText('Oops.'); }); }); diff --git a/ui/admin/tests/acceptance/users/read-test.js b/ui/admin/tests/acceptance/users/read-test.js index a9dc2f009..08705f19d 100644 --- a/ui/admin/tests/acceptance/users/read-test.js +++ b/ui/admin/tests/acceptance/users/read-test.js @@ -50,7 +50,7 @@ module('Acceptance | users | read', function (hooks) { await visit(urls.orgScope); await a11yAudit(); - await click(`[href="${urls.users}"]`); + await click(commonSelectors.HREF(urls.users)); await a11yAudit(); assert.strictEqual(currentURL(), urls.users); @@ -59,7 +59,7 @@ module('Acceptance | users | read', function (hooks) { test('visiting user', async function (assert) { await visit(urls.users); - await click(`[href="${urls.user}"]`); + await click(commonSelectors.HREF(urls.user)); await a11yAudit(); assert.strictEqual(currentURL(), urls.user); @@ -70,7 +70,7 @@ module('Acceptance | users | read', function (hooks) { instances.user.authorized_actions.filter((item) => item !== 'read'); await visit(urls.orgScope); - await click(`[href="${urls.users}"]`); + await click(commonSelectors.HREF(urls.users)); assert.dom(commonSelectors.TABLE_RESOURCE_LINK(urls.user)).doesNotExist(); }); @@ -78,7 +78,7 @@ module('Acceptance | users | read', function (hooks) { test('users can link to docs page for users', async function (assert) { await visit(urls.orgScope); - await click(`[href="${urls.users}"]`); + await click(commonSelectors.HREF(urls.users)); assert .dom( diff --git a/ui/admin/tests/acceptance/users/selectors.js b/ui/admin/tests/acceptance/users/selectors.js new file mode 100644 index 000000000..98ff81ecc --- /dev/null +++ b/ui/admin/tests/acceptance/users/selectors.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: BUSL-1.1 + */ + +export const MANAGE_DROPDOWN_USER_DELETE = + '[data-test-manage-user-dropdown] ul li button'; +export const MANAGE_DROPDOWN_USER = + '[data-test-manage-user-dropdown] button:first-child';