From 1d19d825f2928d290878a7532ed7cf6ab64d37fa Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Thu, 19 Apr 2018 14:21:25 -0700 Subject: [PATCH] Move job-page helpers and repeat stop tests on the service type --- ui/tests/integration/job-page/helpers.js | 51 ++++++++++++ .../integration/job-page/periodic-test.js | 58 ++----------- ui/tests/integration/job-page/service-test.js | 82 +++++++++++++++++++ 3 files changed, 138 insertions(+), 53 deletions(-) create mode 100644 ui/tests/integration/job-page/helpers.js create mode 100644 ui/tests/integration/job-page/service-test.js diff --git a/ui/tests/integration/job-page/helpers.js b/ui/tests/integration/job-page/helpers.js new file mode 100644 index 00000000000..ef64e86af45 --- /dev/null +++ b/ui/tests/integration/job-page/helpers.js @@ -0,0 +1,51 @@ +import { click, find } from 'ember-native-dom-helpers'; +import wait from 'ember-test-helpers/wait'; + +export function jobURL(job, path = '') { + const id = job.get('plainId'); + const namespace = job.get('namespace.name') || 'default'; + let expectedURL = `/v1/job/${id}${path}`; + if (namespace !== 'default') { + expectedURL += `?namespace=${namespace}`; + } + return expectedURL; +} + +export function stopJob() { + click('[data-test-stop] [data-test-idle-button]'); + return wait().then(() => { + click('[data-test-stop] [data-test-confirm-button]'); + return wait(); + }); +} + +export function expectStopError(assert) { + return () => { + assert.equal( + find('[data-test-job-error-title]').textContent, + 'Could Not Stop Job', + 'Appropriate error is shown' + ); + assert.ok( + find('[data-test-job-error-body]').textContent.includes('ACL'), + 'The error message mentions ACLs' + ); + + click('[data-test-job-error-close]'); + assert.notOk(find('[data-test-job-error-title]'), 'Error message is dismissable'); + return wait(); + }; +} + +export function expectDeleteRequest(assert, server, job) { + const expectedURL = jobURL(job); + + assert.ok( + server.pretender.handledRequests + .filterBy('method', 'DELETE') + .find(req => req.url === expectedURL), + 'DELETE URL was made correctly' + ); + + return wait(); +} diff --git a/ui/tests/integration/job-page/periodic-test.js b/ui/tests/integration/job-page/periodic-test.js index 76f8ede6eea..ba93d1a51ad 100644 --- a/ui/tests/integration/job-page/periodic-test.js +++ b/ui/tests/integration/job-page/periodic-test.js @@ -4,6 +4,7 @@ import { click, find, findAll } from 'ember-native-dom-helpers'; import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; +import { jobURL, stopJob, expectStopError, expectDeleteRequest } from './helpers'; moduleForComponent('job-page/periodic', 'Integration | Component | job-page/periodic', { integration: true, @@ -68,7 +69,7 @@ test('Clicking Force Launch launches a new periodic child job', function(assert) const expectedURL = jobURL(job, '/periodic/force'); assert.ok( - server.pretender.handledRequests + this.server.pretender.handledRequests .filterBy('method', 'POST') .find(req => req.url === expectedURL), 'POST URL was correct' @@ -81,7 +82,7 @@ test('Clicking Force Launch launches a new periodic child job', function(assert) }); test('Clicking force launch without proper permissions shows an error message', function(assert) { - server.pretender.post('/v1/job/:id/periodic/force', () => [403, {}, null]); + this.server.pretender.post('/v1/job/:id/periodic/force', () => [403, {}, null]); this.server.create('job', 'periodic', { id: 'parent', @@ -142,11 +143,11 @@ test('Stopping a job sends a delete request for the job', function(assert) { return wait(); }) .then(stopJob) - .then(() => expectDeleteRequest(assert, job)); + .then(() => expectDeleteRequest(assert, this.server, job)); }); test('Stopping a job without proper permissions shows an error message', function(assert) { - server.pretender.delete('/v1/job/:id', () => [403, {}, null]); + this.server.pretender.delete('/v1/job/:id', () => [403, {}, null]); const mirageJob = this.server.create('job', 'periodic', { childrenCount: 0, @@ -168,52 +169,3 @@ test('Stopping a job without proper permissions shows an error message', functio .then(stopJob) .then(expectStopError(assert)); }); - -function expectDeleteRequest(assert, job) { - const expectedURL = jobURL(job); - - assert.ok( - server.pretender.handledRequests - .filterBy('method', 'DELETE') - .find(req => req.url === expectedURL), - 'DELETE URL was made correctly' - ); - - return wait(); -} - -function jobURL(job, path = '') { - const id = job.get('plainId'); - const namespace = job.get('namespace.name') || 'default'; - let expectedURL = `/v1/job/${id}${path}`; - if (namespace !== 'default') { - expectedURL += `?namespace=${namespace}`; - } - return expectedURL; -} - -function stopJob() { - click('[data-test-stop] [data-test-idle-button]'); - return wait().then(() => { - click('[data-test-stop] [data-test-confirm-button]'); - return wait(); - }); -} - -function expectStopError(assert) { - return () => { - assert.equal( - find('[data-test-job-error-title]').textContent, - 'Could Not Stop Job', - 'Appropriate error is shown' - ); - assert.ok( - find('[data-test-job-error-body]').textContent.includes('ACL'), - 'The error message mentions ACLs' - ); - - click('[data-test-job-error-close]'); - assert.notOk(find('[data-test-job-error-title]'), 'Error message is dismissable'); - return wait(); - }; -} diff --git a/ui/tests/integration/job-page/service-test.js b/ui/tests/integration/job-page/service-test.js new file mode 100644 index 00000000000..5b9bf69f345 --- /dev/null +++ b/ui/tests/integration/job-page/service-test.js @@ -0,0 +1,82 @@ +import { getOwner } from '@ember/application'; +import { test, moduleForComponent } from 'ember-qunit'; +import wait from 'ember-test-helpers/wait'; +import hbs from 'htmlbars-inline-precompile'; +import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; +import { stopJob, expectStopError, expectDeleteRequest } from './helpers'; + +moduleForComponent('job-page/service', 'Integration | Component | job-page/service', { + integration: true, + beforeEach() { + window.localStorage.clear(); + this.store = getOwner(this).lookup('service:store'); + this.server = startMirage(); + this.server.create('namespace'); + }, + afterEach() { + this.server.shutdown(); + window.localStorage.clear(); + }, +}); + +const commonTemplate = hbs` + {{job-page/service + job=job + sortProperty=sortProperty + sortDescending=sortDescending + currentPage=currentPage + gotoJob=gotoJob}} +`; + +const commonProperties = job => ({ + job, + sortProperty: 'name', + sortDescending: true, + currentPage: 1, + gotoJob() {}, +}); + +const makeMirageJob = server => + server.create('job', { + type: 'service', + createAllocations: false, + status: 'running', + }); + +test('Stopping a job sends a delete request for the job', function(assert) { + let job; + + const mirageJob = makeMirageJob(this.server); + this.store.findAll('job'); + + return wait() + .then(() => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + + this.setProperties(commonProperties(job)); + this.render(commonTemplate); + + return wait(); + }) + .then(stopJob) + .then(() => expectDeleteRequest(assert, this.server, job)); +}); + +test('Stopping a job without proper permissions shows an error message', function(assert) { + this.server.pretender.delete('/v1/job/:id', () => [403, {}, null]); + + const mirageJob = makeMirageJob(this.server); + this.store.findAll('job'); + + return wait() + .then(() => { + const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + + this.setProperties(commonProperties(job)); + this.render(commonTemplate); + + return wait(); + }) + .then(stopJob) + .then(expectStopError(assert)); +});