diff --git a/packages/-ember-data/tests/integration/identifiers/lid-reflection-test.ts b/packages/-ember-data/tests/integration/identifiers/lid-reflection-test.ts index 4d58ac081c7..d2268f56e6c 100644 --- a/packages/-ember-data/tests/integration/identifiers/lid-reflection-test.ts +++ b/packages/-ember-data/tests/integration/identifiers/lid-reflection-test.ts @@ -1,11 +1,11 @@ import { module, test } from 'qunit'; -import { defer } from 'rsvp'; +import { defer, resolve } from 'rsvp'; import { setupTest } from 'ember-qunit'; import Adapter from '@ember-data/adapter'; import { RECORD_DATA_STATE } from '@ember-data/canary-features'; -import Model, { attr } from '@ember-data/model'; +import Model, { attr, belongsTo, hasMany } from '@ember-data/model'; import Serializer from '@ember-data/serializer'; import Store, { recordIdentifierFor } from '@ember-data/store'; @@ -145,4 +145,79 @@ module('Integration | Identifiers - lid reflection', function(hooks) { assert.strictEqual(record.name, '@runspired', 'After we finish we use the most recent clean name'); }); + + test('hasMany() has correct state after .save() on a newly created record with sideposted child record when lid is provided in the response payload', async function(assert) { + class Ingredient extends Model { + @attr name; + @belongsTo('cake') cake; + } + + class Cake extends Model { + @attr name; + @hasMany('ingredient', { async: false }) ingredients; + } + + this.owner.register('model:ingredient', Ingredient); + this.owner.register('model:cake', Cake); + + class TestSerializer extends Serializer { + normalizeResponse(_, __, payload) { + return payload; + } + } + class TestAdapter extends Adapter { + createRecord(store, ModelClass, snapshot) { + return resolve({ + data: { + type: 'cake', + id: '1', + attributes: { + name: 'Cheesecake', + }, + relationships: { + ingredients: { + data: [ + { + type: 'ingredient', + id: '2', + lid: cheeseIdentifier.lid, + }, + ], + }, + }, + }, + included: [ + { + type: 'ingredient', + id: '2', + lid: cheeseIdentifier.lid, + attributes: { + name: 'Cheese', + }, + relationships: { + cake: { + data: { + type: 'cake', + id: '1', + }, + }, + }, + }, + ], + }); + } + } + this.owner.register('serializer:application', TestSerializer); + this.owner.register('adapter:application', TestAdapter); + + const cheese = store.createRecord('ingredient', { name: 'Cheese' }); + const cake = store.createRecord('cake', { name: 'Cheesecake', ingredients: [cheese] }); + + const cheeseIdentifier = recordIdentifierFor(cheese); + + await cake.save(); + + assert.deepEqual(cake.hasMany('ingredients').ids(), ['2']); + assert.equal(cake.ingredients.objectAt(0).name, 'Cheese'); + }); }); diff --git a/packages/record-data/addon/-private/relationships/state/has-many.ts b/packages/record-data/addon/-private/relationships/state/has-many.ts index 5620ea3c4f6..3ef4ff9279c 100755 --- a/packages/record-data/addon/-private/relationships/state/has-many.ts +++ b/packages/record-data/addon/-private/relationships/state/has-many.ts @@ -215,7 +215,11 @@ export default class ManyRelationship extends Relationship { } else { recordDatas = new Array(data.length); for (let i = 0; i < data.length; i++) { - recordDatas[i] = this.recordData.storeWrapper.recordDataFor(data[i].type, data[i].id) as RelationshipRecordData; + recordDatas[i] = this.recordData.storeWrapper.recordDataFor( + data[i].type, + data[i].id, + data[i].lid + ) as RelationshipRecordData; } } this.updateRecordDatasFromAdapter(recordDatas);