import Vue from 'vue' describe('Global API: set/delete', () => { describe('Vue.set', () => { it('should update a vue object', done => { const vm = new Vue({ template: '
{{x}}
', data: { x: 1 } }).$mount() expect(vm.$el.innerHTML).toBe('1') Vue.set(vm, 'x', 2) waitForUpdate(() => { expect(vm.$el.innerHTML).toBe('2') }).then(done) }) it('should update a observing object', done => { const vm = new Vue({ template: '
{{foo.x}}
', data: { foo: { x: 1 }} }).$mount() expect(vm.$el.innerHTML).toBe('1') Vue.set(vm.foo, 'x', 2) waitForUpdate(() => { expect(vm.$el.innerHTML).toBe('2') }).then(done) }) it('should update a observing array', done => { const vm = new Vue({ template: '
{{k}}-{{v}}
', data: { list: ['a', 'b', 'c'] } }).$mount() expect(vm.$el.innerHTML).toBe('
0-a
1-b
2-c
') Vue.set(vm.list, 1, 'd') waitForUpdate(() => { expect(vm.$el.innerHTML).toBe('
0-a
1-d
2-c
') Vue.set(vm.list, '2', 'e') }).then(() => { expect(vm.$el.innerHTML).toBe('
0-a
1-d
2-e
') /* eslint-disable no-new-wrappers */ Vue.set(vm.list, new Number(1), 'f') }).then(() => { expect(vm.$el.innerHTML).toBe('
0-a
1-f
2-e
') Vue.set(vm.list, '3g', 'g') }).then(() => { expect(vm.$el.innerHTML).toBe('
0-a
1-f
2-e
') }).then(done) }) it('should update a vue object with nothing', done => { const vm = new Vue({ template: '
{{x}}
', data: { x: 1 } }).$mount() expect(vm.$el.innerHTML).toBe('1') Vue.set(vm, 'x', null) waitForUpdate(() => { expect(vm.$el.innerHTML).toBe('') Vue.set(vm, 'x') }).then(() => { expect(vm.$el.innerHTML).toBe('') }).then(done) }) it('be able to use string type index in array', done => { const vm = new Vue({ template: '

{{obj.name}}

', data: { lists: [ { name: 'A' }, { name: 'B' }, { name: 'C' } ] } }).$mount() expect(vm.$el.innerHTML).toBe('

A

B

C

') Vue.set(vm.lists, '0', { name: 'D' }) waitForUpdate(() => { expect(vm.$el.innerHTML).toBe('

D

B

C

') }).then(done) }) // #6845 it('should not overwrite properties on prototype chain', () => { class Model { constructor () { this._bar = null } get bar () { return this._bar } set bar (newvalue) { this._bar = newvalue } } const vm = new Vue({ data: { data: new Model() } }) Vue.set(vm.data, 'bar', 123) expect(vm.data.bar).toBe(123) expect(vm.data.hasOwnProperty('bar')).toBe(false) expect(vm.data._bar).toBe(123) }) }) describe('Vue.delete', () => { it('should delete a key', done => { const vm = new Vue({ template: '
{{obj.x}}
', data: { obj: { x: 1 }} }).$mount() expect(vm.$el.innerHTML).toBe('1') vm.obj.x = 2 waitForUpdate(() => { expect(vm.$el.innerHTML).toBe('2') Vue.delete(vm.obj, 'x') }).then(() => { expect(vm.$el.innerHTML).toBe('') vm.obj.x = 3 }).then(() => { expect(vm.$el.innerHTML).toBe('') }).then(done) }) it('be able to delete an item in array', done => { const vm = new Vue({ template: '

{{obj.name}}

', data: { lists: [ { name: 'A' }, { name: 'B' }, { name: 'C' } ] } }).$mount() expect(vm.$el.innerHTML).toBe('

A

B

C

') Vue.delete(vm.lists, 1) waitForUpdate(() => { expect(vm.$el.innerHTML).toBe('

A

C

') Vue.delete(vm.lists, NaN) }).then(() => { expect(vm.$el.innerHTML).toBe('

A

C

') Vue.delete(vm.lists, -1) }).then(() => { expect(vm.$el.innerHTML).toBe('

A

C

') Vue.delete(vm.lists, '1.3') }).then(() => { expect(vm.$el.innerHTML).toBe('

A

C

') Vue.delete(vm.lists, true) }).then(() => { expect(vm.$el.innerHTML).toBe('

A

C

') Vue.delete(vm.lists, {}) }).then(() => { expect(vm.$el.innerHTML).toBe('

A

C

') Vue.delete(vm.lists, '1') }).then(() => { expect(vm.$el.innerHTML).toBe('

A

') /* eslint-disable no-new-wrappers */ Vue.delete(vm.lists, new Number(0)) }).then(() => { expect(vm.$el.innerHTML).toBe('') }).then(done) }) }) })