Merge pull request #192 from hashicorp/ICU-605-format-yarn-task

Run format yarn task
This commit is contained in:
Randall Morey authored and GitHub committed 2020-09-16 14:44:40 -04:00
commit 33448de090
250 files changed
+1745 -1363

No files matched your search

+3 -4
View File
@@ -35,13 +35,12 @@ function payloadIsBlank(adapterPayload) {
* @return {object}
*/
function prenormalizeArrayResponse(response) {
return payloadIsBlank(response) ? {items: []} : response;
return payloadIsBlank(response) ? { items: [] } : response;
}
export default class ApplicationAdapter extends RESTAdapter.extend(
AdapterBuildURLMixin
) {
// =attributes
/**
@@ -68,7 +67,7 @@ export default class ApplicationAdapter extends RESTAdapter.extend(
* @param {object} snapshot
* @return {string}
*/
urlSuffix(modelName, id, snapshot={}) {
urlSuffix(modelName, id, snapshot = {}) {
const method = getWithDefault(snapshot, 'adapterOptions.method', '');
return method ? `:${method}` : '';
}
@@ -205,7 +204,7 @@ export default class ApplicationAdapter extends RESTAdapter.extend(
normalizeErrorResponse(/*status, headers, payload*/) {
const errors = super.normalizeErrorResponse(...arguments);
if (isArray(errors)) {
errors.forEach(error => {
errors.forEach((error) => {
switch (Number(error.status)) {
case 401:
error.isUnauthenticated = true;
+6 -6
View File
@@ -2,19 +2,20 @@ import BaseModel from '../../models/base';
import { attr } from '@ember-data/model';
/**
* Account contains all fields related to an account resource
* Account contains all fields related to an account resource
*/
export default class GeneratedAccountModel extends BaseModel {
// =attributes
@attr('string', {
description: 'The type of the resource, to help differentiate schemas'
}) type;
description: 'The type of the resource, to help differentiate schemas',
})
type;
@attr('string', {
description: 'The owning auth method ID.',
}) auth_method_id;
})
auth_method_id;
@attr('string', {
description: 'Optional name for identification purposes',
@@ -42,5 +43,4 @@ export default class GeneratedAccountModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
}
@@ -5,12 +5,12 @@ import { attr } from '@ember-data/model';
*
*/
export default class GeneratedAuthMethodModel extends BaseModel {
// =attributes
@attr('string', {
description: 'The type of the resource, to help differentiate schemas'
}) type;
description: 'The type of the resource, to help differentiate schemas',
})
type;
@attr('string', {
description: 'Optional name for identification purposes',
@@ -43,5 +43,4 @@ export default class GeneratedAuthMethodModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
}
+1 -2
View File
@@ -3,7 +3,7 @@ import { attr } from '@ember-data/model';
/**
* Group contains all fields related to a Group resource
*/
*/
export default class GeneratedGroupModel extends BaseModel {
// = attributes
@@ -38,5 +38,4 @@ export default class GeneratedGroupModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
}
@@ -5,42 +5,47 @@ import { attr } from '@ember-data/model';
* HostCatalog manages Hosts and HostSets
*/
export default class GeneratedHostCatalogModel extends BaseModel {
// =attributes
@attr('string', {
description: 'The type of the resource, to help differentiate schemas'
}) type;
description: 'The type of the resource, to help differentiate schemas',
})
type;
@attr('string', {
description: 'Optional name for identification purposes'
}) name;
description: 'Optional name for identification purposes',
})
name;
@attr('string', {
description: 'Optional user-set description for identification purposes'
}) description;
description: 'Optional user-set description for identification purposes',
})
description;
@attr('date', {
description: 'The time this resource was created\nOutput only.',
readOnly: true
}) created_time;
readOnly: true,
})
created_time;
@attr('date', {
description: 'The time this resource was last updated\nOutput only.',
readOnly: true
}) updated_time;
readOnly: true,
})
updated_time;
@attr('boolean', {
description: 'Whether the catalog is disabled'
}) disabled;
description: 'Whether the catalog is disabled',
})
disabled;
@attr({
description: 'Attributes specific to the catalog type'
}) attributes;
description: 'Attributes specific to the catalog type',
})
attributes;
@attr('number', {
description: 'Current version number of this resource.',
})
version;
}
+20 -15
View File
@@ -5,35 +5,40 @@ import { attr } from '@ember-data/model';
* HostSet is a collection of Hosts created and managed by a HostCatalog
*/
export default class GeneratedHostSetModel extends BaseModel {
// =attributes
@attr('string', {
description: 'The type of the resource, to help differentiate schemas',
readOnly: true
}) type;
readOnly: true,
})
type;
@attr('string', {
description: 'The owning host catalog ID.',
}) host_catalog_id;
})
host_catalog_id;
@attr('string', {
description: 'Optional name for identification purposes'
}) name;
description: 'Optional name for identification purposes',
})
name;
@attr('string', {
description: 'Optional user-set description for identification purposes'
}) description;
description: 'Optional user-set description for identification purposes',
})
description;
@attr('date', {
description: 'The time this resource was created\nOutput only.',
readOnly: true
}) created_time;
readOnly: true,
})
created_time;
@attr('date', {
description: 'The time this resource was last updated\nOutput only.',
readOnly: true
}) updated_time;
readOnly: true,
})
updated_time;
@attr('number', {
description: 'Current version number of this resource.',
@@ -42,7 +47,7 @@ export default class GeneratedHostSetModel extends BaseModel {
@attr('number', {
description: 'The total count of hosts in this host set\nOutput only.',
readOnly: true
}) size;
readOnly: true,
})
size;
}
+17 -13
View File
@@ -5,38 +5,42 @@ import { attr } from '@ember-data/model';
* Host contains all fields related to a Host resource
*/
export default class GeneratedHostModel extends BaseModel {
// =attributes
@attr('string', {
description: 'The type of the resource, to help differentiate schemas'
}) type;
description: 'The type of the resource, to help differentiate schemas',
})
type;
@attr('string', {
description: 'The owning host catalog ID.',
}) host_catalog_id;
})
host_catalog_id;
@attr('string', {
description: 'Optional name for identification purposes'
}) name;
description: 'Optional name for identification purposes',
})
name;
@attr('string', {
description: 'Optional user-set description for identification purposes'
}) description;
description: 'Optional user-set description for identification purposes',
})
description;
@attr('date', {
description: 'The time this resource was created\nOutput only.',
readOnly: true
}) created_time;
readOnly: true,
})
created_time;
@attr('date', {
description: 'The time this resource was last updated\nOutput only.',
readOnly: true
}) updated_time;
readOnly: true,
})
updated_time;
@attr('number', {
description: 'Current version number of this resource.',
})
version;
}
@@ -38,5 +38,4 @@ export default class GeneratedRoleModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
}
+3 -4
View File
@@ -5,12 +5,12 @@ import { attr } from '@ember-data/model';
*
*/
export default class GeneratedScopeModel extends BaseModel {
// =attributes
@attr('string', {
description: 'The type of the resource'
}) type;
description: 'The type of the resource',
})
type;
@attr('string', {
description: 'Optional name for identification purposes',
@@ -38,5 +38,4 @@ export default class GeneratedScopeModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
}
+18 -13
View File
@@ -5,34 +5,39 @@ import { attr } from '@ember-data/model';
* Target
*/
export default class GeneratedTargetModel extends BaseModel {
// =attributes
@attr('string', {
description: 'The type of the resource, to help differentiate schemas'
}) type;
description: 'The type of the resource, to help differentiate schemas',
})
type;
@attr('string', {
description: 'Optional name for identification purposes'
}) name;
description: 'Optional name for identification purposes',
})
name;
@attr('string', {
description: 'Optional user-set description for identification purposes'
}) description;
description: 'Optional user-set description for identification purposes',
})
description;
@attr('date', {
description: 'The time this resource was created\nOutput only.',
readOnly: true
}) created_time;
readOnly: true,
})
created_time;
@attr('date', {
description: 'The time this resource was last updated\nOutput only.',
readOnly: true
}) updated_time;
readOnly: true,
})
updated_time;
@attr('boolean', {
description: 'Whether the catalog is disabled'
}) disabled;
description: 'Whether the catalog is disabled',
})
disabled;
@attr('number', {
description: 'Current version number of this resource.',
+1 -1
View File
@@ -3,7 +3,7 @@ import { attr } from '@ember-data/model';
/**
* User contains all fields related to a user resource
*/
*/
export default class GeneratedUserModel extends BaseModel {
// =attributes
+1 -3
View File
@@ -13,7 +13,6 @@ import { get } from '@ember/object';
* uses this mixin to alter generated URLs.
*/
export default Mixin.create({
// =methods
/**
@@ -162,6 +161,5 @@ export default Mixin.create({
*/
urlForDeleteRecord(id, modelName, snapshot) {
return this._buildURL(modelName, id, snapshot);
}
},
});
+4 -6
View File
@@ -2,7 +2,6 @@ import GeneratedAccountModel from '../generated/models/account';
import { fragment } from 'ember-data-model-fragments/attributes';
export default class AccountModel extends GeneratedAccountModel {
/**
* Attributes of this resource, if any, represented as a JSON fragment.
* @type {FragmentAccountAttributesModel}
@@ -19,18 +18,17 @@ export default class AccountModel extends GeneratedAccountModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
setPassword(password, options={ adapterOptions: {} }) {
setPassword(password, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'set-password',
password
password,
};
return this.save({
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
}
-2
View File
@@ -26,7 +26,6 @@ import { get } from '@ember/object';
* 2) Or as an ID: `record.scopeID`.
*/
export default class BaseModel extends Model {
// =relationships
/**
@@ -83,5 +82,4 @@ export default class BaseModel extends Model {
get cannotSave() {
return !this.canSave;
}
}
@@ -2,9 +2,8 @@ import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentAccountAttributesModel extends Fragment {
@attr('string', {
description: 'The account login name'
}) login_name;
description: 'The account login name',
})
login_name;
}
@@ -2,9 +2,8 @@ import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentHostAttributesModel extends Fragment {
@attr('string', {
description: 'The address (DNS or IP name) used to reach the host'
}) address;
description: 'The address (DNS or IP name) used to reach the host',
})
address;
}
+6 -6
View File
@@ -2,15 +2,15 @@ import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentHostSetModel extends Fragment {
// =attributes
@attr('string', {
description: 'ID of the related host set'
}) host_set_id;
description: 'ID of the related host set',
})
host_set_id;
@attr('string', {
description: 'ID of the catalog to which the host set belongs'
}) host_catalog_id;
description: 'ID of the catalog to which the host set belongs',
})
host_catalog_id;
}
@@ -2,19 +2,20 @@ import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentPrincipal extends Fragment {
// =attributes
@attr('string', {
description: 'ID of the related scope'
}) scope_id;
description: 'ID of the related scope',
})
scope_id;
@attr('string', {
description: 'ID of the related principal (user or group)'
}) principal_id;
description: 'ID of the related principal (user or group)',
})
principal_id;
@attr('string', {
description: 'Type of the related principal (user or group)'
}) type;
description: 'Type of the related principal (user or group)',
})
type;
}
+15 -9
View File
@@ -4,33 +4,39 @@ import { attr } from '@ember-data/model';
import { scopeTypes } from './scope';
export default class FragmentScope extends Fragment {
// =attributes
@attr('string', {
description: 'ID of the related scope'
}) scope_id;
description: 'ID of the related scope',
})
scope_id;
@attr('string', {
description: 'The type of the resource'
}) type;
description: 'The type of the resource',
})
type;
/**
* @type {boolean}
*/
@computed('type')
get isGlobal() { return this.type === scopeTypes.global; }
get isGlobal() {
return this.type === scopeTypes.global;
}
/**
* @type {boolean}
*/
@computed('type')
get isOrg() { return this.type === scopeTypes.org; }
get isOrg() {
return this.type === scopeTypes.org;
}
/**
* @type {boolean}
*/
@computed('type')
get isProject() { return this.type === scopeTypes.project; }
get isProject() {
return this.type === scopeTypes.project;
}
}
+1 -3
View File
@@ -5,12 +5,10 @@ import { attr } from '@ember-data/model';
* Represents an item in an array of strings.
*/
export default class FragmentStringModel extends Fragment {
// =attributes
@attr('string', {
description: 'The value of the string.'
description: 'The value of the string.',
})
value;
}
@@ -2,9 +2,8 @@ import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentTargetAttributesModel extends Fragment {
@attr('number', {
description: 'The default port a target should use if present.'
}) default_port;
description: 'The default port a target should use if present.',
})
default_port;
}
+12 -13
View File
@@ -4,7 +4,6 @@ import { computed } from '@ember/object';
import { A } from '@ember/array';
export default class GroupModel extends GeneratedGroupModel {
// =attributes
/**
@@ -14,8 +13,9 @@ export default class GroupModel extends GeneratedGroupModel {
@attr({
readOnly: true,
defaultValue: () => A(),
emptyArrayIfMissing: true
}) member_ids;
emptyArrayIfMissing: true,
})
member_ids;
/**
* An array of resolved user instances.
@@ -26,7 +26,7 @@ export default class GroupModel extends GeneratedGroupModel {
@computed('member_ids.[]')
get members() {
return this.member_ids
.map(id => this.store.peekRecord('user', id))
.map((id) => this.store.peekRecord('user', id))
.filter(Boolean);
}
@@ -40,10 +40,10 @@ export default class GroupModel extends GeneratedGroupModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
addMembers(memberIDs, options={ adapterOptions: {} }) {
addMembers(memberIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'add-members',
memberIDs
memberIDs,
};
// There is no "deep merge" in ES.
// All of this nonsense is here to ensure we get
@@ -52,8 +52,8 @@ export default class GroupModel extends GeneratedGroupModel {
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
@@ -65,10 +65,10 @@ export default class GroupModel extends GeneratedGroupModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
removeMembers(memberIDs, options={ adapterOptions: {} }) {
removeMembers(memberIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'remove-members',
memberIDs
memberIDs,
};
// There is no "deep merge" in ES.
// All of this nonsense is here to ensure we get
@@ -77,8 +77,8 @@ export default class GroupModel extends GeneratedGroupModel {
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
@@ -91,5 +91,4 @@ export default class GroupModel extends GeneratedGroupModel {
removeMember(memberID, options) {
return this.removeMembers([memberID], options);
}
}
+11 -11
View File
@@ -2,7 +2,6 @@ import GeneratedHostSetModel from '../generated/models/host-set';
import { fragmentArray } from 'ember-data-model-fragments/attributes';
export default class HostSetModel extends GeneratedHostSetModel {
// =attributes
/**
@@ -11,8 +10,9 @@ export default class HostSetModel extends GeneratedHostSetModel {
*/
@fragmentArray('fragment-string', {
readOnly: true,
emptyArrayIfMissing: true
}) host_ids;
emptyArrayIfMissing: true,
})
host_ids;
// =methods
@@ -24,17 +24,17 @@ export default class HostSetModel extends GeneratedHostSetModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
addHosts(hostIDs, options={ adapterOptions: {} }) {
addHosts(hostIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'add-hosts',
hostIDs
hostIDs,
};
return this.save({
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
@@ -46,17 +46,17 @@ export default class HostSetModel extends GeneratedHostSetModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
removeHosts(hostIDs, options={ adapterOptions: {} }) {
removeHosts(hostIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'remove-hosts',
hostIDs
hostIDs,
};
return this.save({
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
-2
View File
@@ -2,11 +2,9 @@ import GeneratedHostModel from '../generated/models/host';
import { fragment } from 'ember-data-model-fragments/attributes';
export default class HostModel extends GeneratedHostModel {
/**
* Attributes of this resource, if any, represented as a JSON fragment.
* @type {FragmentHostAttributesModel}
*/
@fragment('fragment-host-attributes', { defaultValue: {} }) attributes;
}
+14 -15
View File
@@ -2,7 +2,6 @@ import GeneratedRoleModel from '../generated/models/role';
import { fragmentArray } from 'ember-data-model-fragments/attributes';
export default class RoleModel extends GeneratedRoleModel {
// =attributes
/**
@@ -14,14 +13,15 @@ export default class RoleModel extends GeneratedRoleModel {
*/
@fragmentArray('fragment-principal', {
readOnly: true,
emptyArrayIfMissing: true
}) principals;
emptyArrayIfMissing: true,
})
principals;
/**
* Grants is read-only _most_ under normal circumstances. But grants can
* be persisted via a dedicated call to `saveGrants()`.
*/
@fragmentArray('fragment-string', {readOnly: true}) grants;
@fragmentArray('fragment-string', { readOnly: true }) grants;
// =methods
@@ -34,8 +34,8 @@ export default class RoleModel extends GeneratedRoleModel {
return this.save({
adapterOptions: {
method: 'set-grants',
serializeGrants: true
}
serializeGrants: true,
},
});
}
@@ -47,10 +47,10 @@ export default class RoleModel extends GeneratedRoleModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
addPrincipals(principalIDs, options={ adapterOptions: {} }) {
addPrincipals(principalIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'add-principals',
principalIDs
principalIDs,
};
// There is no "deep merge" in ES.
// All of this nonsense is here to ensure we get
@@ -59,8 +59,8 @@ export default class RoleModel extends GeneratedRoleModel {
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
@@ -72,10 +72,10 @@ export default class RoleModel extends GeneratedRoleModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
removePrincipals(principalIDs, options={ adapterOptions: {} }) {
removePrincipals(principalIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'remove-principals',
principalIDs
principalIDs,
};
// There is no "deep merge" in ES.
// All of this nonsense is here to ensure we get
@@ -84,8 +84,8 @@ export default class RoleModel extends GeneratedRoleModel {
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
@@ -98,5 +98,4 @@ export default class RoleModel extends GeneratedRoleModel {
removePrincipal(principalID, options) {
return this.removePrincipals([principalID], options);
}
}
+1 -3
View File
@@ -4,11 +4,10 @@ import { computed } from '@ember/object';
export const scopeTypes = {
global: 'global',
org: 'org',
project: 'project'
project: 'project',
};
export default class ScopeModel extends GeneratedScopeModel {
// =attributes
/**
@@ -42,5 +41,4 @@ export default class ScopeModel extends GeneratedScopeModel {
set isProject(value) {
if (value) this.type = scopeTypes.project;
}
}
+13 -14
View File
@@ -3,7 +3,6 @@ import { fragment, fragmentArray } from 'ember-data-model-fragments/attributes';
import { computed } from '@ember/object';
export default class TargetModel extends GeneratedTargetModel {
// =attributes
/**
@@ -17,8 +16,9 @@ export default class TargetModel extends GeneratedTargetModel {
*/
@fragmentArray('fragment-host-set', {
readOnly: true,
emptyArrayIfMissing: true
}) host_sets;
emptyArrayIfMissing: true,
})
host_sets;
/**
* An array of resolved host set and host catalog instances. Model instances
@@ -31,9 +31,9 @@ export default class TargetModel extends GeneratedTargetModel {
return this.host_sets
.map(({ host_set_id, host_catalog_id }) => ({
model: this.store.peekRecord('host-set', host_set_id),
hostCatalog: this.store.peekRecord('host-catalog', host_catalog_id)
hostCatalog: this.store.peekRecord('host-catalog', host_catalog_id),
}))
.filter(hostSetRef => hostSetRef.model !== null);
.filter((hostSetRef) => hostSetRef.model !== null);
}
// =methods
@@ -46,10 +46,10 @@ export default class TargetModel extends GeneratedTargetModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
addHostSets(hostSetIDs, options={ adapterOptions: {} }) {
addHostSets(hostSetIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'add-host-sets',
hostSetIDs
hostSetIDs,
};
// There is no "deep merge" in ES.
// All of this nonsense is here to ensure we get
@@ -58,8 +58,8 @@ export default class TargetModel extends GeneratedTargetModel {
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
@@ -71,10 +71,10 @@ export default class TargetModel extends GeneratedTargetModel {
* @param {object} options.adapterOptions
* @return {Promise}
*/
removeHostSets(hostSetIDs, options={ adapterOptions: {} }) {
removeHostSets(hostSetIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'remove-host-sets',
hostSetIDs
hostSetIDs,
};
// There is no "deep merge" in ES.
// All of this nonsense is here to ensure we get
@@ -83,8 +83,8 @@ export default class TargetModel extends GeneratedTargetModel {
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions
}
...options.adapterOptions,
},
});
}
@@ -97,5 +97,4 @@ export default class TargetModel extends GeneratedTargetModel {
removeHostSet(hostSetID, options) {
return this.removeHostSets([hostSetID], options);
}
}
+2 -3
View File
@@ -1,7 +1,6 @@
import ApplicationSerializer from './application';
export default class AccountSerializer extends ApplicationSerializer {
// =methods
/**
@@ -16,7 +15,8 @@ export default class AccountSerializer extends ApplicationSerializer {
serialize(snapshot) {
const password = snapshot?.adapterOptions?.password;
let serialized = super.serialize(...arguments);
if (password && snapshot?.record?.isNew) serialized.attributes.password = password;
if (password && snapshot?.record?.isNew)
serialized.attributes.password = password;
if (snapshot?.adapterOptions?.method === 'set-password') {
serialized = this.serializeForSetPassword(snapshot, password);
}
@@ -35,5 +35,4 @@ export default class AccountSerializer extends ApplicationSerializer {
password,
};
}
}
+4 -4
View File
@@ -7,7 +7,6 @@ import { copy } from 'ember-copy';
* Manages serialization/normalization of data to/from the API.
*/
export default class ApplicationSerializer extends RESTSerializer {
// =methods
/**
@@ -160,9 +159,11 @@ export default class ApplicationSerializer extends RESTSerializer {
* @return {object}
*/
normalizeMissingArrays(store, primaryModelClass, payload) {
const attrDefs = store._attributesDefinitionFor(primaryModelClass.modelName);
const attrDefs = store._attributesDefinitionFor(
primaryModelClass.modelName
);
if (attrDefs) {
Object.keys(attrDefs).forEach(key => {
Object.keys(attrDefs).forEach((key) => {
if (!payload[key] && attrDefs[key]?.options?.emptyArrayIfMissing) {
payload[key] = [];
}
@@ -187,5 +188,4 @@ export default class ApplicationSerializer extends RESTSerializer {
if (scopeID) normalizedHash.scope.scope_id = scopeID;
return super.normalize(typeClass, normalizedHash);
}
}
@@ -1,7 +1,6 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentHostSetSerializer extends JSONSerializer {
// =methods
/**
@@ -14,5 +13,4 @@ export default class FragmentHostSetSerializer extends JSONSerializer {
normalize(typeClass, { id: host_set_id, ...obj }) {
return super.normalize(typeClass, { host_set_id, ...obj });
}
}
@@ -1,7 +1,6 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentPrincipalSerializer extends JSONSerializer {
// =methods
/**
@@ -14,5 +13,4 @@ export default class FragmentPrincipalSerializer extends JSONSerializer {
normalize(typeClass, { id: principal_id, ...obj }) {
return super.normalize(typeClass, { principal_id, ...obj });
}
}
+1 -3
View File
@@ -1,7 +1,6 @@
import ApplicationSerializer from './application';
export default class GroupSerializer extends ApplicationSerializer {
// =methods
/**
@@ -27,8 +26,7 @@ export default class GroupSerializer extends ApplicationSerializer {
serializewithMembers(snapshot, memberIDs) {
return {
version: snapshot.attr('version'),
member_ids: memberIDs
member_ids: memberIDs,
};
}
}
+1 -4
View File
@@ -1,7 +1,6 @@
import ApplicationSerializer from './application';
export default class HostSetSerializer extends ApplicationSerializer {
// =methods
/**
@@ -44,10 +43,8 @@ export default class HostSetSerializer extends ApplicationSerializer {
// TODO: can fragment string normalization be handled generically?
// TODO: host_ids might actually be attributes.host_ids
if (resourceHash.host_ids) {
resourceHash.host_ids =
resourceHash.host_ids.map(value => ({ value }));
resourceHash.host_ids = resourceHash.host_ids.map((value) => ({ value }));
}
return super.normalize(modelClass, resourceHash);
}
}
+9 -8
View File
@@ -2,7 +2,6 @@ import ApplicationSerializer from './application';
import { get } from '@ember/object';
export default class RoleSerializer extends ApplicationSerializer {
// =methods
/**
@@ -20,8 +19,8 @@ export default class RoleSerializer extends ApplicationSerializer {
let serialized = super.serialize(...arguments);
if (serializeGrants) serialized = this.serializeWithGrants(snapshot);
const principalIDs = snapshot?.adapterOptions?.principalIDs;
if (principalIDs) serialized =
this.serializewithPrincipals(snapshot, principalIDs);
if (principalIDs)
serialized = this.serializewithPrincipals(snapshot, principalIDs);
return serialized;
}
@@ -33,7 +32,9 @@ export default class RoleSerializer extends ApplicationSerializer {
serializeWithGrants(snapshot) {
return {
version: snapshot.attr('version'),
grant_strings: snapshot.attr('grants').map(grant => grant.attr('value'))
grant_strings: snapshot
.attr('grants')
.map((grant) => grant.attr('value')),
};
}
@@ -47,7 +48,7 @@ export default class RoleSerializer extends ApplicationSerializer {
serializewithPrincipals(snapshot, principalIDs) {
return {
version: snapshot.attr('version'),
principal_ids: principalIDs
principal_ids: principalIDs,
};
}
@@ -62,10 +63,10 @@ export default class RoleSerializer extends ApplicationSerializer {
normalize(modelClass, resourceHash) {
// TODO: can fragment string normalization be handled generically?
if (resourceHash.grant_strings) {
resourceHash.grants =
resourceHash.grant_strings.map(value => ({ value }));
resourceHash.grants = resourceHash.grant_strings.map((value) => ({
value,
}));
}
return super.normalize(modelClass, resourceHash);
}
}
+3 -5
View File
@@ -1,7 +1,6 @@
import ApplicationSerializer from './application';
export default class TargetSerializer extends ApplicationSerializer {
// =methods
/**
@@ -15,8 +14,8 @@ export default class TargetSerializer extends ApplicationSerializer {
serialize(snapshot) {
let serialized = super.serialize(...arguments);
const hostSetIDs = snapshot?.adapterOptions?.hostSetIDs;
if (hostSetIDs) serialized =
this.serializeWithHostSets(snapshot, hostSetIDs);
if (hostSetIDs)
serialized = this.serializeWithHostSets(snapshot, hostSetIDs);
return serialized;
}
@@ -30,8 +29,7 @@ export default class TargetSerializer extends ApplicationSerializer {
serializeWithHostSets(snapshot, hostSetIDs) {
return {
version: snapshot.attr('version'),
host_set_ids: hostSetIDs
host_set_ids: hostSetIDs,
};
}
}
+1 -5
View File
@@ -1,17 +1,13 @@
export default function() {
export default function () {
// These comments are here to help you get started. Feel free to delete them.
/*
Config (with defaults).
Note: these only affect routes defined *after* them!
*/
// this.urlPrefix = ''; // make this `http://localhost:8080`, for example, if your API is on a different server
// this.namespace = ''; // make this `/api`, for example, if your API is namespaced
// this.timing = 400; // delay for each request, automatically set to 0 during testing
/*
Shorthand cheatsheet:
@@ -1,9 +1,7 @@
export default function(/* server */) {
export default function (/* server */) {
/*
Seed your development database using your factories.
This data will not be loaded in your tests.
*/
// server.createList('post', 10);
}
@@ -1,4 +1,3 @@
import { JSONAPISerializer } from 'ember-cli-mirage';
export default JSONAPISerializer.extend({
});
export default JSONAPISerializer.extend({});
@@ -35,7 +35,7 @@ module('Unit | Adapter | application', function (hooks) {
const method = 'set-something';
const adapter = this.owner.lookup('adapter:application');
const suffix = adapter.urlSuffix(null, null, {
adapterOptions: { method }
adapterOptions: { method },
});
assert.ok(config.api.namespace);
assert.equal(suffix, ':set-something');
@@ -48,31 +48,56 @@ module('Unit | Adapter | application', function (hooks) {
const mockSnapshot = {
adapterOptions: {
scopeID,
method
}
method,
},
};
const adapter = this.owner.lookup('adapter:application');
// test URL generation for each request type...
const findRecordURL = adapter.buildURL('user', '1', mockSnapshot, 'findRecord');
const findRecordURL = adapter.buildURL(
'user',
'1',
mockSnapshot,
'findRecord'
);
assert.equal(findRecordURL, '/v1/users/1:my-custom-method');
const findAllURL = adapter.buildURL('user', null, mockSnapshot, 'findAll');
assert.equal(findAllURL, '/v1/users:my-custom-method');
const findBelongsToURL = adapter.buildURL('user', '2', mockSnapshot, 'findBelongsTo');
const findBelongsToURL = adapter.buildURL(
'user',
'2',
mockSnapshot,
'findBelongsTo'
);
assert.equal(findBelongsToURL, '/v1/users/2:my-custom-method');
const createRecordURL = adapter.buildURL('user', null, mockSnapshot, 'createRecord');
const createRecordURL = adapter.buildURL(
'user',
null,
mockSnapshot,
'createRecord'
);
assert.equal(createRecordURL, '/v1/users:my-custom-method');
const updateRecordURL = adapter.buildURL('user', '3', mockSnapshot, 'updateRecord');
const updateRecordURL = adapter.buildURL(
'user',
'3',
mockSnapshot,
'updateRecord'
);
assert.equal(updateRecordURL, '/v1/users/3:my-custom-method');
const deleteRecordURL = adapter.buildURL('user', '4', mockSnapshot, 'deleteRecord');
const deleteRecordURL = adapter.buildURL(
'user',
'4',
mockSnapshot,
'deleteRecord'
);
assert.equal(deleteRecordURL, '/v1/users/4:my-custom-method');
});
test('it can request records through the store from a specified scope', async function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
this.server.get('/v1/groups', (_, { queryParams: { scope_id }}) => {
this.server.get('/v1/groups', (_, { queryParams: { scope_id } }) => {
assert.equal(scope_id, 'p_456', 'Scoped resource URL was requested.');
return {items: []};
return { items: [] };
});
await store.query('group', { scope_id: 'p_456' });
});
@@ -95,15 +120,15 @@ module('Unit | Adapter | application', function (hooks) {
const store = this.owner.lookup('service:store');
const snapshot = store.createRecord('role', {})._createSnapshot();
snapshot.adapterOptions = {
method: 'custom-method'
}
method: 'custom-method',
};
// TODO this is icky, should be changed to a spy or stub
const originalAjax = RESTAdapter.prototype.ajax;
RESTAdapter.prototype.ajax = (url, type) => {
assert.equal(type, 'POST');
RESTAdapter.prototype.ajax = originalAjax;
};
adapter.updateRecord(store, {modelName: 'user'}, snapshot);
adapter.updateRecord(store, { modelName: 'user' }, snapshot);
});
test('it prenormalizes "empty" responses into a form that the fetch-manager will not reject', async function (assert) {
@@ -111,8 +136,13 @@ module('Unit | Adapter | application', function (hooks) {
const adapter = this.owner.lookup('adapter:application');
const store = this.owner.lookup('service:store');
this.server.get('/v1/users', () => new Response({}));
const prenormalized = await adapter.findAll(store, {modelName: 'user'}, null, []);
assert.deepEqual(prenormalized, {items: []});
const prenormalized = await adapter.findAll(
store,
{ modelName: 'user' },
null,
[]
);
assert.deepEqual(prenormalized, { items: [] });
});
test('it correctly identifies 400 responses as invalid', function (assert) {
@@ -3,7 +3,7 @@ import AdapterBuildURLMixin from 'api/mixins/adapter-build-url';
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Mixin | build-url', function(hooks) {
module('Unit | Mixin | build-url', function (hooks) {
setupTest(hooks);
test('it does not interfere with basic URLs', function (assert) {
@@ -18,7 +18,7 @@ module('Unit | Mixin | build-url', function(hooks) {
test('it does not interfere with namespaced URLs', function (assert) {
assert.expect(1);
const Adapter = RESTAdapter.extend(AdapterBuildURLMixin, {
namespace: 'api/v1'
namespace: 'api/v1',
});
this.owner.register('adapter:adapter', Adapter);
const adapter = this.owner.lookup('adapter:adapter');
@@ -30,8 +30,8 @@ module('Unit | Mixin | build-url', function(hooks) {
assert.expect(1);
const Adapter = RESTAdapter.extend(AdapterBuildURLMixin, {
urlPrefix() {
return '/foo/bars'
}
return '/foo/bars';
},
});
this.owner.register('adapter:adapter', Adapter);
const adapter = this.owner.lookup('adapter:adapter');
@@ -43,13 +43,12 @@ module('Unit | Mixin | build-url', function(hooks) {
assert.expect(1);
const Adapter = RESTAdapter.extend(AdapterBuildURLMixin, {
urlSuffix() {
return ':method'
}
return ':method';
},
});
this.owner.register('adapter:adapter', Adapter);
const adapter = this.owner.lookup('adapter:adapter');
const url = adapter._buildURL('model', 1);
assert.equal(url, '/models/1:method');
});
});
+2 -3
View File
@@ -1,13 +1,12 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | account', function(hooks) {
module('Unit | Model | account', function (hooks) {
setupTest(hooks);
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('account', {});
assert.ok(model);
});
});
@@ -1,11 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | auth method', function(hooks) {
module('Unit | Model | auth method', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('auth-method', {});
assert.ok(model);
+20 -20
View File
@@ -19,8 +19,8 @@ module('Unit | Model | base', function (hooks) {
store.push({
data: {
id: 'o_1',
type: 'scope'
}
type: 'scope',
},
});
store.push({
data: {
@@ -29,10 +29,10 @@ module('Unit | Model | base', function (hooks) {
attributes: {
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const scope = store.peekRecord('scope', 'o_1');
const model = store.peekRecord('user', '123abc');
@@ -42,7 +42,7 @@ module('Unit | Model | base', function (hooks) {
test('it may accept a `scopeModel` for convenience, instead of a fragment', function (assert) {
assert.expect(3);
const store = this.owner.lookup('service:store');
const scope = store.createRecord('scope', {id: 'o_1', type: 'org'});
const scope = store.createRecord('scope', { id: 'o_1', type: 'org' });
const model = store.createRecord('user', '123abc');
assert.notEqual(model.scopeID, scope.id);
model.scopeModel = scope;
@@ -98,17 +98,17 @@ module('Unit | Model | base', function (hooks) {
const store = this.owner.lookup('service:store');
const model = store.createRecord('user', { scopeID: 'o_123' });
this.server.post('/v1/users', () => {
assert.ok(true, 'Correctly scoped create record URL was requested.')
assert.ok(true, 'Correctly scoped create record URL was requested.');
return {};
});
await model.save();
this.server.patch('/v1/users', () => {
assert.ok(true, 'Correctly scoped update record URL was requested.')
assert.ok(true, 'Correctly scoped update record URL was requested.');
return {};
});
await model.save();
this.server.delete('/v1/users', () => {
assert.ok(true, 'Correctly scoped delete record URL was requested.')
assert.ok(true, 'Correctly scoped delete record URL was requested.');
return {};
});
await model.destroyRecord();
@@ -118,35 +118,35 @@ module('Unit | Model | base', function (hooks) {
assert.expect(3);
const store = this.owner.lookup('service:store');
const customScopeID = 'global';
const scope = {scope_id: 'o_123'};
const scope = { scope_id: 'o_123' };
const model = store.createRecord('user', { scope });
this.server.post('/v1/users', () => {
assert.ok(true, 'Correctly scoped create record URL was requested.')
assert.ok(true, 'Correctly scoped create record URL was requested.');
return {};
});
await model.save({adapterOptions: {scopeID: customScopeID}});
await model.save({ adapterOptions: { scopeID: customScopeID } });
this.server.patch('/v1/users', () => {
assert.ok(true, 'Correctly scoped update record URL was requested.')
assert.ok(true, 'Correctly scoped update record URL was requested.');
return {};
});
await model.save({adapterOptions: {scopeID: customScopeID}});
await model.save({ adapterOptions: { scopeID: customScopeID } });
this.server.delete('/v1/users', () => {
assert.ok(true, 'Correctly scoped delete record URL was requested.')
assert.ok(true, 'Correctly scoped delete record URL was requested.');
return {};
});
await model.destroyRecord({adapterOptions: {scopeID: customScopeID}});
await model.destroyRecord({ adapterOptions: { scopeID: customScopeID } });
});
test('it saves records to a URL with a custom method if requested', async function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const method = 'my-custom-method';
const scope = {scope_id: 'o_123'};
const scope = { scope_id: 'o_123' };
const model = store.createRecord('user', { scope });
this.server.post(`/v1/users:${method}`, () => {
assert.ok(true, 'Correctly scoped create record URL was requested.')
assert.ok(true, 'Correctly scoped create record URL was requested.');
return {};
});
await model.save({adapterOptions: {method}});
await model.save({ adapterOptions: { method } });
});
});
@@ -1,11 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment host set', function(hooks) {
module('Unit | Model | fragment host set', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('fragment-host-set', {});
assert.ok(model);
@@ -1,11 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment principal', function(hooks) {
module('Unit | Model | fragment principal', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('fragment-principal', {});
assert.ok(model);
@@ -1,11 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment string', function(hooks) {
module('Unit | Model | fragment string', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('fragment-string', {});
assert.ok(model);
+50 -34
View File
@@ -2,11 +2,11 @@ import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
module('Unit | Model | group', function(hooks) {
module('Unit | Model | group', function (hooks) {
setupTest(hooks);
setupMirage(hooks);
test('it has a `members` array of resolved model instances (if those instances are already in the store)', function(assert) {
test('it has a `members` array of resolved model instances (if those instances are already in the store)', function (assert) {
assert.expect(4);
const store = this.owner.lookup('service:store');
store.push({
@@ -14,30 +14,42 @@ module('Unit | Model | group', function(hooks) {
id: 'group_123',
type: 'group',
attributes: {
member_ids: [ '1', '2', ]
}
}
member_ids: ['1', '2'],
},
},
});
const group = store.peekRecord('group', 'group_123');
assert.equal(group.member_ids.length, 2, 'Group has two entires in member_ids');
assert.equal(group.members.length, 0, 'Group has no resolved members because they are not loaded yet');
assert.equal(
group.member_ids.length,
2,
'Group has two entires in member_ids'
);
assert.equal(
group.members.length,
0,
'Group has no resolved members because they are not loaded yet'
);
store.push({
data: {
id: '1',
type: 'user',
attributes: {}
}
attributes: {},
},
});
store.push({
data: {
id: '2',
type: 'user',
attributes: {}
}
attributes: {},
},
});
// eslint-disable-next-line no-self-assign
group.member_ids = [...group.member_ids];
assert.equal(group.member_ids.length, 2, 'Group has two entires in member_ids');
assert.equal(
group.member_ids.length,
2,
'Group has two entires in member_ids'
);
assert.equal(group.members.length, 2, 'Group has two resolved members');
});
@@ -47,7 +59,7 @@ module('Unit | Model | group', function(hooks) {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
member_ids: ['123_abc', 'foobar'],
version: 1
version: 1,
});
});
const store = this.owner.lookup('service:store');
@@ -58,14 +70,14 @@ module('Unit | Model | group', function(hooks) {
attributes: {
name: 'Group',
description: 'Description',
member_ids: [ '1', '2' ],
member_ids: ['1', '2'],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('group', '123abc');
await model.addMembers(['123_abc', 'foobar']);
@@ -77,7 +89,7 @@ module('Unit | Model | group', function(hooks) {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
member_ids: ['1', '3'],
version: 1
version: 1,
});
});
const store = this.owner.lookup('service:store');
@@ -88,14 +100,14 @@ module('Unit | Model | group', function(hooks) {
attributes: {
name: 'group',
description: 'Description',
member_ids: [ '4', '5' ],
member_ids: ['4', '5'],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('group', '123abc');
await model.removeMembers(['1', '3']);
@@ -107,7 +119,7 @@ module('Unit | Model | group', function(hooks) {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
member_ids: ['3'],
version: 1
version: 1,
});
});
const store = this.owner.lookup('service:store');
@@ -118,29 +130,33 @@ module('Unit | Model | group', function(hooks) {
attributes: {
name: 'group',
description: 'Description',
member_ids: [ '1', '3' ],
member_ids: ['1', '3'],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('group', '123abc');
await model.removeMember('3');
});
test('it defaults `members_ids` to an empty array when model instance does not define it', function(assert) {
test('it defaults `members_ids` to an empty array when model instance does not define it', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
store.push({
data: {
id: 'group_123',
type: 'group'
}
type: 'group',
},
});
const group = store.peekRecord('group', 'group_123');
assert.equal(group.member_ids.length, 0, 'Group has empty member_ids by default');
assert.equal(
group.member_ids.length,
0,
'Group has empty member_ids by default'
);
});
});
@@ -1,10 +1,10 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | host catalog', function(hooks) {
module('Unit | Model | host catalog', function (hooks) {
setupTest(hooks);
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('host-catalog', {});
assert.ok(model);
@@ -1,11 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | host set', function(hooks) {
module('Unit | Model | host set', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('host-set', {});
assert.ok(model);
+5 -5
View File
@@ -1,23 +1,23 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | host', function(hooks) {
module('Unit | Model | host', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('host', {});
assert.ok(model);
});
test('it contains attributes', function(assert) {
test('it contains attributes', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('host', {
type: 'static',
attributes: {
address: '127.0.0.1'
}
address: '127.0.0.1',
},
});
assert.equal(model.attributes.address, '127.0.0.1');
});
+43 -37
View File
@@ -6,7 +6,7 @@ module('Unit | Model | role', function (hooks) {
setupTest(hooks);
setupMirage(hooks);
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('role', {});
assert.ok(model);
@@ -18,7 +18,7 @@ module('Unit | Model | role', function (hooks) {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
grant_strings: ['grant1', 'grant2'],
version: 1
version: 1,
});
});
const store = this.owner.lookup('service:store');
@@ -29,14 +29,14 @@ module('Unit | Model | role', function (hooks) {
attributes: {
name: 'Role',
description: 'Description',
grants: [{value: 'grant1'}, {value: 'grant2'}],
grants: [{ value: 'grant1' }, { value: 'grant2' }],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('role', '123abc');
await model.saveGrants();
@@ -48,7 +48,7 @@ module('Unit | Model | role', function (hooks) {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
principal_ids: ['123_abc', 'foobar'],
version: 1
version: 1,
});
});
const store = this.owner.lookup('service:store');
@@ -61,15 +61,15 @@ module('Unit | Model | role', function (hooks) {
description: 'Description',
principals: [
{ id: '1', type: 'user' },
{ id: '3', type: 'group' }
{ id: '3', type: 'group' },
],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('role', '123abc');
await model.addPrincipals(['123_abc', 'foobar']);
@@ -77,13 +77,16 @@ module('Unit | Model | role', function (hooks) {
test('it has a `removePrincipals` method that targets a specific POST API endpoint and serialization', async function (assert) {
assert.expect(1);
this.server.post('/v1/roles/123abc:remove-principals', (schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
principal_ids: ['1', '3'],
version: 1
});
});
this.server.post(
'/v1/roles/123abc:remove-principals',
(schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
principal_ids: ['1', '3'],
version: 1,
});
}
);
const store = this.owner.lookup('service:store');
store.push({
data: {
@@ -94,15 +97,15 @@ module('Unit | Model | role', function (hooks) {
description: 'Description',
principals: [
{ id: '1', type: 'user' },
{ id: '3', type: 'group' }
{ id: '3', type: 'group' },
],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('role', '123abc');
await model.removePrincipals(['1', '3']);
@@ -110,13 +113,16 @@ module('Unit | Model | role', function (hooks) {
test('it has a `removePrincipal` method that deletes a single principal using `removePrincipals` method', async function (assert) {
assert.expect(1);
this.server.post('/v1/roles/123abc:remove-principals', (schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
principal_ids: ['3'],
version: 1
});
});
this.server.post(
'/v1/roles/123abc:remove-principals',
(schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
principal_ids: ['3'],
version: 1,
});
}
);
const store = this.owner.lookup('service:store');
store.push({
data: {
@@ -127,15 +133,15 @@ module('Unit | Model | role', function (hooks) {
description: 'Description',
principals: [
{ id: '1', type: 'user' },
{ id: '3', type: 'group' }
{ id: '3', type: 'group' },
],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('role', '123abc');
await model.removePrincipal('3');
+40 -18
View File
@@ -2,37 +2,60 @@ import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
module('Unit | Model | scope', function(hooks) {
module('Unit | Model | scope', function (hooks) {
setupTest(hooks);
setupMirage(hooks);
test('it may have a scope fragment', async function(assert) {
test('it may have a scope fragment', async function (assert) {
assert.expect(6);
const store = this.owner.lookup('service:store');
this.server.get('/v1/scopes', () => ({
items: [
{id: 'global', type: 'global'},
{id: 'o_1', type: 'org', scope: {scope_id: 'global'}},
{id: 'o_2', type: 'org', scope: {scope_id: 'global'}},
{id: 'p_1', type: 'project', scope: {scope_id: 'o_1'}},
{id: 'p_2', type: 'project', scope: {scope_id: 'o_1'}},
{id: 'p_3', type: 'project', scope: {scope_id: 'o_2'}},
]
{ id: 'global', type: 'global' },
{ id: 'o_1', type: 'org', scope: { scope_id: 'global' } },
{ id: 'o_2', type: 'org', scope: { scope_id: 'global' } },
{ id: 'p_1', type: 'project', scope: { scope_id: 'o_1' } },
{ id: 'p_2', type: 'project', scope: { scope_id: 'o_1' } },
{ id: 'p_3', type: 'project', scope: { scope_id: 'o_2' } },
],
}));
const scopes = await store.findAll('scope');
// check integrity of scope relationships
assert.notOk(await scopes.firstObject.get('scope'), 'Global scope has no parent');
assert.equal(await scopes.objectAt(1).get('scope.scope_id'), 'global', 'Org 1 parent scope is global');
assert.equal(await scopes.objectAt(2).get('scope.scope_id'), 'global', 'Org 2 parent scope is global');
assert.equal(await scopes.objectAt(3).get('scope.scope_id'), 'o_1', 'Project 1 parent scope is org 1');
assert.equal(await scopes.objectAt(4).get('scope.scope_id'), 'o_1', 'Project 2 parent scope is org 1');
assert.equal(await scopes.objectAt(5).get('scope.scope_id'), 'o_2', 'Project 3 parent scope is org 2');
assert.notOk(
await scopes.firstObject.get('scope'),
'Global scope has no parent'
);
assert.equal(
await scopes.objectAt(1).get('scope.scope_id'),
'global',
'Org 1 parent scope is global'
);
assert.equal(
await scopes.objectAt(2).get('scope.scope_id'),
'global',
'Org 2 parent scope is global'
);
assert.equal(
await scopes.objectAt(3).get('scope.scope_id'),
'o_1',
'Project 1 parent scope is org 1'
);
assert.equal(
await scopes.objectAt(4).get('scope.scope_id'),
'o_1',
'Project 2 parent scope is org 1'
);
assert.equal(
await scopes.objectAt(5).get('scope.scope_id'),
'o_2',
'Project 3 parent scope is org 2'
);
});
test('it has isType boolean getters and setters', async function(assert) {
test('it has isType boolean getters and setters', async function (assert) {
assert.expect(9);
const store = this.owner.lookup('service:store');
const model = store.createRecord('scope', {type: 'global'});
const model = store.createRecord('scope', { type: 'global' });
assert.ok(model.isGlobal);
assert.notOk(model.isOrg);
assert.notOk(model.isProject);
@@ -45,5 +68,4 @@ module('Unit | Model | scope', function(hooks) {
assert.notOk(model.isOrg);
assert.ok(model.isProject);
});
});
+66 -45
View File
@@ -6,7 +6,7 @@ module('Unit | Model | target', function (hooks) {
setupTest(hooks);
setupMirage(hooks);
test('it has a `hostSets` array of resolved model instances (if those instances are already in the store)', function(assert) {
test('it has a `hostSets` array of resolved model instances (if those instances are already in the store)', function (assert) {
assert.expect(6);
const store = this.owner.lookup('service:store');
store.push({
@@ -16,41 +16,56 @@ module('Unit | Model | target', function (hooks) {
attributes: {
host_sets: [
{ host_set_id: '1', host_catalog_id: '2' },
{ host_set_id: '3', host_catalog_id: '2' }
]
}
}
{ host_set_id: '3', host_catalog_id: '2' },
],
},
},
});
const target = store.peekRecord('target', '123abc');
assert.equal(target.host_sets.length, 2, 'Target has two entires in host_sets');
assert.equal(target.hostSets.length, 0, 'Target has no resolved hostSets because they are not loaded yet');
assert.equal(
target.host_sets.length,
2,
'Target has two entires in host_sets'
);
assert.equal(
target.hostSets.length,
0,
'Target has no resolved hostSets because they are not loaded yet'
);
store.push({
data: {
id: '1',
type: 'host-set',
attributes: {}
}
attributes: {},
},
});
store.push({
data: {
id: '3',
type: 'host-set',
attributes: {}
}
attributes: {},
},
});
// Since `hostSets` is computed on `host_sets`, not the store itself,
// it's necessary to do this assignment to kick-off the computed update.
// eslint-disable-next-line no-self-assign
target.host_sets = target.host_sets;
assert.equal(target.host_sets.length, 2, 'Target has two entires in host_sets');
assert.equal(
target.host_sets.length,
2,
'Target has two entires in host_sets'
);
assert.equal(target.hostSets.length, 2, 'Target has two resolved hostSets');
assert.notOk(target.hostSets[0].hostCatalog, 'Host catalog was not resolved because it is not loaded yet');
assert.notOk(
target.hostSets[0].hostCatalog,
'Host catalog was not resolved because it is not loaded yet'
);
store.push({
data: {
id: '2',
type: 'host-catalog',
attributes: {}
}
attributes: {},
},
});
// eslint-disable-next-line no-self-assign
target.host_sets = target.host_sets;
@@ -63,7 +78,7 @@ module('Unit | Model | target', function (hooks) {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
host_set_ids: ['123_abc', 'foobar'],
version: 1
version: 1,
});
});
const store = this.owner.lookup('service:store');
@@ -76,15 +91,15 @@ module('Unit | Model | target', function (hooks) {
description: 'Description',
host_sets: [
{ host_set_id: '1', host_catalog_id: '2' },
{ host_set_id: '3', host_catalog_id: '4' }
{ host_set_id: '3', host_catalog_id: '4' },
],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('target', '123abc');
await model.addHostSets(['123_abc', 'foobar']);
@@ -92,13 +107,16 @@ module('Unit | Model | target', function (hooks) {
test('it has a `removeHostSets` method that targets a specific POST API endpoint and serialization', async function (assert) {
assert.expect(1);
this.server.post('/v1/targets/123abc:remove-host-sets', (schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
host_set_ids: ['1', '3'],
version: 1
});
});
this.server.post(
'/v1/targets/123abc:remove-host-sets',
(schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
host_set_ids: ['1', '3'],
version: 1,
});
}
);
const store = this.owner.lookup('service:store');
store.push({
data: {
@@ -109,15 +127,15 @@ module('Unit | Model | target', function (hooks) {
description: 'Description',
host_sets: [
{ host_set_id: '1', host_catalog_id: '2' },
{ host_set_id: '3', host_catalog_id: '4' }
{ host_set_id: '3', host_catalog_id: '4' },
],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('target', '123abc');
await model.removeHostSets(['1', '3']);
@@ -125,13 +143,16 @@ module('Unit | Model | target', function (hooks) {
test('it has a `removeHostSet` method that deletes a single host set using `removeHostSets` method', async function (assert) {
assert.expect(1);
this.server.post('/v1/targets/123abc:remove-host-sets', (schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
host_set_ids: ['3'],
version: 1
});
});
this.server.post(
'/v1/targets/123abc:remove-host-sets',
(schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
host_set_ids: ['3'],
version: 1,
});
}
);
const store = this.owner.lookup('service:store');
store.push({
data: {
@@ -142,15 +163,15 @@ module('Unit | Model | target', function (hooks) {
description: 'Description',
host_sets: [
{ host_set_id: '1', host_catalog_id: '2' },
{ host_set_id: '3', host_catalog_id: '4' }
{ host_set_id: '3', host_catalog_id: '4' },
],
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope'
}
}
}
type: 'scope',
},
},
},
});
const model = store.peekRecord('target', '123abc');
await model.removeHostSet('3');
+2 -2
View File
@@ -1,10 +1,10 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | user', function(hooks) {
module('Unit | Model | user', function (hooks) {
setupTest(hooks);
test('it exists', function(assert) {
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('user', {});
assert.ok(model);
@@ -1,7 +1,7 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | account', function(hooks) {
module('Unit | Serializer | account', function (hooks) {
setupTest(hooks);
test('it serializes normally', function (assert) {
@@ -16,7 +16,7 @@ module('Unit | Serializer | account', function(hooks) {
attributes: {
login_name: 'Login Name',
},
version: 1
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {};
@@ -27,9 +27,9 @@ module('Unit | Serializer | account', function(hooks) {
auth_method_id: '1',
description: 'Description',
attributes: {
login_name: 'Login Name'
login_name: 'Login Name',
},
version: 1
version: 1,
});
});
@@ -45,11 +45,11 @@ module('Unit | Serializer | account', function(hooks) {
attributes: {
login_name: 'Login Name',
},
version: 1
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {
password: 'Password'
password: 'Password',
};
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
@@ -59,9 +59,9 @@ module('Unit | Serializer | account', function(hooks) {
description: 'Description',
attributes: {
login_name: 'Login Name',
password: 'Password'
password: 'Password',
},
version: 1
version: 1,
});
});
@@ -78,20 +78,20 @@ module('Unit | Serializer | account', function(hooks) {
name: 'Name',
description: 'Description',
attributes: {
login_name: 'Login Name'
login_name: 'Login Name',
},
auth_method_id: '1',
version: 1
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {
method: 'set-password',
password: 'Password'
password: 'Password',
};
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
password: 'Password',
version: 1
version: 1,
});
});
});
@@ -19,14 +19,14 @@ module('Unit | Serializer | application', function (hooks) {
description: 'Description',
scope: {
scope_id: 'global',
type: 'global'
}
type: 'global',
},
});
const serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
name: 'User',
description: 'Description',
scope_id: 'global'
scope_id: 'global',
});
});
@@ -38,14 +38,14 @@ module('Unit | Serializer | application', function (hooks) {
description: 'Description',
scope: {
scope_id: 'global',
type: 'global'
}
type: 'global',
},
});
const serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
name: 'User',
description: 'Description',
scope_id: 'global'
scope_id: 'global',
});
});
@@ -55,19 +55,19 @@ module('Unit | Serializer | application', function (hooks) {
const record = store.createRecord('user', {
name: 'User',
description: 'Description',
version: null
version: null,
});
let serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
name: 'User',
description: 'Description'
description: 'Description',
});
record.version = 1;
serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
name: 'User',
description: 'Description',
version: 1
version: 1,
});
});
@@ -121,7 +121,7 @@ module('Unit | Serializer | application', function (hooks) {
const payload = {
id: '1',
name: 'User 1',
scope: { id: 'o_123' }
scope: { id: 'o_123' },
};
const normalized = serializer.normalizeSingleResponse(
store,
@@ -147,7 +147,7 @@ module('Unit | Serializer | application', function (hooks) {
const payload = {
id: '1',
name: 'Target 1',
scope: { id: 'o_123' }
scope: { id: 'o_123' },
};
const normalized = serializer.normalizeSingleResponse(
store,
@@ -162,7 +162,7 @@ module('Unit | Serializer | application', function (hooks) {
attributes: {
name: 'Target 1',
scope: { scope_id: 'o_123' },
host_sets: []
host_sets: [],
},
relationships: {},
},
@@ -2,27 +2,27 @@ import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import FragmentHostSet from 'api/models/fragment-host-set';
module('Unit | Serializer | fragment host set', function(hooks) {
module('Unit | Serializer | fragment host set', function (hooks) {
setupTest(hooks);
test('it normalizes `id` into `host_set_id`', function(assert) {
test('it normalizes `id` into `host_set_id`', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('fragment-host-set');
const normalized = serializer.normalize(FragmentHostSet, {
id: '2',
host_catalog_id: '1'
host_catalog_id: '1',
});
assert.deepEqual(normalized, {
data: {
attributes: {
host_set_id: '2',
host_catalog_id: '1'
host_catalog_id: '1',
},
id: null,
relationships: {},
type: 'fragment-host-set'
}
type: 'fragment-host-set',
},
});
});
});
@@ -2,29 +2,29 @@ import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import FragmentPrincipal from 'api/models/fragment-principal';
module('Unit | Serializer | fragment principal', function(hooks) {
module('Unit | Serializer | fragment principal', function (hooks) {
setupTest(hooks);
test('it normalizes `id` into `principal_id`', function(assert) {
test('it normalizes `id` into `principal_id`', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('fragment-principal');
const normalized = serializer.normalize(FragmentPrincipal, {
scope_id: '1',
principal_id: '2',
type: 'user'
type: 'user',
});
assert.deepEqual(normalized, {
data: {
attributes: {
scope_id: '1',
principal_id: '2',
type: 'user'
type: 'user',
},
id: null,
relationships: {},
type: 'fragment-principal'
}
type: 'fragment-principal',
},
});
});
});
+10 -11
View File
@@ -1,7 +1,7 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | group', function(hooks) {
module('Unit | Serializer | group', function (hooks) {
setupTest(hooks);
test('it serializes groups normally, without members', function (assert) {
@@ -11,8 +11,8 @@ module('Unit | Serializer | group', function(hooks) {
const record = store.createRecord('group', {
name: 'Group',
description: 'Description',
member_ids: [ '1', '2', ],
version: 1
member_ids: ['1', '2'],
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {};
@@ -20,7 +20,7 @@ module('Unit | Serializer | group', function(hooks) {
assert.deepEqual(serializedRecord, {
name: 'Group',
description: 'Description',
version: 1
version: 1,
});
});
@@ -31,17 +31,17 @@ module('Unit | Serializer | group', function(hooks) {
const record = store.createRecord('group', {
name: 'Group',
description: 'Description',
member_ids: [ '1', '2', ],
version: 1
member_ids: ['1', '2'],
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {
memberIDs: ['4', '5']
memberIDs: ['4', '5'],
};
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
member_ids: ['4', '5'],
version: 1
version: 1,
});
});
@@ -53,7 +53,7 @@ module('Unit | Serializer | group', function(hooks) {
const payload = {
id: '1',
name: 'Group 1',
scope: { id: 'o_123' }
scope: { id: 'o_123' },
};
const normalized = serializer.normalizeSingleResponse(
store,
@@ -68,11 +68,10 @@ module('Unit | Serializer | group', function(hooks) {
attributes: {
name: 'Group 1',
scope: { scope_id: 'o_123' },
member_ids: []
member_ids: [],
},
relationships: {},
},
});
});
});
@@ -1,7 +1,7 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | host set', function(hooks) {
module('Unit | Serializer | host set', function (hooks) {
setupTest(hooks);
test('it serializes host sets normally, without host_ids', function (assert) {
@@ -12,7 +12,7 @@ module('Unit | Serializer | host set', function(hooks) {
name: 'Host Set 1',
description: 'Description',
host_catalog_id: '123',
version: 1
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {};
@@ -21,7 +21,7 @@ module('Unit | Serializer | host set', function(hooks) {
name: 'Host Set 1',
description: 'Description',
host_catalog_id: '123',
version: 1
version: 1,
});
});
@@ -32,17 +32,17 @@ module('Unit | Serializer | host set', function(hooks) {
const record = store.createRecord('host-set', {
name: 'Host Set 1',
description: 'Description',
host_ids: [{value: '1'}, {value: '2'}, {value: '3'}],
version: 1
host_ids: [{ value: '1' }, { value: '2' }, { value: '3' }],
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {
hostIDs: ['4', '5']
hostIDs: ['4', '5'],
};
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
host_ids: ['4', '5'],
version: 1
version: 1,
});
});
@@ -54,7 +54,7 @@ module('Unit | Serializer | host set', function(hooks) {
const payload = {
id: '1',
name: 'Host Set 1',
host_ids: ['1', '2', '3']
host_ids: ['1', '2', '3'],
};
const normalized = serializer.normalizeSingleResponse(
store,
@@ -68,7 +68,7 @@ module('Unit | Serializer | host set', function(hooks) {
type: 'host-set',
attributes: {
name: 'Host Set 1',
host_ids: [{value: '1'}, {value: '2'}, {value: '3'}],
host_ids: [{ value: '1' }, { value: '2' }, { value: '3' }],
},
relationships: {},
},
@@ -83,7 +83,7 @@ module('Unit | Serializer | host set', function(hooks) {
const payload = {
id: '1',
name: 'Host Set 1',
scope: { id: 'o_123' }
scope: { id: 'o_123' },
};
const normalized = serializer.normalizeSingleResponse(
store,
@@ -98,11 +98,10 @@ module('Unit | Serializer | host set', function(hooks) {
attributes: {
name: 'Host Set 1',
scope: { scope_id: 'o_123' },
host_ids: []
host_ids: [],
},
relationships: {},
},
});
});
});
+14 -19
View File
@@ -1,7 +1,7 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | role', function(hooks) {
module('Unit | Serializer | role', function (hooks) {
setupTest(hooks);
test('it serializes roles normally, without grants', function (assert) {
@@ -11,8 +11,8 @@ module('Unit | Serializer | role', function(hooks) {
const record = store.createRecord('role', {
name: 'User',
description: 'Description',
grants: [{value: 'foo'}, {value: 'bar'}],
version: 1
grants: [{ value: 'foo' }, { value: 'bar' }],
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {};
@@ -20,7 +20,7 @@ module('Unit | Serializer | role', function(hooks) {
assert.deepEqual(serializedRecord, {
name: 'User',
description: 'Description',
version: 1
version: 1,
});
});
@@ -31,17 +31,17 @@ module('Unit | Serializer | role', function(hooks) {
const record = store.createRecord('role', {
name: 'User',
description: 'Description',
grants: [{value: 'foo'}, {value: 'bar'}],
version: 1
grants: [{ value: 'foo' }, { value: 'bar' }],
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {
serializeGrants: true
serializeGrants: true,
};
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
grant_strings: ['foo', 'bar'],
version: 1
version: 1,
});
});
@@ -53,7 +53,7 @@ module('Unit | Serializer | role', function(hooks) {
const payload = {
id: '1',
name: 'Role 1',
grant_strings: ['*', '*']
grant_strings: ['*', '*'],
};
const normalized = serializer.normalizeSingleResponse(
store,
@@ -67,8 +67,8 @@ module('Unit | Serializer | role', function(hooks) {
type: 'role',
attributes: {
name: 'Role 1',
grants: [{value: '*'}, {value: '*'}],
principals: []
grants: [{ value: '*' }, { value: '*' }],
principals: [],
},
relationships: {},
},
@@ -83,13 +83,9 @@ module('Unit | Serializer | role', function(hooks) {
const payload = {
id: '1',
name: 'Role 1',
scope: { id: 'o_123' }
scope: { id: 'o_123' },
};
const normalized = serializer.normalizeSingleResponse(
store,
role,
payload
);
const normalized = serializer.normalizeSingleResponse(store, role, payload);
assert.deepEqual(normalized, {
included: [],
data: {
@@ -98,11 +94,10 @@ module('Unit | Serializer | role', function(hooks) {
attributes: {
name: 'Role 1',
scope: { scope_id: 'o_123' },
principals: []
principals: [],
},
relationships: {},
},
});
});
});
@@ -1,7 +1,7 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | target', function(hooks) {
module('Unit | Serializer | target', function (hooks) {
setupTest(hooks);
test('it serializes targets normally, without host sets', function (assert) {
@@ -13,14 +13,14 @@ module('Unit | Serializer | target', function(hooks) {
description: 'Description',
host_sets: [
{ host_set_id: '1', host_catalog_id: '2' },
{ host_set_id: '3', host_catalog_id: '4' }
{ host_set_id: '3', host_catalog_id: '4' },
],
scope: {
scope_id: 'org_1',
type: 'org'
type: 'org',
},
version: 1,
type: 'tcp'
type: 'tcp',
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {};
@@ -32,10 +32,9 @@ module('Unit | Serializer | target', function(hooks) {
type: 'tcp',
scope_id: 'org_1',
attributes: {
default_port: null
}
default_port: null,
},
});
});
test('it serializes only host sets and version when an `adapterOptions.hostSetIDs` array is passed', function (assert) {
@@ -47,18 +46,18 @@ module('Unit | Serializer | target', function(hooks) {
description: 'Description',
host_sets: [
{ host_set_id: '1', host_catalog_id: '2' },
{ host_set_id: '3', host_catalog_id: '4' }
{ host_set_id: '3', host_catalog_id: '4' },
],
version: 1
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {
hostSetIDs: ['4', '5']
hostSetIDs: ['4', '5'],
};
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
host_set_ids: ['4', '5'],
version: 1
version: 1,
});
});
@@ -72,8 +71,8 @@ module('Unit | Serializer | target', function(hooks) {
name: 'Target 1',
host_sets: [
{ host_set_id: '1', host_catalog_id: '2' },
{ host_set_id: '3', host_catalog_id: '4' }
]
{ host_set_id: '3', host_catalog_id: '4' },
],
};
const normalized = serializer.normalizeSingleResponse(
store,
@@ -89,8 +88,8 @@ module('Unit | Serializer | target', function(hooks) {
name: 'Target 1',
host_sets: [
{ host_set_id: '1', host_catalog_id: '2' },
{ host_set_id: '3', host_catalog_id: '4' }
]
{ host_set_id: '3', host_catalog_id: '4' },
],
},
relationships: {},
},
@@ -105,7 +104,7 @@ module('Unit | Serializer | target', function(hooks) {
const payload = {
id: '1',
name: 'Target 1',
scope: { id: 'o_123' }
scope: { id: 'o_123' },
};
const normalized = serializer.normalizeSingleResponse(
store,
@@ -120,11 +119,10 @@ module('Unit | Serializer | target', function(hooks) {
attributes: {
name: 'Target 1',
scope: { scope_id: 'o_123' },
host_sets: []
host_sets: [],
},
relationships: {},
},
});
});
});
@@ -1,13 +1,11 @@
import PasswordAuthenticator from 'auth/authenticators/password';
export default class ApplicationPasswordAuthenticator extends PasswordAuthenticator {
buildAuthEndpointURL() {
return '/authenticate';
}
buildDeauthEndpointURL() {
return '/deauthenticate';
}
}
@@ -10,11 +10,14 @@ module('Unit | Authenticator | password', function (hooks) {
test('it authenticates to the specified authEndpoint', async function (assert) {
assert.expect(2);
const authenticator = this.owner.lookup('authenticator:password');
this.server.post(authenticator.buildAuthEndpointURL(), (schema, request) => {
const json = JSON.parse(request.requestBody);
assert.ok(json.token_type, 'Requested token cookies by default');
return new Response(200);
});
this.server.post(
authenticator.buildAuthEndpointURL(),
(schema, request) => {
const json = JSON.parse(request.requestBody);
assert.ok(json.token_type, 'Requested token cookies by default');
return new Response(200);
}
);
await authenticator.authenticate({}).then(() => {
assert.ok(true, 'authentication succeeded');
});
@@ -23,11 +26,14 @@ module('Unit | Authenticator | password', function (hooks) {
test('it can authenticate without requesting cookies', async function (assert) {
assert.expect(2);
const authenticator = this.owner.lookup('authenticator:password');
this.server.post(authenticator.buildAuthEndpointURL(), (schema, request) => {
const json = JSON.parse(request.requestBody);
assert.notOk(json.token_type, 'Did not request tokens cookies');
return new Response(200);
});
this.server.post(
authenticator.buildAuthEndpointURL(),
(schema, request) => {
const json = JSON.parse(request.requestBody);
assert.notOk(json.token_type, 'Did not request tokens cookies');
return new Response(200);
}
);
await authenticator.authenticate({}, false).then(() => {
assert.ok(true, 'authentication succeeded');
});
@@ -36,17 +42,20 @@ module('Unit | Authenticator | password', function (hooks) {
test('it authenticates with the expected payload', async function (assert) {
assert.expect(1);
const authenticator = this.owner.lookup('authenticator:password');
this.server.post(authenticator.buildAuthEndpointURL(), (schema, request) => {
const json = JSON.parse(request.requestBody);
assert.deepEqual(json, {
token_type: 'cookie',
credentials: {
login_name: 'foo',
password: 'bar',
},
});
return new Response(200);
});
this.server.post(
authenticator.buildAuthEndpointURL(),
(schema, request) => {
const json = JSON.parse(request.requestBody);
assert.deepEqual(json, {
token_type: 'cookie',
credentials: {
login_name: 'foo',
password: 'bar',
},
});
return new Response(200);
}
);
const creds = {
identification: 'foo',
password: 'bar',
@@ -3,5 +3,5 @@ import layout from '../../../templates/components/rose/list/key-value';
export default Component.extend({
layout,
tagName: ''
tagName: '',
});
@@ -4,5 +4,5 @@ import ComponentAutoId from '../../../../mixins/component-auto-id';
export default Component.extend(ComponentAutoId, {
layout,
tagName: ''
tagName: '',
});
@@ -1,3 +1,3 @@
@import 'dropdown';
@import 'button';
@import 'link';
@import 'link';
@@ -16,8 +16,7 @@
background-color: var(--subtle);
border: sizing.rems(xxxxs) solid var(--ui-gray-subtler-2);
border-radius: sizing.rems(xxxs);
box-shadow: inset 0px 3px 1px
rgba(var(--stark-components), var(--opacity-4));
box-shadow: inset 0px 3px 1px rgba(var(--stark-components), var(--opacity-4));
&.error {
color: var(--failure);
@@ -3,7 +3,7 @@
$chevron: "data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%23ebeef2' xmlns='http://www.w3.org/2000/svg'><path fill-rule='evenodd' clip-rule='evenodd' d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z'></path></svg>";
.rose-header {
.rose-header {
.rose-dropdown {
&,
&[open] {
@@ -33,7 +33,8 @@ $chevron: "data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%23ebeef2' xm
}
}
&:hover, &:focus {
&:hover,
&:focus {
background-color: transparent;
}
}
@@ -1 +1 @@
@import 'table';
@import 'table';
@@ -1 +1 @@
export { default } from 'rose/components/rose/dropdown/button';
export { default } from 'rose/components/rose/dropdown/button';
@@ -1 +1 @@
export { default } from 'rose/components/rose/dropdown/link';
export { default } from 'rose/components/rose/dropdown/link';
@@ -1 +1 @@
export { default } from 'rose/components/rose/form/helper-text';
export { default } from 'rose/components/rose/form/helper-text';
@@ -1 +1 @@
export { default } from 'rose/components/rose/form/input/input';
export { default } from 'rose/components/rose/form/input/input';
@@ -1 +1 @@
export { default } from 'rose/components/rose/form/label';
export { default } from 'rose/components/rose/form/label';
@@ -1 +1 @@
export { default } from 'rose/components/rose/form/textarea/textarea';
export { default } from 'rose/components/rose/form/textarea/textarea';
@@ -1 +1 @@
export { default } from 'rose/components/rose/list/key-value';
export { default } from 'rose/components/rose/list/key-value';
@@ -1 +1 @@
export { default } from 'rose/components/rose/list/key-value/item';
export { default } from 'rose/components/rose/list/key-value/item';
@@ -3,7 +3,7 @@ import { setupRenderingTest } from 'ember-qunit';
import { render, find } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
module('Integration | Component | rose/dropdown/button', function(hooks) {
module('Integration | Component | rose/dropdown/button', function (hooks) {
setupRenderingTest(hooks);
test('it renders', async function (assert) {
@@ -3,7 +3,7 @@ import { setupRenderingTest } from 'ember-qunit';
import { render, find } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
module('Integration | Component | rose/dropdown/link', function(hooks) {
module('Integration | Component | rose/dropdown/link', function (hooks) {
setupRenderingTest(hooks);
test('it renders', async function (assert) {
@@ -16,9 +16,17 @@ module('Integration | Component | rose/form/checkbox', function (hooks) {
test('it renders optional description paragraph', async function (assert) {
assert.expect(3);
await render(hbs`<Rose::Form::Checkbox @label="Label" @description="Hello world" />`);
assert.equal(await find('.rose-form-checkbox-label-text').textContent.trim(), 'Label');
assert.equal(await find('.rose-form-checkbox-label-description').textContent.trim(), 'Hello world');
await render(
hbs`<Rose::Form::Checkbox @label="Label" @description="Hello world" />`
);
assert.equal(
await find('.rose-form-checkbox-label-text').textContent.trim(),
'Label'
);
assert.equal(
await find('.rose-form-checkbox-label-description').textContent.trim(),
'Hello world'
);
assert.ok(await find('input'));
});
@@ -3,7 +3,7 @@ import { setupRenderingTest } from 'ember-qunit';
import { render, find } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
module('Integration | Component | rose/form/helper-text', function(hooks) {
module('Integration | Component | rose/form/helper-text', function (hooks) {
setupRenderingTest(hooks);
test('it renders', async function (assert) {
@@ -80,7 +80,10 @@ module('Integration | Component | rose/form/input', function (hooks) {
</field.errors>
</Rose::Form::Input>
`);
assert.notOk(find('.rose-form-input'), 'The form field wrapper element is not present in contextual mode');
assert.notOk(
find('.rose-form-input'),
'The form field wrapper element is not present in contextual mode'
);
assert.ok(find('.rose-form-label.error'));
assert.ok(find('.rose-form-helper-text.error'));
assert.ok(find('.rose-form-input-field.error'));
@@ -3,7 +3,7 @@ import { setupRenderingTest } from 'ember-qunit';
import { render, find } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
module('Integration | Component | rose/form/label', function(hooks) {
module('Integration | Component | rose/form/label', function (hooks) {
setupRenderingTest(hooks);
test('it renders', async function (assert) {
@@ -14,9 +14,6 @@ module('Integration | Component | rose/form/label', function(hooks) {
<//Rose::Form::Label>
`);
assert.ok(find('.rose-form-label'));
assert.equal(
find('.rose-form-label').textContent.trim(),
'Form Label'
);
assert.equal(find('.rose-form-label').textContent.trim(), 'Form Label');
});
});
@@ -3,10 +3,10 @@ import { setupRenderingTest } from 'ember-qunit';
import { render, find, findAll } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
module('Integration | Component | rose/list/key-value', function(hooks) {
module('Integration | Component | rose/list/key-value', function (hooks) {
setupRenderingTest(hooks);
test('it renders', async function(assert) {
test('it renders', async function (assert) {
assert.expect(2);
await render(hbs`
<Rose::List::KeyValue as |list|>
@@ -20,10 +20,18 @@ module('Integration | Component | rose/list/key-value', function(hooks) {
</list.item>
</Rose::List::KeyValue>
`);
const itemLabelledBy = find('.rose-list-key-value-item:first-child').getAttribute('aria-labelledby');
assert.equal(findAll('.rose-list-key-value-item').length, 2, 'it has two items');
const itemLabelledBy = find(
'.rose-list-key-value-item:first-child'
).getAttribute('aria-labelledby');
assert.equal(
findAll('.rose-list-key-value-item').length,
2,
'it has two items'
);
assert.ok(
find(`.rose-list-key-value-item:first-child > .rose-list-key-value-item-cell:first-child#${itemLabelledBy}`),
find(
`.rose-list-key-value-item:first-child > .rose-list-key-value-item-cell:first-child#${itemLabelledBy}`
),
'The key cell has an ID associated with the `aria-labelledby` attribute of its parent item element'
);
});
+7 -8
View File
@@ -50,12 +50,11 @@ export default class PasswordAuthenticator extends BasePasswordAuthenticator {
* @override
*/
authenticate() {
return super.authenticate(...arguments)
.then(data => {
const token = data?.token;
if (token) this.addTokenToAuthorization(token);
return data;
});
return super.authenticate(...arguments).then((data) => {
const token = data?.token;
if (token) this.addTokenToAuthorization(token);
return data;
});
}
/**
@@ -78,8 +77,8 @@ export default class PasswordAuthenticator extends BasePasswordAuthenticator {
* @param {string} token
*/
addTokenToAuthorization(token) {
const adapterPrototype =
this.store.adapterFor('application').constructor.prototype;
const adapterPrototype = this.store.adapterFor('application').constructor
.prototype;
const headers = adapterPrototype?.headers;
if (!headers) adapterPrototype.headers = {};
adapterPrototype.headers.Authorization = null;
@@ -4,7 +4,6 @@ import { action } from '@ember/object';
import { next } from '@ember/runloop';
export default class FormAccountPasswordIndexComponent extends Component {
// =properties
/**
@@ -5,7 +5,6 @@ import { action } from '@ember/object';
import { next } from '@ember/runloop';
export default class FormAccountPasswordSetPasswordIndexComponent extends Component {
// =properties
/**
@@ -54,5 +53,4 @@ export default class FormAccountPasswordSetPasswordIndexComponent extends Compon
this.resetPassword();
fn();
}
}
@@ -3,7 +3,6 @@ import { computed, action } from '@ember/object';
import { A } from '@ember/array';
export default class FormGroupAddMembersComponent extends Component {
// =properties
/**
@@ -38,5 +37,4 @@ export default class FormGroupAddMembersComponent extends Component {
submit(fn) {
fn(this.selectedMemberIDs);
}
}
@@ -3,7 +3,6 @@ import { computed, action } from '@ember/object';
import { A } from '@ember/array';
export default class FormHostSetAddHostsIndexComponent extends Component {
// =properties
/**
@@ -28,7 +27,7 @@ export default class FormHostSetAddHostsIndexComponent extends Component {
*/
@computed('args.{model,hosts}')
get filteredHosts() {
const currentHostIDs = this.args.model.host_ids.map(host => host.value);
const currentHostIDs = this.args.model.host_ids.map((host) => host.value);
return this.args.hosts.filter(({ id }) => !currentHostIDs.includes(id));
}
@@ -2,7 +2,6 @@ import Component from '@glimmer/component';
import { computed } from '@ember/object';
export default class FormHostSetHostsComponent extends Component {
// =attributes
/**
@@ -14,10 +13,9 @@ export default class FormHostSetHostsComponent extends Component {
@computed('args.{hosts.[],model.host_ids.[]}')
get options() {
const { hosts, model: hostSet } = this.args;
return hosts.map(host => ({
return hosts.map((host) => ({
host,
selected: Boolean(hostSet.host_ids.findBy('value', host.id))
selected: Boolean(hostSet.host_ids.findBy('value', host.id)),
}));
}
}
@@ -3,8 +3,6 @@ import { computed, action } from '@ember/object';
import { A } from '@ember/array';
export default class FormRoleAddPrincipalsIndexComponent extends Component {
// =properties
/**
@@ -31,10 +29,16 @@ export default class FormRoleAddPrincipalsIndexComponent extends Component {
@computed('args.{model,users,groups}')
get filteredPrincipals() {
// Retrieve principal IDs assigned to current role
const currentPrincipalIDs = this.args.model.principals.map(principal => principal.principal_id);
const currentPrincipalIDs = this.args.model.principals.map(
(principal) => principal.principal_id
);
// Retrieve principal IDs not assigned to current role
const unassignedUsers = this.args.users.filter(({ id }) => !currentPrincipalIDs.includes(id));
const unassignedGroups = this.args.groups.filter(({ id }) => !currentPrincipalIDs.includes(id));
const unassignedUsers = this.args.users.filter(
({ id }) => !currentPrincipalIDs.includes(id)
);
const unassignedGroups = this.args.groups.filter(
({ id }) => !currentPrincipalIDs.includes(id)
);
return [...unassignedUsers, ...unassignedGroups];
}
@@ -53,5 +57,4 @@ export default class FormRoleAddPrincipalsIndexComponent extends Component {
submit(fn) {
fn(this.selectedPrincipalIDs);
}
}
@@ -3,7 +3,6 @@ import { tracked } from '@glimmer/tracking';
import { computed, action } from '@ember/object';
export default class FormRoleGrantsComponent extends Component {
// =attributes
/**
@@ -3,7 +3,6 @@ import { computed, action } from '@ember/object';
import { A } from '@ember/array';
export default class FormTargetAddHostSetsComponent extends Component {
// =properties
/**
@@ -19,10 +18,12 @@ export default class FormTargetAddHostSetsComponent extends Component {
@computed('args.{hostSets.[],model.host_sets.[]}')
get filteredHostSets() {
// Get IDs for host sets already added to the current target
const alreadyAddedHostSetIDs = this.args.model.host_sets
.map(({ host_set_id }) => host_set_id);
const notAddedHostSets = this.args.hostSets
.filter(({ id }) => !alreadyAddedHostSetIDs.includes(id));
const alreadyAddedHostSetIDs = this.args.model.host_sets.map(
({ host_set_id }) => host_set_id
);
const notAddedHostSets = this.args.hostSets.filter(
({ id }) => !alreadyAddedHostSetIDs.includes(id)
);
return notAddedHostSets;
}
@@ -2,7 +2,6 @@ import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
export default class ScopesScopeAuthMethodsAuthMethodAccountsController extends Controller {
// =services
@service intl;
@@ -16,5 +15,4 @@ export default class ScopesScopeAuthMethodsAuthMethodAccountsController extends
get breadCrumb() {
return this.intl.t('resources.accounts');
}
}
@@ -1,7 +1,6 @@
import Controller from '@ember/controller';
export default class ScopesScopeAuthMethodsAuthMethodAccountsAccountController extends Controller {
// =attributes
/**
@@ -11,5 +10,4 @@ export default class ScopesScopeAuthMethodsAuthMethodAccountsAccountController e
get breadCrumb() {
return this.model.displayName;
}
}
@@ -2,7 +2,6 @@ import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
export default class ScopesScopeAuthMethodsAuthMethodAccountsNewController extends Controller {
// =services
@service intl;
@@ -16,5 +15,4 @@ export default class ScopesScopeAuthMethodsAuthMethodAccountsNewController exten
get breadCrumb() {
return this.intl.t('titles.new');
}
}
@@ -2,7 +2,6 @@ import Controller from '@ember/controller';
import { sort } from '@ember/object/computed';
export default class ScopesScopeAuthenticateController extends Controller {
// =attributes
/**
@@ -17,5 +16,4 @@ export default class ScopesScopeAuthenticateController extends Controller {
return 0;
})
sortedScopes;
}
@@ -2,7 +2,6 @@ import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
export default class ScopesScopeGroupsGroupAddMembersController extends Controller {
// =services
@service intl;
@@ -16,5 +15,4 @@ export default class ScopesScopeGroupsGroupAddMembersController extends Controll
get breadCrumb() {
return this.intl.t('actions.add-members');
}
}
@@ -2,7 +2,6 @@ import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
export default class ScopesScopeProjectsProjectHostCatalogsController extends Controller {
// =services
@service intl;
@@ -15,5 +14,4 @@ export default class ScopesScopeProjectsProjectHostCatalogsController extends Co
get breadCrumb() {
return this.intl.t('resources.host-catalogs');
}
}
Loaded 100 of 250 files, more files were not shown because too many files have changed in this diff. Show more