input.spec.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. import { createVue, destroyVM } from '../util';
  2. describe('Input', () => {
  3. let vm;
  4. afterEach(() => {
  5. destroyVM(vm);
  6. });
  7. it('create', () => {
  8. vm = createVue({
  9. template: `
  10. <el-input
  11. :minlength="3"
  12. :maxlength="5"
  13. placeholder="请输入内容"
  14. @focus="handleFocus"
  15. value="input">
  16. </el-input>
  17. `,
  18. data() {
  19. return {
  20. inputFocus: false
  21. };
  22. },
  23. methods: {
  24. handleFocus() {
  25. this.inputFocus = true;
  26. }
  27. }
  28. }, true);
  29. let inputElm = vm.$el.querySelector('input');
  30. inputElm.focus();
  31. expect(vm.inputFocus).to.be.true;
  32. expect(inputElm.getAttribute('placeholder')).to.equal('请输入内容');
  33. expect(inputElm.value).to.equal('input');
  34. expect(inputElm.getAttribute('minlength')).to.equal('3');
  35. expect(inputElm.getAttribute('maxlength')).to.equal('5');
  36. });
  37. it('disabled', () => {
  38. vm = createVue({
  39. template: `
  40. <el-input disabled>
  41. </el-input>
  42. `
  43. }, true);
  44. expect(vm.$el.querySelector('input').getAttribute('disabled')).to.ok;
  45. });
  46. it('suffixIcon', () => {
  47. vm = createVue({
  48. template: `
  49. <el-input suffix-icon="time"></el-input>
  50. `
  51. }, true);
  52. var icon = vm.$el.querySelector('.el-input__icon');
  53. expect(icon).to.be.exist;
  54. });
  55. it('prefixIcon', () => {
  56. vm = createVue({
  57. template: `
  58. <el-input prefix-icon="time"></el-input>
  59. `
  60. }, true);
  61. var icon = vm.$el.querySelector('.el-input__icon');
  62. expect(icon).to.be.exist;
  63. });
  64. it('size', () => {
  65. vm = createVue({
  66. template: `
  67. <el-input size="large">
  68. </el-input>
  69. `
  70. }, true);
  71. expect(vm.$el.classList.contains('el-input--large')).to.true;
  72. });
  73. it('type', () => {
  74. vm = createVue({
  75. template: `
  76. <el-input type="textarea">
  77. </el-input>
  78. `
  79. }, true);
  80. expect(vm.$el.classList.contains('el-textarea')).to.true;
  81. });
  82. it('rows', () => {
  83. vm = createVue({
  84. template: `
  85. <el-input type="textarea" :rows="3">
  86. </el-input>
  87. `
  88. }, true);
  89. expect(vm.$el.querySelector('.el-textarea__inner').getAttribute('rows')).to.be.equal('3');
  90. });
  91. // Github issue #2836
  92. it('resize', done => {
  93. vm = createVue({
  94. template: `
  95. <div>
  96. <el-input type="textarea" :resize="resize"></el-input>
  97. </div>
  98. `,
  99. data: {
  100. resize: 'none'
  101. }
  102. }, true);
  103. vm.$nextTick(() => {
  104. expect(vm.$el.querySelector('.el-textarea__inner').style.resize).to.be.equal(vm.resize);
  105. vm.resize = 'horizontal';
  106. vm.$nextTick(() => {
  107. expect(vm.$el.querySelector('.el-textarea__inner').style.resize).to.be.equal(vm.resize);
  108. done();
  109. });
  110. });
  111. });
  112. it('autosize', done => {
  113. vm = createVue({
  114. template: `
  115. <div>
  116. <el-input
  117. ref="limitSize"
  118. type="textarea"
  119. :autosize="{minRows: 3, maxRows: 5}"
  120. v-model="textareaValue"
  121. >
  122. </el-input>
  123. <el-input
  124. ref="limitlessSize"
  125. type="textarea"
  126. autosize
  127. v-model="textareaValue"
  128. >
  129. </el-input>
  130. </div>
  131. `,
  132. data() {
  133. return {
  134. textareaValue: 'sda\ndasd\nddasdsda\ndasd\nddasdsda\ndasd\nddasdsda\ndasd\nddasd'
  135. };
  136. }
  137. }, true);
  138. var limitSizeInput = vm.$refs.limitSize;
  139. var limitlessSizeInput = vm.$refs.limitlessSize;
  140. expect(limitSizeInput.textareaStyle.height).to.be.equal('117px');
  141. expect(limitlessSizeInput.textareaStyle.height).to.be.equal('201px');
  142. vm.textareaValue = '';
  143. setTimeout(_ => {
  144. expect(limitSizeInput.textareaStyle.height).to.be.equal('75px');
  145. expect(limitlessSizeInput.textareaStyle.height).to.be.equal('33px');
  146. done();
  147. }, 200);
  148. });
  149. it('focus', done => {
  150. vm = createVue({
  151. template: `
  152. <el-input ref="input">
  153. </el-input>
  154. `
  155. }, true);
  156. const spy = sinon.spy();
  157. vm.$refs.input.$on('focus', spy);
  158. vm.$refs.input.focus();
  159. vm.$nextTick(_ => {
  160. expect(spy.calledOnce).to.be.true;
  161. done();
  162. });
  163. });
  164. it('Input contains Select and append slot', (done) => {
  165. vm = createVue({
  166. template: `
  167. <el-input v-model="value" clearable class="input-with-select" ref="input">
  168. <el-select v-model="select" slot="prepend" placeholder="请选择">
  169. <el-option label="餐厅名" value="1"></el-option>
  170. <el-option label="订单号" value="2"></el-option>
  171. <el-option label="用户电话" value="3"></el-option>
  172. </el-select>
  173. <el-button slot="append" icon="el-icon-search"></el-button>
  174. </el-input>
  175. `,
  176. data() {
  177. return {
  178. value: '1234'
  179. };
  180. }
  181. }, true);
  182. vm.$refs.input.hovering = true;
  183. setTimeout(() => {
  184. const suffixEl = document.querySelector('.input-with-select > .el-input__suffix');
  185. expect(suffixEl).to.not.be.null;
  186. expect(suffixEl.style.transform).to.not.be.empty;
  187. done();
  188. }, 20);
  189. });
  190. describe('Input Events', () => {
  191. it('event:focus & blur', done => {
  192. vm = createVue({
  193. template: `
  194. <el-input
  195. ref="input"
  196. placeholder="请输入内容"
  197. value="input">
  198. </el-input>
  199. `
  200. }, true);
  201. const spyFocus = sinon.spy();
  202. const spyBlur = sinon.spy();
  203. vm.$refs.input.$on('focus', spyFocus);
  204. vm.$refs.input.$on('blur', spyBlur);
  205. vm.$el.querySelector('input').focus();
  206. vm.$el.querySelector('input').blur();
  207. vm.$nextTick(_ => {
  208. expect(spyFocus.calledOnce).to.be.true;
  209. expect(spyBlur.calledOnce).to.be.true;
  210. done();
  211. });
  212. });
  213. it('event:change', done => {
  214. // NOTE: should be same as native's change behavior
  215. vm = createVue({
  216. template: `
  217. <el-input
  218. ref="input"
  219. placeholder="请输入内容"
  220. :value="input">
  221. </el-input>
  222. `,
  223. data() {
  224. return {
  225. input: 'a'
  226. };
  227. }
  228. }, true);
  229. const inputElm = vm.$el.querySelector('input');
  230. const simulateEvent = (text, event) => {
  231. inputElm.value = text;
  232. inputElm.dispatchEvent(new Event(event));
  233. };
  234. const spy = sinon.spy();
  235. vm.$refs.input.$on('change', spy);
  236. // simplified test, component should emit change when native does
  237. simulateEvent('1', 'input');
  238. simulateEvent('2', 'change');
  239. vm.$nextTick(_ => {
  240. expect(spy.calledWith('2')).to.be.true;
  241. expect(spy.calledOnce).to.be.true;
  242. done();
  243. });
  244. });
  245. it('event:clear', done => {
  246. vm = createVue({
  247. template: `
  248. <el-input
  249. ref="input"
  250. placeholder="请输入内容"
  251. clearable
  252. :value="input">
  253. </el-input>
  254. `,
  255. data() {
  256. return {
  257. input: 'a'
  258. };
  259. }
  260. }, true);
  261. const spyClear = sinon.spy();
  262. const inputElm = vm.$el.querySelector('input');
  263. // focus to show clear button
  264. inputElm.focus();
  265. vm.$refs.input.$on('clear', spyClear);
  266. vm.$nextTick(_ => {
  267. vm.$el.querySelector('.el-input__clear').click();
  268. vm.$nextTick(_ => {
  269. expect(spyClear.calledOnce).to.be.true;
  270. done();
  271. });
  272. });
  273. });
  274. });
  275. });