vault/ui/tests/unit/utils/openapi-to-attrs-test.js
Matthew Irish 7e9c016883
UI - add kmip engine (#6936)
* add kmip engine

* adjust where kmip engine is mounted and sketch out routes

* add secret mount path service to share params to engines

* move list-controller and list-route mixins to core addon and adjust imports

* properly link kmip secrets from the secrets list page

* tweak routes and add list controllers

* stub out some models and adapters

* fix mixin exports

* move a bunch of components into the core addon

* use new empty yield in list-view in the namespace template

* scopes list using list-view and list-item components

* simplify and flatten routes, templates for all of the list pages

* role show route and template and scope create template

* add ember-router-helpers

* add more packages to the dependencies of the core addon

* add field-group-show component for listing fields from a model

* move more components to the shared addon

* make configure and configuration routes work and save a generated model

* save and list scopes

* role create, list, read

* list credentials properly

* move allowed attributes to field group

* show allowed operations on role details page

* add kmip logo to mount secrets engine list page

* add role edit page

* show all model attributes on role show page

* enable role edit

* fix newFields error by creating open api role model on the role list route

* only show selected fields on role edit page

* do not send scope and backend attrs to api

* move path-or-array to core addon

* move string-list component to core addon

* remove extra top border when there is only one field group

* add icons for all of the list pages

* update kmip config model so defaultValue doesn't error

* generate credentials

* credential create and show

* only show kmip when feature is enabled

* fix saving of TTL fields generated from Open API

* move masked-input and list-pagination components to core addon

* add param on edit form to allow for calling onSave after render happens

* polish credential show page and redirect there after generating credentials

* add externalLink for kmip engine

* add kmip-breadcrumb component

* use kmip-breadcrumb component

* add linkPrefix param to linked-block component to allow for routing programmatically inside an engine

* redirect to the right place when enabling kmip

* fix linting

* review feedback

* update signature for path-help usage

* fix ttl field expansion test

* remove role filed from role form, fix generate redirect

* remove field-group-show because it's in the core addon

* remove bottom rule from show pages

* fix Max TTL displayAttrs for ssh role

* update edit-form to take fields or attrs

* fix linting

* remove listenAddrs and set default val on ttl if a val is passed in
2019-06-21 16:05:45 -05:00

227 lines
5.9 KiB
JavaScript

import { expandOpenApiProps, combineAttributes, combineFieldGroups } from 'vault/utils/openapi-to-attrs';
import { module, test } from 'qunit';
import DS from 'ember-data';
const { attr } = DS;
module('Unit | Util | OpenAPI Data Utilities', function() {
const OPENAPI_RESPONSE_PROPS = {
ttl: {
type: 'string',
format: 'seconds',
description: 'this is a TTL!',
'x-vault-displayAttrs': {
name: 'TTL',
},
},
'awesome-people': {
type: 'array',
items: {
type: 'string',
},
'x-vault-displayAttrs': {
value: 'Grace Hopper,Lady Ada',
},
},
'favorite-ice-cream': {
type: 'string',
enum: ['vanilla', 'chocolate', 'strawberry'],
},
'default-value': {
default: 30,
'x-vault-displayAttrs': {
value: 300,
},
type: 'integer',
},
default: {
'x-vault-displayAttrs': {
value: 30,
},
type: 'integer',
},
'super-secret': {
type: 'string',
'x-vault-displayAttrs': {
sensitive: true,
},
description: 'A really secret thing',
},
};
const EXPANDED_PROPS = {
ttl: {
helpText: 'this is a TTL!',
editType: 'ttl',
label: 'TTL',
fieldGroup: 'default',
},
awesomePeople: {
editType: 'stringArray',
type: 'array',
defaultValue: 'Grace Hopper,Lady Ada',
fieldGroup: 'default',
},
favoriteIceCream: {
editType: 'string',
type: 'string',
possibleValues: ['vanilla', 'chocolate', 'strawberry'],
fieldGroup: 'default',
},
defaultValue: {
editType: 'number',
type: 'number',
defaultValue: 300,
fieldGroup: 'default',
},
default: {
editType: 'number',
type: 'number',
defaultValue: 30,
fieldGroup: 'default',
},
superSecret: {
type: 'string',
editType: 'string',
sensitive: true,
helpText: 'A really secret thing',
fieldGroup: 'default',
},
};
const EXISTING_MODEL_ATTRS = [
{
key: 'name',
value: {
isAttribute: true,
name: 'name',
options: {
editType: 'string',
label: 'Role name',
},
},
},
{
key: 'awesomePeople',
value: {
isAttribute: true,
name: 'awesomePeople',
options: {
label: 'People Who Are Awesome',
},
},
},
];
const COMBINED_ATTRS = {
name: attr('string', {
editType: 'string',
type: 'string',
label: 'Role name',
}),
ttl: attr('string', {
editType: 'ttl',
label: 'TTL',
helpText: 'this is a TTL!',
}),
awesomePeople: attr({
label: 'People Who Are Awesome',
editType: 'stringArray',
type: 'array',
defaultValue: 'Grace Hopper,Lady Ada',
}),
favoriteIceCream: attr('string', {
type: 'string',
editType: 'string',
possibleValues: ['vanilla', 'chocolate', 'strawberry'],
}),
superSecret: attr('string', {
type: 'string',
editType: 'string',
sensitive: true,
description: 'A really secret thing',
}),
};
const NEW_FIELDS = ['one', 'two', 'three'];
test('it creates objects from OpenAPI schema props', function(assert) {
const generatedProps = expandOpenApiProps(OPENAPI_RESPONSE_PROPS);
for (let propName in EXPANDED_PROPS) {
assert.deepEqual(EXPANDED_PROPS[propName], generatedProps[propName], `correctly expands ${propName}`);
}
});
test('it combines OpenAPI props with existing model attrs', function(assert) {
const combined = combineAttributes(EXISTING_MODEL_ATTRS, EXPANDED_PROPS);
for (let propName in EXISTING_MODEL_ATTRS) {
assert.deepEqual(COMBINED_ATTRS[propName], combined[propName]);
}
});
test('it adds new fields from OpenAPI to fieldGroups except for exclusions', function(assert) {
let modelFieldGroups = [
{ default: ['name', 'awesomePeople'] },
{
Options: ['ttl'],
},
];
const excludedFields = ['two'];
const expectedGroups = [
{ default: ['name', 'awesomePeople', 'one', 'three'] },
{
Options: ['ttl'],
},
];
const newFieldGroups = combineFieldGroups(modelFieldGroups, NEW_FIELDS, excludedFields);
for (let groupName in modelFieldGroups) {
assert.deepEqual(
newFieldGroups[groupName],
expectedGroups[groupName],
'it incorporates all new fields except for those excluded'
);
}
});
test('it adds all new fields from OpenAPI to fieldGroups when excludedFields is empty', function(assert) {
let modelFieldGroups = [
{ default: ['name', 'awesomePeople'] },
{
Options: ['ttl'],
},
];
const excludedFields = [];
const expectedGroups = [
{ default: ['name', 'awesomePeople', 'one', 'two', 'three'] },
{
Options: ['ttl'],
},
];
const nonExcludedFieldGroups = combineFieldGroups(modelFieldGroups, NEW_FIELDS, excludedFields);
for (let groupName in modelFieldGroups) {
assert.deepEqual(
nonExcludedFieldGroups[groupName],
expectedGroups[groupName],
'it incorporates all new fields'
);
}
});
test('it keeps fields the same when there are no brand new fields from OpenAPI', function(assert) {
let modelFieldGroups = [
{ default: ['name', 'awesomePeople', 'two', 'one', 'three'] },
{
Options: ['ttl'],
},
];
const excludedFields = [];
const expectedGroups = [
{ default: ['name', 'awesomePeople', 'two', 'one', 'three'] },
{
Options: ['ttl'],
},
];
const fieldGroups = combineFieldGroups(modelFieldGroups, NEW_FIELDS, excludedFields);
for (let groupName in modelFieldGroups) {
assert.deepEqual(fieldGroups[groupName], expectedGroups[groupName], 'it incorporates all new fields');
}
});
});