Files
nomad/ui/tests/acceptance/application-errors-test.js
Phil Renaud 16479af38d Jobs Index Page: Live Updates + Pagination (#20452)
* Hook and latch on the initial index

* Serialization and restart of controller and table

* de-log

* allocBlocks reimplemented at job model level

* totalAllocs doesnt mean on jobmodel what it did in steady.js

* Hamburgers to sausages

* Hacky way to bring new jobs back around and parent job handling in list view

* Getting closer to hook/latch

* Latch from update on hook from initialize, but fickle

* Note on multiple-watch problem

* Sensible monday morning comment removal

* use of abortController to handle transition and reset events

* Next token will now update when there's an on-page shift

* Very rough anti-jostle technique

* Demoable, now to move things out of route and into controller

* Into the controller, generally

* Smarter cancellations

* Reset abortController on index models run, and system/sysbatch jobs now have an improved groupCountSum computed property

* Prev Page reverse querying

* n+1th jobs existing will trigger nextToken/pagination display

* Start of a GET/POST statuses return

* Namespace fix

* Unblock tests

* Realizing to my small horror that this skipURLModification flag may be too heavy handed

* Lintfix

* Default liveupdates localStorage setting to true

* Pagination and index rethink

* Big uncoupling of watchable and url-append stuff

* Testfixes for region, search, and keyboard

* Job row class for test purposes

* Allocations in test now contain events

* Starting on the jobs list tests in earnest

* Forbidden state de-bubbling cleanup

* Job list page size fixes

* Facet/Search/Filter jobs list tests skipped

* Maybe it's the automatic mirage logging

* Unbreak task unit test

* Pre-sort sort

* styling for jobs list pagination and general PR cleanup

* moving from Job.ActiveDeploymentID to Job.LatestDeployment.ID

* modifyIndex-based pagination (#20350)

* modifyIndex-based pagination

* modifyIndex gets its own column and pagination compacted with icons

* A generic withPagination handler for mirage

* Some live-PR changes

* Pagination and button disabled tests

* Job update handling tests for jobs index

* assertion timeout in case of long setTimeouts

* assert.timeouts down to 500ms

* de-to-do

* Clarifying comment and test descriptions

* Bugfix: resizing your browser on the new jobs index page would make the viz grow forever (#20458)

* [ui] Searching and filtering options (#20459)

* Beginnings of a search box for filter expressions

* jobSearchBox integration test

* jobs list updateFilter initial test

* Basic jobs list filtering tests

* First attempt at side-by-side facets and search with a computed filter

* Weirdly close to an iterative approach but checked isnt tracked properly

* Big rework to make filter composition and decomposition work nicely with the url

* Namespace facet dropdown added

* NodePool facet dropdown added

* hdsFacet for future testing and basic namespace filtering test

* Namespace filter existence test

* Status filtering

* Node pool/dynamic facet test

* Test patchups

* Attempt at optimize test fix

* Allocation re-load on optimize page explainer

* The Big Un-Skip

* Post-PR-review cleanup

* todo-squashing

* [ui] Handle parent/child jobs with the paginated Jobs Index route (#20493)

* First pass at a non-watchQuery version

* Parameterized jobs get child fetching and jobs index status style for parent jobs

* Completed allocs vs Running allocs in a child-job context, and fix an issue where moving from parent to parent would not reset index

* Testfix and better handling empty-child-statuses-list

* Parent/child test case

* Dont show empty allocation-status bars for parent jobs with no children

* Splits Settings into 2 sections, sign-in/profile and user settings (#20535)

* Changelog
2024-05-06 17:09:37 -04:00

114 lines
3.5 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import { currentURL, visit } from '@ember/test-helpers';
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
import { setupMirage } from 'ember-cli-mirage/test-support';
import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit';
import ClientsList from 'nomad-ui/tests/pages/clients/list';
import JobsList from 'nomad-ui/tests/pages/jobs/list';
import Job from 'nomad-ui/tests/pages/jobs/detail';
import percySnapshot from '@percy/ember';
import faker from 'nomad-ui/mirage/faker';
module('Acceptance | application errors ', function (hooks) {
setupApplicationTest(hooks);
setupMirage(hooks);
hooks.beforeEach(function () {
faker.seed(1);
server.create('agent');
server.create('node-pool');
server.create('node');
server.create('job');
});
test('it passes an accessibility audit', async function (assert) {
assert.expect(1);
server.pretender.get('/v1/nodes', () => [500, {}, null]);
await ClientsList.visit();
await a11yAudit(assert);
await percySnapshot(assert);
});
test('transitioning away from an error page resets the global error', async function (assert) {
server.pretender.get('/v1/nodes', () => [500, {}, null]);
await ClientsList.visit();
assert.ok(ClientsList.error.isPresent, 'Application has errored');
await JobsList.visit();
assert.notOk(
JobsList.error.isPresent,
'Application is no longer in an error state'
);
});
test('the 403 error page links to the ACL tokens page', async function (assert) {
assert.expect(3);
const job = server.db.jobs[0];
server.pretender.get(`/v1/job/${job.id}`, () => [403, {}, null]);
await Job.visit({ id: job.id });
assert.ok(Job.error.isPresent, 'Error message is shown');
assert.equal(Job.error.title, 'Not Authorized', 'Error message is for 403');
await percySnapshot(assert);
await Job.error.seekHelp();
assert.equal(
currentURL(),
'/settings/tokens',
'Error message contains a link to the tokens page'
);
});
test('the no leader error state gets its own error message', async function (assert) {
assert.expect(2);
server.pretender.get('/v1/jobs/statuses', () => [
500,
{},
'No cluster leader',
]);
await JobsList.visit();
assert.ok(JobsList.error.isPresent, 'An error is shown');
assert.equal(
JobsList.error.title,
'No Cluster Leader',
'The error is specifically for the lack of a cluster leader'
);
await percySnapshot(assert);
});
test('error pages include links to the jobs, clients and auth pages', async function (assert) {
await visit('/a/non-existent/page');
assert.ok(JobsList.error.isPresent, 'An error is shown');
await JobsList.error.gotoJobs();
assert.equal(currentURL(), '/jobs', 'Now on the jobs page');
assert.notOk(JobsList.error.isPresent, 'The error is gone now');
await visit('/a/non-existent/page');
assert.ok(JobsList.error.isPresent, 'An error is shown');
await JobsList.error.gotoClients();
assert.equal(currentURL(), '/clients', 'Now on the clients page');
assert.notOk(JobsList.error.isPresent, 'The error is gone now');
await visit('/a/non-existent/page');
assert.ok(JobsList.error.isPresent, 'An error is shown');
await JobsList.error.gotoSignin();
assert.equal(currentURL(), '/settings/tokens', 'Now on the sign-in page');
assert.notOk(JobsList.error.isPresent, 'The error is gone now');
});
});