From 6ead026b4399a849fc43c115f6a834aa35d394a6 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Thu, 24 May 2018 21:21:16 +0100 Subject: [PATCH] feat: overwrite arrays breaking change --- docs/api/wrapper/setData.md | 4 +++- flow/modules.flow.js | 2 +- packages/test-utils/src/wrapper.js | 6 ++++-- test/specs/wrapper/setData.spec.js | 22 +++++++++++++++++++--- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/docs/api/wrapper/setData.md b/docs/api/wrapper/setData.md index 817050b00..8a90cb6d6 100644 --- a/docs/api/wrapper/setData.md +++ b/docs/api/wrapper/setData.md @@ -1,6 +1,8 @@ ## setData(data) -Sets `Wrapper` `vm` data and forces update. +Sets `Wrapper` `vm` data. + +setData works by merging existing properties, except for arrays which are overwritten. **Note the Wrapper must contain a Vue instance.** diff --git a/flow/modules.flow.js b/flow/modules.flow.js index f064254ab..fe37dfd20 100644 --- a/flow/modules.flow.js +++ b/flow/modules.flow.js @@ -12,7 +12,7 @@ declare module 'lodash/cloneDeep' { declare module.exports: any; } -declare module 'lodash/merge' { +declare module 'lodash/mergeWith' { declare module.exports: any; } diff --git a/packages/test-utils/src/wrapper.js b/packages/test-utils/src/wrapper.js index b85af8985..8965f08f4 100644 --- a/packages/test-utils/src/wrapper.js +++ b/packages/test-utils/src/wrapper.js @@ -1,7 +1,7 @@ // @flow import Vue from 'vue' -import merge from 'lodash/merge' +import mergeWith from 'lodash/mergeWith' import getSelectorTypeOrThrow from './get-selector-type' import { REF_SELECTOR, @@ -424,7 +424,9 @@ export default class Wrapper implements BaseWrapper { if (typeof data[key] === 'object' && data[key] !== null && !Array.isArray(data[key])) { // $FlowIgnore : Problem with possibly null this.vm - const newObj = merge(this.vm[key], data[key]) + const newObj = mergeWith(this.vm[key], data[key], (objValue, srcValue) => { + return Array.isArray(srcValue) ? srcValue : undefined + }) // $FlowIgnore : Problem with possibly null this.vm this.vm.$set(this.vm, [key], newObj) } else { diff --git a/test/specs/wrapper/setData.spec.js b/test/specs/wrapper/setData.spec.js index 10c667093..9a90ba0dc 100644 --- a/test/specs/wrapper/setData.spec.js +++ b/test/specs/wrapper/setData.spec.js @@ -165,7 +165,8 @@ describeWithShallowAndMount('setData', (mountingMethod) => { }, propB: 'b' } - }) + }), + render: () => {} } const wrapper = mountingMethod(TestComponent) wrapper.setData({ @@ -179,10 +180,16 @@ describeWithShallowAndMount('setData', (mountingMethod) => { expect(wrapper.vm.anObject.propA.prop2).to.equal('b') }) - it('sets array data properly', () => { + it('does not merge arrays', () => { const TestComponent = { + template: '
{{nested.nested.nestedArray[0]}}
', data: () => ({ - items: [1, 2] + items: [1, 2], + nested: { + nested: { + nestedArray: [1, 2] + } + } }) } const wrapper = mountingMethod(TestComponent) @@ -190,5 +197,14 @@ describeWithShallowAndMount('setData', (mountingMethod) => { items: [3] }) expect(wrapper.vm.items).to.deep.equal([3]) + wrapper.setData({ + nested: { + nested: { + nestedArray: [10] + } + } + }) + expect(wrapper.text()).to.equal('10') + expect(wrapper.vm.nested.nested.nestedArray).to.deep.equal([10]) }) })