open-nomad/ui/tests/integration/components/list-table-test.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

109 lines
3.3 KiB
JavaScript
Raw Normal View History

import { findAll, find, render } from '@ember/test-helpers';
2019-03-13 00:04:16 +00:00
import { module, skip, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import faker from 'nomad-ui/mirage/faker';
2017-09-19 14:47:10 +00:00
import hbs from 'htmlbars-inline-precompile';
import { componentA11yAudit } from 'nomad-ui/tests/helpers/a11y-audit';
2017-09-19 14:47:10 +00:00
2021-12-28 14:45:20 +00:00
module('Integration | Component | list table', function (hooks) {
2019-03-13 00:04:16 +00:00
setupRenderingTest(hooks);
2017-09-19 14:47:10 +00:00
2019-03-13 00:04:16 +00:00
const commonTable = Array(10)
.fill(null)
.map(() => ({
firstName: faker.name.firstName(),
lastName: faker.name.lastName(),
age: faker.random.number({ min: 18, max: 60 }),
}));
2017-09-19 14:47:10 +00:00
2019-03-13 00:04:16 +00:00
// thead
2021-12-28 14:45:20 +00:00
test('component exposes a thead contextual component', async function (assert) {
2019-03-13 00:04:16 +00:00
this.set('source', commonTable);
await render(hbs`
<ListTable @source={{source}} @sortProperty={{sortProperty}} @sortDescending={{sortDescending}} as |t|>
<t.head @class="head">
2019-03-13 00:04:16 +00:00
<th>First Name</th>
<th>Last Name</th>
<th>Age</th>
</t.head>
</ListTable>
2019-03-13 00:04:16 +00:00
`);
2017-09-19 14:47:10 +00:00
2019-03-13 00:04:16 +00:00
assert.ok(findAll('.head').length, 'Table head is rendered');
2021-12-28 16:08:12 +00:00
assert.equal(
find('.head').tagName.toLowerCase(),
'thead',
'Table head is a thead element'
);
2017-09-19 14:47:10 +00:00
});
2019-03-13 00:04:16 +00:00
// tbody
2021-12-28 14:45:20 +00:00
test('component exposes a tbody contextual component', async function (assert) {
assert.expect(44);
2019-03-13 00:04:16 +00:00
this.setProperties({
source: commonTable,
sortProperty: 'firstName',
sortDescending: false,
});
await render(hbs`
<ListTable @source={{source}} @sortProperty={{sortProperty}} @sortDescending={{sortDescending}} as |t|>
<t.body @class="body" as |row index|>
2019-03-13 00:04:16 +00:00
<tr class="item">
<td>{{row.model.firstName}}</td>
<td>{{row.model.lastName}}</td>
<td>{{row.model.age}}</td>
<td>{{index}}</td>
2019-03-13 00:04:16 +00:00
</tr>
</t.body>
</ListTable>
2019-03-13 00:04:16 +00:00
`);
2017-09-19 14:47:10 +00:00
2019-03-13 00:04:16 +00:00
assert.ok(findAll('.body').length, 'Table body is rendered');
2021-12-28 16:08:12 +00:00
assert.equal(
find('.body').tagName.toLowerCase(),
'tbody',
'Table body is a tbody element'
);
2017-09-19 14:47:10 +00:00
2021-12-28 16:08:12 +00:00
assert.equal(
findAll('.item').length,
this.get('source.length'),
'Each item gets its own row'
);
2019-03-13 00:04:16 +00:00
// list-table is not responsible for sorting, only dispatching sort events. The table is still
// rendered in index-order.
this.source.forEach((item, index) => {
const $item = this.element.querySelectorAll('.item')[index];
2021-12-28 16:08:12 +00:00
assert.equal(
$item.querySelectorAll('td')[0].innerHTML.trim(),
item.firstName,
'First name'
);
assert.equal(
$item.querySelectorAll('td')[1].innerHTML.trim(),
item.lastName,
'Last name'
);
assert.equal(
$item.querySelectorAll('td')[2].innerHTML.trim(),
item.age,
'Age'
);
assert.equal(
$item.querySelectorAll('td')[3].innerHTML.trim(),
index,
'Index'
);
2019-03-13 00:04:16 +00:00
});
await componentA11yAudit(this.element, assert);
2017-09-19 14:47:10 +00:00
});
2019-03-13 00:04:16 +00:00
// Ember doesn't support query params (or controllers or routes) in integration tests,
// so sorting links can only be tested in acceptance tests.
// Leaving this test here for posterity.
2021-12-28 14:45:20 +00:00
skip('sort-by creates links using the appropriate links given sort property and sort descending', function () {});
2019-03-13 00:04:16 +00:00
});