diff --git a/backend/package.json b/backend/package.json index 1eb11d13..259b5ab0 100644 --- a/backend/package.json +++ b/backend/package.json @@ -5,7 +5,7 @@ "license": "Apache 2.0", "description": "Provide rich user experience for Yeoman generators using VSCode extension or the browser", "repository": "https://github.com/SAP/yeoman-ui", - "version": "0.0.24", + "version": "0.0.25", "engines": { "vscode": "^1.38.0" }, diff --git a/frontend/package.json b/frontend/package.json index 5122308a..b3d51398 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "yeoman-ui-frontend", "displayName": "Yeoman UI Frontend", - "version": "0.2.3", + "version": "0.2.5", "publisher": "SAP", "license": "Apache 2.0", "description": "Frontend for the yeoman UI framework", @@ -15,14 +15,14 @@ "precommit": "lint-staged" }, "dependencies": { + "@mdi/font": "^4.5.95", "core-js": "2.6.6", "jquery": "3.4.1", - "vue-loading-overlay": "^3.2.0", "lodash": "^4.17.15", - "vue": "^2.6.10", - "vuetify": "^2.2.1", "material-design-icons-iconfont": "^5.0.1", - "@mdi/font": "^4.5.95" + "vue": "^2.6.10", + "vue-loading-overlay": "^3.2.0", + "vuetify": "^2.2.1" }, "devDependencies": { "@sap-devx/webview-rpc": "^0.2.0", diff --git a/frontend/src/App.vue b/frontend/src/App.vue index aeb4c9d5..dd3b47fb 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -241,8 +241,15 @@ export default { } } } catch (error) { - const message = `'${question.name}' question update of generator ${this.generatorName} has failed: ${_.get(error, "message", error)}`; - await this.rpc.invoke("logMessage", [message]); + let errorInfo = "No failure info"; + if (_.isString(error)) { + errorInfo = error; + } else { + errorInfo = _.get(error, "message", _.get(error, "stack", errorInfo)); + } + + const errorMessage = `Failed to update '${question.name}' question in generator '${this.generatorName}'. Reason: ${errorInfo}`; + await this.rpc.invoke("logMessage", [errorMessage]); this.rpc.invoke("toggleLog", [{}]); } }, diff --git a/frontend/tests/App.spec.js b/frontend/tests/App.spec.js index 7a7805f8..f9279c11 100644 --- a/frontend/tests/App.spec.js +++ b/frontend/tests/App.spec.js @@ -147,7 +147,7 @@ describe('App.vue', () => { expect(wrapper.vm.prompts[0].questions[0].validationMessage ).toBeUndefined() }) - test('invoke for question that throws error', async () => { + test('invoke for question that throws error as string', async () => { wrapper.vm.rpc = { invoke: jest.fn().mockRejectedValueOnce("test error").mockResolvedValue() } @@ -157,13 +157,38 @@ describe('App.vue', () => { }], answers: {} }] + wrapper.vm.generatorName = "testGen"; wrapper.vm.promptIndex = 0 const invokeSpy = jest.spyOn(wrapper.vm.rpc, 'invoke') await wrapper.vm.updateQuestionsFromIndex(0) expect(invokeSpy).toHaveBeenCalledWith('evaluateMethod', [["validateAnswer", {"validateQ": "validateAnswer"}], 'validateQ', 'validate']) - expect(invokeSpy).toHaveBeenCalledWith('logMessage', ["'validateQ' question update of generator has failed: test error"]) + expect(invokeSpy).toHaveBeenCalledWith('logMessage', [`Failed to update 'validateQ' question in generator 'testGen'. Reason: test error`]) expect(invokeSpy).toHaveBeenCalledWith('toggleLog', [{}]) + + invokeSpy.mockRestore(); + }) + + test('invoke for question that throws error as error object', async () => { + wrapper.vm.rpc = { + invoke: jest.fn().mockRejectedValueOnce(new Error("test error")).mockResolvedValue() + } + wrapper.vm.prompts = [{ + questions: [{ + name: 'validateQ', validate: '__Function', answer: 'validateAnswer', isWhen: true, doNotShow: false + }], + answers: {} + }] + wrapper.vm.generatorName = "testGen"; + wrapper.vm.promptIndex = 0 + + const invokeSpy = jest.spyOn(wrapper.vm.rpc, 'invoke') + await wrapper.vm.updateQuestionsFromIndex(0) + expect(invokeSpy).toHaveBeenCalledWith('evaluateMethod', [["validateAnswer", {"validateQ": "validateAnswer"}], 'validateQ', 'validate']) + expect(invokeSpy).toHaveBeenCalledWith('logMessage', [`Failed to update 'validateQ' question in generator 'testGen'. Reason: test error`]) + expect(invokeSpy).toHaveBeenCalledWith('toggleLog', [{}]) + + invokeSpy.mockRestore(); }) })