open-nomad/ui/tests/acceptance/regions-test.js

194 lines
6.7 KiB
JavaScript
Raw Normal View History

2019-03-13 00:08:16 +00:00
import { currentURL } from '@ember/test-helpers';
2019-03-13 00:04:16 +00:00
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
import { selectChoose } from 'ember-power-select/test-support';
2019-09-26 18:47:07 +00:00
import { setupMirage } from 'ember-cli-mirage/test-support';
import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit';
import JobsList from 'nomad-ui/tests/pages/jobs/list';
import ClientsList from 'nomad-ui/tests/pages/clients/list';
import Layout from 'nomad-ui/tests/pages/layout';
import Allocation from 'nomad-ui/tests/pages/allocations/detail';
2021-12-28 14:45:20 +00:00
module('Acceptance | regions (only one)', function (hooks) {
2019-03-13 00:04:16 +00:00
setupApplicationTest(hooks);
2019-03-13 01:09:19 +00:00
setupMirage(hooks);
2019-03-13 00:04:16 +00:00
2021-12-28 14:45:20 +00:00
hooks.beforeEach(function () {
server.create('agent');
server.create('node');
server.createList('job', 2, { createAllocations: false, noDeployments: true });
2019-03-13 00:04:16 +00:00
});
2021-12-28 14:45:20 +00:00
test('it passes an accessibility audit', async function (assert) {
await JobsList.visit();
await a11yAudit(assert);
});
2021-12-28 14:45:20 +00:00
test('when there is only one region, the region switcher is not shown in the nav bar and the region is not in the page title', async function (assert) {
2019-03-13 00:04:16 +00:00
server.create('region', { id: 'global' });
await JobsList.visit();
assert.notOk(Layout.navbar.regionSwitcher.isPresent, 'No region switcher');
assert.equal(document.title, 'Jobs - Nomad');
});
2021-12-28 14:45:20 +00:00
test('when the only region is not named "global", the region switcher still is not shown', async function (assert) {
2019-03-13 00:04:16 +00:00
server.create('region', { id: 'some-region' });
await JobsList.visit();
assert.notOk(Layout.navbar.regionSwitcher.isPresent, 'No region switcher');
});
2021-12-28 14:45:20 +00:00
test('pages do not include the region query param', async function (assert) {
2019-03-13 00:04:16 +00:00
server.create('region', { id: 'global' });
await JobsList.visit();
assert.equal(currentURL(), '/jobs', 'No region query param');
const jobId = JobsList.jobs.objectAt(0).id;
await JobsList.jobs.objectAt(0).clickRow();
assert.equal(currentURL(), `/jobs/${jobId}`, 'No region query param');
await ClientsList.visit();
assert.equal(currentURL(), '/clients', 'No region query param');
});
2021-12-28 14:45:20 +00:00
test('api requests do not include the region query param', async function (assert) {
2019-03-13 00:04:16 +00:00
server.create('region', { id: 'global' });
await JobsList.visit();
await JobsList.jobs.objectAt(0).clickRow();
await Layout.gutter.visitClients();
await Layout.gutter.visitServers();
2021-12-28 14:45:20 +00:00
server.pretender.handledRequests.forEach((req) => {
assert.notOk(req.url.includes('region='), req.url);
});
});
});
2021-12-28 14:45:20 +00:00
module('Acceptance | regions (many)', function (hooks) {
2019-03-13 00:04:16 +00:00
setupApplicationTest(hooks);
setupMirage(hooks);
2019-03-13 00:04:16 +00:00
2021-12-28 14:45:20 +00:00
hooks.beforeEach(function () {
server.create('agent');
server.create('node');
server.createList('job', 2, { createAllocations: false, noDeployments: true });
server.create('allocation');
server.create('region', { id: 'global' });
server.create('region', { id: 'region-2' });
2019-03-13 00:04:16 +00:00
});
2021-12-28 14:45:20 +00:00
test('the region switcher is rendered in the nav bar and the region is in the page title', async function (assert) {
await JobsList.visit();
assert.ok(Layout.navbar.regionSwitcher.isPresent, 'Region switcher is shown');
assert.equal(document.title, 'Jobs - global - Nomad');
});
2021-12-28 14:45:20 +00:00
test('when on the default region, pages do not include the region query param', async function (assert) {
await JobsList.visit();
assert.equal(currentURL(), '/jobs', 'No region query param');
assert.equal(window.localStorage.nomadActiveRegion, 'global', 'Region in localStorage');
});
2021-12-28 14:45:20 +00:00
test('switching regions sets localStorage and the region query param', async function (assert) {
2019-03-13 00:04:16 +00:00
const newRegion = server.db.regions[1].id;
await JobsList.visit();
await selectChoose('[data-test-region-switcher-parent]', newRegion);
assert.ok(
currentURL().includes(`region=${newRegion}`),
'New region is the region query param value'
);
assert.equal(window.localStorage.nomadActiveRegion, newRegion, 'New region in localStorage');
});
2021-12-28 14:45:20 +00:00
test('switching regions to the default region, unsets the region query param', async function (assert) {
2019-03-13 00:04:16 +00:00
const startingRegion = server.db.regions[1].id;
const defaultRegion = server.db.regions[0].id;
await JobsList.visit({ region: startingRegion });
await selectChoose('[data-test-region-switcher-parent]', defaultRegion);
assert.notOk(currentURL().includes('region='), 'No region query param for the default region');
assert.equal(
window.localStorage.nomadActiveRegion,
defaultRegion,
'New region in localStorage'
);
});
2021-12-28 14:45:20 +00:00
test('switching regions on deep pages redirects to the application root', async function (assert) {
2019-03-13 00:04:16 +00:00
const newRegion = server.db.regions[1].id;
await Allocation.visit({ id: server.db.allocations[0].id });
await selectChoose('[data-test-region-switcher-parent]', newRegion);
assert.ok(currentURL().includes('/jobs?'), 'Back at the jobs page');
});
2021-12-28 14:45:20 +00:00
test('navigating directly to a page with the region query param sets the application to that region', async function (assert) {
2019-03-13 00:04:16 +00:00
const allocation = server.db.allocations[0];
const region = server.db.regions[1].id;
await Allocation.visit({ id: allocation.id, region });
assert.equal(
currentURL(),
`/allocations/${allocation.id}?region=${region}`,
'Region param is persisted when navigating straight to a detail page'
);
assert.equal(
window.localStorage.nomadActiveRegion,
region,
'Region is also set in localStorage from a detail page'
);
});
2021-12-28 14:45:20 +00:00
test('when the region is not the default region, all api requests other than the agent/self request include the region query param', async function (assert) {
window.localStorage.removeItem('nomadTokenSecret');
2019-03-13 00:04:16 +00:00
const region = server.db.regions[1].id;
await JobsList.visit({ region });
await JobsList.jobs.objectAt(0).clickRow();
await Layout.gutter.visitClients();
await Layout.gutter.visitServers();
const [
ui: Change global search to use fuzzy search API (#10412) This updates the UI to use the new fuzzy search API. It’s a drop-in replacement so the / shortcut to jump to search is preserved, and results can be cycled through and chosen via arrow keys and the enter key. It doesn’t use everything returned by the API: * deployments and evaluations: these match by id, doesn’t seem like people would know those or benefit from quick navigation to them * namespaces: doesn’t seem useful as they currently function * scaling policies * tasks: the response doesn’t include an allocation id, which means they can’t be navigated to in the UI without an additional query * CSI volumes: aren’t actually returned by the API Since there’s no API to check the server configuration and know whether the feature has been disabled, this adds another query in route:application#beforeModel that acts as feature detection: if the attempt to query fails (500), the global search field is hidden. Upon having added another query on load, I realised that beforeModel was being triggered any time service:router#transitionTo was being called, which happens upon navigating to a search result, for instance, because of refreshModel being present on the region query parameter. This PR adds a check for transition.queryParamsOnly and skips rerunning the onload queries (token permissions check, license check, fuzzy search feature detection). Implementation notes: * there are changes to unrelated tests to ignore the on-load feature detection query * some lifecycle-related guards against undefined were required to address failures when navigating to an allocation * the minimum search length of 2 characters is hard-coded as there’s currently no way to determine min_term_length in the UI
2021-04-28 18:31:05 +00:00
,
,
,
// License request
// Token/policies request
ui: Change global search to use fuzzy search API (#10412) This updates the UI to use the new fuzzy search API. It’s a drop-in replacement so the / shortcut to jump to search is preserved, and results can be cycled through and chosen via arrow keys and the enter key. It doesn’t use everything returned by the API: * deployments and evaluations: these match by id, doesn’t seem like people would know those or benefit from quick navigation to them * namespaces: doesn’t seem useful as they currently function * scaling policies * tasks: the response doesn’t include an allocation id, which means they can’t be navigated to in the UI without an additional query * CSI volumes: aren’t actually returned by the API Since there’s no API to check the server configuration and know whether the feature has been disabled, this adds another query in route:application#beforeModel that acts as feature detection: if the attempt to query fails (500), the global search field is hidden. Upon having added another query on load, I realised that beforeModel was being triggered any time service:router#transitionTo was being called, which happens upon navigating to a search result, for instance, because of refreshModel being present on the region query parameter. This PR adds a check for transition.queryParamsOnly and skips rerunning the onload queries (token permissions check, license check, fuzzy search feature detection). Implementation notes: * there are changes to unrelated tests to ignore the on-load feature detection query * some lifecycle-related guards against undefined were required to address failures when navigating to an allocation * the minimum search length of 2 characters is hard-coded as there’s currently no way to determine min_term_length in the UI
2021-04-28 18:31:05 +00:00
// Search feature detection
regionsRequest,
defaultRegionRequest,
...appRequests
] = server.pretender.handledRequests;
assert.notOk(
regionsRequest.url.includes('region='),
'The regions request is made without a region qp'
);
assert.notOk(
defaultRegionRequest.url.includes('region='),
'The default region request is made without a region qp'
);
2021-12-28 14:45:20 +00:00
appRequests.forEach((req) => {
if (req.url === '/v1/agent/self') {
assert.notOk(req.url.includes('region='), `(no region) ${req.url}`);
} else {
assert.ok(req.url.includes(`region=${region}`), req.url);
}
});
});
});