import Vue from 'vue2'
import Input from '@/modules/input'
import createVue from '../utils/create-vue'
import { createEvent } from '../utils/event'
describe('Input.vue', () => {
let vm
afterEach(() => {
if (vm) {
vm.$parent.destroy()
vm = null
}
})
it('use', () => {
Vue.use(Input)
expect(Vue.component(Input.name))
.to.be.a('function')
})
it('should render correct contents', () => {
vm = createInput()
const el = vm.$el
expect(el.className)
.to.equal('cube-input')
expect(el.querySelector('input'))
.to.be.ok
})
it('should not show clear button when no text', () => {
vm = createInput()
expect(vm.$el.querySelector('.cube-input-clear'))
.to.be.null
})
it('should show clear button when has text', () => {
vm = createInput(1)
expect(vm.$el.querySelector('.cube-input-clear').style.display)
.to.equal('')
})
it('value should be empty when clear button clicked', (done) => {
vm = createInput(1)
expect(vm.$el.querySelector('input').value)
.is.not.empty
vm.$el.querySelector('.cube-input-clear').click()
setTimeout(() => {
expect(vm.$el.querySelector('input').value)
.is.empty
done()
}, 50)
})
it('should support more native props', () => {
vm = createVue({
template: `
`,
data: {
value: '1'
}
})
const el = vm.$el.querySelector('input')
expect(el.min)
.to.equal('1')
expect(el.max)
.to.equal('10')
expect(el.autocomplete)
.to.equal('true')
expect(el.disabled)
.to.be.true
expect(el.readOnly)
.to.be.true
expect(el.autofocus)
.to.be.false
})
it('should show password eye and work correctly', (done) => {
vm = createVue({
template: `
`,
data: {
value: 'pwd',
eye: true
}
})
expect(vm.$el.querySelector('input').type)
.to.equal('text')
vm.$parent.eye = {
open: false
}
vm.$nextTick(() => {
expect(vm.$el.querySelector('input').type)
.to.equal('password')
vm.$parent.eye = {
open: true
}
vm.$nextTick(() => {
expect(vm.$el.querySelector('input').type)
.to.equal('text')
// click eye
vm.$el.querySelector('.cube-input-eye').click()
vm.$nextTick(() => {
// now password is invisible
expect(vm.$el.querySelector('input').type)
.to.equal('password')
done()
})
})
})
})
it('should show clearable icon and work correctly', (done) => {
vm = createVue({
template: `
`,
data: {
value: 'xxx',
clearable: {
visible: true,
blurHidden: true
}
}
})
expect(vm.$el.querySelector('.cube-input-clear'))
.to.be.null
vm.$parent.clearable.blurHidden = false
vm.$nextTick(() => {
expect(vm.$el.querySelector('.cube-input-clear'))
.not.to.be.null
done()
})
})
it('should trigger events', (done) => {
const focusHandler = sinon.spy()
const blurHandler = sinon.spy()
const changeHandler = sinon.spy()
vm = createVue({
template: `
`,
data: {
value: 'value'
},
methods: {
focusHandler: focusHandler,
blurHandler: blurHandler,
changeHandler: changeHandler
}
})
const input = vm.$el.querySelector('input')
vm.focus()
setTimeout(() => {
expect(focusHandler)
.to.be.calledOnce
input.value = 'new value'
vm.blur()
const e = createEvent('', 'change')
input.dispatchEvent(e)
setTimeout(() => {
expect(blurHandler)
.to.be.calledOnce
expect(changeHandler)
.to.be.calledOnce
done()
})
})
})
})
function createInput (value) {
const vm = createVue({
template: `
`,
data: {
disabled: false,
readonly: false,
useClear: {
visible: true,
blurHidden: false
},
value: value && 'test'
}
})
return vm
}