From 322828ccc450c0a1a494d0bc222f7d158895c741 Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Thu, 28 Oct 2021 08:30:28 -0700 Subject: [PATCH 01/11] First iteration API modeling managed groups --- .../addon/generated/models/managed-groups.js | 47 ++++++++++ addons/api/addon/models/managed-groups.js | 89 +++++++++++++++++++ .../api/addon/serializers/managed-groups.js | 32 +++++++ addons/api/app/models/managed-groups.js | 1 + .../tests/unit/models/managed-groups-test.js | 13 +++ .../unit/serializers/managed-groups-test.js | 56 ++++++++++++ 6 files changed, 238 insertions(+) create mode 100644 addons/api/addon/generated/models/managed-groups.js create mode 100644 addons/api/addon/models/managed-groups.js create mode 100644 addons/api/addon/serializers/managed-groups.js create mode 100644 addons/api/app/models/managed-groups.js create mode 100644 addons/api/tests/unit/models/managed-groups-test.js create mode 100644 addons/api/tests/unit/serializers/managed-groups-test.js diff --git a/addons/api/addon/generated/models/managed-groups.js b/addons/api/addon/generated/models/managed-groups.js new file mode 100644 index 000000000..d6502eee6 --- /dev/null +++ b/addons/api/addon/generated/models/managed-groups.js @@ -0,0 +1,47 @@ +import BaseModel from '../../models/base'; +import { attr } from '@ember-data/model'; + +/** + * A managed group is a resource that represents a collection of accounts. + */ +export default class GeneratedManagedGroupModel extends BaseModel { + // =attributes + + @attr('string', { + description: 'Optional name for identification purposes.', + }) + name; + + @attr('string', { + description: 'Optional user-set description for identification purposes.', + }) + description; + + @attr('date', { + description: 'The time this resource was created', + readOnly: true, + }) + created_time; + + @attr('date', { + description: 'The time this resource was last updated.', + readOnly: true, + }) + updated_time; + + @attr('number', { + description: 'Current version number of this resource.', + }) + version; + + @attr('string', { + description: 'The type of this ManagedGroup.', + }) + type; + + @attr('string', { + description: + 'The ID of the Auth Method that is associated with this ManagedGroup', + }) + auth_method_id; +} diff --git a/addons/api/addon/models/managed-groups.js b/addons/api/addon/models/managed-groups.js new file mode 100644 index 000000000..ddc2d2ba4 --- /dev/null +++ b/addons/api/addon/models/managed-groups.js @@ -0,0 +1,89 @@ +import GeneratedManagedGroupModel from '../generated/models/managed-groups'; +import { attr } from '@ember-data/model'; +import { computed } from '@ember/object'; +import { A } from '@ember/array'; + +export default class ManagedGroupsModel extends GeneratedManagedGroupModel { + // =attributes + /** + * Members is read-only under normal circumstances. But members can + * be persisted via calls to `addMembers()` or `removeMembers()`. + */ + @attr({ + readOnly: true, + defaultValue: () => A(), + emptyArrayIfMissing: true, + }) + member_ids; + + /** + * An array of resolved user instances. + * Unresolvable instances are excluded from the array. + * @type {[UserModel]} + */ + // TODO: Use fragments array to read cross scope members. + @computed('member_ids.[]', 'store') + get members() { + return this.member_ids + .map((id) => this.store.peekRecord('user', id)) + .filter(Boolean); + } + + // =methods + + /** + * Adds members via the `add-members` method. + * See serializer and adapter for more information. + * @param {[string]} memberIDs + * @param {object} options + * @param {object} options.adapterOptions + * @return {Promise} + */ + addMembers(memberIDs, options = { adapterOptions: {} }) { + const defaultAdapterOptions = { + method: 'add-members', + memberIDs, + }; + // There is no "deep merge" in ES. + return this.save({ + ...options, + adapterOptions: { + ...defaultAdapterOptions, + ...options.adapterOptions, + }, + }); + } + + /** + * Delete members via the `remove-members` method. + * See serializer and adapter for more information. + * @param {[string]} memberIDs + * @param {object} options + * @param {object} options.adapterOptions + * @return {Promise} + */ + removeMembers(memberIDs, options = { adapterOptions: {} }) { + const defaultAdapterOptions = { + method: 'remove-members', + memberIDs, + }; + // There is no "deep merge" in ES. + return this.save({ + ...options, + adapterOptions: { + ...defaultAdapterOptions, + ...options.adapterOptions, + }, + }); + } + + /** + * Delete a single member via the `remove-members` method. + * @param {number} memberID + * @param {object} options + * @return {Promise} + */ + removeMember(memberID, options) { + return this.removeMembers([memberID], options); + } +} diff --git a/addons/api/addon/serializers/managed-groups.js b/addons/api/addon/serializers/managed-groups.js new file mode 100644 index 000000000..3757bcbe0 --- /dev/null +++ b/addons/api/addon/serializers/managed-groups.js @@ -0,0 +1,32 @@ +import ApplicationSerializer from './application'; + +export default class ManagedGroupsSerializer extends ApplicationSerializer { + // =methods + + /** + * If `adapterOptions.memberIDs` is set (to an array of user IDs), + * then the payload is serialized via `serializewithMembers`. + * @override + * @param {Snapshot} snapshot + * @return {object} + */ + serialize(snapshot) { + let serialized = super.serialize(...arguments); + const memberIDs = snapshot?.adapterOptions?.memberIDs; + if (memberIDs) serialized = this.serializewithMembers(snapshot, memberIDs); + return serialized; + } + + /** + * Returns a payload containing only the `member_ids` array (and version). + * @param {Snapshot} snapshot + * @param {[string]} memberIDs + * @return {object} + */ + serializewithMembers(snapshot, memberIDs) { + return { + version: snapshot.attr('version'), + member_ids: memberIDs, + }; + } +} diff --git a/addons/api/app/models/managed-groups.js b/addons/api/app/models/managed-groups.js new file mode 100644 index 000000000..4fb49c35a --- /dev/null +++ b/addons/api/app/models/managed-groups.js @@ -0,0 +1 @@ +export { default } from 'api/models/managed-groups'; diff --git a/addons/api/tests/unit/models/managed-groups-test.js b/addons/api/tests/unit/models/managed-groups-test.js new file mode 100644 index 000000000..426faa008 --- /dev/null +++ b/addons/api/tests/unit/models/managed-groups-test.js @@ -0,0 +1,13 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Model | managed groups', function (hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function (assert) { + let store = this.owner.lookup('service:store'); + let model = store.createRecord('managed-groups', {}); + assert.ok(model); + }); +}); diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-groups-test.js new file mode 100644 index 000000000..f4f68de33 --- /dev/null +++ b/addons/api/tests/unit/serializers/managed-groups-test.js @@ -0,0 +1,56 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Serializer | Managed groups', function (hooks) { + setupTest(hooks); + + test('it serializes managed groups normally, without members', function (assert) { + assert.expect(1); + // TODO: move store declaration at module level. Before doing so, to make sure it works, generate one out, one in and deep compare. + // TODO: if moving store out works, move serializer too. + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-groups'); + const record = store.createRecord('managed-groups', { + name: 'Group', + description: 'Description', + member_ids: ['1', '2'], + version: 1, + auth_method_id: '1234', + type: '80', + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = {}; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group', + description: 'Description', + version: 1, + auth_method_id: '1234', + type: '80', + }); + }); + + test('it seralizes only members associated with this group and version when a `memberIDs` array is provided', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-groups'); + const record = store.createRecord('managed-groups', { + name: 'Group', + description: 'Description', + member_ids: ['1', '2'], + version: 1, + auth_method_id: '1234', + type: '80', + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = { + memberIDs: ['4', '5'], + }; + const serializedRecord = serializer.serialize(snapshot); + console.log(JSON.stringify(serializedRecord)); + assert.deepEqual(serializedRecord, { + member_ids: ['4', '5'], + version: 1, + }); + }); +}); From 360bf0ffdd98a2cbb5cceac149b134299b5cc0c1 Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Thu, 28 Oct 2021 11:28:21 -0700 Subject: [PATCH 02/11] Refactor model --- .../addon/generated/models/managed-groups.js | 6 ++ addons/api/addon/models/managed-groups.js | 88 +------------------ .../api/addon/serializers/managed-groups.js | 31 +------ .../tests/unit/models/managed-groups-test.js | 1 - .../unit/serializers/managed-groups-test.js | 40 +++++---- 5 files changed, 31 insertions(+), 135 deletions(-) diff --git a/addons/api/addon/generated/models/managed-groups.js b/addons/api/addon/generated/models/managed-groups.js index d6502eee6..0dc62ee1e 100644 --- a/addons/api/addon/generated/models/managed-groups.js +++ b/addons/api/addon/generated/models/managed-groups.js @@ -44,4 +44,10 @@ export default class GeneratedManagedGroupModel extends BaseModel { 'The ID of the Auth Method that is associated with this ManagedGroup', }) auth_method_id; + + @attr('array', { + description: + 'The IDs of the current set of members (accounts) that are associated with this ManagedGroup.', + }) + member_ids } diff --git a/addons/api/addon/models/managed-groups.js b/addons/api/addon/models/managed-groups.js index ddc2d2ba4..d217a0043 100644 --- a/addons/api/addon/models/managed-groups.js +++ b/addons/api/addon/models/managed-groups.js @@ -1,89 +1,3 @@ import GeneratedManagedGroupModel from '../generated/models/managed-groups'; -import { attr } from '@ember-data/model'; -import { computed } from '@ember/object'; -import { A } from '@ember/array'; -export default class ManagedGroupsModel extends GeneratedManagedGroupModel { - // =attributes - /** - * Members is read-only under normal circumstances. But members can - * be persisted via calls to `addMembers()` or `removeMembers()`. - */ - @attr({ - readOnly: true, - defaultValue: () => A(), - emptyArrayIfMissing: true, - }) - member_ids; - - /** - * An array of resolved user instances. - * Unresolvable instances are excluded from the array. - * @type {[UserModel]} - */ - // TODO: Use fragments array to read cross scope members. - @computed('member_ids.[]', 'store') - get members() { - return this.member_ids - .map((id) => this.store.peekRecord('user', id)) - .filter(Boolean); - } - - // =methods - - /** - * Adds members via the `add-members` method. - * See serializer and adapter for more information. - * @param {[string]} memberIDs - * @param {object} options - * @param {object} options.adapterOptions - * @return {Promise} - */ - addMembers(memberIDs, options = { adapterOptions: {} }) { - const defaultAdapterOptions = { - method: 'add-members', - memberIDs, - }; - // There is no "deep merge" in ES. - return this.save({ - ...options, - adapterOptions: { - ...defaultAdapterOptions, - ...options.adapterOptions, - }, - }); - } - - /** - * Delete members via the `remove-members` method. - * See serializer and adapter for more information. - * @param {[string]} memberIDs - * @param {object} options - * @param {object} options.adapterOptions - * @return {Promise} - */ - removeMembers(memberIDs, options = { adapterOptions: {} }) { - const defaultAdapterOptions = { - method: 'remove-members', - memberIDs, - }; - // There is no "deep merge" in ES. - return this.save({ - ...options, - adapterOptions: { - ...defaultAdapterOptions, - ...options.adapterOptions, - }, - }); - } - - /** - * Delete a single member via the `remove-members` method. - * @param {number} memberID - * @param {object} options - * @return {Promise} - */ - removeMember(memberID, options) { - return this.removeMembers([memberID], options); - } -} +export default class ManagedGroupsModel extends GeneratedManagedGroupModel {} diff --git a/addons/api/addon/serializers/managed-groups.js b/addons/api/addon/serializers/managed-groups.js index 3757bcbe0..215d52935 100644 --- a/addons/api/addon/serializers/managed-groups.js +++ b/addons/api/addon/serializers/managed-groups.js @@ -1,32 +1,3 @@ import ApplicationSerializer from './application'; -export default class ManagedGroupsSerializer extends ApplicationSerializer { - // =methods - - /** - * If `adapterOptions.memberIDs` is set (to an array of user IDs), - * then the payload is serialized via `serializewithMembers`. - * @override - * @param {Snapshot} snapshot - * @return {object} - */ - serialize(snapshot) { - let serialized = super.serialize(...arguments); - const memberIDs = snapshot?.adapterOptions?.memberIDs; - if (memberIDs) serialized = this.serializewithMembers(snapshot, memberIDs); - return serialized; - } - - /** - * Returns a payload containing only the `member_ids` array (and version). - * @param {Snapshot} snapshot - * @param {[string]} memberIDs - * @return {object} - */ - serializewithMembers(snapshot, memberIDs) { - return { - version: snapshot.attr('version'), - member_ids: memberIDs, - }; - } -} +export default class ManagedGroupsSerializer extends ApplicationSerializer {} diff --git a/addons/api/tests/unit/models/managed-groups-test.js b/addons/api/tests/unit/models/managed-groups-test.js index 426faa008..fd79c2f01 100644 --- a/addons/api/tests/unit/models/managed-groups-test.js +++ b/addons/api/tests/unit/models/managed-groups-test.js @@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit'; module('Unit | Model | managed groups', function (hooks) { setupTest(hooks); - // Replace this with your real tests. test('it exists', function (assert) { let store = this.owner.lookup('service:store'); let model = store.createRecord('managed-groups', {}); diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-groups-test.js index f4f68de33..a9b7deaa4 100644 --- a/addons/api/tests/unit/serializers/managed-groups-test.js +++ b/addons/api/tests/unit/serializers/managed-groups-test.js @@ -4,10 +4,8 @@ import { setupTest } from 'ember-qunit'; module('Unit | Serializer | Managed groups', function (hooks) { setupTest(hooks); - test('it serializes managed groups normally, without members', function (assert) { + test('it serializes correctly on create', function (assert) { assert.expect(1); - // TODO: move store declaration at module level. Before doing so, to make sure it works, generate one out, one in and deep compare. - // TODO: if moving store out works, move serializer too. const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('managed-groups'); const record = store.createRecord('managed-groups', { @@ -24,33 +22,41 @@ module('Unit | Serializer | Managed groups', function (hooks) { assert.deepEqual(serializedRecord, { name: 'Group', description: 'Description', + member_ids: ['1', '2'], version: 1, auth_method_id: '1234', type: '80', }); }); - test('it seralizes only members associated with this group and version when a `memberIDs` array is provided', function (assert) { + test('it serializes correctly on update', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('managed-groups'); - const record = store.createRecord('managed-groups', { - name: 'Group', - description: 'Description', + store.push({ + data: { + id: '1', + type: 'managed-groups', + attributes: { + name: 'Group Test', + description: 'Description for the test', + member_ids: ['1', '2'], + version: 1, + auth_method_id: '1234', + type: '80', + }, + }, + }); + const record = store.peekRecord('managed-groups', '1'); + const snapshot = record._createSnapshot(); + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group Test', + description: 'Description for the test', member_ids: ['1', '2'], version: 1, auth_method_id: '1234', type: '80', }); - const snapshot = record._createSnapshot(); - snapshot.adapterOptions = { - memberIDs: ['4', '5'], - }; - const serializedRecord = serializer.serialize(snapshot); - console.log(JSON.stringify(serializedRecord)); - assert.deepEqual(serializedRecord, { - member_ids: ['4', '5'], - version: 1, - }); }); }); From 6022d7fc36d398c5f4e76d926224e3ddfee44a39 Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Thu, 28 Oct 2021 15:53:07 -0700 Subject: [PATCH 03/11] Made member_ids readOnly --- addons/api/addon/generated/models/managed-groups.js | 3 ++- addons/api/tests/unit/serializers/managed-groups-test.js | 2 -- yarn.lock | 6 +++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/addons/api/addon/generated/models/managed-groups.js b/addons/api/addon/generated/models/managed-groups.js index 0dc62ee1e..279ee3898 100644 --- a/addons/api/addon/generated/models/managed-groups.js +++ b/addons/api/addon/generated/models/managed-groups.js @@ -48,6 +48,7 @@ export default class GeneratedManagedGroupModel extends BaseModel { @attr('array', { description: 'The IDs of the current set of members (accounts) that are associated with this ManagedGroup.', + readOnly: true, }) - member_ids + member_ids; } diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-groups-test.js index a9b7deaa4..d19eac935 100644 --- a/addons/api/tests/unit/serializers/managed-groups-test.js +++ b/addons/api/tests/unit/serializers/managed-groups-test.js @@ -22,7 +22,6 @@ module('Unit | Serializer | Managed groups', function (hooks) { assert.deepEqual(serializedRecord, { name: 'Group', description: 'Description', - member_ids: ['1', '2'], version: 1, auth_method_id: '1234', type: '80', @@ -53,7 +52,6 @@ module('Unit | Serializer | Managed groups', function (hooks) { assert.deepEqual(serializedRecord, { name: 'Group Test', description: 'Description for the test', - member_ids: ['1', '2'], version: 1, auth_method_id: '1234', type: '80', diff --git a/yarn.lock b/yarn.lock index 271c67fee..8eb8bf3ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9152,9 +9152,9 @@ electron-rebuild@^2.0.3: yargs "^16.0.0" electron-to-chromium@^1.3.867: - version "1.3.883" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.883.tgz#cc409921469b3aa6ab6efd65cc2a4375128bb703" - integrity sha512-goyjNx4wB9j911PBteb+AXNbErug7rJVkmDXWdw5SCVn2JlARBwsqucPkvp1h5mXWxHUbBRK3bwXTrqSxSiAIQ== + version "1.3.884" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.884.tgz#0cd8c3a80271fd84a81f284c60fb3c9ecb33c166" + integrity sha512-kOaCAa+biA98PwH5BpCkeUeTL6mCeg8p3Q3OhqzPyqhu/5QUnWAN2wr/3IK8xMQxIV76kfoQpP+Bn/wij/jXrg== element-resize-detector@^1.2.2: version "1.2.3" From 499432522a61882ddf4b7d7abb973e582cbc5cfd Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Fri, 29 Oct 2021 15:01:50 -0700 Subject: [PATCH 04/11] Unfinished fragment managed groups modeling --- .../fragment-managed-groups-attributes.js | 13 +++++++++++ addons/api/addon/models/managed-groups.js | 11 ++++++++- .../fragment-managed-groups-attributes.js | 23 +++++++++++++++++++ ...fragment-managed-groups-attributes-test.js | 22 ++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 addons/api/addon/models/fragment-managed-groups-attributes.js create mode 100644 addons/api/addon/serializers/fragment-managed-groups-attributes.js create mode 100644 addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js diff --git a/addons/api/addon/models/fragment-managed-groups-attributes.js b/addons/api/addon/models/fragment-managed-groups-attributes.js new file mode 100644 index 000000000..cb38c2c3a --- /dev/null +++ b/addons/api/addon/models/fragment-managed-groups-attributes.js @@ -0,0 +1,13 @@ +import Fragment from 'ember-data-model-fragments/fragment'; +import { attr } from '@ember-data/model'; + +export default class FragmentManagedGroupsAttributesModel extends Fragment { + // =attributes (OIDC) + + @attr('string', { + description: + 'The boolean expression filter to use to determine membership.', + defaultValue: () => 'OIDC', + }) + filter; +} diff --git a/addons/api/addon/models/managed-groups.js b/addons/api/addon/models/managed-groups.js index d217a0043..7dbfe75e2 100644 --- a/addons/api/addon/models/managed-groups.js +++ b/addons/api/addon/models/managed-groups.js @@ -1,3 +1,12 @@ import GeneratedManagedGroupModel from '../generated/models/managed-groups'; +import { attr } from '@ember-data/model'; +import { fragment } from 'ember-data-model-fragments/attributes'; -export default class ManagedGroupsModel extends GeneratedManagedGroupModel {} +export default class ManagedGroupsModel extends GeneratedManagedGroupModel { + // =error attributes + @attr('string', { readOnly: true }) filter; + + // =attributes + @fragment('fragment-managed-groups-attributes', { defaultValue: {} }) + attributes; +} diff --git a/addons/api/addon/serializers/fragment-managed-groups-attributes.js b/addons/api/addon/serializers/fragment-managed-groups-attributes.js new file mode 100644 index 000000000..750fb02fe --- /dev/null +++ b/addons/api/addon/serializers/fragment-managed-groups-attributes.js @@ -0,0 +1,23 @@ +import JSONSerializer from '@ember-data/serializer/json'; + +export default class FragmentManagedGroupsAttributesSerializer extends JSONSerializer { + /** + * If an attribute is annotated as readOnly in the model, don't serialize it. + * Otherwise delegate to default attribute serializer. + * @override + * @method serializeAttribute + * @param {Snapshot} snapshot + * @param {Object} json + * @param {String} key + * @param {Object} attribute + */ + serializeAttribute(snapshot, json, key, attribute) { + const { type, options } = attribute; + let value = super.serializeAttribute(...arguments); + // COnvert empty strin to null. + if (type === 'string' && json[key] === '') json[key] = null; + // Do not serialize read-only attributes. + if (options.readOnly) delete json[key]; + return value; + } +} diff --git a/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js b/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js new file mode 100644 index 000000000..c317d5771 --- /dev/null +++ b/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js @@ -0,0 +1,22 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module( + 'Unit | Serializer | fragment managed groups attributes', + function (hooks) { + setupTest(hooks); + + test('it serializes empty string to null', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('fragment-managed-groups-attributes', { + filter: '', + }); + // const serializedRecord = record.serialize(); + // assert.deepEqual(serializedRecord, { + // filter: null, + // }); + assert.equal(1, 1); + }); + } +); From 2620607cc3588a209dae0d69e4fc81fc00ffeccd Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Mon, 1 Nov 2021 12:26:22 -0700 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Finish=20fragment?= =?UTF-8?q?=20serializer=20and=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Finish fragment serializer and refactor the tests of the model to accomadate the change. --- .../fragment-managed-groups-attributes.js | 2 +- .../models/fragment-managed-groups-attributes.js | 1 + .../fragment-managed-groups-attributes.js | 1 + .../fragment-managed-groups-attributes-test.js | 13 +++++++++++++ .../fragment-managed-groups-attributes-test.js | 9 ++++----- .../tests/unit/serializers/managed-groups-test.js | 9 +++++++++ 6 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 addons/api/app/models/fragment-managed-groups-attributes.js create mode 100644 addons/api/app/serializers/fragment-managed-groups-attributes.js create mode 100644 addons/api/tests/unit/models/fragment-managed-groups-attributes-test.js diff --git a/addons/api/addon/serializers/fragment-managed-groups-attributes.js b/addons/api/addon/serializers/fragment-managed-groups-attributes.js index 750fb02fe..4d4ac0a4d 100644 --- a/addons/api/addon/serializers/fragment-managed-groups-attributes.js +++ b/addons/api/addon/serializers/fragment-managed-groups-attributes.js @@ -14,7 +14,7 @@ export default class FragmentManagedGroupsAttributesSerializer extends JSONSeria serializeAttribute(snapshot, json, key, attribute) { const { type, options } = attribute; let value = super.serializeAttribute(...arguments); - // COnvert empty strin to null. + // Convert empty string to null. if (type === 'string' && json[key] === '') json[key] = null; // Do not serialize read-only attributes. if (options.readOnly) delete json[key]; diff --git a/addons/api/app/models/fragment-managed-groups-attributes.js b/addons/api/app/models/fragment-managed-groups-attributes.js new file mode 100644 index 000000000..491c0628f --- /dev/null +++ b/addons/api/app/models/fragment-managed-groups-attributes.js @@ -0,0 +1 @@ +export { default } from 'api/models/fragment-managed-groups-attributes'; diff --git a/addons/api/app/serializers/fragment-managed-groups-attributes.js b/addons/api/app/serializers/fragment-managed-groups-attributes.js new file mode 100644 index 000000000..1f10fec04 --- /dev/null +++ b/addons/api/app/serializers/fragment-managed-groups-attributes.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/fragment-managed-groups-attributes'; diff --git a/addons/api/tests/unit/models/fragment-managed-groups-attributes-test.js b/addons/api/tests/unit/models/fragment-managed-groups-attributes-test.js new file mode 100644 index 000000000..3659b85e4 --- /dev/null +++ b/addons/api/tests/unit/models/fragment-managed-groups-attributes-test.js @@ -0,0 +1,13 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Model | fragment managed groups attributes', function (hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function (assert) { + let store = this.owner.lookup('service:store'); + let model = store.createRecord('fragment-managed-groups-attributes', {}); + assert.ok(model); + }); +}); diff --git a/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js b/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js index c317d5771..f179021d3 100644 --- a/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js +++ b/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js @@ -12,11 +12,10 @@ module( const record = store.createRecord('fragment-managed-groups-attributes', { filter: '', }); - // const serializedRecord = record.serialize(); - // assert.deepEqual(serializedRecord, { - // filter: null, - // }); - assert.equal(1, 1); + const serializedRecord = record.serialize(); + assert.deepEqual(serializedRecord, { + filter: null, + }); }); } ); diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-groups-test.js index d19eac935..a072a37a0 100644 --- a/addons/api/tests/unit/serializers/managed-groups-test.js +++ b/addons/api/tests/unit/serializers/managed-groups-test.js @@ -25,6 +25,9 @@ module('Unit | Serializer | Managed groups', function (hooks) { version: 1, auth_method_id: '1234', type: '80', + attributes: { + filter: 'OIDC', + }, }); }); @@ -43,6 +46,9 @@ module('Unit | Serializer | Managed groups', function (hooks) { version: 1, auth_method_id: '1234', type: '80', + attributes: { + filter: 'key=value', + }, }, }, }); @@ -55,6 +61,9 @@ module('Unit | Serializer | Managed groups', function (hooks) { version: 1, auth_method_id: '1234', type: '80', + attributes: { + filter: 'key=value', + }, }); }); }); From 5df6b6de113bd20761fe124b291fb3fffde937bd Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Mon, 1 Nov 2021 16:30:54 -0700 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Refactor=20modelin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove OIDC as default value for fragment field filter. Applied default value OIDC to type field. Accomodate tests for the changes. Add a readOnly serializer test. Delete from fragment serializer not serializing readOnly, because that is a case it will never reproduce on such model. --- .../addon/generated/models/managed-groups.js | 1 + .../fragment-managed-groups-attributes.js | 1 - .../fragment-managed-groups-attributes.js | 4 +- .../unit/serializers/managed-groups-test.js | 70 +++++++++++++++++-- 4 files changed, 66 insertions(+), 10 deletions(-) diff --git a/addons/api/addon/generated/models/managed-groups.js b/addons/api/addon/generated/models/managed-groups.js index 279ee3898..4ae9e12e5 100644 --- a/addons/api/addon/generated/models/managed-groups.js +++ b/addons/api/addon/generated/models/managed-groups.js @@ -36,6 +36,7 @@ export default class GeneratedManagedGroupModel extends BaseModel { @attr('string', { description: 'The type of this ManagedGroup.', + defaultValue: () => 'OIDC', }) type; diff --git a/addons/api/addon/models/fragment-managed-groups-attributes.js b/addons/api/addon/models/fragment-managed-groups-attributes.js index cb38c2c3a..1c80275a5 100644 --- a/addons/api/addon/models/fragment-managed-groups-attributes.js +++ b/addons/api/addon/models/fragment-managed-groups-attributes.js @@ -7,7 +7,6 @@ export default class FragmentManagedGroupsAttributesModel extends Fragment { @attr('string', { description: 'The boolean expression filter to use to determine membership.', - defaultValue: () => 'OIDC', }) filter; } diff --git a/addons/api/addon/serializers/fragment-managed-groups-attributes.js b/addons/api/addon/serializers/fragment-managed-groups-attributes.js index 4d4ac0a4d..e2c750454 100644 --- a/addons/api/addon/serializers/fragment-managed-groups-attributes.js +++ b/addons/api/addon/serializers/fragment-managed-groups-attributes.js @@ -12,12 +12,10 @@ export default class FragmentManagedGroupsAttributesSerializer extends JSONSeria * @param {Object} attribute */ serializeAttribute(snapshot, json, key, attribute) { - const { type, options } = attribute; + const { type } = attribute; let value = super.serializeAttribute(...arguments); // Convert empty string to null. if (type === 'string' && json[key] === '') json[key] = null; - // Do not serialize read-only attributes. - if (options.readOnly) delete json[key]; return value; } } diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-groups-test.js index a072a37a0..20a4a216c 100644 --- a/addons/api/tests/unit/serializers/managed-groups-test.js +++ b/addons/api/tests/unit/serializers/managed-groups-test.js @@ -4,7 +4,7 @@ import { setupTest } from 'ember-qunit'; module('Unit | Serializer | Managed groups', function (hooks) { setupTest(hooks); - test('it serializes correctly on create', function (assert) { + test('it serializes correctly on create with no filter provided', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('managed-groups'); @@ -14,7 +14,6 @@ module('Unit | Serializer | Managed groups', function (hooks) { member_ids: ['1', '2'], version: 1, auth_method_id: '1234', - type: '80', }); const snapshot = record._createSnapshot(); snapshot.adapterOptions = {}; @@ -24,9 +23,68 @@ module('Unit | Serializer | Managed groups', function (hooks) { description: 'Description', version: 1, auth_method_id: '1234', - type: '80', + type: 'OIDC', attributes: { - filter: 'OIDC', + filter: null, + }, + }); + }); + + test('it serializes correctly on create when filter provided', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-groups'); + const record = store.createRecord('managed-groups', { + name: 'Group', + description: 'Description', + member_ids: ['1', '2'], + version: 1, + auth_method_id: '1234', + type: 'OIDC', + attributes: { + filter: 'key=value', + }, + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = {}; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group', + description: 'Description', + version: 1, + auth_method_id: '1234', + type: 'OIDC', + attributes: { + filter: 'key=value', + }, + }); + }); + + test('it does not serialize readOnly attributes', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-groups'); + const record = store.createRecord('managed-groups', { + name: 'Group', + description: 'Description', + version: 1, + auth_method_id: '1234', + member_ids: ['1', '2'], + created_time: Date.now(), + updated_time: Date.now(), + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = {}; + const serializedRecord = serializer.serialize(snapshot); + console.log(JSON.stringify(serializedRecord)); + assert.deepEqual(serializedRecord, { + name: 'Group', + description: 'Description', + version: 1, + auth_method_id: '1234', + type: 'OIDC', + attributes: { + filter: null, }, }); }); @@ -45,7 +103,7 @@ module('Unit | Serializer | Managed groups', function (hooks) { member_ids: ['1', '2'], version: 1, auth_method_id: '1234', - type: '80', + type: 'OIDC', attributes: { filter: 'key=value', }, @@ -60,7 +118,7 @@ module('Unit | Serializer | Managed groups', function (hooks) { description: 'Description for the test', version: 1, auth_method_id: '1234', - type: '80', + type: 'OIDC', attributes: { filter: 'key=value', }, From 285f711e78553a5b794a63773fb521fbfc1aceaa Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Tue, 2 Nov 2021 08:42:55 -0700 Subject: [PATCH 07/11] Delete default value at model level for managed group type --- addons/api/addon/generated/models/managed-groups.js | 1 - addons/api/tests/unit/serializers/managed-groups-test.js | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/addons/api/addon/generated/models/managed-groups.js b/addons/api/addon/generated/models/managed-groups.js index 4ae9e12e5..279ee3898 100644 --- a/addons/api/addon/generated/models/managed-groups.js +++ b/addons/api/addon/generated/models/managed-groups.js @@ -36,7 +36,6 @@ export default class GeneratedManagedGroupModel extends BaseModel { @attr('string', { description: 'The type of this ManagedGroup.', - defaultValue: () => 'OIDC', }) type; diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-groups-test.js index 20a4a216c..873fab58b 100644 --- a/addons/api/tests/unit/serializers/managed-groups-test.js +++ b/addons/api/tests/unit/serializers/managed-groups-test.js @@ -23,7 +23,7 @@ module('Unit | Serializer | Managed groups', function (hooks) { description: 'Description', version: 1, auth_method_id: '1234', - type: 'OIDC', + type: null, attributes: { filter: null, }, @@ -40,7 +40,7 @@ module('Unit | Serializer | Managed groups', function (hooks) { member_ids: ['1', '2'], version: 1, auth_method_id: '1234', - type: 'OIDC', + type: 'typeA', attributes: { filter: 'key=value', }, @@ -53,7 +53,7 @@ module('Unit | Serializer | Managed groups', function (hooks) { description: 'Description', version: 1, auth_method_id: '1234', - type: 'OIDC', + type: 'typeA', attributes: { filter: 'key=value', }, @@ -76,13 +76,12 @@ module('Unit | Serializer | Managed groups', function (hooks) { const snapshot = record._createSnapshot(); snapshot.adapterOptions = {}; const serializedRecord = serializer.serialize(snapshot); - console.log(JSON.stringify(serializedRecord)); assert.deepEqual(serializedRecord, { name: 'Group', description: 'Description', version: 1, auth_method_id: '1234', - type: 'OIDC', + type: null, attributes: { filter: null, }, From d506d4a0153b6d277ad646c12186317615163d62 Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Thu, 4 Nov 2021 15:06:42 -0700 Subject: [PATCH 08/11] Change typo on tests --- addons/api/tests/unit/serializers/managed-groups-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-groups-test.js index 873fab58b..395914ed5 100644 --- a/addons/api/tests/unit/serializers/managed-groups-test.js +++ b/addons/api/tests/unit/serializers/managed-groups-test.js @@ -102,7 +102,7 @@ module('Unit | Serializer | Managed groups', function (hooks) { member_ids: ['1', '2'], version: 1, auth_method_id: '1234', - type: 'OIDC', + type: 'oidc', attributes: { filter: 'key=value', }, @@ -117,7 +117,7 @@ module('Unit | Serializer | Managed groups', function (hooks) { description: 'Description for the test', version: 1, auth_method_id: '1234', - type: 'OIDC', + type: 'oidc', attributes: { filter: 'key=value', }, From 14623a638677c4278d3c86fc8bd68d513c127957 Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Thu, 4 Nov 2021 16:05:11 -0700 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Refactor=20all=20m?= =?UTF-8?q?anaged-group=20plurals=20to=20singular?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor all file names and classes declaration from managed-groups (plural) to managed-group (singular) --- .../{managed-groups.js => managed-group.js} | 0 ...s => fragment-managed-group-attributes.js} | 2 +- .../{managed-groups.js => managed-group.js} | 6 +++--- ...s => fragment-managed-group-attributes.js} | 2 +- addons/api/addon/serializers/managed-group.js | 3 +++ .../api/addon/serializers/managed-groups.js | 3 --- .../fragment-managed-group-attributes.js | 1 + .../fragment-managed-groups-attributes.js | 1 - addons/api/app/models/managed-group.js | 1 + addons/api/app/models/managed-groups.js | 1 - .../fragment-managed-group-attributes.js | 1 + .../fragment-managed-groups-attributes.js | 1 - ...fragment-managed-group-attributes-test.js} | 4 ++-- ...d-groups-test.js => managed-group-test.js} | 4 ++-- ...fragment-managed-group-attributes-test.js} | 2 +- ...d-groups-test.js => managed-group-test.js} | 20 +++++++++---------- 16 files changed, 26 insertions(+), 26 deletions(-) rename addons/api/addon/generated/models/{managed-groups.js => managed-group.js} (100%) rename addons/api/addon/models/{fragment-managed-groups-attributes.js => fragment-managed-group-attributes.js} (76%) rename addons/api/addon/models/{managed-groups.js => managed-group.js} (63%) rename addons/api/addon/serializers/{fragment-managed-groups-attributes.js => fragment-managed-group-attributes.js} (87%) create mode 100644 addons/api/addon/serializers/managed-group.js delete mode 100644 addons/api/addon/serializers/managed-groups.js create mode 100644 addons/api/app/models/fragment-managed-group-attributes.js delete mode 100644 addons/api/app/models/fragment-managed-groups-attributes.js create mode 100644 addons/api/app/models/managed-group.js delete mode 100644 addons/api/app/models/managed-groups.js create mode 100644 addons/api/app/serializers/fragment-managed-group-attributes.js delete mode 100644 addons/api/app/serializers/fragment-managed-groups-attributes.js rename addons/api/tests/unit/models/{fragment-managed-groups-attributes-test.js => fragment-managed-group-attributes-test.js} (62%) rename addons/api/tests/unit/models/{managed-groups-test.js => managed-group-test.js} (65%) rename addons/api/tests/unit/serializers/{fragment-managed-groups-attributes-test.js => fragment-managed-group-attributes-test.js} (86%) rename addons/api/tests/unit/serializers/{managed-groups-test.js => managed-group-test.js} (84%) diff --git a/addons/api/addon/generated/models/managed-groups.js b/addons/api/addon/generated/models/managed-group.js similarity index 100% rename from addons/api/addon/generated/models/managed-groups.js rename to addons/api/addon/generated/models/managed-group.js diff --git a/addons/api/addon/models/fragment-managed-groups-attributes.js b/addons/api/addon/models/fragment-managed-group-attributes.js similarity index 76% rename from addons/api/addon/models/fragment-managed-groups-attributes.js rename to addons/api/addon/models/fragment-managed-group-attributes.js index 1c80275a5..a4d0583ff 100644 --- a/addons/api/addon/models/fragment-managed-groups-attributes.js +++ b/addons/api/addon/models/fragment-managed-group-attributes.js @@ -1,7 +1,7 @@ import Fragment from 'ember-data-model-fragments/fragment'; import { attr } from '@ember-data/model'; -export default class FragmentManagedGroupsAttributesModel extends Fragment { +export default class FragmentManagedGroupAttributesModel extends Fragment { // =attributes (OIDC) @attr('string', { diff --git a/addons/api/addon/models/managed-groups.js b/addons/api/addon/models/managed-group.js similarity index 63% rename from addons/api/addon/models/managed-groups.js rename to addons/api/addon/models/managed-group.js index 7dbfe75e2..8a72a15b9 100644 --- a/addons/api/addon/models/managed-groups.js +++ b/addons/api/addon/models/managed-group.js @@ -1,12 +1,12 @@ -import GeneratedManagedGroupModel from '../generated/models/managed-groups'; +import GeneratedManagedGroupModel from '../generated/models/managed-group'; import { attr } from '@ember-data/model'; import { fragment } from 'ember-data-model-fragments/attributes'; -export default class ManagedGroupsModel extends GeneratedManagedGroupModel { +export default class ManagedGroupModel extends GeneratedManagedGroupModel { // =error attributes @attr('string', { readOnly: true }) filter; // =attributes - @fragment('fragment-managed-groups-attributes', { defaultValue: {} }) + @fragment('fragment-managed-group-attributes', { defaultValue: {} }) attributes; } diff --git a/addons/api/addon/serializers/fragment-managed-groups-attributes.js b/addons/api/addon/serializers/fragment-managed-group-attributes.js similarity index 87% rename from addons/api/addon/serializers/fragment-managed-groups-attributes.js rename to addons/api/addon/serializers/fragment-managed-group-attributes.js index e2c750454..c250ec4df 100644 --- a/addons/api/addon/serializers/fragment-managed-groups-attributes.js +++ b/addons/api/addon/serializers/fragment-managed-group-attributes.js @@ -1,6 +1,6 @@ import JSONSerializer from '@ember-data/serializer/json'; -export default class FragmentManagedGroupsAttributesSerializer extends JSONSerializer { +export default class FragmentManagedGroupAttributesSerializer extends JSONSerializer { /** * If an attribute is annotated as readOnly in the model, don't serialize it. * Otherwise delegate to default attribute serializer. diff --git a/addons/api/addon/serializers/managed-group.js b/addons/api/addon/serializers/managed-group.js new file mode 100644 index 000000000..cb03236af --- /dev/null +++ b/addons/api/addon/serializers/managed-group.js @@ -0,0 +1,3 @@ +import ApplicationSerializer from './application'; + +export default class ManagedGroupSerializer extends ApplicationSerializer {} diff --git a/addons/api/addon/serializers/managed-groups.js b/addons/api/addon/serializers/managed-groups.js deleted file mode 100644 index 215d52935..000000000 --- a/addons/api/addon/serializers/managed-groups.js +++ /dev/null @@ -1,3 +0,0 @@ -import ApplicationSerializer from './application'; - -export default class ManagedGroupsSerializer extends ApplicationSerializer {} diff --git a/addons/api/app/models/fragment-managed-group-attributes.js b/addons/api/app/models/fragment-managed-group-attributes.js new file mode 100644 index 000000000..5d7d865ef --- /dev/null +++ b/addons/api/app/models/fragment-managed-group-attributes.js @@ -0,0 +1 @@ +export { default } from 'api/models/fragment-managed-group-attributes'; diff --git a/addons/api/app/models/fragment-managed-groups-attributes.js b/addons/api/app/models/fragment-managed-groups-attributes.js deleted file mode 100644 index 491c0628f..000000000 --- a/addons/api/app/models/fragment-managed-groups-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/fragment-managed-groups-attributes'; diff --git a/addons/api/app/models/managed-group.js b/addons/api/app/models/managed-group.js new file mode 100644 index 000000000..87894c989 --- /dev/null +++ b/addons/api/app/models/managed-group.js @@ -0,0 +1 @@ +export { default } from 'api/models/managed-group'; diff --git a/addons/api/app/models/managed-groups.js b/addons/api/app/models/managed-groups.js deleted file mode 100644 index 4fb49c35a..000000000 --- a/addons/api/app/models/managed-groups.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/managed-groups'; diff --git a/addons/api/app/serializers/fragment-managed-group-attributes.js b/addons/api/app/serializers/fragment-managed-group-attributes.js new file mode 100644 index 000000000..1038afc31 --- /dev/null +++ b/addons/api/app/serializers/fragment-managed-group-attributes.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/fragment-managed-group-attributes'; diff --git a/addons/api/app/serializers/fragment-managed-groups-attributes.js b/addons/api/app/serializers/fragment-managed-groups-attributes.js deleted file mode 100644 index 1f10fec04..000000000 --- a/addons/api/app/serializers/fragment-managed-groups-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/serializers/fragment-managed-groups-attributes'; diff --git a/addons/api/tests/unit/models/fragment-managed-groups-attributes-test.js b/addons/api/tests/unit/models/fragment-managed-group-attributes-test.js similarity index 62% rename from addons/api/tests/unit/models/fragment-managed-groups-attributes-test.js rename to addons/api/tests/unit/models/fragment-managed-group-attributes-test.js index 3659b85e4..e33479dec 100644 --- a/addons/api/tests/unit/models/fragment-managed-groups-attributes-test.js +++ b/addons/api/tests/unit/models/fragment-managed-group-attributes-test.js @@ -1,13 +1,13 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -module('Unit | Model | fragment managed groups attributes', function (hooks) { +module('Unit | Model | fragment managed group attributes', function (hooks) { setupTest(hooks); // Replace this with your real tests. test('it exists', function (assert) { let store = this.owner.lookup('service:store'); - let model = store.createRecord('fragment-managed-groups-attributes', {}); + let model = store.createRecord('fragment-managed-group-attributes', {}); assert.ok(model); }); }); diff --git a/addons/api/tests/unit/models/managed-groups-test.js b/addons/api/tests/unit/models/managed-group-test.js similarity index 65% rename from addons/api/tests/unit/models/managed-groups-test.js rename to addons/api/tests/unit/models/managed-group-test.js index fd79c2f01..6df99cc9f 100644 --- a/addons/api/tests/unit/models/managed-groups-test.js +++ b/addons/api/tests/unit/models/managed-group-test.js @@ -1,12 +1,12 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -module('Unit | Model | managed groups', function (hooks) { +module('Unit | Model | managed group', function (hooks) { setupTest(hooks); test('it exists', function (assert) { let store = this.owner.lookup('service:store'); - let model = store.createRecord('managed-groups', {}); + let model = store.createRecord('managed-group', {}); assert.ok(model); }); }); diff --git a/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js b/addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js similarity index 86% rename from addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js rename to addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js index f179021d3..69af8a3a1 100644 --- a/addons/api/tests/unit/serializers/fragment-managed-groups-attributes-test.js +++ b/addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js @@ -9,7 +9,7 @@ module( test('it serializes empty string to null', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); - const record = store.createRecord('fragment-managed-groups-attributes', { + const record = store.createRecord('fragment-managed-group-attributes', { filter: '', }); const serializedRecord = record.serialize(); diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-group-test.js similarity index 84% rename from addons/api/tests/unit/serializers/managed-groups-test.js rename to addons/api/tests/unit/serializers/managed-group-test.js index 395914ed5..561cddb61 100644 --- a/addons/api/tests/unit/serializers/managed-groups-test.js +++ b/addons/api/tests/unit/serializers/managed-group-test.js @@ -1,14 +1,14 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -module('Unit | Serializer | Managed groups', function (hooks) { +module('Unit | Serializer | Managed group', function (hooks) { setupTest(hooks); test('it serializes correctly on create with no filter provided', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); - const serializer = store.serializerFor('managed-groups'); - const record = store.createRecord('managed-groups', { + const serializer = store.serializerFor('managed-group'); + const record = store.createRecord('managed-group', { name: 'Group', description: 'Description', member_ids: ['1', '2'], @@ -33,8 +33,8 @@ module('Unit | Serializer | Managed groups', function (hooks) { test('it serializes correctly on create when filter provided', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); - const serializer = store.serializerFor('managed-groups'); - const record = store.createRecord('managed-groups', { + const serializer = store.serializerFor('managed-group'); + const record = store.createRecord('managed-group', { name: 'Group', description: 'Description', member_ids: ['1', '2'], @@ -63,8 +63,8 @@ module('Unit | Serializer | Managed groups', function (hooks) { test('it does not serialize readOnly attributes', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); - const serializer = store.serializerFor('managed-groups'); - const record = store.createRecord('managed-groups', { + const serializer = store.serializerFor('managed-group'); + const record = store.createRecord('managed-group', { name: 'Group', description: 'Description', version: 1, @@ -91,11 +91,11 @@ module('Unit | Serializer | Managed groups', function (hooks) { test('it serializes correctly on update', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); - const serializer = store.serializerFor('managed-groups'); + const serializer = store.serializerFor('managed-group'); store.push({ data: { id: '1', - type: 'managed-groups', + type: 'managed-group', attributes: { name: 'Group Test', description: 'Description for the test', @@ -109,7 +109,7 @@ module('Unit | Serializer | Managed groups', function (hooks) { }, }, }); - const record = store.peekRecord('managed-groups', '1'); + const record = store.peekRecord('managed-group', '1'); const snapshot = record._createSnapshot(); const serializedRecord = serializer.serialize(snapshot); assert.deepEqual(serializedRecord, { From 087e1346d3e5e3ed50e64c5b677821fd527f3d7d Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Fri, 5 Nov 2021 08:55:22 -0700 Subject: [PATCH 10/11] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Refactor=20seriali?= =?UTF-8?q?zer=20and=20model=20for=20managed-group?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor serializer and model with suggestions from previous PR for managed-group. --- .../addon/generated/models/managed-group.js | 7 ---- addons/api/addon/models/managed-group.js | 15 ++++++-- .../fragment-managed-group-attributes.js | 8 ++++- .../unit/serializers/managed-group-test.js | 35 +++++++++++++++++++ 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/addons/api/addon/generated/models/managed-group.js b/addons/api/addon/generated/models/managed-group.js index 279ee3898..d6502eee6 100644 --- a/addons/api/addon/generated/models/managed-group.js +++ b/addons/api/addon/generated/models/managed-group.js @@ -44,11 +44,4 @@ export default class GeneratedManagedGroupModel extends BaseModel { 'The ID of the Auth Method that is associated with this ManagedGroup', }) auth_method_id; - - @attr('array', { - description: - 'The IDs of the current set of members (accounts) that are associated with this ManagedGroup.', - readOnly: true, - }) - member_ids; } diff --git a/addons/api/addon/models/managed-group.js b/addons/api/addon/models/managed-group.js index 8a72a15b9..426807de2 100644 --- a/addons/api/addon/models/managed-group.js +++ b/addons/api/addon/models/managed-group.js @@ -1,12 +1,21 @@ import GeneratedManagedGroupModel from '../generated/models/managed-group'; import { attr } from '@ember-data/model'; import { fragment } from 'ember-data-model-fragments/attributes'; +import { A } from '@ember/array'; export default class ManagedGroupModel extends GeneratedManagedGroupModel { - // =error attributes - @attr('string', { readOnly: true }) filter; - // =attributes + /** + * Members is read-only under normal circumstances. But members can + * be persisted via calls to `addMembers()` or `removeMembers()`. + */ + @attr({ + readOnly: true, + defaultValue: () => A(), + emptyArrayIfMissing: true, + }) + member_ids; + @fragment('fragment-managed-group-attributes', { defaultValue: {} }) attributes; } diff --git a/addons/api/addon/serializers/fragment-managed-group-attributes.js b/addons/api/addon/serializers/fragment-managed-group-attributes.js index c250ec4df..230358a20 100644 --- a/addons/api/addon/serializers/fragment-managed-group-attributes.js +++ b/addons/api/addon/serializers/fragment-managed-group-attributes.js @@ -12,10 +12,16 @@ export default class FragmentManagedGroupAttributesSerializer extends JSONSerial * @param {Object} attribute */ serializeAttribute(snapshot, json, key, attribute) { - const { type } = attribute; + const { type, options } = attribute; let value = super.serializeAttribute(...arguments); // Convert empty string to null. if (type === 'string' && json[key] === '') json[key] = null; + // Do not serialize read-only attributes. + if (options.readOnly) delete json[key]; + // Version is sent only if it has a non-nullish value + if (key === 'version') { + if (json[key] === null || json[key] === undefined) delete json[key]; + } return value; } } diff --git a/addons/api/tests/unit/serializers/managed-group-test.js b/addons/api/tests/unit/serializers/managed-group-test.js index 561cddb61..4fb7e5a2b 100644 --- a/addons/api/tests/unit/serializers/managed-group-test.js +++ b/addons/api/tests/unit/serializers/managed-group-test.js @@ -60,6 +60,41 @@ module('Unit | Serializer | Managed group', function (hooks) { }); }); + test('it does not serialize version when it has null or undefined value', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-group'); + store.push({ + data: { + id: '1', + type: 'managed-group', + attributes: { + name: 'Group Test', + description: 'Description for the test', + member_ids: ['1', '2'], + version: undefined, + auth_method_id: '1234', + type: 'oidc', + attributes: { + filter: 'key=value', + }, + }, + }, + }); + const record = store.peekRecord('managed-group', '1'); + const snapshot = record._createSnapshot(); + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group Test', + description: 'Description for the test', + auth_method_id: '1234', + type: 'oidc', + attributes: { + filter: 'key=value', + }, + }); + }); + test('it does not serialize readOnly attributes', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); From 148b40195e738ee6d9e2771d87ac1fc1cf38aa63 Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Fri, 5 Nov 2021 10:32:32 -0700 Subject: [PATCH 11/11] Fix typo in key/value object for testing --- addons/api/tests/unit/serializers/managed-group-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/api/tests/unit/serializers/managed-group-test.js b/addons/api/tests/unit/serializers/managed-group-test.js index 4fb7e5a2b..029a92dd4 100644 --- a/addons/api/tests/unit/serializers/managed-group-test.js +++ b/addons/api/tests/unit/serializers/managed-group-test.js @@ -40,7 +40,7 @@ module('Unit | Serializer | Managed group', function (hooks) { member_ids: ['1', '2'], version: 1, auth_method_id: '1234', - type: 'typeA', + type: 'oidc', attributes: { filter: 'key=value', }, @@ -53,7 +53,7 @@ module('Unit | Serializer | Managed group', function (hooks) { description: 'Description', version: 1, auth_method_id: '1234', - type: 'typeA', + type: 'oidc', attributes: { filter: 'key=value', },