date-picker.spec.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. import { createTest, createVue, destroyVM, triggerEvent } from '../util';
  2. import DatePicker from 'packages/date-picker';
  3. const DELAY = 10;
  4. describe('DatePicker', () => {
  5. let vm;
  6. afterEach(() => {
  7. destroyVM(vm);
  8. });
  9. it('create', () => {
  10. vm = createTest(DatePicker, {
  11. readonly: true,
  12. placeholder: '23333',
  13. format: 'HH-mm-ss'
  14. });
  15. const input = vm.$el.querySelector('input');
  16. expect(input.getAttribute('placeholder')).to.equal('23333');
  17. expect(input.getAttribute('readonly')).to.equal('readonly');
  18. });
  19. it('select date', done => {
  20. vm = createVue({
  21. template: `
  22. <el-date-picker ref="compo" v-model="value"></el-date-picker>
  23. `,
  24. data() {
  25. return { value: '' };
  26. }
  27. }, true);
  28. const input = vm.$el.querySelector('input');
  29. const date = new Date();
  30. input.blur();
  31. input.focus();
  32. setTimeout(_ => {
  33. const $el = vm.$refs.compo.picker.$el;
  34. const spans = $el.querySelectorAll('.el-date-picker__header-label');
  35. const arrowLeftElm = $el.querySelector('.el-date-picker__prev-btn.el-icon-arrow-left');
  36. const arrowRightElm = $el.querySelector('.el-date-picker__next-btn.el-icon-arrow-right');
  37. expect(spans[0].textContent).to.include(date.getFullYear());
  38. expect(spans[1].textContent).to.include(date.getMonth() + 1);
  39. $el.querySelector('.el-date-picker__prev-btn.el-icon-d-arrow-left').click();
  40. let count = 20;
  41. while (--count) {
  42. arrowLeftElm.click();
  43. }
  44. count = 18;
  45. while (--count) {
  46. arrowRightElm.click();
  47. }
  48. setTimeout(_ => {
  49. expect(spans[0].textContent).to.include(date.getFullYear() - 1);
  50. expect(spans[1].textContent).to.include(date.getMonth() - 1);
  51. $el.querySelector('td.available').click();
  52. vm.$nextTick(_ => {
  53. expect(vm.value).to.exist;
  54. });
  55. done();
  56. }, DELAY);
  57. }, DELAY);
  58. });
  59. it('clear value', done => {
  60. vm = createVue({
  61. template: `
  62. <el-date-picker v-model="value" ref="compo"></el-date-picker>
  63. `,
  64. data() {
  65. return { value: '' };
  66. }
  67. }, true);
  68. const input = vm.$el.querySelector('input');
  69. input.focus();
  70. setTimeout(_ => {
  71. const $el = vm.$refs.compo.picker.$el;
  72. $el.querySelector('td.available').click();
  73. vm.$nextTick(_ => {
  74. vm.$el.querySelector('.el-date-editor__trigger').click();
  75. setTimeout(_ => {
  76. expect(vm.value).to.empty;
  77. done();
  78. }, DELAY);
  79. });
  80. }, DELAY);
  81. });
  82. it('reset', done => {
  83. vm = createVue({
  84. template: `
  85. <el-date-picker ref="compo" v-model="value"></el-date-picker>
  86. `,
  87. data() {
  88. return { value: '' };
  89. }
  90. }, true);
  91. const input = vm.$el.querySelector('input');
  92. input.blur();
  93. input.focus();
  94. setTimeout(_ => {
  95. const $el = vm.$refs.compo.picker.$el;
  96. $el.querySelector('.el-date-picker__next-btn.el-icon-arrow-right').click();
  97. setTimeout(_ => {
  98. $el.querySelector('td.available').click();
  99. vm.$nextTick(_ => {
  100. vm.value = '';
  101. setTimeout(_ => {
  102. expect(vm.$refs.compo.picker.date.getDate()).to.equal(new Date().getDate());
  103. done();
  104. }, DELAY);
  105. });
  106. }, DELAY);
  107. }, DELAY);
  108. });
  109. describe('keydown', () => {
  110. let input;
  111. let keyDown = function(el, keyCode) {
  112. const evt = document.createEvent('Events');
  113. evt.initEvent('keydown', true, true);
  114. evt.keyCode = keyCode;
  115. el.dispatchEvent(evt);
  116. };
  117. beforeEach(done => {
  118. vm = createTest(DatePicker, true);
  119. input = vm.$el.querySelector('input');
  120. input.blur();
  121. input.focus();
  122. setTimeout(done, DELAY);
  123. });
  124. afterEach(() => destroyVM(vm));
  125. it('tab', () => {
  126. keyDown(input, 9);
  127. expect(vm.pickerVisible).to.false;
  128. });
  129. it('enter', () => {
  130. input.value = '2000-10-1';
  131. keyDown(input, 13);
  132. expect(vm.pickerVisible).to.false;
  133. expect(vm.picker.value.getFullYear()).to.equal(2000);
  134. expect(vm.picker.value.getMonth()).to.equal(9);
  135. expect(vm.picker.value.getDate()).to.equal(1);
  136. });
  137. it('left', () => {
  138. input.value = '2000-10-1';
  139. keyDown(input, 13);
  140. input.focus();
  141. keyDown(input, 37);
  142. expect(input.selectionStart > 0).to.true;
  143. });
  144. it('right', () => {
  145. input.value = '2000-10-1';
  146. keyDown(input, 13);
  147. input.focus();
  148. keyDown(input, 39);
  149. expect(input.selectionStart > 0).to.true;
  150. });
  151. });
  152. it('type:month', done => {
  153. vm = createTest(DatePicker, {
  154. type: 'month'
  155. }, true);
  156. const input = vm.$el.querySelector('input');
  157. input.blur();
  158. input.focus();
  159. setTimeout(_ => {
  160. expect(vm.picker.$el.querySelector('.el-month-table').style.display).to.be.empty;
  161. expect(vm.picker.$el.querySelector('.el-year-table').style.display).to.be.equal('none');
  162. vm.picker.$el.querySelector('.el-month-table a.cell').click();
  163. expect(vm.pickerVisible).to.false;
  164. done();
  165. }, DELAY);
  166. });
  167. it('type:year', done => {
  168. vm = createTest(DatePicker, {
  169. type: 'year'
  170. }, true);
  171. const input = vm.$el.querySelector('input');
  172. input.blur();
  173. input.focus();
  174. setTimeout(_ => {
  175. expect(vm.picker.$el.querySelector('.el-year-table').style.display).to.empty;
  176. expect(vm.picker.$el.querySelector('.el-month-table').style.display).to.be.equal('none');
  177. const leftBtn = vm.picker.$el.querySelector('.el-icon-d-arrow-left');
  178. const rightBtn = vm.picker.$el.querySelector('.el-icon-d-arrow-right');
  179. let count = 20;
  180. while (--count) {
  181. leftBtn.click();
  182. }
  183. count = 18;
  184. while (--count) {
  185. rightBtn.click();
  186. }
  187. vm.picker.$el.querySelector('.el-year-table a.cell').click();
  188. expect(vm.pickerVisible).to.false;
  189. done();
  190. }, DELAY);
  191. });
  192. describe('type:datetime', () => {
  193. let vm;
  194. beforeEach(done => {
  195. vm = createTest(DatePicker, {
  196. type: 'datetime'
  197. }, true);
  198. const input = vm.$el.querySelector('input');
  199. input.blur();
  200. input.focus();
  201. setTimeout(done, DELAY);
  202. });
  203. afterEach(() => destroyVM(vm));
  204. it('create', () => {
  205. expect(vm.picker.$el.querySelector('.el-time-panel')).to.ok;
  206. });
  207. it('click now button', done => {
  208. const date = new Date(1999, 10, 10, 10, 10);
  209. vm.picker.$el.querySelector('.el-picker-panel__link-btn').click();
  210. setTimeout(_ => {
  211. expect(vm.picker.date > date).to.true;
  212. done();
  213. }, DELAY);
  214. });
  215. it('click timepicker', done => {
  216. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  217. triggerEvent(input, 'focus');
  218. setTimeout(_ => {
  219. expect(vm.picker.$el.querySelector('.el-time-panel')).to.have.deep.property('style.display').to.equal('');
  220. done();
  221. }, DELAY);
  222. });
  223. it('input timepicker', done => {
  224. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  225. input.value = '20:30:33';
  226. triggerEvent(input, 'change');
  227. setTimeout(_ => {
  228. expect(vm.picker.date.getHours()).to.equal(20);
  229. expect(vm.picker.date.getMinutes()).to.equal(30);
  230. expect(vm.picker.date.getSeconds()).to.equal(33);
  231. done();
  232. }, DELAY);
  233. });
  234. it('input date', done => {
  235. const input = vm.picker.$el.querySelector('.el-date-picker__editor-wrap input');
  236. input.value = '2017-2-2';
  237. triggerEvent(input, 'change');
  238. setTimeout(_ => {
  239. expect(vm.picker.date.getFullYear()).to.equal(2017);
  240. expect(vm.picker.date.getMonth()).to.equal(1);
  241. expect(vm.picker.date.getDate()).to.equal(2);
  242. done();
  243. }, DELAY);
  244. });
  245. it('select time', done => {
  246. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  247. input.blur();
  248. input.focus();
  249. input.blur();
  250. setTimeout(_ => {
  251. const button = vm.picker.$el.querySelector('.el-time-panel .confirm');
  252. button.click();
  253. setTimeout(_ => {
  254. expect(input.value).to.exist;
  255. done();
  256. }, DELAY);
  257. }, DELAY);
  258. });
  259. });
  260. describe('type:week', () => {
  261. let vm;
  262. beforeEach(done => {
  263. vm = createTest(DatePicker, {
  264. type: 'week'
  265. }, true);
  266. const input = vm.$el.querySelector('input');
  267. input.blur();
  268. input.focus();
  269. setTimeout(done, DELAY);
  270. });
  271. afterEach(() => destroyVM(vm));
  272. it('create', () => {
  273. expect(vm.picker.$el.querySelector('.is-week-mode')).to.be.ok;
  274. });
  275. it('click cell', done => {
  276. vm.picker.$el.querySelector('.el-date-table__row .available').click();
  277. setTimeout(_ => {
  278. expect(vm.picker.week).to.exist;
  279. done();
  280. }, DELAY);
  281. });
  282. it('click year label', () => {
  283. vm.picker.$el.querySelector('.el-date-picker__header-label').click();
  284. expect(vm.picker.currentView).to.equal('year');
  285. });
  286. it('click month label', () => {
  287. vm.picker.$el.querySelectorAll('.el-date-picker__header-label')[1].click();
  288. expect(vm.picker.currentView).to.equal('month');
  289. });
  290. it('select month', done => {
  291. vm.picker.$el.querySelectorAll('.el-date-picker__header-label')[1].click();
  292. setTimeout(_ => {
  293. vm.picker.$el.querySelector('.el-month-table .cell').click();
  294. setTimeout(_ => {
  295. expect(vm.picker.$el.querySelector('.el-date-table.is-week-mode').style.display).to.equal('');
  296. done();
  297. }, DELAY);
  298. }, DELAY);
  299. });
  300. });
  301. it('type:daterange', done => {
  302. vm = createTest(DatePicker, {
  303. type: 'daterange'
  304. }, true);
  305. const input = vm.$el.querySelector('input');
  306. input.blur();
  307. input.focus();
  308. setTimeout(_ => {
  309. const panels = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  310. expect(Array.prototype.slice.call(panels)).to.length(2);
  311. panels[0].querySelector('td.available').click();
  312. setTimeout(_ => {
  313. panels[1].querySelector('td.available').click();
  314. const { minDate, maxDate } = vm.picker;
  315. expect(minDate).to.exist;
  316. expect(maxDate).to.exist;
  317. expect(maxDate > minDate).to.true;
  318. done();
  319. }, DELAY);
  320. }, DELAY);
  321. });
  322. describe('type:datetimerange', () => {
  323. let vm;
  324. beforeEach(done => {
  325. vm = createTest(DatePicker, {
  326. type: 'datetimerange',
  327. value: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)]
  328. }, true);
  329. const input = vm.$el.querySelector('input');
  330. input.blur();
  331. input.focus();
  332. setTimeout(done, DELAY);
  333. });
  334. afterEach(() => destroyVM(vm));
  335. it('create', () => {
  336. expect(Array.prototype.slice.call(vm.picker.$el.querySelectorAll('.el-time-panel'))).to.length(2);
  337. });
  338. it('click timepicker', done => {
  339. const input = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[1];
  340. input.blur();
  341. input.focus();
  342. input.blur();
  343. setTimeout(_ => {
  344. expect(vm.picker.$el.querySelector('.el-date-range-picker__time-picker-wrap .el-time-panel')).to.have.deep.property('style.display').to.equal('');
  345. done();
  346. }, DELAY);
  347. });
  348. it('click timepicker in right', done => {
  349. const input = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[3];
  350. input.blur();
  351. input.focus();
  352. input.blur();
  353. setTimeout(_ => {
  354. expect(vm.picker.$el.querySelectorAll('.el-date-range-picker__time-picker-wrap .el-time-panel')[1]).to.have.deep.property('style.display').to.equal('');
  355. done();
  356. }, DELAY);
  357. });
  358. it('input timepicker', done => {
  359. const input = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[1];
  360. input.value = '10:22:14';
  361. triggerEvent(input, 'change');
  362. setTimeout(_ => {
  363. expect(vm.picker.minDate.getHours()).to.equal(10);
  364. expect(vm.picker.minDate.getMinutes()).to.equal(22);
  365. expect(vm.picker.minDate.getSeconds()).to.equal(14);
  366. done();
  367. }, DELAY);
  368. });
  369. it('input timepicker in right', done => {
  370. const input = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[3];
  371. input.value = '10:22:14';
  372. triggerEvent(input, 'change');
  373. setTimeout(_ => {
  374. expect(vm.picker.maxDate.getHours()).to.equal(10);
  375. expect(vm.picker.maxDate.getMinutes()).to.equal(22);
  376. expect(vm.picker.maxDate.getSeconds()).to.equal(14);
  377. done();
  378. }, DELAY);
  379. });
  380. it('select daterange', done => {
  381. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  382. const leftCell = pickers[0].querySelector('td.available');
  383. const rightCell = pickers[1].querySelector('td.available');
  384. triggerEvent(leftCell, 'mousemove', true);
  385. triggerEvent(leftCell, 'click', true);
  386. setTimeout(_ => {
  387. triggerEvent(rightCell, 'mousemove', true);
  388. triggerEvent(rightCell, 'click', true);
  389. setTimeout(_ => {
  390. const { minDate, maxDate } = vm.picker;
  391. const minMonth = minDate.getMonth();
  392. const maxMonth = maxDate.getMonth();
  393. expect(maxMonth - minMonth).to.equal(1); // one month
  394. done();
  395. }, DELAY);
  396. }, DELAY);
  397. });
  398. it('prev/next month button', done => {
  399. const leftBtn = vm.picker.$el.querySelector('.is-left .el-icon-arrow-left');
  400. const rightBtn = vm.picker.$el.querySelector('.is-right .el-icon-arrow-right');
  401. const left = vm.picker.$el.querySelector('.is-left .el-date-range-picker__header');
  402. const right = vm.picker.$el.querySelector('.is-right .el-date-range-picker__header');
  403. const leftText = left.textContent.match(/\d+/g);
  404. const rightText = right.textContent.match(/\d+/g);
  405. let count = 20;
  406. while (--count) {
  407. leftBtn.click();
  408. }
  409. count = 18;
  410. while (--count) {
  411. rightBtn.click();
  412. }
  413. setTimeout(_ => {
  414. const newLeft = left.textContent.match(/\d+/g);
  415. const newRight = right.textContent.match(/\d+/g);
  416. expect(leftText[1] - newLeft[1]).to.equal(2);
  417. expect(leftText[0] - newLeft[0]).to.equal(0);
  418. expect(rightText[1] - newRight[1]).to.equal(2);
  419. expect(rightText[0] - newRight[0]).to.equal(0);
  420. done();
  421. }, DELAY);
  422. });
  423. it('prev/next year button', done => {
  424. const leftBtn = vm.picker.$el.querySelector('.is-left .el-icon-d-arrow-left');
  425. const rightBtn = vm.picker.$el.querySelector('.is-right .el-icon-d-arrow-right');
  426. const left = vm.picker.$el.querySelector('.is-left .el-date-range-picker__header');
  427. const right = vm.picker.$el.querySelector('.is-right .el-date-range-picker__header');
  428. const leftText = left.textContent.match(/\d+/g);
  429. const rightText = right.textContent.match(/\d+/g);
  430. let count = 20;
  431. while (--count) {
  432. leftBtn.click();
  433. }
  434. count = 18;
  435. while (--count) {
  436. rightBtn.click();
  437. }
  438. setTimeout(_ => {
  439. const newLeft = left.textContent.match(/\d+/g);
  440. const newRight = right.textContent.match(/\d+/g);
  441. expect(leftText[1] - newLeft[1]).to.equal(0);
  442. expect(leftText[0] - newLeft[0]).to.equal(2);
  443. expect(rightText[1] - newRight[1]).to.equal(0);
  444. expect(rightText[0] - newRight[0]).to.equal(2);
  445. done();
  446. }, DELAY);
  447. });
  448. it('input date', done => {
  449. const input = vm.picker.$el.querySelector('.el-date-range-picker__editors-wrap input');
  450. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  451. const leftCell = pickers[0].querySelector('td.available');
  452. const rightCell = pickers[1].querySelector('td.available');
  453. triggerEvent(leftCell, 'mousemove', true);
  454. triggerEvent(leftCell, 'click', true);
  455. setTimeout(_ => {
  456. triggerEvent(rightCell, 'mousemove', true);
  457. triggerEvent(rightCell, 'click', true);
  458. setTimeout(_ => {
  459. triggerEvent(input, 'input');
  460. input.value = '1989-6-4';
  461. triggerEvent(input, 'change');
  462. setTimeout(_ => {
  463. const minDate = vm.picker.minDate;
  464. expect(minDate.getFullYear()).to.equal(1989);
  465. expect(minDate.getMonth()).to.equal(5);
  466. expect(minDate.getDate()).to.equal(4);
  467. done();
  468. }, DELAY);
  469. }, DELAY);
  470. }, DELAY);
  471. });
  472. it('input date when minDate > maxDate', done => {
  473. const input = vm.picker.$el.querySelector('.el-date-range-picker__editors-wrap input');
  474. const input2 = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[2];
  475. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  476. const leftCell = pickers[0].querySelector('td.available');
  477. const rightCell = pickers[1].querySelector('td.available');
  478. triggerEvent(leftCell, 'mousemove', true);
  479. triggerEvent(leftCell, 'click', true);
  480. setTimeout(_ => {
  481. triggerEvent(rightCell, 'mousemove', true);
  482. triggerEvent(rightCell, 'click', true);
  483. setTimeout(_ => {
  484. triggerEvent(input2, 'input');
  485. input2.value = '1988-6-4';
  486. triggerEvent(input2, 'change');
  487. setTimeout(_ => {
  488. triggerEvent(input, 'input');
  489. input.value = '1989-6-4';
  490. triggerEvent(input, 'change');
  491. setTimeout(_ => {
  492. expect(vm.picker.maxDate > vm.picker.minDate).to.true;
  493. done();
  494. }, DELAY);
  495. }, DELAY);
  496. }, DELAY);
  497. }, DELAY);
  498. });
  499. it('select time', done => {
  500. const input = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[1];
  501. input.blur();
  502. input.focus();
  503. input.blur();
  504. setTimeout(_ => {
  505. const button = vm.picker.$el.querySelector('.el-date-range-picker__time-picker-wrap .el-time-panel .confirm');
  506. button.click();
  507. setTimeout(_ => {
  508. expect(input.value).to.exist;
  509. done();
  510. }, DELAY);
  511. }, DELAY);
  512. });
  513. });
  514. it('picker-options:shortcuts', done => {
  515. let test;
  516. vm = createTest(DatePicker, {
  517. pickerOptions: {
  518. shortcuts: [
  519. {
  520. text: '今天',
  521. onClick(picker) {
  522. test = true;
  523. picker.$emit('pick', new Date());
  524. }
  525. }
  526. ]
  527. }
  528. }, true);
  529. const input = vm.$el.querySelector('input');
  530. input.blur();
  531. input.focus();
  532. setTimeout(_ => {
  533. const shortcut = vm.picker.$el.querySelector('.el-picker-panel__shortcut');
  534. expect(shortcut.textContent).to.be.equal('今天');
  535. expect(vm.picker.$el.querySelector('.el-picker-panel__sidebar')).to.be.ok;
  536. shortcut.click();
  537. setTimeout(_ => {
  538. expect(test).to.true;
  539. done();
  540. }, DELAY);
  541. }, DELAY);
  542. });
  543. describe('picker-options:disabledDate', () => {
  544. let vm;
  545. beforeEach(done => {
  546. vm = createTest(DatePicker, {
  547. value: new Date(),
  548. pickerOptions: {
  549. disabledDate(time) {
  550. return time.getTime() < Date.now() - 8.64e7;
  551. }
  552. }
  553. }, true);
  554. const input = vm.$el.querySelector('input');
  555. input.blur();
  556. input.focus();
  557. setTimeout(done, DELAY);
  558. });
  559. afterEach(() => destroyVM(vm));
  560. it('create', () => {
  561. expect(vm.picker.$el.querySelector('.disabled')).to.be.ok;
  562. });
  563. it('set disabled value', done => {
  564. const date = new Date(1999, 10, 10, 10, 10, 10);
  565. vm.picker.value = date;
  566. setTimeout(_ => {
  567. expect(vm.picker.date > date).to.true;
  568. done();
  569. }, DELAY);
  570. });
  571. it('set value', done => {
  572. const date = new Date(3000, 10, 10, 10, 10, 10);
  573. vm.picker.value = date;
  574. setTimeout(_ => {
  575. expect(vm.picker.date.getTime() === date.getTime()).to.true;
  576. done();
  577. }, DELAY);
  578. });
  579. });
  580. });