diff --git a/packages/backend/src/yeomanui.ts b/packages/backend/src/yeomanui.ts index 21a3fa536..27a10679e 100644 --- a/packages/backend/src/yeomanui.ts +++ b/packages/backend/src/yeomanui.ts @@ -90,6 +90,7 @@ export class YeomanUI { this.rpc.registerMethod({ func: this.exploreGenerators, thisArg: this }); this.rpc.registerMethod({ func: this.logError, thisArg: this }); this.rpc.registerMethod({ func: this.back, thisArg: this }); + this.rpc.registerMethod({ func: this.fromWizard, thisArg: this }); this.rpc.registerMethod({ func: this.executeCommand, thisArg: this }); this.rpc.registerMethod({ func: this.getState, thisArg: this }); @@ -392,6 +393,11 @@ export class YeomanUI { return this.runGenerator(this.generatorName); } + private fromWizard(): boolean { + if (this.uiOptions.generator) return false; + return true; + } + private executeCommand(id: string, ...args: any[]): void { void this.youiEvents.executeCommand(id, args); } diff --git a/packages/backend/test/yeomanui.spec.ts b/packages/backend/test/yeomanui.spec.ts index 9fea11fbb..7b80dc488 100644 --- a/packages/backend/test/yeomanui.spec.ts +++ b/packages/backend/test/yeomanui.spec.ts @@ -913,6 +913,34 @@ describe("yeomanui unit test", () => { expect(res.message).to.be.equal(errorInfo); }); + describe("fromWizard", () => { + it("from fiori generator", () => { + const yeomanUiInstance: YeomanUI = new YeomanUI( + rpc, + youiEvents, + outputChannel, + testLogger, + { generator: "fiori" }, + flowPromise.state, + ); + const res = yeomanUiInstance["fromWizard"](); + expect(res).to.be.false; + }); + + it("from application wizard", () => { + const yeomanUiInstance: YeomanUI = new YeomanUI( + rpc, + youiEvents, + outputChannel, + testLogger, + { generator: undefined }, + flowPromise.state, + ); + const res = yeomanUiInstance["fromWizard"](); + expect(res).to.be.true; + }); + }); + describe("answersUtils", () => { it("setDefaults", () => { const questions = [{ name: "q1", default: "a" }, { name: "q2", default: () => "b" }, { name: "q3" }]; diff --git a/packages/frontend/src/youi/App.vue b/packages/frontend/src/youi/App.vue index 0e0431b4b..7a7cf2e90 100644 --- a/packages/frontend/src/youi/App.vue +++ b/packages/frontend/src/youi/App.vue @@ -322,20 +322,24 @@ export default { back() { return this.gotoStep(1); // go 1 step back }, - gotoStep(numOfSteps) { + async gotoStep(numOfSteps) { // go numOfSteps step back try { this.toShowPromptMessage = false; this.isReplaying = true; this.numOfSteps = numOfSteps; const answers = this.currentPrompt.answers; - if (this.promptIndex - numOfSteps > 0) { + let fromWizard = true; + const targetStep = this.promptIndex - numOfSteps; + if (targetStep === 0) { + fromWizard = await this.rpc.invoke("fromWizard"); + } + if ((fromWizard && targetStep > 0) || (!fromWizard && targetStep === 0)) { return this.rpc.invoke("back", [ answers !== undefined ? JSON.parse(JSON.stringify(answers)) : answers, numOfSteps, ]); } - return this.reload(); } catch (error) { this.rpc.invoke("logError", [error]); diff --git a/packages/frontend/test/App.spec.js b/packages/frontend/test/App.spec.js index b837c5048..b9156e86f 100644 --- a/packages/frontend/test/App.spec.js +++ b/packages/frontend/test/App.spec.js @@ -722,10 +722,12 @@ describe("App.vue", () => { }); describe("back - method", () => { - test("promptIndex is 0 (Select Generator)", () => { + test("promptIndex is 0 (Select Generator)", async () => { wrapper = initComponent(App, {}, true); wrapper.vm.rpc = { - invoke: jest.fn(), + invoke: jest.fn().mockImplementation(async () => { + return true; + }), registerMethod: jest.fn(), }; const invokeSpy = jest.spyOn(wrapper.vm.rpc, "invoke"); @@ -734,7 +736,7 @@ describe("App.vue", () => { wrapper.vm.promptIndex = 1; wrapper.vm.prompts = [{}, {}]; - wrapper.vm.back(); + await wrapper.vm.back(); expect(wrapper.vm.promptIndex).toBe(0); expect(wrapper.vm.prompts.length).toBe(0); @@ -780,23 +782,24 @@ describe("App.vue", () => { }); describe("gotoStep - method", () => { - test("promptIndex is 1, goto 1 step back -> (Select Generator)", () => { + test("promptIndex is 1, goto 1 step back -> (Select Generator)", async () => { wrapper = initComponent(App, {}, true); wrapper.vm.rpc = { - invoke: jest.fn(), + invoke: jest.fn().mockImplementation(async () => { + return true; + }), registerMethod: jest.fn(), }; const invokeSpy = jest.spyOn(wrapper.vm.rpc, "invoke"); - wrapper.vm.resolve = undefined; wrapper.vm.promptIndex = 1; wrapper.vm.prompts = [{}, {}]; - wrapper.vm.gotoStep(1); - + await wrapper.vm.gotoStep(1); expect(wrapper.vm.promptIndex).toBe(0); expect(wrapper.vm.prompts.length).toBe(0); expect(wrapper.vm.isReplaying).toBe(false); + expect(invokeSpy).toHaveBeenCalledWith("fromWizard"); expect(invokeSpy).toHaveBeenCalledWith("getState"); }); @@ -823,7 +826,9 @@ describe("App.vue", () => { test("promptIndex is 3, goto 3, exception thrown", async () => { wrapper = initComponent(App, {}, true); wrapper.vm.rpc = { - invoke: jest.fn(), + invoke: jest.fn().mockImplementation(async () => { + return true; + }), registerMethod: jest.fn(), }; const err = new Error("error"); @@ -833,8 +838,9 @@ describe("App.vue", () => { wrapper.vm.reject = jest.fn(); wrapper.vm.promptIndex = 3; wrapper.vm.prompts = [{}, {}, {}, { questions: [] }]; - wrapper.vm.gotoStep(3); - + await wrapper.vm.gotoStep(3); + expect(wrapper.vm.rpc.invoke).toHaveBeenCalledTimes(2); + expect(wrapper.vm.rpc.invoke).toHaveBeenCalledWith("fromWizard"); expect(wrapper.vm.rpc.invoke).toHaveBeenCalledWith("logError", [err]); expect(wrapper.vm.reject).toHaveBeenCalledWith(err); });