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' ;
2019-03-14 06:44:53 +00:00
import { selectChoose } from 'ember-power-select/test-support' ;
2019-09-26 18:47:07 +00:00
import { setupMirage } from 'ember-cli-mirage/test-support' ;
2020-07-28 17:59:14 +00:00
import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit' ;
2018-08-10 18:20:44 +00:00
import JobsList from 'nomad-ui/tests/pages/jobs/list' ;
import ClientsList from 'nomad-ui/tests/pages/clients/list' ;
2020-12-10 17:51:22 +00:00
import Layout from 'nomad-ui/tests/pages/layout' ;
2018-08-10 18:20:44 +00:00
import Allocation from 'nomad-ui/tests/pages/allocations/detail' ;
2019-03-13 00:04:16 +00:00
module ( 'Acceptance | regions (only one)' , function ( hooks ) {
setupApplicationTest ( hooks ) ;
2019-03-13 01:09:19 +00:00
setupMirage ( hooks ) ;
2019-03-13 00:04:16 +00:00
hooks . beforeEach ( function ( ) {
2018-08-10 18:20:44 +00:00
server . create ( 'agent' ) ;
server . create ( 'node' ) ;
2019-04-12 03:08:43 +00:00
server . createList ( 'job' , 2 , { createAllocations : false , noDeployments : true } ) ;
2019-03-13 00:04:16 +00:00
} ) ;
2018-08-10 18:20:44 +00:00
2020-07-28 17:59:14 +00:00
test ( 'it passes an accessibility audit' , async function ( assert ) {
await JobsList . visit ( ) ;
2020-08-25 15:56:02 +00:00
await a11yAudit ( assert ) ;
2020-07-28 17:59:14 +00:00
} ) ;
2019-07-17 20:02:58 +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' } ) ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await JobsList . visit ( ) ;
2018-08-10 18:20:44 +00:00
2020-12-10 17:51:22 +00:00
assert . notOk ( Layout . navbar . regionSwitcher . isPresent , 'No region switcher' ) ;
2019-07-17 20:02:58 +00:00
assert . equal ( document . title , 'Jobs - Nomad' ) ;
2018-08-10 18:20:44 +00:00
} ) ;
2019-03-14 06:44:53 +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' } ) ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await JobsList . visit ( ) ;
2018-08-10 18:20:44 +00:00
2020-12-10 17:51:22 +00:00
assert . notOk ( Layout . navbar . regionSwitcher . isPresent , 'No region switcher' ) ;
2018-08-10 18:20:44 +00:00
} ) ;
2019-03-14 06:44:53 +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' } ) ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await JobsList . visit ( ) ;
2018-08-10 18:20:44 +00:00
assert . equal ( currentURL ( ) , '/jobs' , 'No region query param' ) ;
2019-03-14 06:44:53 +00:00
const jobId = JobsList . jobs . objectAt ( 0 ) . id ;
await JobsList . jobs . objectAt ( 0 ) . clickRow ( ) ;
2018-08-10 18:20:44 +00:00
assert . equal ( currentURL ( ) , ` /jobs/ ${ jobId } ` , 'No region query param' ) ;
2019-03-14 06:44:53 +00:00
await ClientsList . visit ( ) ;
2018-08-10 18:20:44 +00:00
assert . equal ( currentURL ( ) , '/clients' , 'No region query param' ) ;
} ) ;
2019-03-14 06:44:53 +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' } ) ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await JobsList . visit ( ) ;
await JobsList . jobs . objectAt ( 0 ) . clickRow ( ) ;
2020-12-10 17:51:22 +00:00
await Layout . gutter . visitClients ( ) ;
await Layout . gutter . visitServers ( ) ;
2018-08-10 18:20:44 +00:00
server . pretender . handledRequests . forEach ( req => {
assert . notOk ( req . url . includes ( 'region=' ) , req . url ) ;
} ) ;
} ) ;
} ) ;
2019-03-13 00:04:16 +00:00
module ( 'Acceptance | regions (many)' , function ( hooks ) {
setupApplicationTest ( hooks ) ;
2019-03-14 06:44:53 +00:00
setupMirage ( hooks ) ;
2019-03-13 00:04:16 +00:00
hooks . beforeEach ( function ( ) {
2018-08-10 18:20:44 +00:00
server . create ( 'agent' ) ;
server . create ( 'node' ) ;
2019-04-12 03:08:43 +00:00
server . createList ( 'job' , 2 , { createAllocations : false , noDeployments : true } ) ;
server . create ( 'allocation' ) ;
2018-08-10 18:20:44 +00:00
server . create ( 'region' , { id : 'global' } ) ;
server . create ( 'region' , { id : 'region-2' } ) ;
2019-03-13 00:04:16 +00:00
} ) ;
2018-08-10 18:20:44 +00:00
2019-07-17 20:02:58 +00:00
test ( 'the region switcher is rendered in the nav bar and the region is in the page title' , async function ( assert ) {
2019-03-14 06:44:53 +00:00
await JobsList . visit ( ) ;
2018-08-10 18:20:44 +00:00
2020-12-10 17:51:22 +00:00
assert . ok ( Layout . navbar . regionSwitcher . isPresent , 'Region switcher is shown' ) ;
2019-07-17 20:02:58 +00:00
assert . equal ( document . title , 'Jobs - global - Nomad' ) ;
2018-08-10 18:20:44 +00:00
} ) ;
2019-03-14 06:44:53 +00:00
test ( 'when on the default region, pages do not include the region query param' , async function ( assert ) {
await JobsList . visit ( ) ;
2018-08-10 18:20:44 +00:00
assert . equal ( currentURL ( ) , '/jobs' , 'No region query param' ) ;
assert . equal ( window . localStorage . nomadActiveRegion , 'global' , 'Region in localStorage' ) ;
} ) ;
2019-03-14 06:44:53 +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 ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await JobsList . visit ( ) ;
2018-08-10 18:20:44 +00:00
2021-03-26 13:55:12 +00:00
await selectChoose ( '[data-test-region-switcher-parent]' , newRegion ) ;
2018-08-10 18:20:44 +00:00
assert . ok (
currentURL ( ) . includes ( ` region= ${ newRegion } ` ) ,
'New region is the region query param value'
) ;
assert . equal ( window . localStorage . nomadActiveRegion , newRegion , 'New region in localStorage' ) ;
} ) ;
2019-03-14 06:44:53 +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 ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await JobsList . visit ( { region : startingRegion } ) ;
2018-08-10 18:20:44 +00:00
2021-03-26 13:55:12 +00:00
await selectChoose ( '[data-test-region-switcher-parent]' , defaultRegion ) ;
2018-08-10 18:20:44 +00:00
2018-08-13 23:18:06 +00:00
assert . notOk ( currentURL ( ) . includes ( 'region=' ) , 'No region query param for the default region' ) ;
2018-08-10 18:20:44 +00:00
assert . equal (
window . localStorage . nomadActiveRegion ,
defaultRegion ,
'New region in localStorage'
) ;
} ) ;
2019-03-14 06:44:53 +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 ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await Allocation . visit ( { id : server . db . allocations [ 0 ] . id } ) ;
2018-08-10 18:20:44 +00:00
2021-03-26 13:55:12 +00:00
await selectChoose ( '[data-test-region-switcher-parent]' , newRegion ) ;
2018-08-10 18:20:44 +00:00
assert . ok ( currentURL ( ) . includes ( '/jobs?' ) , 'Back at the jobs page' ) ;
} ) ;
2019-03-14 06:44:53 +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 ;
2019-03-14 06:44:53 +00:00
await Allocation . visit ( { id : allocation . id , region } ) ;
2018-08-10 18:20:44 +00:00
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'
) ;
} ) ;
2020-10-26 06:25:28 +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 ) {
2020-01-20 20:57:01 +00:00
window . localStorage . removeItem ( 'nomadTokenSecret' ) ;
2019-03-13 00:04:16 +00:00
const region = server . db . regions [ 1 ] . id ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await JobsList . visit ( { region } ) ;
2018-08-10 18:20:44 +00:00
2019-03-14 06:44:53 +00:00
await JobsList . jobs . objectAt ( 0 ) . clickRow ( ) ;
2020-12-10 17:51:22 +00:00
await Layout . gutter . visitClients ( ) ;
await Layout . gutter . visitServers ( ) ;
2020-01-20 20:57:01 +00:00
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
,
2020-12-10 17:51:22 +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
2020-01-20 20:57:01 +00:00
regionsRequest ,
defaultRegionRequest ,
... appRequests
] = server . pretender . handledRequests ;
2018-08-10 18:20:44 +00:00
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'
) ;
appRequests . forEach ( req => {
2020-10-26 06:25:28 +00:00
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 ) ;
}
2018-08-10 18:20:44 +00:00
} ) ;
} ) ;
} ) ;