123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- import { createVue, destroyVM, triggerEvent, wait, waitImmediate } from '../util';
- describe('Input', () => {
- let vm;
- afterEach(() => {
- destroyVM(vm);
- });
- it('create', async() => {
- vm = createVue({
- template: `
- <el-input
- :minlength="3"
- :maxlength="5"
- placeholder="请输入内容"
- @focus="handleFocus"
- :value="input">
- </el-input>
- `,
- data() {
- return {
- input: 'input',
- inputFocus: false
- };
- },
- methods: {
- handleFocus() {
- this.inputFocus = true;
- }
- }
- }, true);
- let inputElm = vm.$el.querySelector('input');
- inputElm.focus();
- expect(vm.inputFocus).to.be.true;
- expect(inputElm.getAttribute('placeholder')).to.equal('请输入内容');
- expect(inputElm.value).to.equal('input');
- expect(inputElm.getAttribute('minlength')).to.equal('3');
- expect(inputElm.getAttribute('maxlength')).to.equal('5');
- vm.input = 'text';
- await waitImmediate();
- expect(inputElm.value).to.equal('text');
- });
- it('default to empty', () => {
- vm = createVue({
- template: '<el-input/>'
- }, true);
- let inputElm = vm.$el.querySelector('input');
- expect(inputElm.value).to.equal('');
- });
- it('disabled', () => {
- vm = createVue({
- template: `
- <el-input disabled>
- </el-input>
- `
- }, true);
- expect(vm.$el.querySelector('input').getAttribute('disabled')).to.ok;
- });
- it('suffixIcon', () => {
- vm = createVue({
- template: `
- <el-input suffix-icon="time"></el-input>
- `
- }, true);
- var icon = vm.$el.querySelector('.el-input__icon');
- expect(icon).to.be.exist;
- });
- it('prefixIcon', () => {
- vm = createVue({
- template: `
- <el-input prefix-icon="time"></el-input>
- `
- }, true);
- var icon = vm.$el.querySelector('.el-input__icon');
- expect(icon).to.be.exist;
- });
- it('size', () => {
- vm = createVue({
- template: `
- <el-input size="large">
- </el-input>
- `
- }, true);
- expect(vm.$el.classList.contains('el-input--large')).to.true;
- });
- it('type', () => {
- vm = createVue({
- template: `
- <el-input type="textarea">
- </el-input>
- `
- }, true);
- expect(vm.$el.classList.contains('el-textarea')).to.true;
- });
- it('rows', () => {
- vm = createVue({
- template: `
- <el-input type="textarea" :rows="3">
- </el-input>
- `
- }, true);
- expect(vm.$el.querySelector('.el-textarea__inner').getAttribute('rows')).to.be.equal('3');
- });
- // Github issue #2836
- it('resize', async() => {
- vm = createVue({
- template: `
- <div>
- <el-input type="textarea" :resize="resize"></el-input>
- </div>
- `,
- data: {
- resize: 'none'
- }
- }, true);
- await waitImmediate();
- expect(vm.$el.querySelector('.el-textarea__inner').style.resize).to.be.equal(vm.resize);
- vm.resize = 'horizontal';
- await waitImmediate();
- expect(vm.$el.querySelector('.el-textarea__inner').style.resize).to.be.equal(vm.resize);
- });
- it('autosize', async() => {
- vm = createVue({
- template: `
- <div>
- <el-input
- ref="limitSize"
- type="textarea"
- :autosize="{minRows: 3, maxRows: 5}"
- v-model="textareaValue"
- >
- </el-input>
- <el-input
- ref="limitlessSize"
- type="textarea"
- autosize
- v-model="textareaValue"
- >
- </el-input>
- </div>
- `,
- data() {
- return {
- textareaValue: 'sda\ndasd\nddasdsda\ndasd\nddasdsda\ndasd\nddasdsda\ndasd\nddasd'
- };
- }
- }, true);
- var limitSizeInput = vm.$refs.limitSize;
- var limitlessSizeInput = vm.$refs.limitlessSize;
- expect(limitSizeInput.textareaStyle.height).to.be.equal('117px');
- expect(limitlessSizeInput.textareaStyle.height).to.be.equal('201px');
- vm.textareaValue = '';
- await wait();
- expect(limitSizeInput.textareaStyle.height).to.be.equal('75px');
- expect(limitlessSizeInput.textareaStyle.height).to.be.equal('33px');
- });
- it('focus', async() => {
- vm = createVue({
- template: `
- <el-input ref="input">
- </el-input>
- `
- }, true);
- const spy = sinon.spy();
- vm.$refs.input.$on('focus', spy);
- vm.$refs.input.focus();
- await waitImmediate();
- expect(spy.calledOnce).to.be.true;
- });
- it('Input contains Select and append slot', async() => {
- vm = createVue({
- template: `
- <el-input v-model="value" clearable class="input-with-select" ref="input">
- <el-select v-model="select" slot="prepend" placeholder="请选择">
- <el-option label="餐厅名" value="1"></el-option>
- <el-option label="订单号" value="2"></el-option>
- <el-option label="用户电话" value="3"></el-option>
- </el-select>
- <el-button slot="append" icon="el-icon-search"></el-button>
- </el-input>
- `,
- data() {
- return {
- value: '1234',
- select: '1'
- };
- }
- }, true);
- vm.$refs.input.hovering = true;
- await wait();
- const suffixEl = document.querySelector('.input-with-select > .el-input__suffix');
- expect(suffixEl).to.not.be.null;
- expect(suffixEl.style.transform).to.not.be.empty;
- });
- it('validateEvent', async() => {
- const spy = sinon.spy();
- vm = createVue({
- template: `
- <el-form :model="model" :rules="rules">
- <el-form-item prop="input">
- <el-input v-model="model.input" :validate-event="false">
- </el-input>
- </el-form-item>
- </el-form>
- `,
- data() {
- const validator = (rule, value, callback) => {
- spy();
- callback();
- };
- return {
- model: {
- input: ''
- },
- rules: {
- input: [
- { validator }
- ]
- }
- };
- }
- }, true);
- vm.model.input = '123';
- await waitImmediate();
- expect(spy.called).to.be.false;
- });
- describe('Input Events', () => {
- it('event:focus & blur', async() => {
- vm = createVue({
- template: `
- <el-input
- ref="input"
- placeholder="请输入内容"
- value="input">
- </el-input>
- `
- }, true);
- const spyFocus = sinon.spy();
- const spyBlur = sinon.spy();
- vm.$refs.input.$on('focus', spyFocus);
- vm.$refs.input.$on('blur', spyBlur);
- vm.$el.querySelector('input').focus();
- vm.$el.querySelector('input').blur();
- await waitImmediate();
- expect(spyFocus.calledOnce).to.be.true;
- expect(spyBlur.calledOnce).to.be.true;
- });
- it('event:change', async() => {
- // NOTE: should be same as native's change behavior
- vm = createVue({
- template: `
- <el-input
- ref="input"
- placeholder="请输入内容"
- :value="input">
- </el-input>
- `,
- data() {
- return {
- input: 'a'
- };
- }
- }, true);
- const inputElm = vm.$el.querySelector('input');
- const simulateEvent = (text, event) => {
- inputElm.value = text;
- inputElm.dispatchEvent(new Event(event));
- };
- const spy = sinon.spy();
- vm.$refs.input.$on('change', spy);
- // simplified test, component should emit change when native does
- simulateEvent('1', 'input');
- simulateEvent('2', 'change');
- await waitImmediate();
- expect(spy.calledWith('2')).to.be.true;
- expect(spy.calledOnce).to.be.true;
- });
- it('event:clear', async() => {
- vm = createVue({
- template: `
- <el-input
- ref="input"
- placeholder="请输入内容"
- clearable
- :value="input">
- </el-input>
- `,
- data() {
- return {
- input: 'a'
- };
- }
- }, true);
- const spyClear = sinon.spy();
- const inputElm = vm.$el.querySelector('input');
- // focus to show clear button
- inputElm.focus();
- vm.$refs.input.$on('clear', spyClear);
- await waitImmediate();
- vm.$el.querySelector('.el-input__clear').click();
- await waitImmediate();
- expect(spyClear.calledOnce).to.be.true;
- });
- it('event:input', async() => {
- vm = createVue({
- template: `
- <el-input
- ref="input"
- placeholder="请输入内容"
- clearable
- :value="input">
- </el-input>
- `,
- data() {
- return {
- input: 'a'
- };
- }
- }, true);
- const spy = sinon.spy();
- vm.$refs.input.$on('input', spy);
- const nativeInput = vm.$refs.input.$el.querySelector('input');
- nativeInput.value = '1';
- triggerEvent(nativeInput, 'compositionstart');
- triggerEvent(nativeInput, 'input');
- await waitImmediate();
- nativeInput.value = '2';
- triggerEvent(nativeInput, 'compositionupdate');
- triggerEvent(nativeInput, 'input');
- await waitImmediate();
- triggerEvent(nativeInput, 'compositionend');
- await waitImmediate();
- // input event does not fire during composition
- expect(spy.calledOnce).to.be.true;
- // native input value is controlled
- expect(vm.input).to.equal('a');
- expect(nativeInput.value).to.equal('a');
- });
- });
- describe('Input Methods', () => {
- it('method:select', async() => {
- const testContent = 'test';
- vm = createVue({
- template: `
- <el-input
- ref="inputComp"
- value="${testContent}"
- />
- `
- }, true);
- expect(vm.$refs.inputComp.$refs.input.selectionStart).to.equal(testContent.length);
- expect(vm.$refs.inputComp.$refs.input.selectionEnd).to.equal(testContent.length);
- vm.$refs.inputComp.select();
- await waitImmediate();
- expect(vm.$refs.inputComp.$refs.input.selectionStart).to.equal(0);
- expect(vm.$refs.inputComp.$refs.input.selectionEnd).to.equal(testContent.length);
- });
- });
- it('sets value on textarea / input type change', async() => {
- vm = createVue({
- template: `
- <el-input :type="type" v-model="val" />
- `,
- data() {
- return {
- type: 'text',
- val: '123'
- };
- }
- }, true);
- expect(vm.$el.querySelector('input').value).to.equal('123');
- vm.type = 'textarea';
- await waitImmediate();
- expect(vm.$el.querySelector('textarea').value).to.equal('123');
- vm.type = 'password';
- await waitImmediate();
- expect(vm.$el.querySelector('input').value).to.equal('123');
- });
- });
|