160 lines
4.7 KiB
JavaScript
160 lines
4.7 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: MPL-2.0
|
|
*/
|
|
|
|
import { module, test } from 'qunit';
|
|
import { setupTest } from 'ember-qunit';
|
|
import { sanitizePath, ensureTrailingSlash } from 'vault/services/console';
|
|
import sinon from 'sinon';
|
|
|
|
module('Unit | Service | console', function (hooks) {
|
|
setupTest(hooks);
|
|
hooks.beforeEach(function () {});
|
|
hooks.afterEach(function () {});
|
|
|
|
test('#sanitizePath', function (assert) {
|
|
assert.strictEqual(
|
|
sanitizePath(' /foo/bar/baz/ '),
|
|
'foo/bar/baz',
|
|
'removes spaces and slashs on either side'
|
|
);
|
|
assert.strictEqual(sanitizePath('//foo/bar/baz/'), 'foo/bar/baz', 'removes more than one slash');
|
|
});
|
|
|
|
test('#ensureTrailingSlash', function (assert) {
|
|
assert.strictEqual(ensureTrailingSlash('foo/bar'), 'foo/bar/', 'adds trailing slash');
|
|
assert.strictEqual(ensureTrailingSlash('baz/'), 'baz/', 'keeps trailing slash if there is one');
|
|
});
|
|
|
|
const testCases = [
|
|
{
|
|
method: 'read',
|
|
args: ['/sys/health', {}],
|
|
expectedURL: 'sys/health',
|
|
expectedVerb: 'GET',
|
|
expectedOptions: { data: undefined, wrapTTL: undefined },
|
|
},
|
|
|
|
{
|
|
method: 'read',
|
|
args: ['/secrets/foo/bar', {}, { wrapTTL: '30m' }],
|
|
expectedURL: 'secrets/foo/bar',
|
|
expectedVerb: 'GET',
|
|
expectedOptions: { data: undefined, wrapTTL: '30m' },
|
|
},
|
|
|
|
{
|
|
method: 'write',
|
|
args: ['aws/roles/my-other-role', { arn: 'arn=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess' }],
|
|
expectedURL: 'aws/roles/my-other-role',
|
|
expectedVerb: 'POST',
|
|
expectedOptions: {
|
|
data: { arn: 'arn=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess' },
|
|
wrapTTL: undefined,
|
|
},
|
|
},
|
|
|
|
{
|
|
method: 'list',
|
|
args: ['secret/mounts', {}],
|
|
expectedURL: 'secret/mounts/',
|
|
expectedVerb: 'GET',
|
|
expectedOptions: { data: { list: true }, wrapTTL: undefined },
|
|
},
|
|
|
|
{
|
|
method: 'list',
|
|
args: ['secret/mounts', {}, { wrapTTL: '1h' }],
|
|
expectedURL: 'secret/mounts/',
|
|
expectedVerb: 'GET',
|
|
expectedOptions: { data: { list: true }, wrapTTL: '1h' },
|
|
},
|
|
|
|
{
|
|
method: 'delete',
|
|
args: ['secret/secrets/kv'],
|
|
expectedURL: 'secret/secrets/kv',
|
|
expectedVerb: 'DELETE',
|
|
expectedOptions: { data: undefined, wrapTTL: undefined },
|
|
},
|
|
];
|
|
|
|
test('it reads, writes, lists, deletes', function (assert) {
|
|
assert.expect(18);
|
|
const ajax = sinon.stub();
|
|
const uiConsole = this.owner.factoryFor('service:console').create({
|
|
adapter() {
|
|
return {
|
|
buildURL(url) {
|
|
return url;
|
|
},
|
|
ajax,
|
|
};
|
|
},
|
|
});
|
|
|
|
testCases.forEach((testCase) => {
|
|
uiConsole[testCase.method](...testCase.args);
|
|
const [url, verb, options] = ajax.lastCall.args;
|
|
assert.strictEqual(url, testCase.expectedURL, `${testCase.method}: uses trimmed passed url`);
|
|
assert.strictEqual(verb, testCase.expectedVerb, `${testCase.method}: uses the correct verb`);
|
|
assert.deepEqual(options, testCase.expectedOptions, `${testCase.method}: uses the correct options`);
|
|
});
|
|
});
|
|
|
|
const kvTestCases = [
|
|
{
|
|
method: 'kvGet',
|
|
args: ['kv/foo'],
|
|
expectedURL: 'kv/data/foo',
|
|
expectedVerb: 'GET',
|
|
expectedOptions: { data: undefined, wrapTTL: undefined },
|
|
},
|
|
{
|
|
method: 'kvGet',
|
|
args: ['kv/foo', {}, { metadata: true }],
|
|
expectedURL: 'kv/metadata/foo',
|
|
expectedVerb: 'GET',
|
|
expectedOptions: { data: undefined, wrapTTL: undefined },
|
|
},
|
|
{
|
|
method: 'kvGet',
|
|
args: ['kv/foo', {}, { wrapTTL: '10m' }],
|
|
expectedURL: 'kv/data/foo',
|
|
expectedVerb: 'GET',
|
|
expectedOptions: { data: undefined, wrapTTL: '10m' },
|
|
},
|
|
{
|
|
method: 'kvGet',
|
|
args: ['kv/foo', {}, { metadata: true, wrapTTL: '10m' }],
|
|
expectedURL: 'kv/metadata/foo',
|
|
expectedVerb: 'GET',
|
|
expectedOptions: { data: undefined, wrapTTL: '10m' },
|
|
},
|
|
];
|
|
|
|
test('it reads kv secret and metadata', function (assert) {
|
|
assert.expect(12);
|
|
const ajax = sinon.stub();
|
|
const uiConsole = this.owner.factoryFor('service:console').create({
|
|
adapter() {
|
|
return {
|
|
buildURL(url) {
|
|
return url;
|
|
},
|
|
ajax,
|
|
};
|
|
},
|
|
});
|
|
|
|
kvTestCases.forEach((testCase) => {
|
|
uiConsole[testCase.method](...testCase.args);
|
|
const [url, verb, options] = ajax.lastCall.args;
|
|
assert.strictEqual(url, testCase.expectedURL, `${testCase.method}: uses correct url`);
|
|
assert.strictEqual(verb, testCase.expectedVerb, `${testCase.method}: uses the correct verb`);
|
|
assert.deepEqual(options, testCase.expectedOptions, `${testCase.method}: uses the correct options`);
|
|
});
|
|
});
|
|
});
|