diff --git a/ui/app/routes/jobs/job/definition.js b/ui/app/routes/jobs/job/definition.js index f6294ebf5..4be568a11 100644 --- a/ui/app/routes/jobs/job/definition.js +++ b/ui/app/routes/jobs/job/definition.js @@ -1,8 +1,18 @@ import Route from '@ember/routing/route'; +import EmberError from '@ember/error'; export default Route.extend({ model() { const job = this.modelFor('jobs.job'); + + // If there is no job, then there is no task group, so handle this as a 404 + if (!job) { + const err = new EmberError(`Job for task group ${name} not found`); + err.code = '404'; + this.controllerFor('application').set('error', err); + return; + } + return job.fetchRawDefinition().then(definition => ({ job, definition, diff --git a/ui/tests/acceptance/job-definition-test.js b/ui/tests/acceptance/job-definition-test.js index 78f65541b..18dbb3982 100644 --- a/ui/tests/acceptance/job-definition-test.js +++ b/ui/tests/acceptance/job-definition-test.js @@ -82,3 +82,18 @@ test('when changes are submitted, the site redirects to the job overview page', assert.equal(currentURL(), `/jobs/${job.id}`, 'Now on the job overview page'); }); }); + +test('when the job for the definition is not found, an error message is shown, but the URL persists', function(assert) { + Definition.visit({ id: 'not-a-real-job' }); + + andThen(() => { + assert.equal( + server.pretender.handledRequests.findBy('status', 404).url, + '/v1/job/not-a-real-job', + 'A request to the nonexistent job is made' + ); + assert.equal(currentURL(), '/jobs/not-a-real-job/definition', 'The URL persists'); + assert.ok(Definition.error.isPresent, 'Error message is shown'); + assert.equal(Definition.error.title, 'Not Found', 'Error message is for 404'); + }); +}); diff --git a/ui/tests/pages/jobs/job/definition.js b/ui/tests/pages/jobs/job/definition.js index b015019b7..16272040b 100644 --- a/ui/tests/pages/jobs/job/definition.js +++ b/ui/tests/pages/jobs/job/definition.js @@ -1,4 +1,4 @@ -import { create, isPresent, visitable, clickable } from 'ember-cli-page-object'; +import { create, isPresent, visitable, clickable, text } from 'ember-cli-page-object'; import jobEditor from 'nomad-ui/tests/pages/components/job-editor'; @@ -9,4 +9,11 @@ export default create({ editor: jobEditor(), edit: clickable('[data-test-edit-job]'), + + error: { + isPresent: isPresent('[data-test-error]'), + title: text('[data-test-error-title]'), + message: text('[data-test-error-message]'), + seekHelp: clickable('[data-test-error-message] a'), + }, });