input.spec.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. import { createVue, destroyVM, wait, waitImmediate } 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', async() => {
  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. await waitImmediate();
  104. expect(vm.$el.querySelector('.el-textarea__inner').style.resize).to.be.equal(vm.resize);
  105. vm.resize = 'horizontal';
  106. await waitImmediate();
  107. expect(vm.$el.querySelector('.el-textarea__inner').style.resize).to.be.equal(vm.resize);
  108. });
  109. it('autosize', async() => {
  110. vm = createVue({
  111. template: `
  112. <div>
  113. <el-input
  114. ref="limitSize"
  115. type="textarea"
  116. :autosize="{minRows: 3, maxRows: 5}"
  117. v-model="textareaValue"
  118. >
  119. </el-input>
  120. <el-input
  121. ref="limitlessSize"
  122. type="textarea"
  123. autosize
  124. v-model="textareaValue"
  125. >
  126. </el-input>
  127. </div>
  128. `,
  129. data() {
  130. return {
  131. textareaValue: 'sda\ndasd\nddasdsda\ndasd\nddasdsda\ndasd\nddasdsda\ndasd\nddasd'
  132. };
  133. }
  134. }, true);
  135. var limitSizeInput = vm.$refs.limitSize;
  136. var limitlessSizeInput = vm.$refs.limitlessSize;
  137. expect(limitSizeInput.textareaStyle.height).to.be.equal('117px');
  138. expect(limitlessSizeInput.textareaStyle.height).to.be.equal('201px');
  139. vm.textareaValue = '';
  140. await wait();
  141. expect(limitSizeInput.textareaStyle.height).to.be.equal('75px');
  142. expect(limitlessSizeInput.textareaStyle.height).to.be.equal('33px');
  143. });
  144. it('focus', async() => {
  145. vm = createVue({
  146. template: `
  147. <el-input ref="input">
  148. </el-input>
  149. `
  150. }, true);
  151. const spy = sinon.spy();
  152. vm.$refs.input.$on('focus', spy);
  153. vm.$refs.input.focus();
  154. await waitImmediate();
  155. expect(spy.calledOnce).to.be.true;
  156. });
  157. it('Input contains Select and append slot', async() => {
  158. vm = createVue({
  159. template: `
  160. <el-input v-model="value" clearable class="input-with-select" ref="input">
  161. <el-select v-model="select" slot="prepend" placeholder="请选择">
  162. <el-option label="餐厅名" value="1"></el-option>
  163. <el-option label="订单号" value="2"></el-option>
  164. <el-option label="用户电话" value="3"></el-option>
  165. </el-select>
  166. <el-button slot="append" icon="el-icon-search"></el-button>
  167. </el-input>
  168. `,
  169. data() {
  170. return {
  171. value: '1234',
  172. select: '1'
  173. };
  174. }
  175. }, true);
  176. vm.$refs.input.hovering = true;
  177. await wait();
  178. const suffixEl = document.querySelector('.input-with-select > .el-input__suffix');
  179. expect(suffixEl).to.not.be.null;
  180. expect(suffixEl.style.transform).to.not.be.empty;
  181. });
  182. it('validateEvent', async() => {
  183. const spy = sinon.spy();
  184. vm = createVue({
  185. template: `
  186. <el-form :model="model" :rules="rules">
  187. <el-form-item prop="input">
  188. <el-input v-model="model.input" :validate-event="false">
  189. </el-input>
  190. </el-form-item>
  191. </el-form>
  192. `,
  193. data() {
  194. const validator = (rule, value, callback) => {
  195. spy();
  196. callback();
  197. };
  198. return {
  199. model: {
  200. input: ''
  201. },
  202. rules: {
  203. input: [
  204. { validator }
  205. ]
  206. }
  207. };
  208. }
  209. }, true);
  210. vm.model.input = '123';
  211. await waitImmediate();
  212. expect(spy.called).to.be.false;
  213. });
  214. describe('Input Events', () => {
  215. it('event:focus & blur', done => {
  216. vm = createVue({
  217. template: `
  218. <el-input
  219. ref="input"
  220. placeholder="请输入内容"
  221. value="input">
  222. </el-input>
  223. `
  224. }, true);
  225. const spyFocus = sinon.spy();
  226. const spyBlur = sinon.spy();
  227. vm.$refs.input.$on('focus', spyFocus);
  228. vm.$refs.input.$on('blur', spyBlur);
  229. vm.$el.querySelector('input').focus();
  230. vm.$el.querySelector('input').blur();
  231. vm.$nextTick(_ => {
  232. expect(spyFocus.calledOnce).to.be.true;
  233. expect(spyBlur.calledOnce).to.be.true;
  234. done();
  235. });
  236. });
  237. it('event:change', done => {
  238. // NOTE: should be same as native's change behavior
  239. vm = createVue({
  240. template: `
  241. <el-input
  242. ref="input"
  243. placeholder="请输入内容"
  244. :value="input">
  245. </el-input>
  246. `,
  247. data() {
  248. return {
  249. input: 'a'
  250. };
  251. }
  252. }, true);
  253. const inputElm = vm.$el.querySelector('input');
  254. const simulateEvent = (text, event) => {
  255. inputElm.value = text;
  256. inputElm.dispatchEvent(new Event(event));
  257. };
  258. const spy = sinon.spy();
  259. vm.$refs.input.$on('change', spy);
  260. // simplified test, component should emit change when native does
  261. simulateEvent('1', 'input');
  262. simulateEvent('2', 'change');
  263. vm.$nextTick(_ => {
  264. expect(spy.calledWith('2')).to.be.true;
  265. expect(spy.calledOnce).to.be.true;
  266. done();
  267. });
  268. });
  269. it('event:clear', done => {
  270. vm = createVue({
  271. template: `
  272. <el-input
  273. ref="input"
  274. placeholder="请输入内容"
  275. clearable
  276. :value="input">
  277. </el-input>
  278. `,
  279. data() {
  280. return {
  281. input: 'a'
  282. };
  283. }
  284. }, true);
  285. const spyClear = sinon.spy();
  286. const inputElm = vm.$el.querySelector('input');
  287. // focus to show clear button
  288. inputElm.focus();
  289. vm.$refs.input.$on('clear', spyClear);
  290. vm.$nextTick(_ => {
  291. vm.$el.querySelector('.el-input__clear').click();
  292. vm.$nextTick(_ => {
  293. expect(spyClear.calledOnce).to.be.true;
  294. done();
  295. });
  296. });
  297. });
  298. });
  299. describe('Input Methods', () => {
  300. it('method:select', done => {
  301. const testContent = 'test';
  302. vm = createVue({
  303. template: `
  304. <el-input
  305. ref="inputComp"
  306. value="${testContent}"
  307. />
  308. `
  309. }, true);
  310. expect(vm.$refs.inputComp.$refs.input.selectionStart).to.equal(testContent.length);
  311. expect(vm.$refs.inputComp.$refs.input.selectionEnd).to.equal(testContent.length);
  312. vm.$refs.inputComp.select();
  313. vm.$nextTick(_ => {
  314. expect(vm.$refs.inputComp.$refs.input.selectionStart).to.equal(0);
  315. expect(vm.$refs.inputComp.$refs.input.selectionEnd).to.equal(testContent.length);
  316. done();
  317. });
  318. });
  319. });
  320. });