Refactor: Scopes tests (#2744)

* refactor: 💡 scopes test

* fix: 🐛 addressed comments

* fix: 🐛 replace exists with isVisible, use hasText

* fix: 🐛 move form to commonSelectors
This commit is contained in:
Priya Patel authored and GitHub committed 2025-03-28 15:00:59 -07:00
1 parent 69d127a89e
commit ca3c1c7623
7 files changed
+216 -158

No files matched your search

@@ -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);
});
});
+17 -20
View File
@@ -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.');
});
+67 -33
View File
@@ -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();
});
});
+15 -21
View File
@@ -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();
});
});
@@ -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`;
+60 -47
View File
@@ -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,
);
});
});
+2
View File
@@ -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';