Merge pull request #2979 from TomasSilv/development

Fix #2699: Prevent exposing internal errors in UI
This commit is contained in:
Mohammad Azmi
2025-04-09 07:46:41 +07:00
committed by GitHub
3 changed files with 27 additions and 5 deletions

View File

@@ -66,8 +66,10 @@ export default Vue.extend({
const status = await this.$util.send('export/status', { id: exp.id });
if (status == ExportStatus.Error) {
const error = this.$util.send('export/error', { id: exp.id });
const error_notice = this.$noty.error(`Export of ${exportName} failed: ${error}`, {
const error = await this.$util.send('export/error', { id: exp.id });
// Error handling for export failure
let errorMessage = "An unexpected error occurred during export.";
const error_notice = this.$noty.error(`Export of ${exportName} failed: ${errorMessage}`, {
buttons: [
Noty.button('Close', "btn btn-primary", () => {
error_notice.close()
@@ -86,7 +88,7 @@ export default Vue.extend({
]
})
} catch (e) {
this.$noty.error(`Failed to export: ${e?.message ?? e}`, {
this.$noty.error(`Failed to export: ${e?.message || "Unexpected error"}`, {
})
}
},
@@ -113,4 +115,4 @@ export default Vue.extend({
this.unregisterHandlers(this.rootBindings)
}
})
</script>
</script>

View File

@@ -36,7 +36,7 @@ export default {
const percentComplete = this.percentComplete;
return percentComplete
? `(${percentComplete}%) Exporting table '${this.exportName}'`
: `(${countExported} rows) Exporting query '${this.exportName}'`
: `(${countExported ?? "0"} rows) Exporting query '${this.exportName}'`// Fallback to "0" if countExported is undefined
},
},
methods: {

View File

@@ -0,0 +1,20 @@
import Vue from 'vue'
import ExportManager from '@/components/export/ExportManager.vue'
describe('ExportManager.vue', () => {
it('should show an error message when export fails', async () => {
const registerHandlersMock = jest.fn()
const errorMock = jest.fn()
Vue.prototype.$noty = { error: errorMock }
const sendMock = jest.fn().mockRejectedValue(new Error('Export failed'))
Vue.prototype.$util = { send: sendMock }
const Constructor = Vue.extend(ExportManager)
const vm = new Constructor().$mount()
vm.registerHandlers = registerHandlersMock
await vm.startExport({ table: { name: 'Test Table' } })
expect(errorMock).toHaveBeenCalledWith(
'Failed to export: Export failed',
expect.objectContaining({})
)
})
})