date-picker.spec.js 19 KB

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