import Vue from 'vue' describe('Directive v-model checkbox', () => { it('should work', done => { const vm = new Vue({ data: { test: true }, template: '' }).$mount() document.body.appendChild(vm.$el) expect(vm.$el.checked).toBe(true) vm.test = false waitForUpdate(function () { expect(vm.$el.checked).toBe(false) expect(vm.test).toBe(false) vm.$el.click() expect(vm.$el.checked).toBe(true) expect(vm.test).toBe(true) }).then(() => { document.body.removeChild(vm.$el) }).then(done) }) it('should respect value bindings', done => { const vm = new Vue({ data: { test: 1, a: 1, b: 2 }, template: '' }).$mount() document.body.appendChild(vm.$el) expect(vm.$el.checked).toBe(true) vm.$el.click() expect(vm.$el.checked).toBe(false) expect(vm.test).toBe(2) vm.$el.click() expect(vm.$el.checked).toBe(true) expect(vm.test).toBe(1) vm.test = 2 waitForUpdate(() => { expect(vm.$el.checked).toBe(false) vm.test = 1 }).then(() => { expect(vm.$el.checked).toBe(true) document.body.removeChild(vm.$el) }).then(done) }) it('bind to Array value', done => { const vm = new Vue({ data: { test: ['1'] }, template: `
` }).$mount() document.body.appendChild(vm.$el) expect(vm.$el.children[0].checked).toBe(true) expect(vm.$el.children[1].checked).toBe(false) vm.$el.children[0].click() expect(vm.test.length).toBe(0) vm.$el.children[1].click() expect(vm.test).toEqual(['2']) vm.$el.children[0].click() expect(vm.test).toEqual(['2', '1']) vm.test = ['1'] waitForUpdate(() => { expect(vm.$el.children[0].checked).toBe(true) expect(vm.$el.children[1].checked).toBe(false) }).then(done) }) it('bind to Array value with value bindings', done => { const vm = new Vue({ data: { test: [1] }, template: `
` }).$mount() document.body.appendChild(vm.$el) expect(vm.$el.children[0].checked).toBe(true) expect(vm.$el.children[1].checked).toBe(false) vm.$el.children[0].click() expect(vm.test.length).toBe(0) vm.$el.children[1].click() expect(vm.test).toEqual([2]) vm.$el.children[0].click() expect(vm.test).toEqual([2, 1]) vm.test = [1] waitForUpdate(() => { expect(vm.$el.children[0].checked).toBe(true) expect(vm.$el.children[1].checked).toBe(false) }).then(done) }) it('bind to Array value with value bindings (object loose equal)', done => { const vm = new Vue({ data: { test: [{ a: 1 }] }, template: `
` }).$mount() document.body.appendChild(vm.$el) expect(vm.$el.children[0].checked).toBe(true) expect(vm.$el.children[1].checked).toBe(false) vm.$el.children[0].click() expect(vm.test.length).toBe(0) vm.$el.children[1].click() expect(vm.test).toEqual([{ a: 2 }]) vm.$el.children[0].click() expect(vm.test).toEqual([{ a: 2 }, { a: 1 }]) vm.test = [{ a: 1 }] waitForUpdate(() => { expect(vm.$el.children[0].checked).toBe(true) expect(vm.$el.children[1].checked).toBe(false) }).then(done) }) it('.number modifier', () => { const vm = new Vue({ data: { test: [], check: true }, template: `
` }).$mount() document.body.appendChild(vm.$el) const checkboxInputs = vm.$el.getElementsByTagName('input') expect(checkboxInputs[0].checked).toBe(false) expect(checkboxInputs[1].checked).toBe(false) expect(checkboxInputs[2].checked).toBe(true) checkboxInputs[0].click() checkboxInputs[1].click() checkboxInputs[2].click() expect(vm.test).toEqual([1, '2']) expect(vm.check).toEqual(false) }) it('should respect different primitive type value', (done) => { const vm = new Vue({ data: { test: [0] }, template: '
' + '' + '' + '' + '' + '' + '
' }).$mount() const checkboxInput = vm.$el.children expect(checkboxInput[0].checked).toBe(false) expect(checkboxInput[1].checked).toBe(true) expect(checkboxInput[2].checked).toBe(false) expect(checkboxInput[3].checked).toBe(false) expect(checkboxInput[4].checked).toBe(false) vm.test = [1] waitForUpdate(() => { expect(checkboxInput[0].checked).toBe(false) expect(checkboxInput[1].checked).toBe(false) expect(checkboxInput[2].checked).toBe(true) expect(checkboxInput[3].checked).toBe(false) expect(checkboxInput[4].checked).toBe(false) vm.test = [''] }).then(() => { expect(checkboxInput[0].checked).toBe(true) expect(checkboxInput[1].checked).toBe(false) expect(checkboxInput[2].checked).toBe(false) expect(checkboxInput[3].checked).toBe(false) expect(checkboxInput[4].checked).toBe(false) vm.test = [false] }).then(() => { expect(checkboxInput[0].checked).toBe(false) expect(checkboxInput[1].checked).toBe(false) expect(checkboxInput[2].checked).toBe(false) expect(checkboxInput[3].checked).toBe(true) expect(checkboxInput[4].checked).toBe(false) vm.test = [true] }).then(() => { expect(checkboxInput[0].checked).toBe(false) expect(checkboxInput[1].checked).toBe(false) expect(checkboxInput[2].checked).toBe(false) expect(checkboxInput[3].checked).toBe(false) expect(checkboxInput[4].checked).toBe(true) vm.test = ['', 0, 1, false, true] }).then(() => { expect(checkboxInput[0].checked).toBe(true) expect(checkboxInput[1].checked).toBe(true) expect(checkboxInput[2].checked).toBe(true) expect(checkboxInput[3].checked).toBe(true) expect(checkboxInput[4].checked).toBe(true) }).then(done) }) // #4521 it('should work with click event', (done) => { const vm = new Vue({ data: { num: 1, checked: false }, template: '
click {{ num }}
', methods: { add: function () { this.num++ } } }).$mount() document.body.appendChild(vm.$el) const checkbox = vm.$refs.checkbox checkbox.click() waitForUpdate(() => { expect(checkbox.checked).toBe(true) expect(vm.num).toBe(2) }).then(done) }) it('should get updated with model when in focus', (done) => { const vm = new Vue({ data: { a: 2 }, template: '' }).$mount() document.body.appendChild(vm.$el) vm.$el.click() waitForUpdate(() => { expect(vm.$el.checked).toBe(false) vm.a = 2 }).then(() => { expect(vm.$el.checked).toBe(true) }).then(done) }) it('warn inline checked', () => { const vm = new Vue({ template: ``, data: { test: false } }).$mount() expect(vm.$el.checked).toBe(false) expect('inline checked attributes will be ignored when using v-model').toHaveBeenWarned() }) })