diff --git a/ui/lib/kv/addon/components/page/secrets/create.hbs b/ui/lib/kv/addon/components/page/secrets/create.hbs
index 326ecab52f9a..4eefecf19854 100644
--- a/ui/lib/kv/addon/components/page/secrets/create.hbs
+++ b/ui/lib/kv/addon/components/page/secrets/create.hbs
@@ -21,6 +21,7 @@
@secret={{@secret}}
@modelValidations={{this.modelValidations}}
@pathValidations={{this.pathValidations}}
+ @type="create"
/>
`, { owner: this.engine });
-
+ await render(hbs`
`, {
+ owner: this.engine,
+ });
await fillIn(FORM.inputByAttr('path'), this.path);
await fillIn(FORM.keyInput(), 'foo');
await fillIn(FORM.maskedValueInput(), 'bar');
@@ -40,7 +41,6 @@ module('Integration | Component | kv-v2 | KvDataFields', function (hooks) {
assert.expect(3);
await render(hbs`
`, { owner: this.engine });
-
assert.strictEqual(
codemirror().getValue(' '),
`{ \"\": \"\" }`, // eslint-disable-line no-useless-escape
@@ -63,7 +63,7 @@ module('Integration | Component | kv-v2 | KvDataFields', function (hooks) {
secretData: this.secret.secretData,
});
- await render(hbs`
`, {
+ await render(hbs`
`, {
owner: this.engine,
});
@@ -73,4 +73,35 @@ module('Integration | Component | kv-v2 | KvDataFields', function (hooks) {
assert.dom(FORM.maskedValueInput()).hasValue('bar');
assert.dom(FORM.dataInputLabel({ isJson: false })).hasText('Version data');
});
+
+ test('it shows readonly info rows when viewing secret details of simple secret', async function (assert) {
+ assert.expect(3);
+ this.secret.secretData = { foo: 'bar' };
+ this.secret.path = this.path;
+
+ await render(hbs`
`, {
+ owner: this.engine,
+ });
+ assert.dom(PAGE.infoRow).exists({ count: 1 }, '1 row of data shows');
+ assert.dom(PAGE.infoRowValue('foo')).hasText('***********');
+ await click(PAGE.infoRowToggleMasked('foo'));
+ assert.dom(PAGE.infoRowValue('foo')).hasText('bar', 'secret value shows after toggle');
+ });
+
+ test('it shows readonly json editor when viewing secret details of complex secret', async function (assert) {
+ assert.expect(3);
+ this.secret.secretData = {
+ foo: {
+ bar: 'baz',
+ },
+ };
+ this.secret.path = this.path;
+
+ await render(hbs`
`, {
+ owner: this.engine,
+ });
+ assert.dom(PAGE.infoRowValue('foo')).doesNotExist('does not render rows of secret data');
+ assert.dom('[data-test-component="code-mirror-modifier"]').hasClass('readonly-codemirror');
+ assert.dom('[data-test-component="code-mirror-modifier"]').includesText(`{ "foo": { "bar": "baz" }}`);
+ });
});
diff --git a/ui/tests/integration/components/kv/page/kv-page-secret-details-test.js b/ui/tests/integration/components/kv/page/kv-page-secret-details-test.js
index 1520818eb598..e570753989a8 100644
--- a/ui/tests/integration/components/kv/page/kv-page-secret-details-test.js
+++ b/ui/tests/integration/components/kv/page/kv-page-secret-details-test.js
@@ -23,8 +23,10 @@ module('Integration | Component | kv-v2 | Page::Secret::Details', function (hook
this.server.post('/sys/capabilities-self', allowAllCapabilitiesStub());
this.backend = 'kv-engine';
this.path = 'my-secret';
+ this.pathComplex = 'my-secret-object';
this.version = 2;
this.dataId = kvDataPath(this.backend, this.path);
+ this.dataIdComplex = kvDataPath(this.backend, this.pathComplex);
this.metadataId = kvMetadataPath(this.backend, this.path);
this.secretData = { foo: 'bar' };
@@ -38,6 +40,22 @@ module('Integration | Component | kv-v2 | Page::Secret::Details', function (hook
destroyed: false,
version: this.version,
});
+ // nested secret
+ this.secretDataComplex = {
+ foo: {
+ bar: 'baz',
+ },
+ };
+ this.store.pushPayload('kv/data', {
+ modelName: 'kv/data',
+ id: this.dataIdComplex,
+ secret_data: this.secretDataComplex,
+ created_time: '2023-08-20T02:12:17.379762Z',
+ custom_metadata: null,
+ deletion_time: '',
+ destroyed: false,
+ version: this.version,
+ });
const metadata = this.server.create('kv-metadatum');
metadata.id = this.metadataId;
@@ -48,6 +66,7 @@ module('Integration | Component | kv-v2 | Page::Secret::Details', function (hook
this.metadata = this.store.peekRecord('kv/metadata', this.metadataId);
this.secret = this.store.peekRecord('kv/data', this.dataId);
+ this.secretComplex = this.store.peekRecord('kv/data', this.dataIdComplex);
// this is the route model, not an ember data model
this.model = {
@@ -61,6 +80,12 @@ module('Integration | Component | kv-v2 | Page::Secret::Details', function (hook
{ label: this.model.backend, route: 'list' },
{ label: this.model.path },
];
+ this.modelComplex = {
+ backend: this.backend,
+ path: this.pathComplex,
+ secret: this.secretComplex,
+ metadata: this.metadata,
+ };
});
test('it renders secret details and toggles json view', async function (assert) {
@@ -90,6 +115,23 @@ module('Integration | Component | kv-v2 | Page::Secret::Details', function (hook
.includesText(`Version ${this.version} created`, 'renders version and time created');
});
+ test('it renders json view when secret is complex', async function (assert) {
+ assert.expect(3);
+ await render(
+ hbs`
+
+ `,
+ { owner: this.engine }
+ );
+ assert.dom(PAGE.infoRowValue('foo')).doesNotExist('does not render rows of secret data');
+ assert.dom(FORM.toggleJson).isDisabled();
+ assert.dom('[data-test-component="code-mirror-modifier"]').includesText(`{ "foo": { "bar": "baz" }}`);
+ });
+
test('it renders deleted empty state', async function (assert) {
assert.expect(3);
this.secret.deletionTime = '2023-07-23T02:12:17.379762Z';