From 8d69e6634d94a56193fc4e3fef0ad38a9590778d Mon Sep 17 00:00:00 2001 From: Neta Molcho Date: Wed, 24 Jan 2024 15:14:35 +0200 Subject: [PATCH 1/6] fix: bug of selected floorplan not retained --- packages/frontend/src/youi/App.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/frontend/src/youi/App.vue b/packages/frontend/src/youi/App.vue index 189ef0c39..f57f97031 100644 --- a/packages/frontend/src/youi/App.vue +++ b/packages/frontend/src/youi/App.vue @@ -329,13 +329,12 @@ export default { this.isReplaying = true; this.numOfSteps = numOfSteps; const answers = this.currentPrompt.answers; - if (this.promptIndex - numOfSteps > 0) { + if (this.backButtonText == "Back") { return this.rpc.invoke("back", [ answers !== undefined ? JSON.parse(JSON.stringify(answers)) : answers, numOfSteps, ]); } - return this.reload(); } catch (error) { this.rpc.invoke("logError", [error]); From 0097ca7d065e5df802ea9575f4d44af90d66bbb4 Mon Sep 17 00:00:00 2001 From: Neta Molcho Date: Thu, 25 Jan 2024 11:19:40 +0200 Subject: [PATCH 2/6] fix: tests --- packages/frontend/src/youi/App.vue | 5 ++++- packages/frontend/test/App.spec.js | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/youi/App.vue b/packages/frontend/src/youi/App.vue index f57f97031..a9d6109f1 100644 --- a/packages/frontend/src/youi/App.vue +++ b/packages/frontend/src/youi/App.vue @@ -329,7 +329,10 @@ export default { this.isReplaying = true; this.numOfSteps = numOfSteps; const answers = this.currentPrompt.answers; - if (this.backButtonText == "Back") { + if ( + (this.backButtonText == "Back" && numOfSteps == 1) || + (numOfSteps > 1 && this.promptIndex - numOfSteps > 0) + ) { return this.rpc.invoke("back", [ answers !== undefined ? JSON.parse(JSON.stringify(answers)) : answers, numOfSteps, diff --git a/packages/frontend/test/App.spec.js b/packages/frontend/test/App.spec.js index b837c5048..042593af3 100644 --- a/packages/frontend/test/App.spec.js +++ b/packages/frontend/test/App.spec.js @@ -733,6 +733,7 @@ describe("App.vue", () => { wrapper.vm.resolve = undefined; wrapper.vm.promptIndex = 1; wrapper.vm.prompts = [{}, {}]; + wrapper.vm.selectGeneratorPromptExists = () => true; wrapper.vm.back(); @@ -791,6 +792,7 @@ describe("App.vue", () => { wrapper.vm.resolve = undefined; wrapper.vm.promptIndex = 1; wrapper.vm.prompts = [{}, {}]; + wrapper.vm.selectGeneratorPromptExists = () => true; wrapper.vm.gotoStep(1); From 525a3003548621b1e7643a478f4344d7445b4660 Mon Sep 17 00:00:00 2001 From: Neta Molcho Date: Thu, 25 Jan 2024 12:15:24 +0200 Subject: [PATCH 3/6] fix: operator --- packages/frontend/src/youi/App.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/youi/App.vue b/packages/frontend/src/youi/App.vue index a9d6109f1..b9490ba81 100644 --- a/packages/frontend/src/youi/App.vue +++ b/packages/frontend/src/youi/App.vue @@ -330,8 +330,8 @@ export default { this.numOfSteps = numOfSteps; const answers = this.currentPrompt.answers; if ( - (this.backButtonText == "Back" && numOfSteps == 1) || - (numOfSteps > 1 && this.promptIndex - numOfSteps > 0) + ( numOfSteps === 1 && this.backButtonText === "Back" ) || + ( numOfSteps > 1 && this.promptIndex - numOfSteps > 0 ) ) { return this.rpc.invoke("back", [ answers !== undefined ? JSON.parse(JSON.stringify(answers)) : answers, From 2a9a6ca1c627da16c43482441cdf9bd5b25293f8 Mon Sep 17 00:00:00 2001 From: Neta Molcho Date: Thu, 25 Jan 2024 12:24:26 +0200 Subject: [PATCH 4/6] fix: format --- packages/frontend/src/youi/App.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/youi/App.vue b/packages/frontend/src/youi/App.vue index b9490ba81..b823ed514 100644 --- a/packages/frontend/src/youi/App.vue +++ b/packages/frontend/src/youi/App.vue @@ -330,8 +330,8 @@ export default { this.numOfSteps = numOfSteps; const answers = this.currentPrompt.answers; if ( - ( numOfSteps === 1 && this.backButtonText === "Back" ) || - ( numOfSteps > 1 && this.promptIndex - numOfSteps > 0 ) + (numOfSteps === 1 && this.backButtonText === "Back") || + (numOfSteps > 1 && this.promptIndex - numOfSteps > 0) ) { return this.rpc.invoke("back", [ answers !== undefined ? JSON.parse(JSON.stringify(answers)) : answers, From 1186d1b9276feb2d7b9c1a615015c59cdf6860ed Mon Sep 17 00:00:00 2001 From: Neta Molcho Date: Tue, 30 Jan 2024 13:23:32 +0200 Subject: [PATCH 5/6] fix: create fromWizard api for checking if we opened the generator from application wizard --- packages/backend/src/yeomanui.ts | 6 ++++++ packages/backend/test/yeomanui.spec.ts | 28 ++++++++++++++++++++++++++ packages/frontend/src/youi/App.vue | 12 ++++++----- packages/frontend/test/App.spec.js | 26 ++++++++++++++---------- 4 files changed, 56 insertions(+), 16 deletions(-) diff --git a/packages/backend/src/yeomanui.ts b/packages/backend/src/yeomanui.ts index 715843230..8577c0a23 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 async fromWizard(): Promise { + 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 d45d97a9f..a9aa55ba6 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", async () => { + const yeomanUiInstance: YeomanUI = new YeomanUI( + rpc, + youiEvents, + outputChannel, + testLogger, + {generator: "fiori"}, + flowPromise.state + ); + const res = await yeomanUiInstance["fromWizard"](); + expect(res).to.be.false; + }); + + it("from application wizard", async () => { + const yeomanUiInstance: YeomanUI = new YeomanUI( + rpc, + youiEvents, + outputChannel, + testLogger, + {generator: undefined}, + flowPromise.state + ); + const res = await 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 b823ed514..5ddbbd6f7 100644 --- a/packages/frontend/src/youi/App.vue +++ b/packages/frontend/src/youi/App.vue @@ -322,17 +322,19 @@ 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 ( - (numOfSteps === 1 && this.backButtonText === "Back") || - (numOfSteps > 1 && 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, diff --git a/packages/frontend/test/App.spec.js b/packages/frontend/test/App.spec.js index 042593af3..22b5a76c5 100644 --- a/packages/frontend/test/App.spec.js +++ b/packages/frontend/test/App.spec.js @@ -725,7 +725,9 @@ describe("App.vue", () => { test("promptIndex is 0 (Select Generator)", () => { 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"); @@ -733,7 +735,6 @@ describe("App.vue", () => { wrapper.vm.resolve = undefined; wrapper.vm.promptIndex = 1; wrapper.vm.prompts = [{}, {}]; - wrapper.vm.selectGeneratorPromptExists = () => true; wrapper.vm.back(); @@ -781,24 +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.selectGeneratorPromptExists = () => true; - - 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"); }); @@ -825,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"); @@ -835,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); }); From 9d881e82a8c622a62e83132fe9b16ee9911dd145 Mon Sep 17 00:00:00 2001 From: Neta Molcho Date: Tue, 30 Jan 2024 16:14:17 +0200 Subject: [PATCH 6/6] fix: format --- packages/backend/src/yeomanui.ts | 2 +- packages/backend/test/yeomanui.spec.ts | 16 ++++++++-------- packages/frontend/test/App.spec.js | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/backend/src/yeomanui.ts b/packages/backend/src/yeomanui.ts index a850b5104..27a10679e 100644 --- a/packages/backend/src/yeomanui.ts +++ b/packages/backend/src/yeomanui.ts @@ -393,7 +393,7 @@ export class YeomanUI { return this.runGenerator(this.generatorName); } - private async fromWizard(): Promise { + private fromWizard(): boolean { if (this.uiOptions.generator) return false; return true; } diff --git a/packages/backend/test/yeomanui.spec.ts b/packages/backend/test/yeomanui.spec.ts index 7aa6a89e0..7b80dc488 100644 --- a/packages/backend/test/yeomanui.spec.ts +++ b/packages/backend/test/yeomanui.spec.ts @@ -914,29 +914,29 @@ describe("yeomanui unit test", () => { }); describe("fromWizard", () => { - it("from fiori generator", async () => { + it("from fiori generator", () => { const yeomanUiInstance: YeomanUI = new YeomanUI( rpc, youiEvents, outputChannel, testLogger, - {generator: "fiori"}, - flowPromise.state + { generator: "fiori" }, + flowPromise.state, ); - const res = await yeomanUiInstance["fromWizard"](); + const res = yeomanUiInstance["fromWizard"](); expect(res).to.be.false; }); - it("from application wizard", async () => { + it("from application wizard", () => { const yeomanUiInstance: YeomanUI = new YeomanUI( rpc, youiEvents, outputChannel, testLogger, - {generator: undefined}, - flowPromise.state + { generator: undefined }, + flowPromise.state, ); - const res = await yeomanUiInstance["fromWizard"](); + const res = yeomanUiInstance["fromWizard"](); expect(res).to.be.true; }); }); diff --git a/packages/frontend/test/App.spec.js b/packages/frontend/test/App.spec.js index 22b5a76c5..b9156e86f 100644 --- a/packages/frontend/test/App.spec.js +++ b/packages/frontend/test/App.spec.js @@ -722,7 +722,7 @@ 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().mockImplementation(async () => { @@ -736,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); @@ -827,8 +827,8 @@ describe("App.vue", () => { wrapper = initComponent(App, {}, true); wrapper.vm.rpc = { invoke: jest.fn().mockImplementation(async () => { - return true; - }), + return true; + }), registerMethod: jest.fn(), }; const err = new Error("error");