From 597b945acab6e9306ae46427a7acc5f8f0fad4cf Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Thu, 20 May 2021 17:54:00 -0400 Subject: [PATCH] =?UTF-8?q?chore:=20=F0=9F=A4=96=20complete=20the=20fragme?= =?UTF-8?q?nt-string=20serializer=20with=20normalize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/addon/initializers/fragment-string.js | 12 +++++ .../api/addon/serializers/fragment-string.js | 24 +++++++++ addons/api/addon/serializers/host-set.js | 17 ------- .../api/app/initializers/fragment-string.js | 1 + addons/api/app/serializers/fragment-string.js | 1 + .../unit/initializers/fragment-string-test.js | 32 ++++++++++++ .../unit/serializers/fragment-string-test.js | 49 +++++++++++++++++++ 7 files changed, 119 insertions(+), 17 deletions(-) create mode 100644 addons/api/addon/initializers/fragment-string.js create mode 100644 addons/api/addon/serializers/fragment-string.js create mode 100644 addons/api/app/initializers/fragment-string.js create mode 100644 addons/api/app/serializers/fragment-string.js create mode 100644 addons/api/tests/unit/initializers/fragment-string-test.js create mode 100644 addons/api/tests/unit/serializers/fragment-string-test.js diff --git a/addons/api/addon/initializers/fragment-string.js b/addons/api/addon/initializers/fragment-string.js new file mode 100644 index 000000000..4ed82346a --- /dev/null +++ b/addons/api/addon/initializers/fragment-string.js @@ -0,0 +1,12 @@ +// app/initializers/fragment-serializer.js +import FragmentStringSerializer from '../serializers/fragment-string'; + +export function initialize(application) { + application.register('serializer:fragment-string', FragmentStringSerializer); +} + +// Fragment serializers must be manually registered +export default { + name: 'fragment-string', + initialize: initialize, +}; diff --git a/addons/api/addon/serializers/fragment-string.js b/addons/api/addon/serializers/fragment-string.js new file mode 100644 index 000000000..9b10f74d1 --- /dev/null +++ b/addons/api/addon/serializers/fragment-string.js @@ -0,0 +1,24 @@ +import JSONSerializer from '@ember-data/serializer/json'; + +export default class FragmentStringSerializer extends JSONSerializer { + // =methods + + /** + * Serializes a to string. + * @param {Snapshot} snapshot + * @return {string} + */ + serialize(snapshot) { + return snapshot.attr('value'); + } + + /** + * Normalizes from strings. + * @param {Model} typeClass + * @param {string} value + * @return {object} + */ + normalize(typeClass, value) { + return super.normalize(typeClass, { value }); + } +} diff --git a/addons/api/addon/serializers/host-set.js b/addons/api/addon/serializers/host-set.js index 5bdb2d028..f0e0c25ad 100644 --- a/addons/api/addon/serializers/host-set.js +++ b/addons/api/addon/serializers/host-set.js @@ -37,21 +37,4 @@ export default class HostSetSerializer extends ApplicationSerializer { host_ids: hostIDs, }; } - - /** - * Converts string arrays to object arrays for use with `fragment-string`. - * E.g. `"foo"` -> `{value: "foo"}` - * @override - * @param {Model} modelClass - * @param {Object} resourceHash - * @return {Object} - */ - normalize(modelClass, resourceHash) { - // 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 })); - } - return super.normalize(modelClass, resourceHash); - } } diff --git a/addons/api/app/initializers/fragment-string.js b/addons/api/app/initializers/fragment-string.js new file mode 100644 index 000000000..813fb5c5a --- /dev/null +++ b/addons/api/app/initializers/fragment-string.js @@ -0,0 +1 @@ +export { default, initialize } from 'api/initializers/fragment-string'; diff --git a/addons/api/app/serializers/fragment-string.js b/addons/api/app/serializers/fragment-string.js new file mode 100644 index 000000000..8e61ed28e --- /dev/null +++ b/addons/api/app/serializers/fragment-string.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/fragment-string'; diff --git a/addons/api/tests/unit/initializers/fragment-string-test.js b/addons/api/tests/unit/initializers/fragment-string-test.js new file mode 100644 index 000000000..6779bb9ff --- /dev/null +++ b/addons/api/tests/unit/initializers/fragment-string-test.js @@ -0,0 +1,32 @@ +import Application from '@ember/application'; + +import { initialize } from 'dummy/initializers/fragment-string'; +import { module, test } from 'qunit'; +import Resolver from 'ember-resolver'; +import { run } from '@ember/runloop'; + +module('Unit | Initializer | fragment-string', function (hooks) { + hooks.beforeEach(function () { + this.TestApplication = class TestApplication extends Application {}; + this.TestApplication.initializer({ + name: 'initializer under test', + initialize, + }); + + this.application = this.TestApplication.create({ + autoboot: false, + Resolver, + }); + }); + + hooks.afterEach(function () { + run(this.application, 'destroy'); + }); + + // TODO: Replace this with your real tests. + test('it works', async function (assert) { + await this.application.boot(); + + assert.ok(true); + }); +}); diff --git a/addons/api/tests/unit/serializers/fragment-string-test.js b/addons/api/tests/unit/serializers/fragment-string-test.js new file mode 100644 index 000000000..0dac16e71 --- /dev/null +++ b/addons/api/tests/unit/serializers/fragment-string-test.js @@ -0,0 +1,49 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Serializer | fragment string', function (hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function (assert) { + let store = this.owner.lookup('service:store'); + let serializer = store.serializerFor('fragment-string'); + + assert.ok(serializer); + }); + + test('it serializes records', function (assert) { + let store = this.owner.lookup('service:store'); + let record = store.createRecord('fragment-string', { + value: 'string value', + }); + + let serializedRecord = record.serialize(); + + assert.equal(serializedRecord, 'string value'); + }); + + test('it normalizes records', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('fragment-string'); + const modelClass = store.createRecord('fragment-string').constructor; + const payload = 'string value'; + const normalized = serializer.normalizeSingleResponse( + store, + modelClass, + payload + ); + assert.deepEqual(normalized, { + included: [], + data: { + id: null, + type: 'fragment-string', + attributes: { + value: 'string value', + }, + relationships: {}, + }, + }); + }); +});