Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/popular-pumpkins-relax.md
Original file line number Diff line number Diff line change
@@ -0,0 +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.
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ export class ModifyCreator implements IModifyCreator {
})
.then((response) => response.result)
.catch((err) => {
if (err instanceof Error) {
throw err;
}
if (err?.error?.message) {
throw new Error(err.error.message);
}
throw new Error(err.error);
});
},
Expand All @@ -82,6 +88,12 @@ export class ModifyCreator implements IModifyCreator {
})
.then((response) => response.result)
.catch((err) => {
if (err instanceof Error) {
throw err;
}
if (err?.error?.message) {
throw new Error(err.error.message);
}
throw new Error(err.error);
}),
},
Expand All @@ -92,7 +104,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'
? {}
Expand All @@ -102,6 +114,12 @@ export class ModifyCreator implements IModifyCreator {
})
.then((response) => response.result)
.catch((err) => {
if (err instanceof Error) {
throw err;
}
if (err?.error?.message) {
throw new Error(err.error.message);
}
throw new Error(err.error);
}),
}
Expand All @@ -112,7 +130,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'
? {}
Expand All @@ -122,6 +140,12 @@ export class ModifyCreator implements IModifyCreator {
})
.then((response) => response.result)
.catch((err) => {
if (err instanceof Error) {
throw err;
}
if (err?.error?.message) {
throw new Error(err.error.message);
}
throw new Error(err.error);
}),
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// deno-lint-ignore-file no-explicit-any
import { afterAll, beforeEach, describe, it } from 'https://deno.land/[email protected]/testing/bdd.ts';
import { assertSpyCall, spy } from 'https://deno.land/[email protected]/testing/mock.ts';
import { assert, assertEquals, assertNotInstanceOf } from 'https://deno.land/[email protected]/assert/mod.ts';
import { assert, assertEquals, assertNotInstanceOf, assertRejects } from 'https://deno.land/[email protected]/assert/mod.ts';

import { AppObjectRegistry } from '../../../AppObjectRegistry.ts';
import { ModifyCreator } from '../modify/ModifyCreator.ts';
Expand Down Expand Up @@ -103,4 +103,157 @@ 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();

await assertRejects(
() =>
livechatCreator.createAndReturnVisitor({
token: 'visitor-token',
username: 'visitor-username',
name: 'Visitor Name',
}),
Error,
'Test error',
);
});

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(
() =>
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 modifyCreator = new ModifyCreator(failingSenderFn);
const livechatCreator = modifyCreator.getLivechatCreator();

await assertRejects(
() =>
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);
const uploadCreator = modifyCreator.getUploadCreator();

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 () => {
const failingSenderFn = () => Promise.reject({ error: { message: 'Upload method error' } });
const modifyCreator = new ModifyCreator(failingSenderFn);
const uploadCreator = modifyCreator.getUploadCreator();

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 modifyCreator = new ModifyCreator(failingSenderFn);
const uploadCreator = modifyCreator.getUploadCreator();

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 () => {
const failingSenderFn = () => Promise.reject(new Error('Email error'));
const modifyCreator = new ModifyCreator(failingSenderFn);
const emailCreator = modifyCreator.getEmailCreator();

await assertRejects(
() =>
emailCreator.send({
to: '[email protected]',
from: '[email protected]',
subject: 'Test Email',
text: 'This is a test email.',
}),
Error,
'Email error',
);
});

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(
() =>
emailCreator.send({
to: '[email protected]',
from: '[email protected]',
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 modifyCreator = new ModifyCreator(failingSenderFn);
const emailCreator = modifyCreator.getEmailCreator();

await assertRejects(
() =>
emailCreator.send({
to: '[email protected]',
from: '[email protected]',
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);
const contactCreator = modifyCreator.getContactCreator();

await assertRejects(() => contactCreator.addContactEmail('test-contact-id', '[email protected]'), Error, 'Contact creation error');
});

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(() => contactCreator.addContactEmail('test-contact-id', '[email protected]'), Error, '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(() => contactCreator.addContactEmail('test-contact-id', '[email protected]'), Error, '[object Object]');
});
});
Loading