test: 💍 refactor targets create alias & enable SR test selectors (#2904)

* test: 💍 refactor targets create alias & enable SR test selector

✅ Closes: https://hashicorp.atlassian.net/browse/ICU-16433
This commit is contained in:
Lisbet Alvarez authored and GitHub committed 2025-06-24 16:09:33 -07:00
1 parent 2a2e4350ee
commit adf7f8603b
3 files changed
+109 -95

No files matched your search

@@ -13,7 +13,7 @@ import { authenticateSession } from 'ember-simple-auth/test-support';
import { setupIndexedDb } from 'api/test-support/helpers/indexed-db';
import { setupIntl } from 'ember-intl/test-support';
import * as commonSelectors from 'admin/tests/helpers/selectors';
import * as selectors from './selectors';
import { TYPE_TARGET_TCP, TYPE_TARGET_SSH } from 'api/models/target';
module('Acceptance | targets | create-alias', function (hooks) {
@@ -25,15 +25,8 @@ module('Acceptance | targets | create-alias', function (hooks) {
let getAliasCount;
let featuresService;
const SAVE_BTN_SELECTOR = '[type="submit"]';
const CANCEL_BTN_SELECTOR = '.rose-form-actions [type="button"]';
const NAME_FIELD_SELECTOR = '[name="name"]';
const ALIAS_FIELD_SELECTOR = '[name="value"]';
const DEST_FIELD_SELECTOR = '[name="destination_id"]';
const FIELD_ERROR_TEXT_SELECTOR = '.hds-form-error__message';
const NAME_FIELD_TEXT = 'random string';
const ALIAS_VALUE_TEXT = 'www.target1.com';
const ADD_AN_ALIAS_SELECTOR = '.target-sidebar-aliases .hds-button';
const instances = {
scopes: {
@@ -45,7 +38,6 @@ module('Acceptance | targets | create-alias', function (hooks) {
};
const urls = {
globalScope: null,
projectScope: null,
targets: null,
target: null,
@@ -71,7 +63,6 @@ module('Acceptance | targets | create-alias', function (hooks) {
instances.alias = this.server.create('alias', {
scope: instances.scopes.global,
});
urls.globalScope = `/scopes/global`;
urls.projectScope = `/scopes/${instances.scopes.project.id}`;
urls.targets = `${urls.projectScope}/targets`;
@@ -86,13 +77,11 @@ module('Acceptance | targets | create-alias', function (hooks) {
const aliasCount = getAliasCount();
await visit(urls.targets);
await click(`[href="${urls.target}"]`);
await click(ADD_AN_ALIAS_SELECTOR);
await fillIn(NAME_FIELD_SELECTOR, NAME_FIELD_TEXT);
await fillIn(ALIAS_FIELD_SELECTOR, ALIAS_VALUE_TEXT);
await click(SAVE_BTN_SELECTOR);
await click(commonSelectors.HREF(urls.target));
await click(selectors.ALIASES_ADD_BTN);
await fillIn(commonSelectors.FIELD_NAME, NAME_FIELD_TEXT);
await fillIn(selectors.FIELD_ALIAS, ALIAS_VALUE_TEXT);
await click(commonSelectors.SAVE_BTN);
const alias = this.server.schema.aliases.findBy({
name: NAME_FIELD_TEXT,
});
@@ -105,23 +94,17 @@ module('Acceptance | targets | create-alias', function (hooks) {
test('users can create a new alias for a target of SSH type', async function (assert) {
featuresService.enable('ssh-target');
instances.target.update({
type: TYPE_TARGET_SSH,
});
const aliasCount = getAliasCount();
await visit(urls.targets);
await click(`[href="${urls.target}"]`);
await click(ADD_AN_ALIAS_SELECTOR);
await fillIn(NAME_FIELD_SELECTOR, NAME_FIELD_TEXT);
await fillIn(ALIAS_FIELD_SELECTOR, ALIAS_VALUE_TEXT);
await click(SAVE_BTN_SELECTOR);
await click(commonSelectors.HREF(urls.target));
await click(selectors.ALIASES_ADD_BTN);
await fillIn(commonSelectors.FIELD_NAME, NAME_FIELD_TEXT);
await fillIn(selectors.FIELD_ALIAS, ALIAS_VALUE_TEXT);
await click(commonSelectors.SAVE_BTN);
const alias = this.server.schema.aliases.findBy({
name: NAME_FIELD_TEXT,
});
@@ -138,17 +121,16 @@ module('Acceptance | targets | create-alias', function (hooks) {
type: TYPE_TARGET_SSH,
});
const aliasCount = getAliasCount();
await visit(urls.targets);
await click(`[href="${urls.target}"]`);
await click(commonSelectors.HREF(urls.target));
await click(selectors.ALIASES_ADD_BTN);
await fillIn(commonSelectors.FIELD_NAME, NAME_FIELD_TEXT);
await fillIn(selectors.FIELD_ALIAS, ALIAS_VALUE_TEXT);
await click(ADD_AN_ALIAS_SELECTOR);
assert.dom(selectors.FIELD_DESTINATION_ID).hasAttribute('readOnly');
await fillIn(NAME_FIELD_SELECTOR, NAME_FIELD_TEXT);
await fillIn(ALIAS_FIELD_SELECTOR, ALIAS_VALUE_TEXT);
assert.dom(DEST_FIELD_SELECTOR).hasAttribute('readOnly');
await click(SAVE_BTN_SELECTOR);
await click(commonSelectors.SAVE_BTN);
const alias = this.server.schema.aliases.findBy({
name: NAME_FIELD_TEXT,
});
@@ -165,10 +147,11 @@ module('Acceptance | targets | create-alias', function (hooks) {
type: TYPE_TARGET_SSH,
});
await visit(urls.targets);
await click(`[href="${urls.target}"]`);
await click(ADD_AN_ALIAS_SELECTOR);
await fillIn(NAME_FIELD_SELECTOR, NAME_FIELD_TEXT);
await click(CANCEL_BTN_SELECTOR);
await click(commonSelectors.HREF(urls.target));
await click(selectors.ALIASES_ADD_BTN);
await fillIn(commonSelectors.FIELD_NAME, NAME_FIELD_TEXT);
await click(commonSelectors.CANCEL_BTN);
assert.strictEqual(getAliasCount(), aliasCount);
});
@@ -195,14 +178,14 @@ module('Acceptance | targets | create-alias', function (hooks) {
});
await visit(urls.targets);
await click(`[href="${urls.target}"]`);
await click(ADD_AN_ALIAS_SELECTOR);
await click(SAVE_BTN_SELECTOR);
await click(commonSelectors.HREF(urls.target));
await click(selectors.ALIASES_ADD_BTN);
await click(commonSelectors.SAVE_BTN);
await a11yAudit();
assert
.dom(commonSelectors.ALERT_TOAST_BODY)
.hasText('The request was invalid.');
assert.dom(FIELD_ERROR_TEXT_SELECTOR).hasText('Name is required.');
assert.dom(commonSelectors.FIELD_ERROR).hasText('Name is required.');
});
});
@@ -4,13 +4,14 @@
*/
import { module, test } from 'qunit';
import { visit, find, click, currentURL } from '@ember/test-helpers';
import { visit, find, click, currentURL, select } 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 * as commonSelectors from 'admin/tests/helpers/selectors';
import * as selectors from './selectors';
import { TYPE_TARGET_SSH } from 'api/models/target';
import select from '@ember/test-helpers/dom/select';
module('Acceptance | targets | enable session recording', function (hooks) {
setupApplicationTest(hooks);
@@ -20,17 +21,6 @@ module('Acceptance | targets | enable session recording', function (hooks) {
let storageBucketOne;
let storageBucketTwo;
const SETTINGS_LINK_SELECTOR = '.target-sidebar .hds-link-standalone';
const ENABLE_BUTTON_SELECTOR = '.target-sidebar .hds-button';
const DROPDOWN_SELECTOR = '[name=storage_bucket_id]';
const LINK_LIST_SELECTOR = '.link-list-item > a';
const LINK_LIST_SELECTOR_ITEM_TEXT = '.link-list-item__text';
const TOGGLE_SELECTOR = '[name=target-enable-session-recording]';
const LINK_TO_NEW_STORAGE_BUCKET =
'.enable-session-recording-toggle .hds-link-standalone';
const SAVE_BTN_SELECTOR = '.rose-form-actions [type="submit"]';
const CANCEL_BTN_SELECTOR = '.rose-form-actions [type="button"]';
// Instances
const instances = {
scopes: {
@@ -93,17 +83,21 @@ module('Acceptance | targets | enable session recording', function (hooks) {
});
test('cannot enable session recording for a target without proper authorization', async function (assert) {
assert.false(featuresService.isEnabled('ssh-session-recording'));
await visit(urls.target);
await a11yAudit();
assert.dom('.target-sidebar a').doesNotExist();
assert.false(featuresService.isEnabled('ssh-session-recording'));
assert.dom(selectors.ENABLE_RECORDING_BTN).doesNotExist();
});
test('users can click on enable-recording button in target session-recording sidebar and it takes them to enable session recording', async function (assert) {
featuresService.enable('ssh-session-recording');
await visit(urls.target);
assert.dom(SETTINGS_LINK_SELECTOR).doesNotExist();
await click(ENABLE_BUTTON_SELECTOR);
assert.dom(selectors.RECORDING_SETTINGS_LINK).doesNotExist();
await click(selectors.ENABLE_RECORDING_BTN);
assert.strictEqual(currentURL(), urls.enableSessionRecording);
});
@@ -114,7 +108,9 @@ module('Acceptance | targets | enable session recording', function (hooks) {
enableSessionRecording: true,
});
await visit(urls.target);
await click(SETTINGS_LINK_SELECTOR);
await click(selectors.RECORDING_SETTINGS_LINK);
assert.strictEqual(currentURL(), urls.enableSessionRecording);
});
@@ -125,37 +121,49 @@ module('Acceptance | targets | enable session recording', function (hooks) {
enableSessionRecording: true,
});
await visit(urls.target);
await click(LINK_LIST_SELECTOR);
await click(selectors.LINK_LIST_ITEM);
assert.strictEqual(currentURL(), urls.storageBucket);
});
test('toggle should be disabled and storage buckets list should be shown when enable session recording button is clicked', async function (assert) {
featuresService.enable('ssh-session-recording');
await visit(urls.target);
await click(ENABLE_BUTTON_SELECTOR);
await click(selectors.ENABLE_RECORDING_BTN);
assert.strictEqual(currentURL(), urls.enableSessionRecording);
assert.dom(TOGGLE_SELECTOR).isVisible();
assert.dom(DROPDOWN_SELECTOR).isNotVisible();
assert.dom(selectors.FIELD_ENABLE_RECORDING_TOGGLE).isVisible();
assert.dom(selectors.FIELD_STORAGE_BUCKET_DROPDOWN).isNotVisible();
});
test('storage buckets list is hidden when toggle is disabled', async function (assert) {
featuresService.enable('ssh-session-recording');
await visit(urls.target);
await click(ENABLE_BUTTON_SELECTOR);
await click(selectors.ENABLE_RECORDING_BTN);
assert.strictEqual(currentURL(), urls.enableSessionRecording);
assert.dom(TOGGLE_SELECTOR).isVisible();
assert.dom(DROPDOWN_SELECTOR).isNotVisible();
await click(TOGGLE_SELECTOR);
assert.dom(DROPDOWN_SELECTOR).isVisible();
assert.dom(selectors.FIELD_ENABLE_RECORDING_TOGGLE).isVisible();
assert.dom(selectors.FIELD_STORAGE_BUCKET_DROPDOWN).isNotVisible();
await click(selectors.FIELD_ENABLE_RECORDING_TOGGLE);
assert.dom(selectors.FIELD_STORAGE_BUCKET_DROPDOWN).isVisible();
});
test('link to add new storage bucket should be displayed and redirect to new storage buckets form', async function (assert) {
featuresService.enable('ssh-session-recording');
await visit(urls.target);
await click(ENABLE_BUTTON_SELECTOR);
await click(selectors.ENABLE_RECORDING_BTN);
assert.strictEqual(currentURL(), urls.enableSessionRecording);
assert.dom(LINK_TO_NEW_STORAGE_BUCKET).isVisible();
await click(LINK_TO_NEW_STORAGE_BUCKET);
assert.dom(selectors.FIELD_ADD_NEW_STORAGE_BUCKET_LINK).isVisible();
await click(selectors.FIELD_ADD_NEW_STORAGE_BUCKET_LINK);
assert.strictEqual(currentURL(), urls.newStorageBucket);
});
@@ -166,37 +174,47 @@ module('Acceptance | targets | enable session recording', function (hooks) {
enable_session_recording: true,
});
await visit(urls.target);
await click(SETTINGS_LINK_SELECTOR);
await click(selectors.RECORDING_SETTINGS_LINK);
assert.strictEqual(currentURL(), urls.enableSessionRecording);
const existingStorageBucketId = find(DROPDOWN_SELECTOR).value;
const existingStorageBucketId = find(
selectors.FIELD_STORAGE_BUCKET_DROPDOWN,
).value;
//disable the toggle, dropdown should be hidden
await click(TOGGLE_SELECTOR);
assert.dom(DROPDOWN_SELECTOR).isNotVisible();
await click(selectors.FIELD_ENABLE_RECORDING_TOGGLE);
assert.dom(selectors.FIELD_STORAGE_BUCKET_DROPDOWN).isNotVisible();
//enable the toggle now,
//it should have the previously selected storage_bucket_id
await click(TOGGLE_SELECTOR);
assert.dom(DROPDOWN_SELECTOR).hasValue(existingStorageBucketId);
await click(selectors.FIELD_ENABLE_RECORDING_TOGGLE);
assert
.dom(selectors.FIELD_STORAGE_BUCKET_DROPDOWN)
.hasValue(existingStorageBucketId);
});
test('can assign a storage bucket for the target', async function (assert) {
featuresService.enable('ssh-session-recording');
await visit(urls.target);
await click(ENABLE_BUTTON_SELECTOR);
await click(selectors.ENABLE_RECORDING_BTN);
assert.strictEqual(currentURL(), urls.enableSessionRecording);
await click(TOGGLE_SELECTOR);
assert.dom(DROPDOWN_SELECTOR).hasNoValue();
await select(DROPDOWN_SELECTOR, storageBucketTwo.id);
assert.dom(DROPDOWN_SELECTOR).hasValue();
await click(SAVE_BTN_SELECTOR);
await click(selectors.FIELD_ENABLE_RECORDING_TOGGLE);
assert.dom(selectors.FIELD_STORAGE_BUCKET_DROPDOWN).hasNoValue();
await select(selectors.FIELD_STORAGE_BUCKET_DROPDOWN, storageBucketTwo.id);
assert.dom(selectors.FIELD_STORAGE_BUCKET_DROPDOWN).hasValue();
await click(commonSelectors.SAVE_BTN);
assert.strictEqual(currentURL(), urls.target);
assert.strictEqual(
find(LINK_LIST_SELECTOR_ITEM_TEXT).textContent.trim(),
find(selectors.LINK_LIST_ITEM_TEXT).textContent.trim(),
storageBucketTwo.name,
);
});
@@ -207,19 +225,19 @@ module('Acceptance | targets | enable session recording', function (hooks) {
storageBucketId: storageBucketOne.id,
enable_session_recording: true,
});
await visit(urls.target);
await click(SETTINGS_LINK_SELECTOR);
await click(selectors.RECORDING_SETTINGS_LINK);
assert.strictEqual(currentURL(), urls.enableSessionRecording);
//update the storage bucket selection
await select(DROPDOWN_SELECTOR, storageBucketTwo);
await select(selectors.FIELD_STORAGE_BUCKET_DROPDOWN, storageBucketTwo);
await click(commonSelectors.CANCEL_BTN);
await click(CANCEL_BTN_SELECTOR);
assert.strictEqual(currentURL(), urls.target);
assert.strictEqual(
find(LINK_LIST_SELECTOR_ITEM_TEXT).textContent.trim(),
find(selectors.LINK_LIST_ITEM_TEXT).textContent.trim(),
storageBucketOne.name,
);
});
@@ -8,6 +8,8 @@ export const FIELD_TYPE_VALUE = (type) => `[value=${type}]`;
export const FIELD_DEFAULT_PORT_LABEL = '[data-test-default-port-label]';
export const FIELD_INFO = '.info-field';
export const FIELD_INFO_LABEL = '.info-field .hds-form-helper-text';
export const FIELD_ALIAS = '[name="value"]';
export const FIELD_DESTINATION_ID = '[name="destination_id"]';
export const FIELD_ALIASES =
'[name="with_aliases"] tbody tr:last-of-type input';
export const FIELD_ALIASES_ADD_BTN =
@@ -17,6 +19,11 @@ export const FIELD_ADDRESS_VALUE = '0.0.0.0';
export const FIELD_NAME_ERROR = '[data-test-error-message-name]';
export const FIELD_DEFAULT_PORT_ERROR =
'[data-test-error-message-default-port]';
export const FIELD_STORAGE_BUCKET_DROPDOWN = '[name=storage_bucket_id]';
export const FIELD_ENABLE_RECORDING_TOGGLE =
'[name=target-enable-session-recording]';
export const FIELD_ADD_NEW_STORAGE_BUCKET_LINK =
'.enable-session-recording-toggle .hds-link-standalone';
export const NEW_TARGET_BTN = '[data-test-new-target-button]';
export const MANAGE_DROPDOWN = '[data-test-manage-targets-dropdown] button';
@@ -33,6 +40,12 @@ export const ALIASES_NEW_LINK = '.target-sidebar-aliases .hds-button';
export const ALIASES_NEW_LINK_TEXT = 'Add an alias';
export const ALIASES_VIEW_MORE_BTN = '[data-test-aliases-view-more]';
export const ALIASES_FLYOUT = '[data-test-aliases-flyout]';
export const ALIASES_ADD_BTN = '.target-sidebar-aliases .hds-button';
export const ENABLE_RECORDING_BTN = '.target-sidebar .hds-button';
export const RECORDING_SETTINGS_LINK = '.target-sidebar .hds-link-standalone';
export const LINK_LIST_ITEM = '.link-list-item > a';
export const LINK_LIST_ITEM_TEXT = '.link-list-item__text';
export const NO_RESULTS_MSG = '[data-test-no-target-results]';
export const TABLE_ACTIVE_SESSIONS = (id) =>