input.spec.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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. select: '1'
  180. };
  181. }
  182. }, true);
  183. vm.$refs.input.hovering = true;
  184. setTimeout(() => {
  185. const suffixEl = document.querySelector('.input-with-select > .el-input__suffix');
  186. expect(suffixEl).to.not.be.null;
  187. expect(suffixEl.style.transform).to.not.be.empty;
  188. done();
  189. }, 20);
  190. });
  191. it('validateEvent', done => {
  192. const spy = sinon.spy();
  193. vm = createVue({
  194. template: `
  195. <el-form :model="model" :rules="rules">
  196. <el-form-item prop="input">
  197. <el-input v-model="model.input" :validate-event="false">
  198. </el-input>
  199. </el-form-item>
  200. </el-form>
  201. `,
  202. data() {
  203. const validator = (rule, value, callback) => {
  204. spy();
  205. callback();
  206. };
  207. return {
  208. model: {
  209. input: ''
  210. },
  211. rules: {
  212. input: [
  213. { validator }
  214. ]
  215. }
  216. };
  217. }
  218. }, true);
  219. vm.model.input = '123';
  220. vm.$nextTick(() => {
  221. expect(spy.called).to.be.false;
  222. done();
  223. });
  224. });
  225. describe('Input Events', () => {
  226. it('event:focus & blur', done => {
  227. vm = createVue({
  228. template: `
  229. <el-input
  230. ref="input"
  231. placeholder="请输入内容"
  232. value="input">
  233. </el-input>
  234. `
  235. }, true);
  236. const spyFocus = sinon.spy();
  237. const spyBlur = sinon.spy();
  238. vm.$refs.input.$on('focus', spyFocus);
  239. vm.$refs.input.$on('blur', spyBlur);
  240. vm.$el.querySelector('input').focus();
  241. vm.$el.querySelector('input').blur();
  242. vm.$nextTick(_ => {
  243. expect(spyFocus.calledOnce).to.be.true;
  244. expect(spyBlur.calledOnce).to.be.true;
  245. done();
  246. });
  247. });
  248. it('event:change', done => {
  249. // NOTE: should be same as native's change behavior
  250. vm = createVue({
  251. template: `
  252. <el-input
  253. ref="input"
  254. placeholder="请输入内容"
  255. :value="input">
  256. </el-input>
  257. `,
  258. data() {
  259. return {
  260. input: 'a'
  261. };
  262. }
  263. }, true);
  264. const inputElm = vm.$el.querySelector('input');
  265. const simulateEvent = (text, event) => {
  266. inputElm.value = text;
  267. inputElm.dispatchEvent(new Event(event));
  268. };
  269. const spy = sinon.spy();
  270. vm.$refs.input.$on('change', spy);
  271. // simplified test, component should emit change when native does
  272. simulateEvent('1', 'input');
  273. simulateEvent('2', 'change');
  274. vm.$nextTick(_ => {
  275. expect(spy.calledWith('2')).to.be.true;
  276. expect(spy.calledOnce).to.be.true;
  277. done();
  278. });
  279. });
  280. it('event:clear', done => {
  281. vm = createVue({
  282. template: `
  283. <el-input
  284. ref="input"
  285. placeholder="请输入内容"
  286. clearable
  287. :value="input">
  288. </el-input>
  289. `,
  290. data() {
  291. return {
  292. input: 'a'
  293. };
  294. }
  295. }, true);
  296. const spyClear = sinon.spy();
  297. const inputElm = vm.$el.querySelector('input');
  298. // focus to show clear button
  299. inputElm.focus();
  300. vm.$refs.input.$on('clear', spyClear);
  301. vm.$nextTick(_ => {
  302. vm.$el.querySelector('.el-input__clear').click();
  303. vm.$nextTick(_ => {
  304. expect(spyClear.calledOnce).to.be.true;
  305. done();
  306. });
  307. });
  308. });
  309. });
  310. describe('Input Methods', () => {
  311. it('method:select', done => {
  312. const testContent = 'test';
  313. vm = createVue({
  314. template: `
  315. <el-input
  316. ref="inputComp"
  317. value="${testContent}"
  318. />
  319. `
  320. }, true);
  321. expect(vm.$refs.inputComp.$refs.input.selectionStart).to.equal(testContent.length);
  322. expect(vm.$refs.inputComp.$refs.input.selectionEnd).to.equal(testContent.length);
  323. vm.$refs.inputComp.select();
  324. vm.$nextTick(_ => {
  325. expect(vm.$refs.inputComp.$refs.input.selectionStart).to.equal(0);
  326. expect(vm.$refs.inputComp.$refs.input.selectionEnd).to.equal(testContent.length);
  327. done();
  328. });
  329. });
  330. });
  331. });