diff --git a/ui/admin/app/controllers/scopes/scope/workers/index.js b/ui/admin/app/controllers/scopes/scope/workers/index.js new file mode 100644 index 000000000..1bf1101e6 --- /dev/null +++ b/ui/admin/app/controllers/scopes/scope/workers/index.js @@ -0,0 +1,62 @@ +import Controller from '@ember/controller'; +import { inject as service } from '@ember/service'; +import { action } from '@ember/object'; +import { loading } from 'ember-loading'; +import { confirm } from 'core/decorators/confirm'; +import { notifySuccess, notifyError } from 'core/decorators/notify'; + +export default class ScopesScopeWorkersIndexController extends Controller { + // =services + + @service router; + @service can; + + // =actions + + /** + * Rollback changes on workers. + * @param {WorkerModel} worker + */ + @action + cancel(worker) { + const { isNew } = worker; + worker.rollbackAttributes(); + if (isNew) this.router.transitionTo('scopes.scope.workers'); + } + + /** + * Save a worker in current scope. + * @param {WorkerModel} worker + * @param {Event} e + */ + @action + @loading + @notifyError(({ message }) => message) + @notifySuccess(({ isNew }) => + isNew ? 'notifications.create-success' : 'notifications.save-success', + ) + async save(worker) { + await worker.save(); + if (this.can.can('read model', worker)) { + await this.router.transitionTo('scopes.scope.workers.worker', worker); + } else { + await this.router.transitionTo('scopes.scope.workers'); + } + await this.router.refresh(); + } + + /** + * Delete worker in current scope and redirect to index. + * @param {WorkerModel} worker + */ + @action + @loading + @confirm('questions.delete-confirm') + @notifyError(({ message }) => message, { catch: true }) + @notifySuccess('notifications.delete-success') + async delete(worker) { + await worker.destroyRecord(); + await this.router.replaceWith('scopes.scope.workers'); + await this.router.refresh(); + } +} diff --git a/ui/admin/app/controllers/scopes/scope/workers/new.js b/ui/admin/app/controllers/scopes/scope/workers/new.js new file mode 100644 index 000000000..a23a42319 --- /dev/null +++ b/ui/admin/app/controllers/scopes/scope/workers/new.js @@ -0,0 +1,38 @@ +import Controller from '@ember/controller'; +import { inject as service } from '@ember/service'; +import { action } from '@ember/object'; +import { loading } from 'ember-loading'; +import { notifySuccess, notifyError } from 'core/decorators/notify'; + +export default class ScopesScopeWorkersNewController extends Controller { + // =services + + @service router; + + // =actions + + /** + * Rollback changes on workers. + * @param {WorkerModel} worker + */ + @action + async cancel(worker) { + const { isNew } = worker; + if (isNew) worker.rollbackAttributes(); + this.router.transitionTo('scopes.scope.workers'); + await this.router.refresh(); + } + + /** + * Created the worker and notifies the user of success or error. + * @param {WorkerModel} worker + * @param {string} workerGeneratedAuthToken + */ + @action + @loading + @notifyError(({ message }) => message, { catch: true }) + @notifySuccess('notifications.add-success') + async createWorkerLed(worker, workerGeneratedAuthToken) { + await worker.createWorkerLed(workerGeneratedAuthToken); + } +} diff --git a/ui/admin/app/controllers/scopes/scope/workers/worker/index.js b/ui/admin/app/controllers/scopes/scope/workers/worker/index.js new file mode 100644 index 000000000..4f05ba2fb --- /dev/null +++ b/ui/admin/app/controllers/scopes/scope/workers/worker/index.js @@ -0,0 +1,5 @@ +import Controller, { inject as controller } from '@ember/controller'; + +export default class ScopesScopeWorkersWorkerIndexController extends Controller { + @controller('scopes/scope/workers/index') workers; +} diff --git a/ui/admin/app/routes/scopes/scope/workers.js b/ui/admin/app/routes/scopes/scope/workers.js index 05dce501f..6c96955b1 100644 --- a/ui/admin/app/routes/scopes/scope/workers.js +++ b/ui/admin/app/routes/scopes/scope/workers.js @@ -6,9 +6,6 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; -import { loading } from 'ember-loading'; -import { confirm } from 'core/decorators/confirm'; -import { notifySuccess, notifyError } from 'core/decorators/notify'; export default class ScopesScopeWorkersRoute extends Route { // =services @@ -46,47 +43,4 @@ export default class ScopesScopeWorkersRoute extends Route { refresh() { return super.refresh(...arguments); } - - @action - cancel(worker) { - const { isNew } = worker; - if (isNew) worker.rollbackAttributes(); - this.router.replaceWith('scopes.scope.workers'); - this.refresh(); - } - /** - * Save a worker in current scope. - * @param {WorkerModel} worker - * @param {Event} e - */ - @action - @loading - @notifyError(({ message }) => message) - @notifySuccess(({ isNew }) => - isNew ? 'notifications.create-success' : 'notifications.save-success', - ) - async save(worker) { - await worker.save(); - if (this.can.can('read model', worker)) { - await this.router.transitionTo('scopes.scope.workers.worker', worker); - } else { - await this.router.transitionTo('scopes.scope.workers'); - } - this.refresh(); - } - - /** - * Delete worker in current scope and redirect to index. - * @param {UserModel} worker - */ - @action - @loading - @confirm('questions.delete-confirm') - @notifyError(({ message }) => message, { catch: true }) - @notifySuccess('notifications.delete-success') - async delete(worker) { - await worker.destroyRecord(); - await this.router.replaceWith('scopes.scope.workers'); - this.refresh(); - } } diff --git a/ui/admin/app/routes/scopes/scope/workers/new.js b/ui/admin/app/routes/scopes/scope/workers/new.js index 84e3247aa..028fb37b6 100644 --- a/ui/admin/app/routes/scopes/scope/workers/new.js +++ b/ui/admin/app/routes/scopes/scope/workers/new.js @@ -4,9 +4,6 @@ */ import Route from '@ember/routing/route'; -import { action } from '@ember/object'; -import { loading } from 'ember-loading'; -import { notifyError, notifySuccess } from 'core/decorators/notify'; import { inject as service } from '@ember/service'; export default class ScopesScopeWorkersNewRoute extends Route { @@ -42,17 +39,4 @@ export default class ScopesScopeWorkersNewRoute extends Route { record.scopeModel = scopeModel; return record; } - - /** - * Created the worker and notifies the user of success or error. - * @param {WorkerModel} worker - * @param {string} workerGeneratedAuthToken - */ - @action - @loading - @notifyError(({ message }) => message, { catch: true }) - @notifySuccess('notifications.add-success') - async createWorkerLed(worker, workerGeneratedAuthToken) { - await worker.createWorkerLed(workerGeneratedAuthToken); - } } diff --git a/ui/admin/app/routes/scopes/scope/workers/worker/index.js b/ui/admin/app/routes/scopes/scope/workers/worker/index.js deleted file mode 100644 index 8304e21af..000000000 --- a/ui/admin/app/routes/scopes/scope/workers/worker/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - * SPDX-License-Identifier: BUSL-1.1 - */ - -import Route from '@ember/routing/route'; -import { action } from '@ember/object'; - -export default class ScopesScopeWorkersWorkerIndexRoute extends Route { - @action - cancel(worker) { - worker.rollbackAttributes(); - this.refresh(); - } -} diff --git a/ui/admin/app/templates/scopes/scope/workers/new.hbs b/ui/admin/app/templates/scopes/scope/workers/new.hbs index 5d0ae0f03..c1f9b609f 100644 --- a/ui/admin/app/templates/scopes/scope/workers/new.hbs +++ b/ui/admin/app/templates/scopes/scope/workers/new.hbs @@ -24,8 +24,8 @@ diff --git a/ui/admin/app/templates/scopes/scope/workers/worker/index.hbs b/ui/admin/app/templates/scopes/scope/workers/worker/index.hbs index f8e7009b0..b3bb0260c 100644 --- a/ui/admin/app/templates/scopes/scope/workers/worker/index.hbs +++ b/ui/admin/app/templates/scopes/scope/workers/worker/index.hbs @@ -36,7 +36,7 @@ {{t 'resources.worker.actions.delete'}} @@ -47,8 +47,8 @@ diff --git a/ui/admin/tests/unit/controllers/scopes/scope/workers/index-test.js b/ui/admin/tests/unit/controllers/scopes/scope/workers/index-test.js new file mode 100644 index 000000000..2a5ac85c7 --- /dev/null +++ b/ui/admin/tests/unit/controllers/scopes/scope/workers/index-test.js @@ -0,0 +1,77 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import { visit } from '@ember/test-helpers'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; +import { authenticateSession } from 'ember-simple-auth/test-support'; + +module('Unit | Controller | scopes/scope/workers/index', function (hooks) { + setupTest(hooks); + setupMirage(hooks); + + let store; + let controller; + let getWorkerCount; + + const instances = { + scopes: { + global: null, + }, + worker: null, + }; + + const urls = { + globalScope: null, + workers: null, + }; + + hooks.beforeEach(function () { + authenticateSession({}); + store = this.owner.lookup('service:store'); + controller = this.owner.lookup('controller:scopes/scope/workers/index'); + + instances.scopes.global = this.server.create('scope', { id: 'global' }); + instances.worker = this.server.create('worker', { + scope: instances.scopes.global, + }); + + urls.globalScope = `/scopes/global`; + urls.workers = `${urls.globalScope}/workers`; + + getWorkerCount = () => this.server.schema.workers.all().models.length; + }); + + test('it exists', function (assert) { + assert.ok(controller); + }); + + test('cancel action rolls-back changes on the specified model', async function (assert) { + await visit(urls.workers); + const worker = await store.findRecord('worker', instances.worker.id); + worker.name = 'test'; + + assert.strictEqual(worker.name, 'test'); + + await controller.cancel(worker); + + assert.notEqual(worker.name, 'test'); + }); + + test('save action saves changes on the specified model', async function (assert) { + await visit(urls.workers); + const worker = await store.findRecord('worker', instances.worker.id); + worker.name = 'test'; + + await controller.save(worker); + + assert.strictEqual(worker.name, 'test'); + }); + + test('delete action destroys specified model', async function (assert) { + const worker = await store.findRecord('worker', instances.worker.id); + const workerCount = getWorkerCount(); + + await controller.delete(worker); + + assert.strictEqual(getWorkerCount(), workerCount - 1); + }); +}); diff --git a/ui/admin/tests/unit/controllers/scopes/scope/workers/new-test.js b/ui/admin/tests/unit/controllers/scopes/scope/workers/new-test.js new file mode 100644 index 000000000..1713026f1 --- /dev/null +++ b/ui/admin/tests/unit/controllers/scopes/scope/workers/new-test.js @@ -0,0 +1,65 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import { visit } from '@ember/test-helpers'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; +import { authenticateSession } from 'ember-simple-auth/test-support'; + +module('Unit | Controller | scopes/scope/workers/new', function (hooks) { + setupTest(hooks); + setupMirage(hooks); + + let store; + let controller; + + const instances = { + scopes: { + global: null, + }, + worker: null, + }; + + const urls = { + globalScope: null, + workers: null, + }; + + hooks.beforeEach(function () { + authenticateSession({}); + store = this.owner.lookup('service:store'); + controller = this.owner.lookup('controller:scopes/scope/workers/new'); + + instances.scopes.global = this.server.create('scope', { id: 'global' }); + instances.worker = this.server.create('worker', { + scope: instances.scopes.global, + }); + + urls.globalScope = `/scopes/global`; + urls.workers = `${urls.globalScope}/workers`; + }); + + test('it exists', function (assert) { + assert.ok(controller); + }); + + test('cancel action rolls-back changes on a new model', async function (assert) { + await visit(urls.workers); + const worker = store.createRecord('worker', instances.worker.id); + worker.name = 'test'; + + assert.strictEqual(worker.name, 'test'); + + await controller.cancel(worker); + + assert.notEqual(worker.name, 'test'); + }); + + test('createWorkerLed action saves changes on the specified model', async function (assert) { + await visit(urls.workers); + const worker = await store.findRecord('worker', instances.worker.id); + worker.name = 'test'; + + await controller.createWorkerLed(worker); + + assert.strictEqual(worker.name, 'test'); + }); +}); diff --git a/ui/admin/tests/unit/routes/scopes/scope/workers/worker/index-test.js b/ui/admin/tests/unit/routes/scopes/scope/workers/worker/index-test.js deleted file mode 100644 index 3a1643eee..000000000 --- a/ui/admin/tests/unit/routes/scopes/scope/workers/worker/index-test.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - * SPDX-License-Identifier: BUSL-1.1 - */ - -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module('Unit | Route | scopes/scope/workers/worker/index', function (hooks) { - setupTest(hooks); - - test('it exists', function (assert) { - let route = this.owner.lookup('route:scopes/scope/workers/worker/index'); - assert.ok(route); - }); -});