/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import sinon from 'sinon';
import { module, test } from 'qunit';
import { setupRenderingTest } from 'vault/tests/helpers';
import { click, fillIn, render, settled } from '@ember/test-helpers';
import { hbs } from 'ember-cli-htmlbars';
import Service from '@ember/service';
import { run } from '@ember/runloop';
import { reject, resolve } from 'rsvp';
import { SHAMIR_FORM } from 'vault/tests/helpers/components/shamir';
const licenseError = { httpStatus: 500, errors: ['failed because licensing is in an invalid state'] };
const response = {
progress: 1,
required: 3,
complete: false,
};
const adapter = {
foo() {
return resolve(response);
},
responseWithErrors() {
return reject({ httpStatus: 400, errors: ['something is wrong', 'seriously wrong'] });
},
responseWithLicense() {
return reject(licenseError);
},
};
const storeStub = Service.extend({
adapterFor() {
return adapter;
},
});
// Checks that the correct data were passed around happens in the integration test
// this one is checking that things happen at the right time
module('Integration | Component | shamir/flow', function (hooks) {
setupRenderingTest(hooks);
hooks.beforeEach(function () {
this.keyPart = 'some-key-partition';
run(() => {
this.owner.unregister('service:store');
this.owner.register('service:store', storeStub);
this.storeService = this.owner.lookup('service:store');
});
});
test('it sends data to the passed action and calls updateProgress', async function (assert) {
const updateSpy = sinon.spy();
const completeSpy = sinon.spy();
this.set('updateProgress', updateSpy);
this.set('checkComplete', () => false);
this.set('onSuccess', completeSpy);
this.set('progress', 0);
await render(hbs`
`);
await fillIn(SHAMIR_FORM.input, this.keyPart);
await click(SHAMIR_FORM.submitButton);
assert.ok(completeSpy.notCalled, 'onShamirSuccess was not called');
assert.ok(updateSpy.calledOnce, 'updateProgress was called');
// Default shamir flow expects the updated values to be passed
// in from parent model, so this approximates the update happening
// from a side effect of the updateProgress call
this.set('progress', 2);
// Pretend the next call will mean completion
this.set('checkComplete', () => true);
await settled();
await fillIn(SHAMIR_FORM.input, this.keyPart);
await click(SHAMIR_FORM.submitButton);
assert.ok(completeSpy.calledOnce, 'onShamirSuccess was called');
assert.ok(updateSpy.calledTwice, 'updateProgress was called again');
});
test('it shows the error when adapter fails with 400 httpStatus', async function (assert) {
assert.expect(3);
const updateSpy = sinon.spy();
const completeSpy = sinon.spy();
this.set('updateProgress', updateSpy);
this.set('checkComplete', completeSpy);
await render(hbs`
`);
await fillIn(SHAMIR_FORM.input, this.keyPart);
await click(SHAMIR_FORM.submitButton);
assert.dom(SHAMIR_FORM.error).exists({ count: 2 }, 'renders errors');
assert.ok(completeSpy.notCalled, 'checkComplete was not called');
assert.ok(updateSpy.notCalled, 'updateProgress was not called');
});
test.skip('it throws the error when adapter fails with license error', async function (assert) {
assert.expect(2);
try {
const licenseSpy = sinon.spy();
this.set('onLicenseError', licenseSpy);
await render(hbs`
`);
await fillIn(SHAMIR_FORM.input, this.keyPart);
await click(SHAMIR_FORM.submitButton);
assert.ok(licenseSpy.calledOnce, 'license error triggered');
} catch (e) {
assert.deepEqual(e, licenseError, 'throws the error');
}
});
});