test: 💍 Add acceptance test for updating an spk credential (#1273)
* test: 💍 Add acceptance test for updating an spk credential ✅ Closes: ICU-5652
This commit is contained in:
1 parent
069a864cbb
commit
0ae2451b9c
1 file changed
+208
-47
@@ -17,6 +17,9 @@ module(
|
||||
org: null,
|
||||
project: null,
|
||||
},
|
||||
staticCredentialStore: null,
|
||||
usernamePasswordCredential: null,
|
||||
usernameKeyPairCredential: null,
|
||||
};
|
||||
|
||||
const urls = {
|
||||
@@ -24,7 +27,8 @@ module(
|
||||
credentialStores: null,
|
||||
staticCredentialStore: null,
|
||||
credentials: null,
|
||||
credential: null,
|
||||
usernamePasswordCredential: null,
|
||||
usernameKeyPairCredential: null,
|
||||
};
|
||||
|
||||
hooks.beforeEach(function () {
|
||||
@@ -42,59 +46,113 @@ 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}`;
|
||||
authenticateSession({});
|
||||
});
|
||||
|
||||
test('can save changes to existing credential', async function (assert) {
|
||||
test('can save changes to existing username & password credential', async function (assert) {
|
||||
assert.expect(3);
|
||||
assert.notEqual(instances.credential.name, 'random string');
|
||||
await visit(urls.credential);
|
||||
const mockInput = 'random string';
|
||||
assert.notEqual(instances.usernamePasswordCredential.name, mockInput);
|
||||
await visit(urls.usernamePasswordCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
await fillIn('[name="name"]', 'random string');
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
await click('.rose-form-actions [type="submit"]');
|
||||
assert.strictEqual(currentURL(), urls.credential);
|
||||
assert.strictEqual(currentURL(), urls.usernamePasswordCredential);
|
||||
assert.strictEqual(
|
||||
this.server.schema.credentials.all().models[0].name,
|
||||
'random string'
|
||||
this.server.schema.credentials.where({ type: 'username_password' })
|
||||
.models[0].name,
|
||||
mockInput
|
||||
);
|
||||
});
|
||||
|
||||
test('cannot make changes to an existing credential without proper authorization', async function (assert) {
|
||||
test('can save changes to existing username & key pair credential', async function (assert) {
|
||||
assert.expect(3);
|
||||
const mockInput = 'random string';
|
||||
assert.notEqual(instances.usernameKeyPairCredential.name, mockInput);
|
||||
await visit(urls.usernameKeyPairCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
await click('.rose-form-actions [type="submit"]');
|
||||
assert.strictEqual(currentURL(), urls.usernameKeyPairCredential);
|
||||
assert.strictEqual(
|
||||
this.server.schema.credentials.where({ type: 'ssh_private_key' })
|
||||
.models[0].name,
|
||||
mockInput
|
||||
);
|
||||
});
|
||||
|
||||
test('cannot make changes to an existing username & password credential without proper authorization', async function (assert) {
|
||||
assert.expect(1);
|
||||
instances.credential.authorized_actions =
|
||||
instances.credential.authorized_actions.filter(
|
||||
instances.usernamePasswordCredential.authorized_actions =
|
||||
instances.usernamePasswordCredential.authorized_actions.filter(
|
||||
(item) => item !== 'update'
|
||||
);
|
||||
await visit(urls.credential);
|
||||
assert.notOk(find('.rose-layout-page-actions .rose-button-secondary'));
|
||||
await visit(urls.usernamePasswordCredential);
|
||||
assert
|
||||
.dom('.rose-layout-page-actions .rose-button-secondary')
|
||||
.doesNotExist();
|
||||
});
|
||||
|
||||
test('can cancel changes to existing credential', async function (assert) {
|
||||
test('cannot make changes to an existing username & key pair credential without proper authorization', async function (assert) {
|
||||
assert.expect(1);
|
||||
instances.usernameKeyPairCredential.authorized_actions =
|
||||
instances.usernameKeyPairCredential.authorized_actions.filter(
|
||||
(item) => item !== 'update'
|
||||
);
|
||||
await visit(urls.usernameKeyPairCredential);
|
||||
assert
|
||||
.dom('.rose-layout-page-actions .rose-button-secondary')
|
||||
.doesNotExist();
|
||||
});
|
||||
|
||||
test('can cancel changes to existing username & password credential', async function (assert) {
|
||||
assert.expect(2);
|
||||
await visit(urls.credential);
|
||||
const mockInput = 'random string';
|
||||
await visit(urls.usernamePasswordCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
await fillIn('[name="name"]', 'random string');
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
await click('.rose-form-actions [type="button"]');
|
||||
assert.notEqual(instances.credential.name, 'random string');
|
||||
assert.notEqual(instances.usernamePasswordCredential.name, mockInput);
|
||||
assert.strictEqual(
|
||||
find('[name="name"]').value,
|
||||
instances.credential.name
|
||||
instances.usernamePasswordCredential.name
|
||||
);
|
||||
});
|
||||
|
||||
test('saving an existing credential with invalid fields displays error message', async function (assert) {
|
||||
test('can cancel changes to existing username & key pair credential', async function (assert) {
|
||||
assert.expect(2);
|
||||
const mockInput = 'random string';
|
||||
await visit(urls.usernameKeyPairCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
await click('.rose-form-actions [type="button"]');
|
||||
assert.notEqual(instances.usernameKeyPairCredential.name, mockInput);
|
||||
assert.strictEqual(
|
||||
find('[name="name"]').value,
|
||||
instances.usernameKeyPairCredential.name
|
||||
);
|
||||
});
|
||||
|
||||
test('saving an existing username & password credential with invalid fields displays error message', async function (assert) {
|
||||
assert.expect(2);
|
||||
const mockInput = 'random string';
|
||||
this.server.patch('/credentials/:id', () => {
|
||||
return new Response(
|
||||
400,
|
||||
@@ -114,9 +172,9 @@ module(
|
||||
}
|
||||
);
|
||||
});
|
||||
await visit(urls.credential);
|
||||
await visit(urls.usernamePasswordCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
await fillIn('[name="name"]', 'random string');
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
await click('[type="submit"]');
|
||||
assert.ok(
|
||||
find('[role="alert"]').textContent.trim(),
|
||||
@@ -128,57 +186,160 @@ module(
|
||||
);
|
||||
});
|
||||
|
||||
test('can discard unsaved credential changes via dialog', async function (assert) {
|
||||
test('saving an existing username & key pair credential with invalid fields displays error message', async function (assert) {
|
||||
assert.expect(2);
|
||||
const mockInput = 'random string';
|
||||
this.server.patch('/credentials/:id', () => {
|
||||
return new Response(
|
||||
400,
|
||||
{},
|
||||
{
|
||||
status: 400,
|
||||
code: 'invalid_argument',
|
||||
message: 'Error in provided request.',
|
||||
details: {
|
||||
request_fields: [
|
||||
{
|
||||
name: 'name',
|
||||
description: 'Name is required.',
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
);
|
||||
});
|
||||
await visit(urls.usernameKeyPairCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
await click('[type="submit"]');
|
||||
assert.ok(
|
||||
find('[role="alert"]').textContent.trim(),
|
||||
'Error in provided request.'
|
||||
);
|
||||
assert.ok(
|
||||
find('.rose-form-error-message').textContent.trim(),
|
||||
'Name is required.'
|
||||
);
|
||||
});
|
||||
|
||||
test('can discard unsaved username & password credential changes via dialog', async function (assert) {
|
||||
assert.expect(5);
|
||||
const mockInput = 'random string';
|
||||
const confirmService = this.owner.lookup('service:confirm');
|
||||
confirmService.enabled = true;
|
||||
assert.notEqual(instances.credential.name, 'random string');
|
||||
await visit(urls.credential);
|
||||
assert.notEqual(instances.usernamePasswordCredential.name, mockInput);
|
||||
await visit(urls.usernamePasswordCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
await fillIn('[name="name"]', 'random string');
|
||||
assert.strictEqual(currentURL(), urls.credential);
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
assert.strictEqual(currentURL(), urls.usernamePasswordCredential);
|
||||
try {
|
||||
await visit(urls.credentials);
|
||||
} catch (e) {
|
||||
assert.ok(find('.rose-dialog'));
|
||||
assert.dom('.rose-dialog').isVisible();
|
||||
await click('.rose-dialog-footer button:first-child', 'Click Discard');
|
||||
assert.strictEqual(currentURL(), urls.credentials);
|
||||
assert.notEqual(
|
||||
this.server.schema.credentials.all().models[0].name,
|
||||
'random string'
|
||||
this.server.schema.credentials.where({ type: 'username_password' })
|
||||
.models[0].name,
|
||||
mockInput
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('can cancel discard unsaved credential changes via dialog', async function (assert) {
|
||||
test('can discard unsaved username & key pair credential changes via dialog', async function (assert) {
|
||||
assert.expect(5);
|
||||
const mockInput = 'random string';
|
||||
const confirmService = this.owner.lookup('service:confirm');
|
||||
confirmService.enabled = true;
|
||||
assert.notEqual(instances.credential.name, 'random string');
|
||||
await visit(urls.credential);
|
||||
assert.notEqual(instances.usernameKeyPairCredential.name, mockInput);
|
||||
await visit(urls.usernameKeyPairCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
await fillIn('[name="name"]', 'random string');
|
||||
assert.strictEqual(currentURL(), urls.credential);
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
assert.strictEqual(currentURL(), urls.usernameKeyPairCredential);
|
||||
try {
|
||||
await visit(urls.credentials);
|
||||
} catch (e) {
|
||||
assert.ok(find('.rose-dialog'));
|
||||
await click('.rose-dialog-footer button:last-child', 'Click Cancel');
|
||||
assert.strictEqual(currentURL(), urls.credential);
|
||||
assert.dom('.rose-dialog').isVisible();
|
||||
await click('.rose-dialog-footer button:first-child', 'Click Discard');
|
||||
assert.strictEqual(currentURL(), urls.credentials);
|
||||
assert.notEqual(
|
||||
this.server.schema.credentials.all().models[0].name,
|
||||
'random string'
|
||||
this.server.schema.credentials.where({ type: 'ssh_private_key' })
|
||||
.models[0].name,
|
||||
mockInput
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('password field renders in edit mode only for a credential', async function (assert) {
|
||||
assert.expect(3);
|
||||
await visit(urls.credential);
|
||||
assert.notOk(find('[name="password"]'));
|
||||
test('can cancel discard unsaved username & password credential changes via dialog', async function (assert) {
|
||||
assert.expect(6);
|
||||
const mockInput = 'random string';
|
||||
const confirmService = this.owner.lookup('service:confirm');
|
||||
confirmService.enabled = true;
|
||||
assert.notEqual(instances.usernamePasswordCredential.name, mockInput);
|
||||
await visit(urls.usernamePasswordCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
assert.strictEqual(currentURL(), urls.credential);
|
||||
assert.ok(find('[name="password"]'));
|
||||
const credentialName = find('[name="name"]').value;
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
assert.strictEqual(currentURL(), urls.usernamePasswordCredential);
|
||||
try {
|
||||
await visit(urls.credentials);
|
||||
} catch (e) {
|
||||
assert.dom('.rose-dialog').isVisible();
|
||||
await click('.rose-dialog-footer button:last-child', 'Click Cancel');
|
||||
assert.strictEqual(currentURL(), urls.usernamePasswordCredential);
|
||||
assert.strictEqual(find('[name="name"]').value, mockInput);
|
||||
assert.strictEqual(
|
||||
this.server.schema.credentials.where({ type: 'username_password' })
|
||||
.models[0].name,
|
||||
credentialName
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('can cancel discard unsaved username & key pair credential changes via dialog', async function (assert) {
|
||||
assert.expect(6);
|
||||
const mockInput = 'random string';
|
||||
const confirmService = this.owner.lookup('service:confirm');
|
||||
confirmService.enabled = true;
|
||||
assert.notEqual(instances.usernameKeyPairCredential.name, mockInput);
|
||||
await visit(urls.usernameKeyPairCredential);
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
const credentialName = find('[name="name"]').value;
|
||||
await fillIn('[name="name"]', mockInput);
|
||||
assert.strictEqual(currentURL(), urls.usernameKeyPairCredential);
|
||||
try {
|
||||
await visit(urls.credentials);
|
||||
} catch (e) {
|
||||
assert.dom('.rose-dialog').isVisible();
|
||||
await click('.rose-dialog-footer button:last-child', 'Click Cancel');
|
||||
assert.strictEqual(currentURL(), urls.usernameKeyPairCredential);
|
||||
assert.strictEqual(find('[name="name"]').value, mockInput);
|
||||
assert.strictEqual(
|
||||
this.server.schema.credentials.where({ type: 'ssh_private_key' })
|
||||
.models[0].name,
|
||||
credentialName
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('password field renders in edit mode only for a username & password credential', async function (assert) {
|
||||
assert.expect(3);
|
||||
await visit(urls.usernamePasswordCredential);
|
||||
assert.dom('[name="password"]').doesNotExist();
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
assert.strictEqual(currentURL(), urls.usernamePasswordCredential);
|
||||
assert.dom('[name="password"]').isVisible();
|
||||
});
|
||||
|
||||
test('private_key and passphrase fields render in edit mode only for a username & key pair credential', async function (assert) {
|
||||
assert.expect(5);
|
||||
await visit(urls.usernameKeyPairCredential);
|
||||
assert.dom('[name="private_key"]').doesNotExist();
|
||||
assert.dom('[name="passphrase"]').doesNotExist();
|
||||
await click('form [type="button"]', 'Activate edit mode');
|
||||
assert.strictEqual(currentURL(), urls.usernameKeyPairCredential);
|
||||
assert.dom('[name="private_key"]').isVisible();
|
||||
assert.dom('[name="passphrase"]').isVisible();
|
||||
});
|
||||
}
|
||||
);
|
||||
Reference in new issue
Block a user