You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
5.3 KiB
218 lines
5.3 KiB
import Vue from 'vue'
|
|
|
|
describe('Directive v-model dynamic input type', () => {
|
|
it('should work', done => {
|
|
const vm = new Vue({
|
|
data: {
|
|
inputType: null,
|
|
test: 'b'
|
|
},
|
|
template: `<input :type="inputType" v-model="test">`
|
|
}).$mount()
|
|
document.body.appendChild(vm.$el)
|
|
|
|
// test text
|
|
assertInputWorks(vm, 'inputType').then(done)
|
|
})
|
|
|
|
it('with v-if', done => {
|
|
const vm = new Vue({
|
|
data: {
|
|
ok: true,
|
|
type: null,
|
|
test: 'b'
|
|
},
|
|
template: `<input v-if="ok" :type="type" v-model="test"><div v-else>haha</div>`
|
|
}).$mount()
|
|
document.body.appendChild(vm.$el)
|
|
|
|
const chain = assertInputWorks(vm).then(() => {
|
|
vm.ok = false
|
|
}).then(() => {
|
|
expect(vm.$el.textContent).toBe('haha')
|
|
}).then(() => {
|
|
// reset
|
|
vm.ok = true
|
|
vm.type = null
|
|
vm.test = 'b'
|
|
})
|
|
|
|
assertInputWorks(vm, chain).then(done)
|
|
})
|
|
|
|
it('with v-else', done => {
|
|
const data = {
|
|
ok: true,
|
|
type: null,
|
|
test: 'b'
|
|
}
|
|
const vm = new Vue({
|
|
data,
|
|
template: `<div v-if="ok">haha</div><input v-else :type="type" v-model="test">`
|
|
}).$mount()
|
|
document.body.appendChild(vm.$el)
|
|
expect(vm.$el.textContent).toBe('haha')
|
|
|
|
vm.ok = false
|
|
assertInputWorks(vm).then(done)
|
|
})
|
|
|
|
it('with v-else-if', done => {
|
|
const vm = new Vue({
|
|
data: {
|
|
foo: true,
|
|
bar: false,
|
|
type: null,
|
|
test: 'b'
|
|
},
|
|
template: `<div v-if="foo">text</div><input v-else-if="bar" :type="type" v-model="test">`
|
|
}).$mount()
|
|
document.body.appendChild(vm.$el)
|
|
|
|
const chain = waitForUpdate(() => {
|
|
expect(vm.$el.textContent).toBe('text')
|
|
}).then(() => {
|
|
vm.foo = false
|
|
}).then(() => {
|
|
expect(vm._vnode.isComment).toBe(true)
|
|
}).then(() => {
|
|
vm.bar = true
|
|
})
|
|
|
|
assertInputWorks(vm, chain).then(done)
|
|
})
|
|
|
|
it('with v-for', done => {
|
|
const vm = new Vue({
|
|
data: {
|
|
data: {
|
|
text: 'foo',
|
|
checkbox: true
|
|
},
|
|
types: ['text', 'checkbox']
|
|
},
|
|
template: `<div>
|
|
<input v-for="type in types" :type="type" v-model="data[type]">
|
|
</div>`
|
|
}).$mount()
|
|
document.body.appendChild(vm.$el)
|
|
|
|
let el1 = vm.$el.children[0]
|
|
expect(el1.type).toBe('text')
|
|
expect(el1.value).toBe('foo')
|
|
el1.value = 'bar'
|
|
triggerEvent(el1, 'input')
|
|
expect(vm.data.text).toBe('bar')
|
|
|
|
let el2 = vm.$el.children[1]
|
|
expect(el2.type).toBe('checkbox')
|
|
expect(el2.checked).toBe(true)
|
|
el2.click()
|
|
expect(vm.data.checkbox).toBe(false)
|
|
|
|
// now in reverse!
|
|
vm.types.reverse()
|
|
waitForUpdate(() => {
|
|
el1 = vm.$el.children[0]
|
|
expect(el1.type).toBe('checkbox')
|
|
expect(el1.checked).toBe(false)
|
|
el1.click()
|
|
expect(vm.data.checkbox).toBe(true)
|
|
|
|
el2 = vm.$el.children[1]
|
|
expect(el2.type).toBe('text')
|
|
expect(el2.value).toBe('bar')
|
|
el2.value = 'foo'
|
|
triggerEvent(el2, 'input')
|
|
expect(vm.data.text).toBe('foo')
|
|
}).then(done)
|
|
})
|
|
|
|
it('with v-bind', done => {
|
|
const vm = new Vue({
|
|
data: {
|
|
data: {
|
|
text: 'foo',
|
|
checkbox: true
|
|
},
|
|
inputs: [{ id: 'one', type: 'text' }, { id: 'two', type: 'checkbox' }]
|
|
},
|
|
template: `<div>
|
|
<input v-for="i in inputs" v-bind="i" v-model="data[i.type]">
|
|
</div>`
|
|
}).$mount()
|
|
document.body.appendChild(vm.$el)
|
|
|
|
let el1 = vm.$el.children[0]
|
|
expect(el1.id).toBe('one')
|
|
expect(el1.type).toBe('text')
|
|
expect(el1.value).toBe('foo')
|
|
el1.value = 'bar'
|
|
triggerEvent(el1, 'input')
|
|
expect(vm.data.text).toBe('bar')
|
|
|
|
let el2 = vm.$el.children[1]
|
|
expect(el2.id).toBe('two')
|
|
expect(el2.type).toBe('checkbox')
|
|
expect(el2.checked).toBe(true)
|
|
el2.click()
|
|
expect(vm.data.checkbox).toBe(false)
|
|
|
|
// now in reverse!
|
|
vm.inputs.reverse()
|
|
waitForUpdate(() => {
|
|
el1 = vm.$el.children[0]
|
|
expect(el1.id).toBe('two')
|
|
expect(el1.type).toBe('checkbox')
|
|
expect(el1.checked).toBe(false)
|
|
el1.click()
|
|
expect(vm.data.checkbox).toBe(true)
|
|
|
|
el2 = vm.$el.children[1]
|
|
expect(el2.id).toBe('one')
|
|
expect(el2.type).toBe('text')
|
|
expect(el2.value).toBe('bar')
|
|
el2.value = 'foo'
|
|
triggerEvent(el2, 'input')
|
|
expect(vm.data.text).toBe('foo')
|
|
}).then(done)
|
|
})
|
|
})
|
|
|
|
function assertInputWorks (vm, type, chain) {
|
|
if (typeof type !== 'string') {
|
|
if (!chain) chain = type
|
|
type = 'type'
|
|
}
|
|
if (!chain) chain = waitForUpdate()
|
|
chain.then(() => {
|
|
expect(vm.$el.value).toBe('b')
|
|
vm.test = 'a'
|
|
}).then(() => {
|
|
expect(vm.$el.value).toBe('a')
|
|
vm.$el.value = 'c'
|
|
triggerEvent(vm.$el, 'input')
|
|
expect(vm.test).toBe('c')
|
|
}).then(() => {
|
|
// change it to password
|
|
vm[type] = 'password'
|
|
vm.test = 'b'
|
|
}).then(() => {
|
|
expect(vm.$el.type).toBe('password')
|
|
expect(vm.$el.value).toBe('b')
|
|
vm.$el.value = 'c'
|
|
triggerEvent(vm.$el, 'input')
|
|
expect(vm.test).toBe('c')
|
|
}).then(() => {
|
|
// change it to checkbox...
|
|
vm[type] = 'checkbox'
|
|
}).then(() => {
|
|
expect(vm.$el.type).toBe('checkbox')
|
|
expect(vm.$el.checked).toBe(true)
|
|
}).then(() => {
|
|
vm.$el.click()
|
|
expect(vm.$el.checked).toBe(false)
|
|
expect(vm.test).toBe(false)
|
|
})
|
|
return chain
|
|
}
|
|
|