table.spec.js 43 KB

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