table.spec.js 43 KB

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