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);
- });
-});