mirror of
https://github.com/hashicorp/vault.git
synced 2025-09-20 21:31:09 +02:00
153 lines
5.7 KiB
JavaScript
153 lines
5.7 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: BUSL-1.1
|
|
*/
|
|
|
|
import {
|
|
currentURL,
|
|
currentRouteName,
|
|
settled,
|
|
fillIn,
|
|
visit,
|
|
click,
|
|
waitFor,
|
|
waitUntil,
|
|
} from '@ember/test-helpers';
|
|
import { module, test } from 'qunit';
|
|
import { setupApplicationTest } from 'ember-qunit';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
import authPage from 'vault/tests/pages/auth';
|
|
import { runCmd } from 'vault/tests/helpers/commands';
|
|
import codemirror from 'vault/tests/helpers/codemirror';
|
|
|
|
const SELECT = {
|
|
policyByName: (name) => `[data-test-policy-link="${name}"]`,
|
|
filterBar: '[data-test-component="navigate-input"]',
|
|
delete: '[data-test-confirm-action-trigger]',
|
|
confirmDelete: '[data-test-confirm-button]',
|
|
createLink: '[data-test-policy-create-link]',
|
|
nameInput: '[data-test-policy-input="name"]',
|
|
save: '[data-test-policy-save]',
|
|
createError: '[data-test-message-error]',
|
|
policyTitle: '[data-test-policy-name]',
|
|
listBreadcrumb: '[data-test-policy-list-link] a',
|
|
};
|
|
module('Acceptance | policies/acl', function (hooks) {
|
|
setupApplicationTest(hooks);
|
|
|
|
hooks.beforeEach(function () {
|
|
this.uid = uuidv4();
|
|
return authPage.login();
|
|
});
|
|
|
|
test('it lists default and root acls', async function (assert) {
|
|
await visit('/vault/policies/acl');
|
|
assert.strictEqual(currentURL(), '/vault/policies/acl');
|
|
await fillIn(SELECT.filterBar, 'default');
|
|
await waitFor(SELECT.policyByName('default'));
|
|
assert.dom(SELECT.policyByName('default')).exists('default policy shown in the list');
|
|
await fillIn(SELECT.filterBar, 'root');
|
|
// root isn't clickable so it has a different selector
|
|
assert.dom('[data-test-policy-name]').hasText('root', 'root policy shown in the list');
|
|
});
|
|
|
|
test('it navigates to show when clicking on the link', async function (assert) {
|
|
await visit('/vault/policies/acl');
|
|
await fillIn(SELECT.filterBar, 'default');
|
|
await waitFor(SELECT.policyByName('default'));
|
|
await click(SELECT.policyByName('default'));
|
|
assert.strictEqual(currentRouteName(), 'vault.cluster.policy.show');
|
|
assert.strictEqual(currentURL(), '/vault/policy/acl/default');
|
|
});
|
|
|
|
test('it allows deletion of policies with dots in names', async function (assert) {
|
|
const POLICY = 'path "*" { capabilities = ["list"]}';
|
|
const policyName = 'list.policy';
|
|
await runCmd(`write sys/policies/acl/${policyName} policy=${window.btoa(POLICY)}`);
|
|
await settled();
|
|
await visit('/vault/policies/acl');
|
|
await fillIn(SELECT.filterBar, policyName);
|
|
await waitFor(SELECT.policyByName(policyName));
|
|
assert.dom(SELECT.policyByName(policyName)).exists('policy is shown in list');
|
|
await click(`${SELECT.policyByName(policyName)} [data-test-popup-menu-trigger]`);
|
|
await click(SELECT.delete);
|
|
await click(SELECT.confirmDelete);
|
|
assert.dom(SELECT.policyByName(policyName)).doesNotExist('policy is deleted successfully');
|
|
});
|
|
|
|
// https://github.com/hashicorp/vault/issues/4395
|
|
test('it properly fetches policies when the name ends in a ,', async function (assert) {
|
|
const policyString = 'path "*" { capabilities = ["update"]}';
|
|
const policyName = `${this.uid}-policy-symbol,.`;
|
|
|
|
await visit('/vault/policies/acl');
|
|
// new policy creation
|
|
await click(SELECT.createLink);
|
|
|
|
await fillIn(SELECT.nameInput, policyName);
|
|
codemirror().setValue(policyString);
|
|
await click(SELECT.save);
|
|
assert.strictEqual(
|
|
currentURL(),
|
|
`/vault/policy/acl/${policyName}`,
|
|
'navigates to policy show on successful save'
|
|
);
|
|
assert.dom('[data-test-policy-edit-toggle]').exists({ count: 1 }, 'shows the edit toggle');
|
|
});
|
|
|
|
test('it can create and delete correctly', async function (assert) {
|
|
const policyString = 'path "*" { capabilities = ["update"]}';
|
|
const policyName = `Policy test ${this.uid}`;
|
|
const policyLower = policyName.toLowerCase();
|
|
|
|
await visit('/vault/policies/acl');
|
|
// new policy creation
|
|
await click(SELECT.createLink);
|
|
|
|
await fillIn(SELECT.nameInput, policyName);
|
|
await click(SELECT.save);
|
|
assert
|
|
.dom(SELECT.createError)
|
|
.hasText(`Error 'policy' parameter not supplied or empty`, 'renders error message on save');
|
|
codemirror().setValue(policyString);
|
|
await click(SELECT.save);
|
|
|
|
await waitUntil(() => currentURL() === `/vault/policy/acl/${encodeURIComponent(policyLower)}`);
|
|
assert.strictEqual(
|
|
currentURL(),
|
|
`/vault/policy/acl/${encodeURIComponent(policyLower)}`,
|
|
'navigates to policy show on successful save'
|
|
);
|
|
assert.dom(SELECT.policyTitle).hasText(policyLower, 'displays the policy name on the show page');
|
|
// will fail if you have a license about to expire.
|
|
assert.dom('[data-test-flash-message].is-info').doesNotExist('no flash message is displayed on save');
|
|
await click(SELECT.listBreadcrumb);
|
|
|
|
assert.strictEqual(currentURL(), `/vault/policies/acl`, 'navigates to policy list from breadcrumb');
|
|
// List of policies can get long quickly -- filter for the policy to make the test more robust
|
|
await fillIn(SELECT.filterBar, policyLower);
|
|
assert
|
|
.dom(`[data-test-policy-link="${policyLower}"]`)
|
|
.exists({ count: 1 }, 'new policy shown in the list');
|
|
|
|
// policy deletion
|
|
await click(SELECT.policyByName(policyLower));
|
|
|
|
await click('[data-test-policy-edit-toggle]');
|
|
|
|
await click('[data-test-confirm-action-trigger]');
|
|
|
|
await click('[data-test-confirm-button]');
|
|
await waitUntil(() => currentURL() === `/vault/policies/acl`);
|
|
assert.strictEqual(
|
|
currentURL(),
|
|
`/vault/policies/acl`,
|
|
'navigates to policy list on successful deletion'
|
|
);
|
|
assert
|
|
.dom(`[data-test-policy-item="${policyLower}"]`)
|
|
.doesNotExist('deleted policy is not shown in the list');
|
|
});
|
|
});
|