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:
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);
|
||||
});
|
||||
});
|
||||
@@ -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.');
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -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`;
|
||||
@@ -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,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -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';
|
||||
Reference in new issue
Block a user