test: 💍 Add acceptance tests for deleting an spk credential (#1274)

✅ Closes: ICU-5654

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
This commit is contained in:
lisbet-alvarezandZhihe Li authored and GitHub committed 2022-08-30 13:01:38 -07:00
1 parent f1f7be4067
commit cb3104a624
1 file changed
+145 -35
@@ -3,8 +3,6 @@ import { setupApplicationTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
import { authenticateSession } from 'ember-simple-auth/test-support';
import { click, currentURL, visit, find } from '@ember/test-helpers';
import { resolve, reject } from 'rsvp';
import sinon from 'sinon';
import { Response } from 'miragejs';
module(
@@ -13,7 +11,8 @@ module(
setupApplicationTest(hooks);
setupMirage(hooks);
let getCredentialsCount;
let getUsernamePasswordCredentialCount;
let getUsernameKeyPairCredentialCount;
const instances = {
scopes: {
@@ -27,7 +26,8 @@ module(
credentialStores: null,
staticCredentialStore: null,
credentials: null,
credential: null,
usernamePasswordCredential: null,
usernameKeyPairCredential: null,
};
hooks.beforeEach(function () {
@@ -44,73 +44,165 @@ module(
scope: instances.scopes.project,
type: 'static',
});
instances.credential = this.server.create('credential', {
instances.usernamePasswordCredential = this.server.create('credential', {
scope: instances.scopes.project,
credentialStore: instances.staticCredentialStore,
type: 'username_password',
});
instances.usernameKeyPairCredential = this.server.create('credential', {
scope: instances.scopes.project,
credentialStore: instances.staticCredentialStore,
type: 'ssh_private_key',
});
// Generate route URLs for resources
urls.projectScope = `/scopes/${instances.scopes.project.id}`;
urls.credentialStores = `${urls.projectScope}/credential-stores`;
urls.staticCredentialStore = `${urls.credentialStores}/${instances.staticCredentialStore.id}`;
urls.credentials = `${urls.staticCredentialStore}/credentials`;
urls.credential = `${urls.credentials}/${instances.credential.id}`;
urls.usernamePasswordCredential = `${urls.credentials}/${instances.usernamePasswordCredential.id}`;
urls.usernameKeyPairCredential = `${urls.credentials}/${instances.usernameKeyPairCredential.id}`;
// Generate resource counter
getCredentialsCount = () => {
return this.server.schema.credentials.all().models.length;
getUsernamePasswordCredentialCount = () => {
return this.server.schema.credentials.where({
type: 'username_password',
}).length;
};
getUsernameKeyPairCredentialCount = () => {
return this.server.schema.credentials.where({ type: 'ssh_private_key' })
.length;
};
authenticateSession({});
});
test('can delete credential', async function (assert) {
test('can delete username & password credential', async function (assert) {
assert.expect(2);
const credentialsCount = getCredentialsCount();
await visit(urls.credential);
const usernamePasswordCredentialCount =
getUsernamePasswordCredentialCount();
await visit(urls.usernamePasswordCredential);
await click('.rose-layout-page-actions .rose-dropdown-button-danger');
assert.strictEqual(currentURL(), urls.credentials);
assert.strictEqual(getCredentialsCount(), credentialsCount - 1);
assert.strictEqual(
getUsernamePasswordCredentialCount(),
usernamePasswordCredentialCount - 1
);
});
test('cannot delete a credential store without proper authorization', async function (assert) {
test('can delete username & key pair credential', async function (assert) {
assert.expect(2);
const usernameKeyPairCredentialCount =
getUsernameKeyPairCredentialCount();
await visit(urls.usernameKeyPairCredential);
await click('.rose-layout-page-actions .rose-dropdown-button-danger');
assert.strictEqual(currentURL(), urls.credentials);
assert.strictEqual(
getUsernameKeyPairCredentialCount(),
usernameKeyPairCredentialCount - 1
);
});
test('cannot delete a username & password credential without proper authorization', async function (assert) {
assert.expect(3);
const credentialsCount = getCredentialsCount();
instances.credential.authorized_actions =
instances.credential.authorized_actions.filter(
const usernamePasswordCredentialCount =
getUsernamePasswordCredentialCount();
instances.usernamePasswordCredential.authorized_actions =
instances.usernamePasswordCredential.authorized_actions.filter(
(item) => item !== 'delete'
);
await visit(urls.credential);
assert.strictEqual(currentURL(), urls.credential);
assert.notOk(
find('.rose-layout-page-actions .rose-dropdown-button-danger')
await visit(urls.usernamePasswordCredential);
assert.strictEqual(currentURL(), urls.usernamePasswordCredential);
assert
.dom('.rose-layout-page-actions .rose-dropdown-button-danger')
.doesNotExist();
assert.strictEqual(
getUsernamePasswordCredentialCount(),
usernamePasswordCredentialCount
);
assert.strictEqual(getCredentialsCount(), credentialsCount);
});
test('can accept delete credential via dialog', async function (assert) {
test('cannot delete a username & key pair credential without proper authorization', async function (assert) {
assert.expect(3);
const usernameKeyPairCredentialCount =
getUsernameKeyPairCredentialCount();
instances.usernameKeyPairCredential.authorized_actions =
instances.usernameKeyPairCredential.authorized_actions.filter(
(item) => item !== 'delete'
);
await visit(urls.usernameKeyPairCredential);
assert.strictEqual(currentURL(), urls.usernameKeyPairCredential);
assert
.dom('.rose-layout-page-actions .rose-dropdown-button-danger')
.doesNotExist();
assert.strictEqual(
getUsernamePasswordCredentialCount(),
usernameKeyPairCredentialCount
);
});
test('can accept delete username & password credential via dialog', async function (assert) {
assert.expect(2);
const confirmService = this.owner.lookup('service:confirm');
confirmService.enabled = true;
confirmService.confirm = sinon.fake.returns(resolve());
const credentialsCount = getCredentialsCount();
await visit(urls.credential);
const usernamePasswordCredentialCount =
getUsernamePasswordCredentialCount();
await visit(urls.usernamePasswordCredential);
await click('.rose-layout-page-actions .rose-dropdown-button-danger');
assert.strictEqual(getCredentialsCount(), credentialsCount - 1);
assert.ok(confirmService.confirm.calledOnce);
await click('.rose-dialog footer .rose-button-primary');
assert.strictEqual(currentURL(), urls.credentials);
assert.strictEqual(
getUsernamePasswordCredentialCount(),
usernamePasswordCredentialCount - 1
);
});
test('cannot cancel delete credential via dialog', async function (assert) {
test('can accept delete username & key pair credential via dialog', async function (assert) {
assert.expect(2);
const confirmService = this.owner.lookup('service:confirm');
confirmService.enabled = true;
confirmService.confirm = sinon.fake.returns(reject());
const credentialsCount = getCredentialsCount();
await visit(urls.credential);
const usernameKeyPairCredentialCount =
getUsernameKeyPairCredentialCount();
await visit(urls.usernameKeyPairCredential);
await click('.rose-layout-page-actions .rose-dropdown-button-danger');
assert.strictEqual(getCredentialsCount(), credentialsCount);
assert.ok(confirmService.confirm.calledOnce);
await click('.rose-dialog footer .rose-button-primary');
assert.strictEqual(currentURL(), urls.credentials);
assert.strictEqual(
getUsernameKeyPairCredentialCount(),
usernameKeyPairCredentialCount - 1
);
});
test('deleting a credential which errors displays error message', async function (assert) {
test('can cancel delete username & password credential via dialog', async function (assert) {
assert.expect(2);
const confirmService = this.owner.lookup('service:confirm');
confirmService.enabled = true;
const usernamePasswordCredentialCount =
getUsernamePasswordCredentialCount();
await visit(urls.usernamePasswordCredential);
await click('.rose-layout-page-actions .rose-dropdown-button-danger');
await click('.rose-dialog footer .rose-button-secondary');
assert.strictEqual(currentURL(), urls.usernamePasswordCredential);
assert.strictEqual(
getUsernamePasswordCredentialCount(),
usernamePasswordCredentialCount
);
});
test('can cancel delete username & key pair credential via dialog', async function (assert) {
assert.expect(2);
const confirmService = this.owner.lookup('service:confirm');
confirmService.enabled = true;
const usernameKeyPairCredentialCount =
getUsernameKeyPairCredentialCount();
await visit(urls.usernameKeyPairCredential);
await click('.rose-layout-page-actions .rose-dropdown-button-danger');
await click('.rose-dialog footer .rose-button-secondary');
assert.strictEqual(currentURL(), urls.usernameKeyPairCredential);
assert.strictEqual(
getUsernameKeyPairCredentialCount(),
usernameKeyPairCredentialCount
);
});
test('deleting a username & password credential which errors displays error message', async function (assert) {
assert.expect(1);
this.server.del('/credentials/:id', () => {
return new Response(
@@ -123,7 +215,25 @@ module(
}
);
});
await visit(urls.credential);
await visit(urls.usernamePasswordCredential);
await click('.rose-layout-page-actions .rose-dropdown-button-danger');
assert.ok(find('[role="alert"]').textContent.trim(), 'Oops.');
});
test('deleting a username & key pair credential which errors displays error message', async function (assert) {
assert.expect(1);
this.server.del('/credentials/:id', () => {
return new Response(
490,
{},
{
status: 490,
code: 'error',
message: 'Oops.',
}
);
});
await visit(urls.usernameKeyPairCredential);
await click('.rose-layout-page-actions .rose-dropdown-button-danger');
assert.ok(find('[role="alert"]').textContent.trim(), 'Oops.');
});