From fc6e905579e7e681d2d0e2d4ab40b719a6083a1d Mon Sep 17 00:00:00 2001 From: Stanley Stuart Date: Fri, 8 Apr 2016 14:14:14 -0500 Subject: [PATCH] [BUGFIX beta] convert single record sideloaded records to plural Before, `_normalizeArray` would call `forEach` even if the object wasn't an array. We guard against it by using `Ember.makeArray`. fixes #3805 https://github.com/emberjs/data/issues/3805 (cherry picked from commit c68d0ef892dcea92a68399d06af3f2072086a7cf) --- addon/serializers/rest.js | 2 +- .../serializers/rest-serializer-test.js | 93 ++++++++++++++++++- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/addon/serializers/rest.js b/addon/serializers/rest.js index 661d7bbc987..8eec1b976a4 100644 --- a/addon/serializers/rest.js +++ b/addon/serializers/rest.js @@ -184,7 +184,7 @@ var RESTSerializer = JSONSerializer.extend({ let serializer = store.serializerFor(modelName); /*jshint loopfunc:true*/ - arrayHash.forEach((hash) => { + Ember.makeArray(arrayHash).forEach((hash) => { let { data, included } = this._normalizePolymorphicRecord(store, hash, prop, modelClass, serializer); documentHash.data.push(data); if (included) { diff --git a/tests/integration/serializers/rest-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js index 98b4de5ee1a..b28a3aabd89 100644 --- a/tests/integration/serializers/rest-serializer-test.js +++ b/tests/integration/serializers/rest-serializer-test.js @@ -22,7 +22,8 @@ module("integration/serializer/rest - RESTSerializer", { }); EvilMinion = DS.Model.extend({ superVillain: DS.belongsTo('super-villain', { async: false }), - name: DS.attr('string') + name: DS.attr('string'), + doomsdayDevice: DS.belongsTo('doomsday-device', { async: false }) }); YellowMinion = EvilMinion.extend({ eyes: DS.attr('number') @@ -846,3 +847,93 @@ test("don't polymorphically deserialize based on the type key in payload when a }); }); + +test('Serializer should respect the attrs hash in links', function(assert) { + env.registry.register("serializer:super-villain", DS.RESTSerializer.extend({ + attrs: { + evilMinions: { key: 'my_minions' } + } + })); + + var jsonHash = { + "super-villains": [ + { + firstName: 'Tom', + lastName: 'Dale', + links: { + my_minions: 'me/minions' + } + } + ] + }; + + var documentHash = env.container.lookup("serializer:super-villain").normalizeSingleResponse(env.store, SuperVillain, jsonHash); + + assert.equal(documentHash.data.relationships.evilMinions.links.related, 'me/minions'); +}); + +// https://github.com/emberjs/data/issues/3805 +test('normalizes sideloaded single record so that it sideloads correctly - belongsTo - GH-3805', function(assert) { + env.registry.register("serializer:doomsday-device", DS.RESTSerializer.extend()); + let payload = { + doomsdayDevice: { + id: 1, + evilMinion: 2 + }, + evilMinion: { + id: 2, + doomsdayDevice: 1 + } + }; + + let document = env.store.serializerFor('doomsday-device').normalizeSingleResponse(env.store, DoomsdayDevice, payload); + assert.equal(document.data.relationships.evilMinion.data.id, 2); + assert.equal(document.included.length, 1); + assert.deepEqual(document.included[0], { + attributes: {}, + id: '2', + type: 'evil-minion', + relationships: { + doomsdayDevice: { + data: { + id: '1', + type: 'doomsday-device' + } + } + } + }); +}); + +// https://github.com/emberjs/data/issues/3805 +test('normalizes sideloaded single record so that it sideloads correctly - hasMany - GH-3805', function(assert) { + env.registry.register("serializer:home-planet", DS.RESTSerializer.extend()); + let payload = { + homePlanet: { + id: 1, + superVillains: [2] + }, + superVillain: { + id: 2, + homePlanet: 1 + } + }; + + let document = env.store.serializerFor('home-planet').normalizeSingleResponse(env.store, HomePlanet, payload); + + assert.equal(document.data.relationships.superVillains.data.length, 1); + assert.equal(document.data.relationships.superVillains.data[0].id, 2); + assert.equal(document.included.length, 1); + assert.deepEqual(document.included[0], { + attributes: {}, + id: '2', + type: 'super-villain', + relationships: { + homePlanet: { + data: { + id: '1', + type: 'home-planet' + } + } + } + }); +});