From c1fabaf8e164130dafb1081832a521cddf202490 Mon Sep 17 00:00:00 2001 From: Alfredo Del Fabro Neto Date: Mon, 31 Mar 2025 16:41:29 -0300 Subject: [PATCH 01/10] regression: thows error message from error --- .../deno-runtime/lib/accessors/modify/ModifyCreator.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts index f4509990edc99..3e54cb7abb0e5 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts @@ -60,7 +60,7 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw new Error(err.error); + throw new Error(err.error.message); }); }, }, @@ -92,7 +92,7 @@ export class ModifyCreator implements IModifyCreator { return new Proxy( { __kind: 'getEmailCreator' }, { - get: (_target: unknown, prop: string) => + get: (_target: unknown, prop: string) => (...params: unknown[]) => prop === 'toJSON' ? {} @@ -112,7 +112,7 @@ export class ModifyCreator implements IModifyCreator { return new Proxy( { __kind: 'getContactCreator' }, { - get: (_target: unknown, prop: string) => + get: (_target: unknown, prop: string) => (...params: unknown[]) => prop === 'toJSON' ? {} From 9ba1146d7e07696e2d6c3069c83ab474b667ae80 Mon Sep 17 00:00:00 2001 From: Alfredo Del Fabro Neto Date: Mon, 31 Mar 2025 17:39:21 -0300 Subject: [PATCH 02/10] fix: throws the entire error --- .../deno-runtime/lib/accessors/modify/ModifyCreator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts index 3e54cb7abb0e5..54a70a29d0a12 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts @@ -60,7 +60,7 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw new Error(err.error.message); + throw err; }); }, }, From 52f98d803cf34e8fb326479c5288be4fc15b344c Mon Sep 17 00:00:00 2001 From: Alfredo Del Fabro Neto Date: Tue, 1 Apr 2025 09:54:27 -0300 Subject: [PATCH 03/10] fix: throw the entire error object --- .../lib/accessors/modify/ModifyCreator.ts | 6 +- .../lib/accessors/tests/ModifyCreator.test.ts | 74 +++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts index 54a70a29d0a12..730126de629c4 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts @@ -82,7 +82,7 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw new Error(err.error); + throw err; }), }, ) as IUploadCreator; @@ -102,7 +102,7 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw new Error(err.error); + throw err; }), } ) @@ -122,7 +122,7 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw new Error(err.error); + throw err; }), } ) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts index 5927869e6c84f..ee32ab3b166de 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts @@ -103,4 +103,78 @@ describe('ModifyCreator', () => { assertNotInstanceOf(result, Promise); assert(typeof result === 'string', `Expected "${result}" to be of type "string", but got "${typeof result}"`); }); + + it('throws an error when a proxy method of getLivechatCreator fails', async () => { + const failingSenderFn = () => Promise.reject(new Error('Test error')); + const modifyCreator = new ModifyCreator(failingSenderFn); + const livechatCreator = modifyCreator.getLivechatCreator(); + + let error: Error | null = null; + try { + await livechatCreator.createVisitor({ + token: 'visitor-token', + username: 'visitor-username', + name: 'Visitor Name', + }); + } catch (err) { + error = err as Error; + } + + assert(error instanceof Error, 'Expected an error to be thrown'); + assertEquals(error?.message, 'Test error'); + }); + + it('throws an error when a proxy method of getUploadCreator fails', async () => { + const failingSenderFn = () => Promise.reject(new Error('Upload error')); + const modifyCreator = new ModifyCreator(failingSenderFn); + const uploadCreator = modifyCreator.getUploadCreator(); + + let error: Error | null = null; + try { + await uploadCreator.uploadBuffer(new Uint8Array([9, 10, 11, 12]), 'image/png'); + } catch (err) { + error = err as Error; + } + + assert(error instanceof Error, 'Expected an error to be thrown'); + assertEquals(error?.message, 'Upload error'); + }); + + it('throws an error when a proxy method of getEmailCreator fails', async () => { + const failingSenderFn = () => Promise.reject(new Error('Email error')); + const modifyCreator = new ModifyCreator(failingSenderFn); + const emailCreator = modifyCreator.getEmailCreator(); + + let error: Error | null = null; + try { + await emailCreator.send({ + to: 'test@example.com', + from: 'sender@example.com', + subject: 'Test Email', + text: 'This is a test email.', + }); + } catch (err) { + error = err as Error; + } + + assert(error instanceof Error, 'Expected an error to be thrown'); + assertEquals(error?.message, 'Email error'); + }); + + it('throws an error when a proxy method of getContactCreator fails', async () => { + const failingSenderFn = () => Promise.reject(new Error('Contact creation error')); + const modifyCreator = new ModifyCreator(failingSenderFn); + const contactCreator = modifyCreator.getContactCreator(); + + let error: Error | null = null; + try { + await contactCreator.addContactEmail('test-contact-id', 'test@example.com') + } catch (err) { + error = err as Error; + } + + assert(error instanceof Error, 'Expected an error to be thrown'); + assertEquals(error?.message, 'Contact creation error'); + }); + }); From c75908b7512b4c3cf4a1dacf8ffc7c8ee5c70303 Mon Sep 17 00:00:00 2001 From: Alfredo Del Fabro Neto Date: Tue, 1 Apr 2025 14:47:17 -0300 Subject: [PATCH 04/10] fix: improve error handling in ModifyCreator by throwing specific error messages --- .../lib/accessors/modify/ModifyCreator.ts | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts index 730126de629c4..79aac8fc3f98b 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts @@ -60,7 +60,10 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw err; + if (err instanceof Error) { + throw err; + } + throw new Error(err.error.message); }); }, }, @@ -82,7 +85,10 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw err; + if (err instanceof Error) { + throw err; + } + throw new Error(err.error.message); }), }, ) as IUploadCreator; @@ -102,7 +108,10 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw err; + if (err instanceof Error) { + throw err; + } + throw new Error(err.error.message); }), } ) @@ -122,7 +131,10 @@ export class ModifyCreator implements IModifyCreator { }) .then((response) => response.result) .catch((err) => { - throw err; + if (err instanceof Error) { + throw err; + } + throw new Error(err.error.message); }), } ) From 2a34dd7825a71eb3a80486cf016bd98022fc3f77 Mon Sep 17 00:00:00 2001 From: Alfredo Del Fabro Neto Date: Tue, 1 Apr 2025 17:15:32 -0300 Subject: [PATCH 05/10] test: enhance error handling in ModifyCreator tests with assertRejects --- .../lib/accessors/tests/ModifyCreator.test.ts | 84 +++++++++---------- 1 file changed, 38 insertions(+), 46 deletions(-) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts index ee32ab3b166de..340c153a80bb3 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts @@ -1,7 +1,7 @@ // deno-lint-ignore-file no-explicit-any import { afterAll, beforeEach, describe, it } from 'https://deno.land/std@0.203.0/testing/bdd.ts'; import { assertSpyCall, spy } from 'https://deno.land/std@0.203.0/testing/mock.ts'; -import { assert, assertEquals, assertNotInstanceOf } from 'https://deno.land/std@0.203.0/assert/mod.ts'; +import { assert, assertEquals, assertNotInstanceOf, assertRejects, assertThrows } from 'https://deno.land/std@0.203.0/assert/mod.ts'; import { AppObjectRegistry } from '../../../AppObjectRegistry.ts'; import { ModifyCreator } from '../modify/ModifyCreator.ts'; @@ -109,19 +109,17 @@ describe('ModifyCreator', () => { const modifyCreator = new ModifyCreator(failingSenderFn); const livechatCreator = modifyCreator.getLivechatCreator(); - let error: Error | null = null; - try { - await livechatCreator.createVisitor({ - token: 'visitor-token', - username: 'visitor-username', - name: 'Visitor Name', - }); - } catch (err) { - error = err as Error; - } - - assert(error instanceof Error, 'Expected an error to be thrown'); - assertEquals(error?.message, 'Test error'); + await assertRejects( + async () => { + await livechatCreator.createAndReturnVisitor({ + token: 'visitor-token', + username: 'visitor-username', + name: 'Visitor Name', + }); + }, + Error, + 'Test error', + ); }); it('throws an error when a proxy method of getUploadCreator fails', async () => { @@ -129,15 +127,13 @@ describe('ModifyCreator', () => { const modifyCreator = new ModifyCreator(failingSenderFn); const uploadCreator = modifyCreator.getUploadCreator(); - let error: Error | null = null; - try { - await uploadCreator.uploadBuffer(new Uint8Array([9, 10, 11, 12]), 'image/png'); - } catch (err) { - error = err as Error; - } - - assert(error instanceof Error, 'Expected an error to be thrown'); - assertEquals(error?.message, 'Upload error'); + await assertRejects( + async () => { + await uploadCreator.uploadBuffer(new Uint8Array([9, 10, 11, 12]), 'image/png'); + }, + Error, + 'Upload error', + ); }); it('throws an error when a proxy method of getEmailCreator fails', async () => { @@ -145,20 +141,18 @@ describe('ModifyCreator', () => { const modifyCreator = new ModifyCreator(failingSenderFn); const emailCreator = modifyCreator.getEmailCreator(); - let error: Error | null = null; - try { - await emailCreator.send({ - to: 'test@example.com', - from: 'sender@example.com', - subject: 'Test Email', - text: 'This is a test email.', - }); - } catch (err) { - error = err as Error; - } - - assert(error instanceof Error, 'Expected an error to be thrown'); - assertEquals(error?.message, 'Email error'); + await assertRejects( + async () => { + await emailCreator.send({ + to: 'test@example.com', + from: 'sender@example.com', + subject: 'Test Email', + text: 'This is a test email.', + }); + }, + Error, + 'Email error', + ); }); it('throws an error when a proxy method of getContactCreator fails', async () => { @@ -166,15 +160,13 @@ describe('ModifyCreator', () => { const modifyCreator = new ModifyCreator(failingSenderFn); const contactCreator = modifyCreator.getContactCreator(); - let error: Error | null = null; - try { - await contactCreator.addContactEmail('test-contact-id', 'test@example.com') - } catch (err) { - error = err as Error; - } - - assert(error instanceof Error, 'Expected an error to be thrown'); - assertEquals(error?.message, 'Contact creation error'); + await assertRejects( + async () => { + await contactCreator.addContactEmail('test-contact-id', 'test@example.com'); + }, + Error, + 'Contact creation error', + ); }); }); From e265dcbd73e072bdf4dfb67f251c6e1b52cd8510 Mon Sep 17 00:00:00 2001 From: Alfredo Del Fabro Neto Date: Tue, 1 Apr 2025 17:51:57 -0300 Subject: [PATCH 06/10] test: add error handling tests for specifics error objects --- .../lib/accessors/tests/ModifyCreator.test.ts | 66 ++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts index 340c153a80bb3..081af2eb2d3eb 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts @@ -1,7 +1,7 @@ // deno-lint-ignore-file no-explicit-any import { afterAll, beforeEach, describe, it } from 'https://deno.land/std@0.203.0/testing/bdd.ts'; import { assertSpyCall, spy } from 'https://deno.land/std@0.203.0/testing/mock.ts'; -import { assert, assertEquals, assertNotInstanceOf, assertRejects, assertThrows } from 'https://deno.land/std@0.203.0/assert/mod.ts'; +import { assert, assertEquals, assertNotInstanceOf, assertRejects } from 'https://deno.land/std@0.203.0/assert/mod.ts'; import { AppObjectRegistry } from '../../../AppObjectRegistry.ts'; import { ModifyCreator } from '../modify/ModifyCreator.ts'; @@ -122,6 +122,24 @@ describe('ModifyCreator', () => { ); }); + it('throws an instance of Error when getLivechatCreator fails with a specific error object', async () => { + const failingSenderFn = () => Promise.reject({ error: { message: 'Livechat method error' } }); + const modifyCreator = new ModifyCreator(failingSenderFn); + const livechatCreator = modifyCreator.getLivechatCreator(); + + await assertRejects( + async () => { + await livechatCreator.createVisitor({ + token: 'visitor-token', + username: 'visitor-username', + name: 'Visitor Name', + }); + }, + Error, + 'Livechat method error', + ); + }); + it('throws an error when a proxy method of getUploadCreator fails', async () => { const failingSenderFn = () => Promise.reject(new Error('Upload error')); const modifyCreator = new ModifyCreator(failingSenderFn); @@ -136,6 +154,20 @@ describe('ModifyCreator', () => { ); }); + it('throws an instance of Error when getUploadCreator fails with a specific error object', async () => { + const failingSenderFn = () => Promise.reject({ error: { message: 'Upload method error' } }); + const modifyCreator = new ModifyCreator(failingSenderFn); + const uploadCreator = modifyCreator.getUploadCreator(); + + await assertRejects( + async () => { + await uploadCreator.uploadBuffer(new Uint8Array([1, 2, 3]), 'image/png'); + }, + Error, + 'Upload method error', + ); + }); + it('throws an error when a proxy method of getEmailCreator fails', async () => { const failingSenderFn = () => Promise.reject(new Error('Email error')); const modifyCreator = new ModifyCreator(failingSenderFn); @@ -155,6 +187,25 @@ describe('ModifyCreator', () => { ); }); + it('throws an instance of Error when getEmailCreator fails with a specific error object', async () => { + const failingSenderFn = () => Promise.reject({ error: { message: 'Email method error' } }); + const modifyCreator = new ModifyCreator(failingSenderFn); + const emailCreator = modifyCreator.getEmailCreator(); + + await assertRejects( + async () => { + await emailCreator.send({ + to: 'test@example.com', + from: 'sender@example.com', + subject: 'Test Email', + text: 'This is a test email.', + }); + }, + Error, + 'Email method error', + ); + }); + it('throws an error when a proxy method of getContactCreator fails', async () => { const failingSenderFn = () => Promise.reject(new Error('Contact creation error')); const modifyCreator = new ModifyCreator(failingSenderFn); @@ -169,4 +220,17 @@ describe('ModifyCreator', () => { ); }); + it('throws an instance of Error when getContactCreator fails with a specific error object', async () => { + const failingSenderFn = () => Promise.reject({ error: { message: 'Contact creation error' } }); + const modifyCreator = new ModifyCreator(failingSenderFn); + const contactCreator = modifyCreator.getContactCreator(); + + await assertRejects( + async () => { + await contactCreator.addContactEmail('test-contact-id', 'test@example.com'); + }, + Error, + 'Contact creation error', + ); + }); }); From b08b2cf7b6796d54a72de3d949bad2bb99adc445 Mon Sep 17 00:00:00 2001 From: Alfredo Del Fabro Neto Date: Tue, 1 Apr 2025 18:13:35 -0300 Subject: [PATCH 07/10] fix: handles the legacy way of throwing errors --- .../lib/accessors/modify/ModifyCreator.ts | 20 ++++-- .../lib/accessors/tests/ModifyCreator.test.ts | 65 +++++++++++++++++++ 2 files changed, 81 insertions(+), 4 deletions(-) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts index 79aac8fc3f98b..a45afcf400fcd 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts @@ -62,8 +62,11 @@ export class ModifyCreator implements IModifyCreator { .catch((err) => { if (err instanceof Error) { throw err; + } else if (err.error && err.error.message) { + throw new Error(err.error.message); + } else { + throw new Error(err.error); } - throw new Error(err.error.message); }); }, }, @@ -87,8 +90,11 @@ export class ModifyCreator implements IModifyCreator { .catch((err) => { if (err instanceof Error) { throw err; + } else if (err.error && err.error.message) { + throw new Error(err.error.message); + } else { + throw new Error(err.error); } - throw new Error(err.error.message); }), }, ) as IUploadCreator; @@ -110,8 +116,11 @@ export class ModifyCreator implements IModifyCreator { .catch((err) => { if (err instanceof Error) { throw err; + } else if (err.error && err.error.message) { + throw new Error(err.error.message); + } else { + throw new Error(err.error); } - throw new Error(err.error.message); }), } ) @@ -133,8 +142,11 @@ export class ModifyCreator implements IModifyCreator { .catch((err) => { if (err instanceof Error) { throw err; + } else if (err.error && err.error.message) { + throw new Error(err.error.message); + } else { + throw new Error(err.error); } - throw new Error(err.error.message); }), } ) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts index 081af2eb2d3eb..3c83cb9f4d46c 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts @@ -140,6 +140,24 @@ describe('ModifyCreator', () => { ); }); + it('throws a default Error when getLivechatCreator fails with an unknown error object', async () => { + const failingSenderFn = () => Promise.reject({ error: { } }); + const modifyCreator = new ModifyCreator(failingSenderFn); + const livechatCreator = modifyCreator.getLivechatCreator(); + + await assertRejects( + async () => { + await livechatCreator.createVisitor({ + token: 'visitor-token', + username: 'visitor-username', + name: 'Visitor Name', + }); + }, + Error, + '[object Object]', + ); + }); + it('throws an error when a proxy method of getUploadCreator fails', async () => { const failingSenderFn = () => Promise.reject(new Error('Upload error')); const modifyCreator = new ModifyCreator(failingSenderFn); @@ -168,6 +186,20 @@ describe('ModifyCreator', () => { ); }); + it('throws a default Error when getUploadCreator fails with an unknown error object', async () => { + const failingSenderFn = () => Promise.reject({ error: { } }); + const modifyCreator = new ModifyCreator(failingSenderFn); + const uploadCreator = modifyCreator.getUploadCreator(); + + await assertRejects( + async () => { + await uploadCreator.uploadBuffer(new Uint8Array([1, 2, 3]), 'image/png'); + }, + Error, + '[object Object]', + ); + }); + it('throws an error when a proxy method of getEmailCreator fails', async () => { const failingSenderFn = () => Promise.reject(new Error('Email error')); const modifyCreator = new ModifyCreator(failingSenderFn); @@ -206,6 +238,25 @@ describe('ModifyCreator', () => { ); }); + it('throws a default Error when getEmailCreator fails with an unknown error object', async () => { + const failingSenderFn = () => Promise.reject({ error: { } }); + const modifyCreator = new ModifyCreator(failingSenderFn); + const emailCreator = modifyCreator.getEmailCreator(); + + await assertRejects( + async () => { + await emailCreator.send({ + to: 'test@example.com', + from: 'sender@example.com', + subject: 'Test Email', + text: 'This is a test email.', + }); + }, + Error, + '[object Object]', + ); + }); + it('throws an error when a proxy method of getContactCreator fails', async () => { const failingSenderFn = () => Promise.reject(new Error('Contact creation error')); const modifyCreator = new ModifyCreator(failingSenderFn); @@ -233,4 +284,18 @@ describe('ModifyCreator', () => { 'Contact creation error', ); }); + + it('throws a default Error when getContactCreator fails with an unknown error object', async () => { + const failingSenderFn = () => Promise.reject({ error: { } }); + const modifyCreator = new ModifyCreator(failingSenderFn); + const contactCreator = modifyCreator.getContactCreator(); + + await assertRejects( + async () => { + await contactCreator.addContactEmail('test-contact-id', 'test@example.com'); + }, + Error, + '[object Object]', + ); + }); }); From b615eb3ad8a8b1c03d49bd2e52ffd8a74dc8ae43 Mon Sep 17 00:00:00 2001 From: Alfredo Del Fabro Neto Date: Tue, 1 Apr 2025 18:41:43 -0300 Subject: [PATCH 08/10] chore: adds changeset --- .changeset/popular-pumpkins-relax.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/popular-pumpkins-relax.md diff --git a/.changeset/popular-pumpkins-relax.md b/.changeset/popular-pumpkins-relax.md new file mode 100644 index 0000000000000..b8207e70e0313 --- /dev/null +++ b/.changeset/popular-pumpkins-relax.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/apps-engine': patch +--- + +Fixes an issue with error handling where errors were not properly propagated to integrated apps. From e28530a79d07f406c70a56dae6cbaf91adc4f2f0 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Wed, 2 Apr 2025 10:27:10 -0300 Subject: [PATCH 09/10] code style --- .../lib/accessors/modify/ModifyCreator.ts | 24 ++--- .../lib/accessors/tests/ModifyCreator.test.ts | 98 ++++++------------- 2 files changed, 40 insertions(+), 82 deletions(-) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts index a45afcf400fcd..e209cb44ea8ef 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/modify/ModifyCreator.ts @@ -62,11 +62,11 @@ export class ModifyCreator implements IModifyCreator { .catch((err) => { if (err instanceof Error) { throw err; - } else if (err.error && err.error.message) { + } + if (err?.error?.message) { throw new Error(err.error.message); - } else { - throw new Error(err.error); } + throw new Error(err.error); }); }, }, @@ -90,11 +90,11 @@ export class ModifyCreator implements IModifyCreator { .catch((err) => { if (err instanceof Error) { throw err; - } else if (err.error && err.error.message) { + } + if (err?.error?.message) { throw new Error(err.error.message); - } else { - throw new Error(err.error); } + throw new Error(err.error); }), }, ) as IUploadCreator; @@ -116,11 +116,11 @@ export class ModifyCreator implements IModifyCreator { .catch((err) => { if (err instanceof Error) { throw err; - } else if (err.error && err.error.message) { + } + if (err?.error?.message) { throw new Error(err.error.message); - } else { - throw new Error(err.error); } + throw new Error(err.error); }), } ) @@ -142,11 +142,11 @@ export class ModifyCreator implements IModifyCreator { .catch((err) => { if (err instanceof Error) { throw err; - } else if (err.error && err.error.message) { + } + if (err?.error?.message) { throw new Error(err.error.message); - } else { - throw new Error(err.error); } + throw new Error(err.error); }), } ) diff --git a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts index 3c83cb9f4d46c..f3d83b32e4e9d 100644 --- a/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts +++ b/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyCreator.test.ts @@ -110,13 +110,12 @@ describe('ModifyCreator', () => { const livechatCreator = modifyCreator.getLivechatCreator(); await assertRejects( - async () => { - await livechatCreator.createAndReturnVisitor({ + () => + livechatCreator.createAndReturnVisitor({ token: 'visitor-token', username: 'visitor-username', name: 'Visitor Name', - }); - }, + }), Error, 'Test error', ); @@ -128,31 +127,29 @@ describe('ModifyCreator', () => { const livechatCreator = modifyCreator.getLivechatCreator(); await assertRejects( - async () => { - await livechatCreator.createVisitor({ + () => + livechatCreator.createVisitor({ token: 'visitor-token', username: 'visitor-username', name: 'Visitor Name', - }); - }, + }), Error, 'Livechat method error', ); }); it('throws a default Error when getLivechatCreator fails with an unknown error object', async () => { - const failingSenderFn = () => Promise.reject({ error: { } }); + const failingSenderFn = () => Promise.reject({ error: {} }); const modifyCreator = new ModifyCreator(failingSenderFn); const livechatCreator = modifyCreator.getLivechatCreator(); await assertRejects( - async () => { - await livechatCreator.createVisitor({ + () => + livechatCreator.createVisitor({ token: 'visitor-token', username: 'visitor-username', name: 'Visitor Name', - }); - }, + }), Error, '[object Object]', ); @@ -163,13 +160,7 @@ describe('ModifyCreator', () => { const modifyCreator = new ModifyCreator(failingSenderFn); const uploadCreator = modifyCreator.getUploadCreator(); - await assertRejects( - async () => { - await uploadCreator.uploadBuffer(new Uint8Array([9, 10, 11, 12]), 'image/png'); - }, - Error, - 'Upload error', - ); + await assertRejects(() => uploadCreator.uploadBuffer(new Uint8Array([9, 10, 11, 12]), 'image/png'), Error, 'Upload error'); }); it('throws an instance of Error when getUploadCreator fails with a specific error object', async () => { @@ -177,27 +168,15 @@ describe('ModifyCreator', () => { const modifyCreator = new ModifyCreator(failingSenderFn); const uploadCreator = modifyCreator.getUploadCreator(); - await assertRejects( - async () => { - await uploadCreator.uploadBuffer(new Uint8Array([1, 2, 3]), 'image/png'); - }, - Error, - 'Upload method error', - ); + await assertRejects(() => uploadCreator.uploadBuffer(new Uint8Array([1, 2, 3]), 'image/png'), Error, 'Upload method error'); }); it('throws a default Error when getUploadCreator fails with an unknown error object', async () => { - const failingSenderFn = () => Promise.reject({ error: { } }); + const failingSenderFn = () => Promise.reject({ error: {} }); const modifyCreator = new ModifyCreator(failingSenderFn); const uploadCreator = modifyCreator.getUploadCreator(); - await assertRejects( - async () => { - await uploadCreator.uploadBuffer(new Uint8Array([1, 2, 3]), 'image/png'); - }, - Error, - '[object Object]', - ); + await assertRejects(() => uploadCreator.uploadBuffer(new Uint8Array([1, 2, 3]), 'image/png'), Error, '[object Object]'); }); it('throws an error when a proxy method of getEmailCreator fails', async () => { @@ -206,14 +185,13 @@ describe('ModifyCreator', () => { const emailCreator = modifyCreator.getEmailCreator(); await assertRejects( - async () => { - await emailCreator.send({ + () => + emailCreator.send({ to: 'test@example.com', from: 'sender@example.com', subject: 'Test Email', text: 'This is a test email.', - }); - }, + }), Error, 'Email error', ); @@ -225,33 +203,31 @@ describe('ModifyCreator', () => { const emailCreator = modifyCreator.getEmailCreator(); await assertRejects( - async () => { - await emailCreator.send({ + () => + emailCreator.send({ to: 'test@example.com', from: 'sender@example.com', subject: 'Test Email', text: 'This is a test email.', - }); - }, + }), Error, 'Email method error', ); }); it('throws a default Error when getEmailCreator fails with an unknown error object', async () => { - const failingSenderFn = () => Promise.reject({ error: { } }); + const failingSenderFn = () => Promise.reject({ error: {} }); const modifyCreator = new ModifyCreator(failingSenderFn); const emailCreator = modifyCreator.getEmailCreator(); await assertRejects( - async () => { - await emailCreator.send({ + () => + emailCreator.send({ to: 'test@example.com', from: 'sender@example.com', subject: 'Test Email', text: 'This is a test email.', - }); - }, + }), Error, '[object Object]', ); @@ -262,13 +238,7 @@ describe('ModifyCreator', () => { const modifyCreator = new ModifyCreator(failingSenderFn); const contactCreator = modifyCreator.getContactCreator(); - await assertRejects( - async () => { - await contactCreator.addContactEmail('test-contact-id', 'test@example.com'); - }, - Error, - 'Contact creation error', - ); + await assertRejects(() => contactCreator.addContactEmail('test-contact-id', 'test@example.com'), Error, 'Contact creation error'); }); it('throws an instance of Error when getContactCreator fails with a specific error object', async () => { @@ -276,26 +246,14 @@ describe('ModifyCreator', () => { const modifyCreator = new ModifyCreator(failingSenderFn); const contactCreator = modifyCreator.getContactCreator(); - await assertRejects( - async () => { - await contactCreator.addContactEmail('test-contact-id', 'test@example.com'); - }, - Error, - 'Contact creation error', - ); + await assertRejects(() => contactCreator.addContactEmail('test-contact-id', 'test@example.com'), Error, 'Contact creation error'); }); it('throws a default Error when getContactCreator fails with an unknown error object', async () => { - const failingSenderFn = () => Promise.reject({ error: { } }); + const failingSenderFn = () => Promise.reject({ error: {} }); const modifyCreator = new ModifyCreator(failingSenderFn); const contactCreator = modifyCreator.getContactCreator(); - await assertRejects( - async () => { - await contactCreator.addContactEmail('test-contact-id', 'test@example.com'); - }, - Error, - '[object Object]', - ); + await assertRejects(() => contactCreator.addContactEmail('test-contact-id', 'test@example.com'), Error, '[object Object]'); }); }); From 066588d21f9de3abed272a2c60c6231301a338af Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Wed, 2 Apr 2025 10:29:15 -0300 Subject: [PATCH 10/10] doc: update changeset --- .changeset/popular-pumpkins-relax.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.changeset/popular-pumpkins-relax.md b/.changeset/popular-pumpkins-relax.md index b8207e70e0313..545b3ae4c0db8 100644 --- a/.changeset/popular-pumpkins-relax.md +++ b/.changeset/popular-pumpkins-relax.md @@ -1,5 +1,6 @@ --- '@rocket.chat/apps-engine': patch +'@rocket.chat/meteor': patch --- Fixes an issue with error handling where errors were not properly propagated to integrated apps.