From 6b380e1a1ace41381e404f0030ce3ee67b67c76a Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Mon, 2 Apr 2018 15:51:13 -0700 Subject: [PATCH 1/4] FIX push on deleted --- addon/-private/system/model/states.js | 3 +- .../relationships/json-api-links-test.js | 0 tests/unit/model-test.js | 50 ++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 tests/integration/relationships/json-api-links-test.js diff --git a/addon/-private/system/model/states.js b/addon/-private/system/model/states.js index 080941fd4b3..e1edd9bff92 100644 --- a/addon/-private/system/model/states.js +++ b/addon/-private/system/model/states.js @@ -701,7 +701,8 @@ const RootState = { }, willCommit() { }, - didCommit() { } + didCommit() { }, + pushedData() {} }, invalid: { diff --git a/tests/integration/relationships/json-api-links-test.js b/tests/integration/relationships/json-api-links-test.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/unit/model-test.js b/tests/unit/model-test.js index b30da69289f..1f48402fdbb 100644 --- a/tests/unit/model-test.js +++ b/tests/unit/model-test.js @@ -16,11 +16,13 @@ module('unit/model - DS.Model', { beforeEach() { Person = DS.Model.extend({ name: DS.attr('string'), - isDrugAddict: DS.attr('boolean') + isDrugAddict: DS.attr('boolean'), + isArchived: DS.attr() }); Person.toString = () => 'person'; env = setupStore({ + adapter: DS.JSONAPIAdapter, person: Person }); store = env.store; @@ -567,6 +569,52 @@ test('supports pushedData in root.deleted.uncommitted', function(assert) { }); }); +test('supports pushedData in root.deleted.saved', function(assert) { + let { adapter } = env; + + adapter.shouldBackgroundReloadRecord = () => false; + adapter.deleteRecord = () => { + return Ember.RSVP.resolve(); + }; + + let record = run(() => store.push({ + data: { + type: 'person', + id: '1', + attributes: { + isArchived: false + } + } + })); + + run(() => { + record.destroyRecord().then(() => { + let currentState = record._internalModel.currentState; + + assert.ok(currentState.stateName === 'root.deleted.saved', + 'record is in a persisted deleted state'); + assert.equal(get(record, 'isDeleted'), true); + assert.ok(store.peekRecord('person', '1') !== null, 'the deleted person is not removed from store (no unload called)'); + }); + }); + + run(() => { + try { + store.push({ + data: { + type: 'person', + id: '1', + attributes: { + isArchived: true + } + } + }) + } catch (e) { + assert.ok(false, e); + } + }); +}); + test('currentState is accessible when the record is created', function(assert) { let hash = { data: { From bc2f6e8da1a93865fe2986fb6e357c9a6fd74401 Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Mon, 2 Apr 2018 17:03:48 -0700 Subject: [PATCH 2/4] Add additional test coverage --- tests/unit/model-test.js | 58 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/tests/unit/model-test.js b/tests/unit/model-test.js index 1f48402fdbb..61c4ce7c4fe 100644 --- a/tests/unit/model-test.js +++ b/tests/unit/model-test.js @@ -569,7 +569,7 @@ test('supports pushedData in root.deleted.uncommitted', function(assert) { }); }); -test('supports pushedData in root.deleted.saved', function(assert) { +test('supports canonical updates via pushedData in root.deleted.saved', function(assert) { let { adapter } = env; adapter.shouldBackgroundReloadRecord = () => false; @@ -608,10 +608,64 @@ test('supports pushedData in root.deleted.saved', function(assert) { isArchived: true } } - }) + }); } catch (e) { assert.ok(false, e); } + + let currentState = record._internalModel.currentState; + + assert.ok(currentState.stateName === 'root.deleted.saved', + 'record is still in a persisted deleted state'); + assert.ok(get(record, 'isDeleted') === true, 'The record is still deleted'); + assert.ok(get(record, 'isArchived') === true, 'The record reflects the update to canonical state'); + }); +}); + + +test('Does not support dirtying in root.deleted.saved', function(assert) { + let { adapter } = env; + + adapter.shouldBackgroundReloadRecord = () => false; + adapter.deleteRecord = () => { + return Ember.RSVP.resolve(); + }; + + let record = run(() => store.push({ + data: { + type: 'person', + id: '1', + attributes: { + isArchived: false + } + } + })); + + run(() => { + record.destroyRecord().then(() => { + let currentState = record._internalModel.currentState; + + assert.ok(currentState.stateName === 'root.deleted.saved', + 'record is in a persisted deleted state'); + assert.equal(get(record, 'isDeleted'), true); + assert.ok(store.peekRecord('person', '1') !== null, 'the deleted person is not removed from store (no unload called)'); + }); + }); + + run(() => { + try { + set(record, 'isArchived', true); + assert.ok(false, 'Was unable to dirty a deleted record'); + } catch (e) { + assert.ok(true, e.message); + } + + let currentState = record._internalModel.currentState; + + assert.ok(currentState.stateName === 'root.deleted.saved', + 'record is still in a persisted deleted state'); + assert.ok(get(record, 'isDeleted') === true, 'The record is still deleted'); + assert.ok(get(record, 'isArchived') === false, 'The record reflects canonical state'); }); }); From a75f7169fc30cdb077b08b7fcdeb2354e9c33646 Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Mon, 2 Apr 2018 17:06:59 -0700 Subject: [PATCH 3/4] rm ghost file --- tests/integration/relationships/json-api-links-test.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/integration/relationships/json-api-links-test.js diff --git a/tests/integration/relationships/json-api-links-test.js b/tests/integration/relationships/json-api-links-test.js deleted file mode 100644 index e69de29bb2d..00000000000 From ec0fcf05ad4ed6edfb54e4bca10623a69e8e107f Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Mon, 2 Apr 2018 17:18:48 -0700 Subject: [PATCH 4/4] cleanup tests --- tests/unit/model-test.js | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/tests/unit/model-test.js b/tests/unit/model-test.js index 61c4ce7c4fe..1c423e819db 100644 --- a/tests/unit/model-test.js +++ b/tests/unit/model-test.js @@ -599,19 +599,15 @@ test('supports canonical updates via pushedData in root.deleted.saved', function }); run(() => { - try { - store.push({ - data: { - type: 'person', - id: '1', - attributes: { - isArchived: true - } + store.push({ + data: { + type: 'person', + id: '1', + attributes: { + isArchived: true } - }); - } catch (e) { - assert.ok(false, e); - } + } + }); let currentState = record._internalModel.currentState; @@ -653,12 +649,9 @@ test('Does not support dirtying in root.deleted.saved', function(assert) { }); run(() => { - try { + assert.expectAssertion(() => { set(record, 'isArchived', true); - assert.ok(false, 'Was unable to dirty a deleted record'); - } catch (e) { - assert.ok(true, e.message); - } + }, /Attempted to handle event `didSetProperty` on while in state root.deleted.saved. Called with {name: isArchived, oldValue: false, originalValue: false, value: true}./); let currentState = record._internalModel.currentState;