From 6ac32efe5783148fa7f057e7c5beb5074251a18c Mon Sep 17 00:00:00 2001 From: bmac Date: Tue, 13 Oct 2015 11:30:19 -0400 Subject: [PATCH] [BUGFIX beta] Attribute/relationship named "type" of primary record is considered before normalization --- .../lib/serializers/rest-serializer.js | 6 ++--- .../serializers/rest-serializer-test.js | 26 ++++++++++++++++--- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/ember-data/lib/serializers/rest-serializer.js b/packages/ember-data/lib/serializers/rest-serializer.js index 2d26d7c8e0f..39e5e8295bc 100644 --- a/packages/ember-data/lib/serializers/rest-serializer.js +++ b/packages/ember-data/lib/serializers/rest-serializer.js @@ -149,10 +149,9 @@ var RESTSerializer = JSONSerializer.extend({ let modelClass = store.modelFor(modelName); let serializer = store.serializerFor(modelName); - const primaryHasTypeAttribute = modelHasAttributeOrRelationshipNamedType(modelClass); /*jshint loopfunc:true*/ arrayHash.forEach((hash) => { - let { data, included } = this._normalizePolymorphicRecord(store, hash, prop, modelClass, serializer, primaryHasTypeAttribute); + let { data, included } = this._normalizePolymorphicRecord(store, hash, prop, modelClass, serializer); documentHash.data.push(data); if (included) { documentHash.included.push(...included); @@ -162,8 +161,9 @@ var RESTSerializer = JSONSerializer.extend({ return documentHash; }, - _normalizePolymorphicRecord: function(store, hash, prop, primaryModelClass, primarySerializer, primaryHasTypeAttribute) { + _normalizePolymorphicRecord: function(store, hash, prop, primaryModelClass, primarySerializer) { let serializer, modelClass; + const primaryHasTypeAttribute = modelHasAttributeOrRelationshipNamedType(primaryModelClass); // Support polymorphic records in async relationships if (!primaryHasTypeAttribute && hash.type && store._hasModelFor(this.modelNameFromPayloadKey(hash.type))) { serializer = store.serializerFor(hash.type); diff --git a/packages/ember-data/tests/integration/serializers/rest-serializer-test.js b/packages/ember-data/tests/integration/serializers/rest-serializer-test.js index ff043de2c28..f8df772b567 100644 --- a/packages/ember-data/tests/integration/serializers/rest-serializer-test.js +++ b/packages/ember-data/tests/integration/serializers/rest-serializer-test.js @@ -607,12 +607,12 @@ test("don't polymorphically deserialize base on the type key in payload when a t })); run(function() { - env.restSerializer.normalizeArrayResponse(env.store, Basket, { + env.store.push(env.restSerializer.normalizeArrayResponse(env.store, Basket, { basket: [ - env.store.createRecord('Basket', { type: 'bamboo', size: 10, id: '1' }), - env.store.createRecord('Basket', { type: 'yellowMinion', size: 10, id: '65536' }) + { type: 'bamboo', size: 10, id: '1' }, + { type: 'yellowMinion', size: 10, id: '65536' } ] - }); + })); }); const normalRecord = env.store.peekRecord('basket', '1'); @@ -626,6 +626,24 @@ test("don't polymorphically deserialize base on the type key in payload when a t strictEqual(clashingRecord.get('size'), 10); }); +test("don't polymorphically deserialize base on the type key in payload when a type attribute exist on a singular response", function() { + env.registry.register('serializer:application', DS.RESTSerializer.extend({ + isNewSerializerAPI: true + })); + + run(function() { + env.store.push(env.restSerializer.normalizeSingleResponse(env.store, Basket, { + basket: { type: 'yellowMinion', size: 10, id: '65536' } + }, '65536')); + }); + + const clashingRecord = env.store.peekRecord('basket', '65536'); + ok(clashingRecord, 'payload with type that matches another model name'); + strictEqual(clashingRecord.get('type'), 'yellowMinion'); + strictEqual(clashingRecord.get('size'), 10); +}); + + test("don't polymorphically deserialize based on the type key in payload when a relationship exists named type", function() { env.registry.register('serializer:application', DS.RESTSerializer.extend({ isNewSerializerAPI: true