From 5c1eb9cfb94610f21786f6b107cf8d7f5b7b9f40 Mon Sep 17 00:00:00 2001 From: "David J. Hamilton" Date: Wed, 12 Jul 2017 07:59:35 -0700 Subject: [PATCH] Set hasData for preloaded empty hasMany See #5053 for a similar fix in the fetchLink case. See #4845 for the initially reported bug. --- .../relationships/state/relationship.js | 1 + tests/unit/store/adapter-interop-test.js | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/addon/-private/system/relationships/state/relationship.js b/addon/-private/system/relationships/state/relationship.js index aa9313692da..43cc279a196 100644 --- a/addon/-private/system/relationships/state/relationship.js +++ b/addon/-private/system/relationships/state/relationship.js @@ -320,6 +320,7 @@ export default class Relationship { updateInternalModelsFromAdapter(internalModels) { heimdall.increment(updateInternalModelsFromAdapter); + this.setHasData(true); //TODO(Igor) move this to a proper place //TODO Once we have adapter support, we need to handle updated and canonical changes this.computeChanges(internalModels); diff --git a/tests/unit/store/adapter-interop-test.js b/tests/unit/store/adapter-interop-test.js index bd03ce621d8..43c80a267a2 100644 --- a/tests/unit/store/adapter-interop-test.js +++ b/tests/unit/store/adapter-interop-test.js @@ -563,6 +563,59 @@ test('initial values of hasMany can be passed in as the third argument to find a return run(() => store.findRecord('person', 1, { preload: { friends: [2] } })); }); +test('initial empty values of hasMany can be passed in as the third argument to find as records', function(assert) { + assert.expect(1); + + const Adapter = TestAdapter.extend({ + findRecord(store, type, id, snapshot) { + assert.equal(snapshot.hasMany('friends').length, 0, 'Preloaded hasMany set'); + return { data: { id, type: 'person' } }; + } + }); + + let env = setupStore({ + adapter: Adapter + }); + + let { store } = env; + + const Person = DS.Model.extend({ + name: DS.attr('string'), + friends: DS.hasMany('person', { inverse: null, async: true }) + }); + + env.registry.register('model:person', Person); + + return run(() => { + return store.findRecord('person', 1, { preload: { friends: [] } }); + }); +}); + +test('initial values of hasMany can be passed in as the third argument to find as ids', function(assert) { + assert.expect(1); + + const Adapter = TestAdapter.extend({ + findRecord(store, type, id, snapshot) { + assert.equal(snapshot.hasMany('friends').length, 0, 'Preloaded hasMany set'); + return { data: { id, type: 'person' } }; + } + }); + + let env = setupStore({ + adapter: Adapter + }); + let { store } = env; + + const Person = DS.Model.extend({ + name: DS.attr('string'), + friends: DS.hasMany('person', { async: true, inverse: null }) + }); + + env.registry.register('model:person', Person); + + return run(() => store.findRecord('person', 1, { preload: { friends: [] } })); +}); + test('records should have their ids updated when the adapter returns the id data', function(assert) { assert.expect(2);