| /** |
| * Copyright (c) HashiCorp, Inc. |
| * SPDX-License-Identifier: MPL-2.0 |
| */ |
| |
| /* eslint qunit/no-conditional-assertions: "warn" */ |
| import { module, test } from 'qunit'; |
| import { setupTest } from 'ember-qunit'; |
| import sinon from 'sinon'; |
| import { STORAGE_KEYS, DEFAULTS } from 'vault/helpers/wizard-constants'; |
| |
| module('Unit | Service | wizard', function (hooks) { |
| setupTest(hooks); |
| |
| hooks.beforeEach(function () { |
| this.router = this.owner.lookup('service:router'); |
| this.router.reopen({ |
| transitionTo: sinon.stub().returns({ |
| followRedirects: function () { |
| return { |
| then: function (callback) { |
| callback(); |
| }, |
| }; |
| }, |
| }), |
| urlFor: sinon.stub().returns('/ui/vault/foo'), |
| }); |
| }); |
| |
| function storage() { |
| return { |
| items: {}, |
| getItem(key) { |
| var item = this.items[key]; |
| return item && JSON.parse(item); |
| }, |
| |
| setItem(key, val) { |
| return (this.items[key] = JSON.stringify(val)); |
| }, |
| |
| removeItem(key) { |
| delete this.items[key]; |
| }, |
| |
| keys() { |
| return Object.keys(this.items); |
| }, |
| }; |
| } |
| |
| const testCases = [ |
| { |
| method: 'getExtState', |
| args: [STORAGE_KEYS.TUTORIAL_STATE], |
| expectedResults: { |
| storage: [{ key: STORAGE_KEYS.TUTORIAL_STATE, value: 'idle' }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'saveExtState', |
| args: [STORAGE_KEYS.TUTORIAL_STATE, 'test'], |
| expectedResults: { |
| storage: [{ key: STORAGE_KEYS.TUTORIAL_STATE, value: 'test' }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'storageHasKey', |
| args: ['fake-key'], |
| expectedResults: { value: false }, |
| assertCount: 1, |
| }, |
| { |
| method: 'storageHasKey', |
| args: [STORAGE_KEYS.TUTORIAL_STATE], |
| expectedResults: { value: true }, |
| assertCount: 1, |
| }, |
| { |
| method: 'handleDismissed', |
| args: [], |
| expectedResults: { |
| storage: [ |
| { key: STORAGE_KEYS.FEATURE_STATE, value: undefined }, |
| { key: STORAGE_KEYS.FEATURE_LIST, value: undefined }, |
| { key: STORAGE_KEYS.COMPONENT_STATE, value: undefined }, |
| ], |
| }, |
| assertCount: 3, |
| }, |
| { |
| method: 'handlePaused', |
| args: [], |
| properties: { |
| expectedURL: 'this/is/a/url', |
| expectedRouteName: 'this.is.a.route', |
| }, |
| expectedResults: { |
| storage: [ |
| { key: STORAGE_KEYS.RESUME_URL, value: 'this/is/a/url' }, |
| { key: STORAGE_KEYS.RESUME_ROUTE, value: 'this.is.a.route' }, |
| ], |
| }, |
| assertCount: 2, |
| }, |
| { |
| method: 'handlePaused', |
| args: [], |
| expectedResults: { |
| storage: [ |
| { key: STORAGE_KEYS.RESUME_URL, value: undefined }, |
| { key: STORAGE_KEYS.RESUME_ROUTE, value: undefined }, |
| ], |
| }, |
| assertCount: 2, |
| }, |
| { |
| method: 'handleResume', |
| storage: [ |
| { key: STORAGE_KEYS.RESUME_URL, value: 'this/is/a/url' }, |
| { key: STORAGE_KEYS.RESUME_ROUTE, value: 'this.is.a.route' }, |
| ], |
| args: [], |
| expectedResults: { |
| props: [ |
| { prop: 'expectedURL', value: 'this/is/a/url' }, |
| { prop: 'expectedRouteName', value: 'this.is.a.route' }, |
| ], |
| storage: [ |
| { key: STORAGE_KEYS.RESUME_URL, value: undefined }, |
| { key: STORAGE_KEYS.RESUME_ROUTE, value: 'this.is.a.route' }, |
| ], |
| }, |
| assertCount: 4, |
| }, |
| { |
| method: 'handleResume', |
| args: [], |
| expectedResults: { |
| storage: [ |
| { key: STORAGE_KEYS.RESUME_URL, value: undefined }, |
| { key: STORAGE_KEYS.RESUME_ROUTE, value: undefined }, |
| ], |
| }, |
| assertCount: 2, |
| }, |
| { |
| method: 'restartGuide', |
| args: [], |
| expectedResults: { |
| props: [ |
| { prop: 'currentState', value: 'active.select' }, |
| { prop: 'featureComponent', value: 'wizard/features-selection' }, |
| { prop: 'tutorialComponent', value: 'wizard/tutorial-active' }, |
| ], |
| storage: [ |
| { key: STORAGE_KEYS.FEATURE_STATE, value: undefined }, |
| { key: STORAGE_KEYS.FEATURE_STATE_HISTORY, value: undefined }, |
| { key: STORAGE_KEYS.FEATURE_LIST, value: undefined }, |
| { key: STORAGE_KEYS.COMPONENT_STATE, value: undefined }, |
| { key: STORAGE_KEYS.TUTORIAL_STATE, value: 'active.select' }, |
| { key: STORAGE_KEYS.COMPLETED_FEATURES, value: undefined }, |
| { key: STORAGE_KEYS.RESUME_URL, value: undefined }, |
| { key: STORAGE_KEYS.RESUME_ROUTE, value: undefined }, |
| ], |
| }, |
| assertCount: 11, |
| }, |
| { |
| method: 'clearFeatureData', |
| args: [], |
| expectedResults: { |
| props: [ |
| { prop: 'currentMachine', value: null }, |
| { prop: 'featureMachineHistory', value: null }, |
| ], |
| storage: [ |
| { key: STORAGE_KEYS.FEATURE_STATE, value: undefined }, |
| { key: STORAGE_KEYS.FEATURE_STATE_HISTORY, value: undefined }, |
| { key: STORAGE_KEYS.FEATURE_LIST, value: undefined }, |
| { key: STORAGE_KEYS.COMPONENT_STATE, value: undefined }, |
| ], |
| }, |
| assertCount: 6, |
| }, |
| { |
| method: 'saveState', |
| args: [ |
| 'currentState', |
| { |
| value: { |
| init: { |
| active: 'login', |
| }, |
| }, |
| actions: [{ type: 'render', level: 'feature', component: 'wizard/init-login' }], |
| }, |
| ], |
| expectedResults: { |
| props: [{ prop: 'currentState', value: 'init.active.login' }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'saveState', |
| args: [ |
| 'currentState', |
| { |
| value: { |
| active: 'login', |
| }, |
| actions: [{ type: 'render', level: 'feature', component: 'wizard/init-login' }], |
| }, |
| ], |
| expectedResults: { |
| props: [{ prop: 'currentState', value: 'active.login' }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'saveState', |
| args: ['currentState', 'login'], |
| expectedResults: { |
| props: [{ prop: 'currentState', value: 'login' }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'saveFeatureHistory', |
| args: ['idle'], |
| properties: { featureList: ['policies', 'tools'] }, |
| storage: [{ key: STORAGE_KEYS.COMPLETED_FEATURES, value: ['secrets'] }], |
| expectedResults: { |
| props: [{ prop: 'featureMachineHistory', value: null }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'saveFeatureHistory', |
| args: ['idle'], |
| properties: { featureList: ['policies', 'tools'] }, |
| storage: [], |
| expectedResults: { |
| props: [{ prop: 'featureMachineHistory', value: ['idle'] }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'saveFeatureHistory', |
| args: ['idle'], |
| properties: { featureList: ['policies', 'tools'] }, |
| storage: [], |
| expectedResults: { |
| props: [{ prop: 'featureMachineHistory', value: ['idle'] }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'saveFeatureHistory', |
| args: ['idle'], |
| properties: { featureMachineHistory: [], featureList: ['policies', 'tools'] }, |
| storage: [{ key: STORAGE_KEYS.COMPLETED_FEATURES, value: ['secrets'] }], |
| expectedResults: { |
| props: [{ prop: 'featureMachineHistory', value: ['idle'] }], |
| storage: [{ key: STORAGE_KEYS.FEATURE_STATE_HISTORY, value: ['idle'] }], |
| }, |
| assertCount: 2, |
| }, |
| { |
| method: 'saveFeatureHistory', |
| args: ['idle'], |
| properties: { featureMachineHistory: null, featureList: ['policies', 'tools'] }, |
| storage: [{ key: STORAGE_KEYS.COMPLETED_FEATURES, value: ['secrets'] }], |
| expectedResults: { |
| props: [{ prop: 'featureMachineHistory', value: null }], |
| }, |
| assertCount: 1, |
| }, |
| { |
| method: 'saveFeatureHistory', |
| args: ['create'], |
| properties: { featureMachineHistory: ['idle'], featureList: ['policies', 'tools'] }, |
| storage: [{ key: STORAGE_KEYS.COMPLETED_FEATURES, value: ['secrets'] }], |
| expectedResults: { |
| props: [{ prop: 'featureMachineHistory', value: ['idle', 'create'] }], |
| storage: [{ key: STORAGE_KEYS.FEATURE_STATE_HISTORY, value: ['idle', 'create'] }], |
| }, |
| assertCount: 2, |
| }, |
| { |
| method: 'saveFeatureHistory', |
| args: ['create'], |
| properties: { featureMachineHistory: ['idle'], featureList: ['policies', 'tools'] }, |
| storage: [ |
| { key: STORAGE_KEYS.COMPLETED_FEATURES, value: ['secrets'] }, |
| { key: STORAGE_KEYS.FEATURE_STATE_HISTORY, value: ['idle', 'create'] }, |
| ], |
| expectedResults: { |
| props: [{ prop: 'featureMachineHistory', value: ['idle', 'create'] }], |
| storage: [{ key: STORAGE_KEYS.FEATURE_STATE_HISTORY, value: ['idle', 'create'] }], |
| }, |
| assertCount: 2, |
| }, |
| { |
| method: 'startFeature', |
| args: [], |
| properties: { featureList: ['secrets', 'tools'] }, |
| expectedResults: { |
| props: [ |
| { prop: 'featureState', value: 'idle' }, |
| { prop: 'currentMachine', value: 'secrets' }, |
| ], |
| }, |
| assertCount: 2, |
| }, |
| { |
| method: 'saveFeatures', |
| args: [['secrets', 'tools']], |
| expectedResults: { |
| props: [{ prop: 'featureList', value: ['secrets', 'tools'] }], |
| storage: [{ key: STORAGE_KEYS.FEATURE_LIST, value: ['secrets', 'tools'] }], |
| }, |
| assertCount: 2, |
| }, |
| ]; |
| |
| testCases.forEach((testCase) => { |
| const store = storage(); |
| test(`${testCase.method}`, function (assert) { |
| assert.expect(testCase.assertCount); |
| const wizard = this.owner.factoryFor('service:wizard').create({ |
| storage() { |
| return store; |
| }, |
| }); |
| |
| if (testCase.properties) { |
| wizard.setProperties(testCase.properties); |
| } else { |
| wizard.setProperties(DEFAULTS); |
| } |
| |
| if (testCase.storage) { |
| testCase.storage.forEach((item) => wizard.storage().setItem(item.key, item.value)); |
| } |
| |
| const result = wizard[testCase.method](...testCase.args); |
| if (testCase.expectedResults.props) { |
| testCase.expectedResults.props.forEach((property) => { |
| assert.deepEqual( |
| wizard.get(property.prop), |
| property.value, |
| `${testCase.method} creates correct value for ${property.prop}` |
| ); |
| }); |
| } |
| if (testCase.expectedResults.storage) { |
| testCase.expectedResults.storage.forEach((item) => { |
| assert.deepEqual( |
| wizard.storage().getItem(item.key), |
| item.value, |
| `${testCase.method} creates correct storage state for ${item.key}` |
| ); |
| }); |
| } |
| if (testCase.expectedResults.value !== null && testCase.expectedResults.value !== undefined) { |
| assert.strictEqual(result, testCase.expectedResults.value, `${testCase.method} gives correct value`); |
| } |
| }); |
| }); |
| }); |