table.spec.js 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458
  1. import { createVue, triggerEvent, destroyVM } from '../util';
  2. const DELAY = 10;
  3. const testDataArr = [];
  4. const toArray = function(obj) {
  5. return [].slice.call(obj);
  6. };
  7. const getTestData = function() {
  8. return [
  9. { name: 'Toy Story', release: '1995-11-22', director: 'John Lasseter', runtime: 80 },
  10. { name: 'A Bug\'s Life', release: '1998-11-25', director: 'John Lasseter', runtime: 95 },
  11. { name: 'Toy Story 2', release: '1999-11-24', director: 'John Lasseter', runtime: 92 },
  12. { name: 'Monsters, Inc.', release: '2001-11-2', director: 'Peter Docter', runtime: 92 },
  13. { name: 'Finding Nemo', release: '2003-5-30', director: 'Andrew Stanton', runtime: 100 }
  14. ];
  15. };
  16. getTestData().forEach(cur => {
  17. Object.keys(cur).forEach(prop => {
  18. testDataArr.push(cur[prop].toString());
  19. });
  20. });
  21. describe('Table', () => {
  22. describe('rendering data is correct', () => {
  23. const vm = createVue({
  24. template: `
  25. <el-table :data="testData">
  26. <el-table-column prop="name" label="片名" />
  27. <el-table-column prop="release" label="发行日期" />
  28. <el-table-column prop="director" label="导演" />
  29. <el-table-column prop="runtime" label="时长(分)" />
  30. </el-table>
  31. `,
  32. created() {
  33. this.testData = getTestData();
  34. }
  35. });
  36. it('head', done => {
  37. setTimeout(_ => {
  38. const ths = toArray(vm.$el.querySelectorAll('thead th'));
  39. expect(ths.map(node => node.textContent).filter(o => o))
  40. .to.eql(['片名', '发行日期', '导演', '时长(分)']);
  41. done();
  42. }, DELAY);
  43. });
  44. it('row length', () => {
  45. expect(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr')).to.length(getTestData().length);
  46. });
  47. it('row data', () => {
  48. const cells = toArray(vm.$el.querySelectorAll('td .cell'))
  49. .map(node => node.textContent);
  50. expect(cells).to.eql(testDataArr);
  51. destroyVM(vm);
  52. });
  53. });
  54. describe('attributes', () => {
  55. const createTable = function(props, opts) {
  56. return createVue(Object.assign({
  57. template: `
  58. <el-table :data="testData" ${props}>
  59. <el-table-column prop="name" label="片名" />
  60. <el-table-column prop="release" label="发行日期" />
  61. <el-table-column prop="director" label="导演" />
  62. <el-table-column prop="runtime" label="时长(分)" />
  63. </el-table>
  64. `,
  65. created() {
  66. this.testData = getTestData();
  67. }
  68. }, opts));
  69. };
  70. it('height', done => {
  71. const vm = createTable('height="134"');
  72. setTimeout(_ => {
  73. expect(vm.$el.style.height).to.equal('134px');
  74. destroyVM(vm);
  75. done();
  76. }, DELAY);
  77. });
  78. it('stripe', done => {
  79. const vm = createTable('stripe');
  80. setTimeout(_ => {
  81. expect(vm.$el.classList.contains('el-table--striped')).to.true;
  82. destroyVM(vm);
  83. done();
  84. }, DELAY);
  85. });
  86. it('border', done => {
  87. const vm = createTable('border');
  88. setTimeout(_ => {
  89. expect(vm.$el.classList.contains('el-table--border')).to.true;
  90. destroyVM(vm);
  91. done();
  92. }, DELAY);
  93. });
  94. it('fit', done => {
  95. const vm = createTable(':fit="false"');
  96. setTimeout(_ => {
  97. expect(vm.$el.classList.contains('el-table--fit')).to.false;
  98. destroyVM(vm);
  99. done();
  100. }, DELAY);
  101. });
  102. it('show-header', done => {
  103. const vm = createTable(':show-header="false"');
  104. setTimeout(_ => {
  105. expect(vm.$el.querySelectorAll('.el-table__header-wrapper').length).to.equal(0);
  106. destroyVM(vm);
  107. done();
  108. }, DELAY);
  109. });
  110. it('tableRowClassName', done => {
  111. const vm = createTable(':row-class-name="tableRowClassName"', {
  112. methods: {
  113. tableRowClassName(row, index) {
  114. if (index === 1) {
  115. return 'info-row';
  116. } else if (index === 3) {
  117. return 'positive-row';
  118. }
  119. return '';
  120. }
  121. }
  122. });
  123. setTimeout(_ => {
  124. expect(vm.$el.querySelectorAll('.info-row')).to.length(1);
  125. expect(vm.$el.querySelectorAll('.positive-row')).to.length(1);
  126. destroyVM(vm);
  127. done();
  128. }, DELAY);
  129. });
  130. it('tableRowStyle[Object]', done => {
  131. const vm = createTable(':row-style="{ height: \'60px\' }"', {});
  132. setTimeout(_ => {
  133. expect(vm.$el.querySelector('.el-table__body tr').style.height).to.equal('60px');
  134. destroyVM(vm);
  135. done();
  136. }, DELAY);
  137. });
  138. it('tableRowStyle[Function]', done => {
  139. const vm = createTable(':row-style="tableRowStyle"', {
  140. methods: {
  141. tableRowStyle(row, index) {
  142. if (index === 1) {
  143. return { height: '60px' };
  144. }
  145. return null;
  146. }
  147. }
  148. });
  149. setTimeout(_ => {
  150. expect(vm.$el.querySelector('.el-table__body tr:nth-child(1)').style.height).to.equal('');
  151. expect(vm.$el.querySelector('.el-table__body tr:nth-child(2)').style.height).to.equal('60px');
  152. destroyVM(vm);
  153. done();
  154. }, DELAY);
  155. });
  156. });
  157. describe('filter', () => {
  158. let vm;
  159. beforeEach(done => {
  160. vm = createVue({
  161. template: `
  162. <el-table ref="table" :data="testData">
  163. <el-table-column prop="name" label="片名" />
  164. <el-table-column prop="release" label="发行日期" />
  165. <el-table-column
  166. prop="director"
  167. :filters="[
  168. { text: 'John Lasseter', value: 'John Lasseter' },
  169. { text: 'Peter Docter', value: 'Peter Docter' },
  170. { text: 'Andrew Stanton', value: 'Andrew Stanton' }
  171. ]"
  172. :filter-method="filterMethod"
  173. label="导演" />
  174. <el-table-column prop="runtime" label="时长(分)" />
  175. </el-table>
  176. `,
  177. created() {
  178. this.testData = getTestData();
  179. },
  180. methods: {
  181. filterMethod(value, row) {
  182. return value === row.director;
  183. }
  184. }
  185. }, true);
  186. setTimeout(done, DELAY);
  187. });
  188. afterEach(() => destroyVM(vm));
  189. it('render', () => {
  190. expect(vm.$el.querySelector('.el-table__column-filter-trigger')).to.exist;
  191. });
  192. it('click dropdown', done => {
  193. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  194. triggerEvent(btn, 'click', true, false);
  195. setTimeout(_ => {
  196. const filter = document.body.querySelector('.el-table-filter');
  197. expect(filter).to.exist;
  198. document.body.removeChild(filter);
  199. done();
  200. }, 100);
  201. });
  202. it('click filter', done => {
  203. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  204. triggerEvent(btn, 'click', true, false);
  205. setTimeout(_ => {
  206. const filter = document.body.querySelector('.el-table-filter');
  207. // John Lasseter
  208. triggerEvent(filter.querySelector('.el-checkbox'), 'click', true, false);
  209. // confrim button
  210. setTimeout(_ => {
  211. triggerEvent(filter.querySelector('.el-table-filter__bottom button'), 'click', true, false);
  212. setTimeout(_ => {
  213. expect(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr')).to.length(3);
  214. document.body.removeChild(filter);
  215. done();
  216. }, DELAY);
  217. }, 100);
  218. }, 100);
  219. });
  220. it('click reset', done => {
  221. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  222. triggerEvent(btn, 'click', true, false);
  223. setTimeout(_ => {
  224. const filter = document.body.querySelector('.el-table-filter');
  225. // John Lasseter
  226. triggerEvent(filter.querySelector('.el-checkbox'), 'click', true, false);
  227. setTimeout(_ => {
  228. // reset button
  229. triggerEvent(filter.querySelectorAll('.el-table-filter__bottom button')[1], 'click', true, false);
  230. setTimeout(_ => {
  231. expect(filter.querySelector('.el-table-filter__bottom button').classList.contains('is-disabled')).to.true;
  232. document.body.removeChild(filter);
  233. destroyVM(vm);
  234. done();
  235. }, DELAY);
  236. }, 100);
  237. }, 100);
  238. });
  239. });
  240. describe('events', () => {
  241. const createTable = function(prop = '', opts) {
  242. return createVue({
  243. template: `
  244. <el-table :data="testData" @${prop}="handleEvent">
  245. <el-table-column type="selection" />
  246. <el-table-column prop="name" />
  247. <el-table-column prop="release" />
  248. <el-table-column prop="director" />
  249. <el-table-column prop="runtime"/>
  250. </el-table>
  251. `,
  252. methods: {
  253. handleEvent(...args) {
  254. this.result = args;
  255. }
  256. },
  257. created() {
  258. this.testData = getTestData();
  259. },
  260. data() {
  261. return { result: '', testData: this.testData };
  262. }
  263. }, true);
  264. };
  265. it('select', done => {
  266. const vm = createTable('select');
  267. setTimeout(_ => {
  268. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  269. expect(vm.result).to.length(2);
  270. expect(vm.result[1]).to.have.property('name').to.equal(getTestData()[0].name);
  271. destroyVM(vm);
  272. done();
  273. }, DELAY);
  274. });
  275. it('select-all', done => {
  276. const vm = createTable('select-all');
  277. setTimeout(_ => {
  278. vm.$el.querySelector('.el-checkbox').click();
  279. setTimeout(_ => {
  280. expect(vm.result).to.length(1);
  281. expect(vm.result[0]).to.length(getTestData().length);
  282. destroyVM(vm);
  283. done();
  284. }, DELAY);
  285. }, DELAY);
  286. });
  287. it('selection-change', done => {
  288. const vm = createTable('selection-change');
  289. setTimeout(_ => {
  290. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  291. expect(vm.result).to.length(1);
  292. destroyVM(vm);
  293. done();
  294. }, DELAY);
  295. });
  296. it('cell-mouse-enter', done => {
  297. const vm = createTable('cell-mouse-enter');
  298. setTimeout(_ => {
  299. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  300. triggerEvent(cell.parentNode, 'mouseenter');
  301. expect(vm.result).to.length(4); // row, column, cell, event
  302. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  303. destroyVM(vm);
  304. done();
  305. }, DELAY);
  306. });
  307. it('cell-mouse-leave', done => {
  308. const vm = createTable('cell-mouse-leave');
  309. setTimeout(_ => {
  310. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[7]; // second row
  311. const cell2 = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  312. triggerEvent(cell2.parentNode, 'mouseenter');
  313. triggerEvent(cell.parentNode, 'mouseleave');
  314. expect(vm.result).to.length(4); // row, column, cell, event
  315. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  316. destroyVM(vm);
  317. done();
  318. }, DELAY);
  319. });
  320. it('cell-click', done => {
  321. const vm = createTable('cell-click');
  322. setTimeout(_ => {
  323. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  324. cell.parentNode.click();
  325. expect(vm.result).to.length(4); // row, column, cell, event
  326. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  327. destroyVM(vm);
  328. done();
  329. }, DELAY);
  330. });
  331. it('row-click', done => {
  332. const vm = createTable('row-click');
  333. setTimeout(_ => {
  334. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  335. triggerEvent(cell.parentNode.parentNode, 'click');
  336. expect(vm.result).to.length(2); // row, event
  337. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  338. destroyVM(vm);
  339. done();
  340. }, DELAY);
  341. });
  342. it('row-dblclick', done => {
  343. const vm = createTable('row-dblclick');
  344. setTimeout(_ => {
  345. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  346. triggerEvent(cell.parentNode.parentNode, 'dblclick');
  347. expect(vm.result).to.length(2); // row, event
  348. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  349. destroyVM(vm);
  350. done();
  351. }, DELAY);
  352. });
  353. it('current-change', done => {
  354. const vm = createTable('current-change');
  355. setTimeout(_ => {
  356. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  357. triggerEvent(cell.parentNode.parentNode, 'click');
  358. expect(vm.result).to.length(2); // currentRow, oldCurrentRow
  359. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  360. expect(vm.result[1]).to.equal(null);
  361. // clear data => current-change should fire again.
  362. const oldRow = vm.result[0];
  363. vm.testData = [];
  364. setTimeout(() => {
  365. expect(vm.result).to.length(2); // currentRow, oldCurrentRow
  366. expect(vm.result[0]).to.equal(null);
  367. expect(vm.result[1]).to.equal(oldRow);
  368. destroyVM(vm);
  369. done();
  370. }, DELAY);
  371. }, DELAY);
  372. });
  373. it('header-click', done => {
  374. const vm = createTable('header-click');
  375. setTimeout(_ => {
  376. const cell = vm.$el.querySelectorAll('.el-table__header th')[1]; // header[prop='name']
  377. triggerEvent(cell, 'click');
  378. expect(vm.result).to.length(2); // column, event
  379. expect(vm.result[0]).to.have.property('property').to.equal('name');
  380. destroyVM(vm);
  381. done();
  382. }, DELAY);
  383. });
  384. });
  385. describe('column attributes', () => {
  386. const createTable = function(props1, props2, props3, props4, opts, tableProps) {
  387. return createVue(Object.assign({
  388. template: `
  389. <el-table :data="testData" ${tableProps || ''}>
  390. <el-table-column prop="name" ${props1 || ''} />
  391. <el-table-column prop="release" ${props2 || ''} />
  392. <el-table-column prop="director" ${props3 || ''} />
  393. <el-table-column prop="runtime" ${props4 || ''} />
  394. </el-table>
  395. `,
  396. created() {
  397. this.testData = getTestData();
  398. }
  399. }, opts));
  400. };
  401. it('label', done => {
  402. const vm = createTable('label="啊哈哈哈"', 'label="啊啦啦啦"');
  403. setTimeout(_ => {
  404. const ths = toArray(vm.$el.querySelectorAll('thead th'))
  405. .map(node => node.textContent).filter(o => o);
  406. expect(ths).to.eql(['啊哈哈哈', '啊啦啦啦']);
  407. destroyVM(vm);
  408. done();
  409. }, DELAY);
  410. });
  411. it('width', done => {
  412. const vm = createTable('width="123px"', ':width="102"', 'width="39"');
  413. setTimeout(_ => {
  414. const ths = toArray(vm.$el.querySelectorAll('.el-table__header-wrapper col'))
  415. .map(node => node.width).filter(o => o);
  416. expect(ths).to.include('123').include('102').include('39');
  417. destroyVM(vm);
  418. done();
  419. }, DELAY);
  420. });
  421. it('fixed', done => {
  422. const vm = createTable(
  423. 'fixed label="test1"',
  424. 'fixed="right" label="test2"',
  425. 'fixed="left" label="test3"');
  426. setTimeout(_ => {
  427. expect(toArray(vm.$el.querySelectorAll('.el-table__fixed th:not(.is-hidden)'))
  428. .map(node => node.textContent))
  429. .to.eql(['test1', 'test3']);
  430. expect(toArray(vm.$el.querySelectorAll('.el-table__fixed-right th:not(.is-hidden)'))
  431. .map(node => node.textContent))
  432. .to.eql(['test2']);
  433. expect(vm.$el.querySelector('.el-table__body-wrapper').style.height).to.equal('');
  434. destroyVM(vm);
  435. done();
  436. }, DELAY);
  437. });
  438. it('resizable', done => {
  439. const vm = createTable(
  440. 'resizable',
  441. ':resizable="false"',
  442. '',
  443. '',
  444. {},
  445. 'border');
  446. setTimeout(_ => {
  447. const firstCol = vm.$el.querySelector('thead th');
  448. triggerEvent(firstCol, 'mousemove');
  449. triggerEvent(firstCol, 'mousedown');
  450. destroyVM(vm);
  451. done();
  452. }, DELAY);
  453. });
  454. it('formatter', done => {
  455. const vm = createTable(
  456. ':formatter="renderCell"', '', '', '', {
  457. methods: {
  458. renderCell(row, column) {
  459. return `[${row.name}]`;
  460. }
  461. }
  462. });
  463. setTimeout(_ => {
  464. const cells = toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'));
  465. expect(cells.map(n => n.textContent)).to.eql(getTestData().map(o => `[${o.name}]`));
  466. destroyVM(vm);
  467. done();
  468. }, DELAY);
  469. });
  470. it('show-overflow-tooltip', done => {
  471. const vm = createTable('show-overflow-tooltip');
  472. setTimeout(_ => {
  473. expect(vm.$el.querySelectorAll('.el-tooltip')).to.length(5);
  474. destroyVM(vm);
  475. done();
  476. }, DELAY);
  477. });
  478. it('show-tooltip-when-overflow', done => { // old version prop name
  479. const vm = createTable('show-tooltip-when-overflow');
  480. setTimeout(_ => {
  481. expect(vm.$el.querySelectorAll('.el-tooltip')).to.length(5);
  482. destroyVM(vm);
  483. done();
  484. }, DELAY);
  485. });
  486. it('inline-template', done => {
  487. const vm = createVue({
  488. template: `
  489. <el-table :data="testData">
  490. <el-table-column prop="name" inline-template>
  491. <span>[{{ row.name }}]</span>
  492. </el-table-column>
  493. <el-table-column prop="release"/>
  494. <el-table-column prop="director"/>
  495. <el-table-column prop="runtime"/>
  496. </el-table>
  497. `,
  498. created() {
  499. this.testData = getTestData();
  500. }
  501. });
  502. setTimeout(_ => {
  503. const cells = toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'));
  504. expect(cells.map(n => n.textContent)).to.eql(getTestData().map(o => `[${o.name}]`));
  505. destroyVM(vm);
  506. done();
  507. }, DELAY);
  508. });
  509. it('render-header', done => {
  510. const vm = createVue({
  511. template: `
  512. <el-table :data="testData">
  513. <el-table-column prop="name" :render-header="renderHeader" label="name">
  514. </el-table-column>
  515. <el-table-column prop="release"/>
  516. <el-table-column prop="director"/>
  517. <el-table-column prop="runtime"/>
  518. </el-table>
  519. `,
  520. methods: {
  521. renderHeader(h, { column, $index }) {
  522. return '' + $index + ':' + column.label;
  523. }
  524. },
  525. created() {
  526. this.testData = getTestData();
  527. }
  528. });
  529. setTimeout(_ => {
  530. const headerCell = vm.$el.querySelector('.el-table__header-wrapper thead tr th:first-child .cell');
  531. expect(headerCell.textContent).to.equal('0:name');
  532. destroyVM(vm);
  533. done();
  534. }, DELAY);
  535. });
  536. it('align', done => {
  537. const vm = createTable('align="left"', 'align="right"', 'align="center"');
  538. setTimeout(_ => {
  539. var len = getTestData().length + 1;
  540. expect(vm.$el.querySelectorAll('.is-left')).to.length(len);
  541. expect(vm.$el.querySelectorAll('.is-right')).to.length(len);
  542. expect(vm.$el.querySelectorAll('.is-center')).to.length(len);
  543. destroyVM(vm);
  544. done();
  545. }, DELAY);
  546. });
  547. it('class-name', done => {
  548. const vm = createTable('class-name="column-1"', 'class-name="column-2 column-class-a"', 'class-name="column-class-a"');
  549. setTimeout(_ => {
  550. var len = getTestData().length + 1;
  551. expect(vm.$el.querySelectorAll('.column-1')).to.length(len);
  552. expect(vm.$el.querySelectorAll('.column-2')).to.length(len);
  553. expect(vm.$el.querySelectorAll('.column-class-a')).to.length(len * 2);
  554. destroyVM(vm);
  555. done();
  556. }, DELAY);
  557. });
  558. it('selectable', done => {
  559. const vm = createVue({
  560. template: `
  561. <el-table :data="testData" @selection-change="change">
  562. <el-table-column type="selection" :selectable="filterSelect" />
  563. <el-table-column prop="name" label="name" />
  564. <el-table-column prop="release" label="release" />
  565. <el-table-column prop="director" label="director" />
  566. <el-table-column prop="runtime" label="runtime" />
  567. </el-table>
  568. `,
  569. created() {
  570. this.testData = getTestData();
  571. },
  572. data() {
  573. return { selected: [] };
  574. },
  575. methods: {
  576. change(rows) {
  577. this.selected = rows;
  578. },
  579. filterSelect(row, index) {
  580. return index > 2;
  581. }
  582. }
  583. }, true);
  584. setTimeout(_ => {
  585. vm.$el.querySelector('.el-checkbox').click();
  586. setTimeout(_ => {
  587. expect(vm.selected).to.length(2);
  588. destroyVM(vm);
  589. done();
  590. }, DELAY);
  591. }, DELAY);
  592. });
  593. it('selectable === false & check selectAll status', done => {
  594. const vm = createVue({
  595. template: `
  596. <el-table :data="testData" @selection-change="change">
  597. <el-table-column type="selection" :selectable="filterSelect" />
  598. <el-table-column prop="name" label="name" />
  599. <el-table-column prop="release" label="release" />
  600. <el-table-column prop="director" label="director" />
  601. <el-table-column prop="runtime" label="runtime" />
  602. </el-table>
  603. `,
  604. created() {
  605. },
  606. data() {
  607. return { selected: [], testData: null };
  608. },
  609. methods: {
  610. change(rows) {
  611. this.selected = rows;
  612. },
  613. filterSelect(row, index) {
  614. return false;
  615. }
  616. }
  617. }, true);
  618. vm.testData = getTestData();
  619. setTimeout(_ => {
  620. expect(vm.$el.querySelector('.el-checkbox').__vue__.checked).to.be.false;
  621. setTimeout(_ => {
  622. expect(vm.selected).to.length(0);
  623. destroyVM(vm);
  624. done();
  625. }, DELAY);
  626. }, DELAY);
  627. });
  628. it('emit selection-change after row has been removed', done => {
  629. const vm = createVue({
  630. template: `
  631. <el-table :data="testData" @selection-change="change">
  632. <el-table-column type="selection" />
  633. <el-table-column prop="name" label="name" />
  634. <el-table-column prop="release" label="release" />
  635. <el-table-column prop="director" label="director" />
  636. <el-table-column prop="runtime" label="runtime" />
  637. </el-table>
  638. `,
  639. created() {
  640. this.testData = getTestData();
  641. },
  642. data() {
  643. return { selected: [], testData: null };
  644. },
  645. methods: {
  646. change(rows) {
  647. this.selected = rows;
  648. },
  649. filterSelect(row, index) {
  650. return index > 2;
  651. }
  652. }
  653. }, true);
  654. setTimeout(_ => {
  655. vm.$el.querySelector('.el-checkbox').click();
  656. setTimeout(_ => {
  657. expect(vm.selected).to.length(5);
  658. vm.testData.splice(0, 1);
  659. setTimeout(_ => {
  660. expect(vm.selected).to.length(4);
  661. destroyVM(vm);
  662. done();
  663. });
  664. }, DELAY);
  665. }, DELAY);
  666. });
  667. it('reserve-selection', done => {
  668. const getData = function(page = 0) {
  669. let id = 0;
  670. const rows = [];
  671. const row = () => {
  672. return {
  673. id: ++id + page * 10,
  674. date: new Date().getTime()
  675. };
  676. };
  677. let count = 10;
  678. while (--count) {
  679. rows.push(row());
  680. }
  681. return rows;
  682. };
  683. const vm = createVue({
  684. template: `
  685. <el-table ref="table" :row-key="rowKey" :data="testData" @selection-change="change">
  686. <el-table-column type="selection" reserve-selection />
  687. <el-table-column prop="id" label="id" />
  688. <el-table-column prop="date" label="date" />
  689. </el-table>
  690. `,
  691. created() {
  692. this.testData = getData();
  693. },
  694. data() {
  695. return { selected: [], testData: [] };
  696. },
  697. methods: {
  698. rowKey(row) {
  699. return row.id;
  700. },
  701. change(rows) {
  702. this.selected = rows;
  703. }
  704. }
  705. }, true);
  706. setTimeout(_ => {
  707. // click first
  708. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  709. setTimeout(_ => {
  710. expect(vm.$el.querySelectorAll('.el-checkbox__inner.is-checked')).to.length(1);
  711. // go to second page
  712. vm.testData = getData(1);
  713. setTimeout(_ => {
  714. // expect no checked
  715. expect(vm.$el.querySelectorAll('.el-checkbox__inner.is-checked')).to.length(0);
  716. // click first checkbox
  717. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  718. vm.$el.querySelectorAll('.el-checkbox')[2].click();
  719. setTimeout(_ => {
  720. // back first page
  721. vm.testData = getData();
  722. setTimeout(_ => {
  723. expect(vm.$el.querySelectorAll('.el-checkbox__inner.is-checked')).to.length(1);
  724. // clear
  725. vm.$refs.table.clearSelection();
  726. setTimeout(_ => {
  727. expect(vm.$el.querySelectorAll('.el-checkbox__inner.is-checked')).to.length(0);
  728. destroyVM(vm);
  729. done();
  730. }, DELAY);
  731. }, DELAY);
  732. }, DELAY);
  733. }, DELAY);
  734. }, DELAY);
  735. }, DELAY);
  736. });
  737. describe('type', () => {
  738. const createTable = function(type) {
  739. return createVue({
  740. template: `
  741. <el-table :data="testData" @selection-change="change">
  742. <el-table-column type="${type}" />
  743. <el-table-column prop="name" label="name" />
  744. <el-table-column prop="release" label="release" />
  745. <el-table-column prop="director" label="director" />
  746. <el-table-column prop="runtime" label="runtime" />
  747. </el-table>
  748. `,
  749. created() {
  750. this.testData = getTestData();
  751. },
  752. data() {
  753. return { selected: [] };
  754. },
  755. methods: {
  756. change(rows) {
  757. this.selected = rows;
  758. }
  759. }
  760. }, true);
  761. };
  762. describe('= selection', () => {
  763. const vm = createTable('selection');
  764. it('render', done => {
  765. setTimeout(_ => {
  766. expect(vm.$el.querySelectorAll('.el-checkbox')).to.length(getTestData().length + 1);
  767. done();
  768. }, DELAY);
  769. });
  770. it('select all', done => {
  771. vm.$el.querySelector('.el-checkbox').click();
  772. setTimeout(_ => {
  773. expect(vm.selected).to.length(getTestData().length);
  774. done();
  775. }, DELAY);
  776. });
  777. it('cancel all', done => {
  778. vm.$el.querySelector('.el-checkbox').click();
  779. setTimeout(_ => {
  780. expect(vm.selected).to.length(0);
  781. destroyVM(vm);
  782. done();
  783. }, DELAY);
  784. });
  785. it('select one', done => {
  786. const vm2 = createTable('selection');
  787. setTimeout(_ => {
  788. vm2.$el.querySelectorAll('.el-checkbox')[1].click();
  789. setTimeout(_ => {
  790. expect(vm2.selected).to.length(1);
  791. expect(vm2.selected[0].name).to.equal(getTestData()[0].name);
  792. destroyVM(vm2);
  793. done();
  794. }, DELAY);
  795. }, DELAY);
  796. });
  797. });
  798. describe('= index', () => {
  799. const vm = createTable('index');
  800. it('render', done => {
  801. setTimeout(_ => {
  802. expect(toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'))
  803. .map(node => node.textContent)).to.eql(['1', '2', '3', '4', '5']);
  804. destroyVM(vm);
  805. done();
  806. }, DELAY);
  807. });
  808. });
  809. });
  810. describe('sortable', () => {
  811. it('render', done => {
  812. const vm = createTable('', '', '', 'sortable');
  813. setTimeout(_ => {
  814. expect(vm.$el.querySelectorAll('.caret-wrapper')).to.length(1);
  815. destroyVM(vm);
  816. done();
  817. }, DELAY);
  818. });
  819. it('sortable method', done => {
  820. const vm = createTable(
  821. 'sortable :sort-method="sortMethod"', '', '', '', {
  822. methods: {
  823. sortMethod(a, b) {
  824. return a.runtime < b.runtime;
  825. }
  826. }
  827. });
  828. setTimeout(_ => {
  829. const elm = vm.$el.querySelector('.caret-wrapper');
  830. elm.click();
  831. setTimeout(_ => {
  832. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  833. expect(toArray(lastCells).map(node => node.textContent)).to.eql(['100', '95', '92', '92', '80']);
  834. destroyVM(vm);
  835. done();
  836. }, DELAY);
  837. }, DELAY);
  838. });
  839. it('sort-change', done => {
  840. let result;
  841. const vm = createTable('sortable="custom"', '', '', '', {
  842. methods: {
  843. sortChange(...args) {
  844. result = args;
  845. }
  846. }
  847. }, '@sort-change="sortChange"');
  848. setTimeout(_ => {
  849. const elm = vm.$el.querySelector('.caret-wrapper');
  850. elm.click();
  851. setTimeout(_ => {
  852. expect(result).to.exist;
  853. destroyVM(vm);
  854. done();
  855. }, DELAY);
  856. }, DELAY);
  857. });
  858. });
  859. describe('click sortable column', () => {
  860. const vm = createTable('', '', '', 'sortable');
  861. it('ascending', done => {
  862. const elm = vm.$el.querySelector('.caret-wrapper');
  863. elm.click();
  864. setTimeout(_ => {
  865. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  866. expect(toArray(lastCells).map(node => node.textContent))
  867. .to.eql(['80', '92', '92', '95', '100']);
  868. done();
  869. }, DELAY);
  870. });
  871. it('descending', done => {
  872. const elm = vm.$el.querySelector('.caret-wrapper');
  873. elm.click();
  874. setTimeout(_ => {
  875. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  876. expect(toArray(lastCells).map(node => node.textContent))
  877. .to.eql(['100', '95', '92', '92', '80']);
  878. destroyVM(vm);
  879. done();
  880. }, DELAY);
  881. });
  882. });
  883. });
  884. describe('multi level column', () => {
  885. it('should works', done => {
  886. const vm = createVue({
  887. template: `
  888. <el-table :data="testData">
  889. <el-table-column prop="name" />
  890. <el-table-column label="group">
  891. <el-table-column prop="release"/>
  892. <el-table-column prop="director"/>
  893. </el-table-column>
  894. <el-table-column prop="runtime"/>
  895. </el-table>
  896. `,
  897. created() {
  898. this.testData = null;
  899. }
  900. }, true);
  901. setTimeout(_ => {
  902. const trs = vm.$el.querySelectorAll('.el-table__header tr');
  903. expect(trs.length).equal(2);
  904. const firstRowHeader = trs[0].querySelectorAll('th .cell').length;
  905. const secondRowHeader = trs[1].querySelectorAll('th .cell').length;
  906. expect(firstRowHeader).to.equal(3);
  907. expect(secondRowHeader).to.equal(2);
  908. expect(trs[0].querySelector('th:first-child').getAttribute('rowspan')).to.equal('2');
  909. expect(trs[0].querySelector('th:nth-child(2)').getAttribute('colspan')).to.equal('2');
  910. destroyVM(vm);
  911. done();
  912. }, DELAY);
  913. });
  914. it('should works', done => {
  915. const vm = createVue({
  916. template: `
  917. <el-table :data="testData">
  918. <el-table-column prop="name" />
  919. <el-table-column label="group">
  920. <el-table-column label="group's group">
  921. <el-table-column prop="release" />
  922. <el-table-column prop="runtime"/>
  923. </el-table-column>
  924. <el-table-column prop="director" />
  925. </el-table-column>
  926. <el-table-column prop="runtime"/>
  927. </el-table>
  928. `,
  929. created() {
  930. this.testData = null;
  931. }
  932. }, true);
  933. setTimeout(_ => {
  934. const trs = vm.$el.querySelectorAll('.el-table__header tr');
  935. expect(trs.length).equal(3);
  936. const firstRowHeader = trs[0].querySelectorAll('th .cell').length;
  937. const secondRowHeader = trs[1].querySelectorAll('th .cell').length;
  938. const thirdRowHeader = trs[2].querySelectorAll('th .cell').length;
  939. expect(firstRowHeader).to.equal(3);
  940. expect(secondRowHeader).to.equal(2);
  941. expect(thirdRowHeader).to.equal(2);
  942. expect(trs[0].querySelector('th:first-child').getAttribute('rowspan')).to.equal('3');
  943. expect(trs[0].querySelector('th:nth-child(2)').getAttribute('colspan')).to.equal('3');
  944. expect(trs[1].querySelector('th:first-child').getAttribute('colspan')).to.equal('2');
  945. expect(trs[1].querySelector('th:nth-child(2)').getAttribute('rowspan')).to.equal('2');
  946. destroyVM(vm);
  947. done();
  948. }, DELAY);
  949. });
  950. it('should work in one column', done => {
  951. const vm = createVue({
  952. template: `
  953. <el-table :data="testData">
  954. <el-table-column label="group">
  955. <el-table-column prop="release"/>
  956. </el-table-column>
  957. </el-table>
  958. `,
  959. created() {
  960. this.testData = null;
  961. }
  962. }, true);
  963. setTimeout(_ => {
  964. const trs = vm.$el.querySelectorAll('.el-table__header tr');
  965. expect(trs.length).equal(2);
  966. const firstRowLength = trs[0].querySelectorAll('th .cell').length;
  967. const secondRowLength = trs[1].querySelectorAll('th .cell').length;
  968. expect(firstRowLength).to.equal(1);
  969. expect(secondRowLength).to.equal(1);
  970. expect(trs[0].querySelector('th:first-child').getAttribute('rowspan')).to.equal('1');
  971. expect(trs[0].querySelector('th:first-child').getAttribute('colspan')).to.equal('1');
  972. destroyVM(vm);
  973. done();
  974. }, DELAY);
  975. });
  976. });
  977. describe('dynamic column attribtes', () => {
  978. const DELAY = 50;
  979. it('label', (done) => {
  980. const vm = createVue({
  981. template: `
  982. <el-table :data="testData">
  983. <el-table-column prop="name" :label="label"/>
  984. <el-table-column prop="release" />
  985. <el-table-column prop="director" />
  986. <el-table-column prop="runtime" />
  987. </el-table>
  988. `,
  989. data() {
  990. return {
  991. label: 'name'
  992. };
  993. },
  994. created() {
  995. this.testData = getTestData();
  996. }
  997. }, true);
  998. setTimeout(() => {
  999. expect(vm.$el.querySelector('.el-table__header th .cell').textContent).to.equal('name');
  1000. vm.label = 'NAME';
  1001. vm.$nextTick(() => {
  1002. expect(vm.$el.querySelector('.el-table__header th .cell').textContent).to.equal('NAME');
  1003. });
  1004. done();
  1005. }, DELAY);
  1006. });
  1007. it('align', (done) => {
  1008. const vm = createVue({
  1009. template: `
  1010. <el-table :data="testData">
  1011. <el-table-column prop="name" :align="align"/>
  1012. </el-table>
  1013. `,
  1014. data() {
  1015. return {
  1016. align: 'left'
  1017. };
  1018. },
  1019. created() {
  1020. this.testData = getTestData();
  1021. }
  1022. }, true);
  1023. setTimeout(() => {
  1024. expect(vm.$el.querySelectorAll('.el-table__body td.is-right').length === 0).to.be.true;
  1025. vm.align = 'right';
  1026. vm.$nextTick(() => {
  1027. expect(vm.$el.querySelectorAll('.el-table__body td.is-right').length > 0).to.be.true;
  1028. });
  1029. done();
  1030. }, DELAY);
  1031. });
  1032. it('width', (done) => {
  1033. const vm = createVue({
  1034. template: `
  1035. <el-table :data="testData" :fit="false">
  1036. <el-table-column prop="name" :width="width"/>
  1037. </el-table>
  1038. `,
  1039. data() {
  1040. return {
  1041. width: 100
  1042. };
  1043. },
  1044. created() {
  1045. this.testData = getTestData();
  1046. }
  1047. }, true);
  1048. setTimeout(() => {
  1049. expect(vm.$el.querySelector('.el-table__body col').getAttribute('width')).to.equal('100');
  1050. vm.width = 200;
  1051. vm.$nextTick(() => {
  1052. expect(vm.$el.querySelector('.el-table__body col').getAttribute('width')).to.equal('200');
  1053. });
  1054. done();
  1055. }, DELAY);
  1056. });
  1057. it('min-width', (done) => {
  1058. const vm = createVue({
  1059. template: `
  1060. <el-table :data="testData" :fit="false">
  1061. <el-table-column prop="name" :min-width="width"/>
  1062. </el-table>
  1063. `,
  1064. data() {
  1065. return {
  1066. width: 100
  1067. };
  1068. },
  1069. created() {
  1070. this.testData = getTestData();
  1071. }
  1072. }, true);
  1073. setTimeout(() => {
  1074. expect(vm.$el.querySelector('.el-table__body col').getAttribute('width')).to.equal('100');
  1075. vm.width = 200;
  1076. vm.$nextTick(() => {
  1077. expect(vm.$el.querySelector('.el-table__body col').getAttribute('width')).to.equal('200');
  1078. });
  1079. done();
  1080. }, DELAY);
  1081. });
  1082. it('fixed', (done) => {
  1083. const vm = createVue({
  1084. template: `
  1085. <el-table :data="testData">
  1086. <el-table-column :fixed="fixed" />
  1087. <el-table-column prop="release" />
  1088. <el-table-column prop="director" />
  1089. <el-table-column prop="runtime" />
  1090. </el-table>
  1091. `,
  1092. data() {
  1093. return {
  1094. fixed: false
  1095. };
  1096. },
  1097. created() {
  1098. this.testData = getTestData();
  1099. }
  1100. }, true);
  1101. setTimeout(() => {
  1102. expect(!vm.$el.querySelector('.el-table__fixed')).to.be.true;
  1103. vm.fixed = true;
  1104. vm.$nextTick(() => {
  1105. expect(!!vm.$el.querySelector('.el-table__fixed')).to.be.true;
  1106. });
  1107. done();
  1108. }, DELAY);
  1109. });
  1110. it('prop', (done) => {
  1111. const vm = createVue({
  1112. template: `
  1113. <el-table :data="testData">
  1114. <el-table-column :prop="name" />
  1115. <el-table-column prop="release" />
  1116. <el-table-column prop="director" />
  1117. <el-table-column prop="runtime" />
  1118. </el-table>
  1119. `,
  1120. data() {
  1121. return {
  1122. prop: 'name'
  1123. };
  1124. },
  1125. created() {
  1126. this.testData = getTestData();
  1127. }
  1128. }, true);
  1129. setTimeout(() => {
  1130. let firstColumnContent = vm.$el.querySelector('.el-table__body td .cell').textContent;
  1131. let secondColumnContent = vm.$el.querySelector('.el-table__body td:nth-child(2) .cell').textContent;
  1132. expect(firstColumnContent !== secondColumnContent).to.be.true;
  1133. vm.prop = 'release';
  1134. vm.property = 'release';
  1135. vm.$nextTick(() => {
  1136. firstColumnContent = vm.$el.querySelector('.el-table__body td .cell').textContent;
  1137. secondColumnContent = vm.$el.querySelector('.el-table__body td:nth-child(2) .cell').textContent;
  1138. expect(firstColumnContent === secondColumnContent).to.be.true;
  1139. });
  1140. done();
  1141. }, DELAY);
  1142. });
  1143. });
  1144. describe('methods', () => {
  1145. const createTable = function(prop = '', opts) {
  1146. return createVue({
  1147. template: `
  1148. <el-table ref="table" :data="testData" @${prop}="handleEvent">
  1149. <el-table-column type="selection" />
  1150. <el-table-column prop="name" />
  1151. <el-table-column prop="release" />
  1152. <el-table-column prop="director" />
  1153. <el-table-column prop="runtime"/>
  1154. </el-table>
  1155. `,
  1156. methods: {
  1157. handleEvent(selection) {
  1158. this.fireCount++;
  1159. this.selection = selection;
  1160. }
  1161. },
  1162. created() {
  1163. this.testData = getTestData();
  1164. },
  1165. data() {
  1166. return { selection: null, testData: this.testData, fireCount: 0 };
  1167. }
  1168. }, true);
  1169. };
  1170. it('toggleRowSelection', () => {
  1171. const vm = createTable('selection-change');
  1172. vm.$refs.table.toggleRowSelection(vm.testData[0]);
  1173. expect(vm.selection).to.length(1);
  1174. expect(vm.fireCount).to.equal(1);
  1175. // test use second parameter
  1176. vm.$refs.table.toggleRowSelection(vm.testData[0], true);
  1177. expect(vm.fireCount).to.equal(1);
  1178. vm.$refs.table.toggleRowSelection(vm.testData[0], false);
  1179. expect(vm.fireCount).to.equal(2);
  1180. expect(vm.selection).to.length(0);
  1181. destroyVM(vm);
  1182. });
  1183. it('clearSelection', () => {
  1184. const vm = createTable('selection-change');
  1185. vm.$refs.table.toggleRowSelection(vm.testData[0]);
  1186. expect(vm.selection).to.length(1);
  1187. expect(vm.fireCount).to.equal(1);
  1188. // clear selection
  1189. vm.$refs.table.clearSelection();
  1190. expect(vm.fireCount).to.equal(2);
  1191. expect(vm.selection).to.length(0);
  1192. vm.$refs.table.clearSelection();
  1193. expect(vm.fireCount).to.equal(2);
  1194. destroyVM(vm);
  1195. });
  1196. });
  1197. it('hover', done => {
  1198. const vm = createVue({
  1199. template: `
  1200. <el-table :data="testData">
  1201. <el-table-column prop="name" label="片名" fixed />
  1202. <el-table-column prop="release" label="发行日期" />
  1203. <el-table-column prop="director" label="导演" />
  1204. <el-table-column prop="runtime" label="时长(分)" />
  1205. </el-table>
  1206. `,
  1207. created() {
  1208. this.testData = getTestData();
  1209. }
  1210. }, true);
  1211. setTimeout(_ => {
  1212. const tr = vm.$el.querySelector('.el-table__body-wrapper tbody tr');
  1213. triggerEvent(tr, 'mouseenter', true, false);
  1214. setTimeout(_ => {
  1215. expect(tr.classList.contains('hover-row')).to.true;
  1216. triggerEvent(tr, 'mouseleave', true, false);
  1217. setTimeout(_ => {
  1218. expect(tr.classList.contains('hover-row')).to.false;
  1219. destroyVM(vm);
  1220. done();
  1221. }, DELAY);
  1222. }, DELAY);
  1223. }, DELAY);
  1224. });
  1225. it('highlight-current-row', done => {
  1226. const vm = createVue({
  1227. template: `
  1228. <el-table :data="testData" highlight-current-row>
  1229. <el-table-column prop="name" label="片名" />
  1230. <el-table-column prop="release" label="发行日期" />
  1231. <el-table-column prop="director" label="导演" />
  1232. <el-table-column prop="runtime" label="时长(分)" />
  1233. </el-table>
  1234. `,
  1235. created() {
  1236. this.testData = getTestData();
  1237. }
  1238. }, true);
  1239. setTimeout(_ => {
  1240. const tr = vm.$el.querySelector('.el-table__body-wrapper tbody tr');
  1241. triggerEvent(tr, 'click', true, false);
  1242. setTimeout(_ => {
  1243. expect(tr.classList.contains('current-row')).to.be.true;
  1244. const rows = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
  1245. triggerEvent(rows[2], 'click', true, false);
  1246. setTimeout(_ => {
  1247. expect(tr.classList.contains('current-row')).to.be.false;
  1248. expect(rows[2].classList.contains('current-row')).to.be.true;
  1249. destroyVM(vm);
  1250. done();
  1251. }, DELAY);
  1252. }, DELAY);
  1253. }, DELAY);
  1254. });
  1255. });