The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/packages/apps-engine/deno-runtime/lib/accessors/tests/ModifyExtender.test.ts

244 lines
7.7 KiB

// 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, stub } from 'https://deno.land/std@0.203.0/testing/mock.ts';
import { assertRejects } from 'https://deno.land/std@0.203.0/assert/mod.ts';
import { AppObjectRegistry } from '../../../AppObjectRegistry.ts';
import { ModifyExtender } from '../modify/ModifyExtender.ts';
import jsonrpc from 'jsonrpc-lite';
describe('ModifyExtender', () => {
let extender: ModifyExtender;
const senderFn = (r: any) =>
Promise.resolve({
id: Math.random().toString(36).substring(2),
jsonrpc: '2.0',
result: structuredClone(r),
serialize() {
return JSON.stringify(this);
},
});
beforeEach(() => {
AppObjectRegistry.clear();
AppObjectRegistry.set('id', 'deno-test');
extender = new ModifyExtender(senderFn);
});
afterAll(() => {
AppObjectRegistry.clear();
});
it('correctly formats requests for the extend message requests', async () => {
const _spy = spy(extender, 'senderFn' as keyof ModifyExtender);
const messageExtender = await extender.extendMessage('message-id', { _id: 'user-id' } as any);
assertSpyCall(_spy, 0, {
args: [
{
method: 'bridges:getMessageBridge:doGetById',
params: ['message-id', 'deno-test'],
},
],
});
messageExtender.addCustomField('key', 'value');
await extender.finish(messageExtender);
assertSpyCall(_spy, 1, {
args: [
{
method: 'bridges:getMessageBridge:doUpdate',
params: [messageExtender.getMessage(), 'deno-test'],
},
],
});
_spy.restore();
});
it('correctly formats requests for the extend room requests', async () => {
const _spy = spy(extender, 'senderFn' as keyof ModifyExtender);
const roomExtender = await extender.extendRoom('room-id', { _id: 'user-id' } as any);
assertSpyCall(_spy, 0, {
args: [
{
method: 'bridges:getRoomBridge:doGetById',
params: ['room-id', 'deno-test'],
},
],
});
roomExtender.addCustomField('key', 'value');
await extender.finish(roomExtender);
assertSpyCall(_spy, 1, {
args: [
{
method: 'bridges:getRoomBridge:doUpdate',
params: [roomExtender.getRoom(), [], 'deno-test'],
},
],
});
_spy.restore();
});
it('correctly formats requests for the extend video conference requests', async () => {
const _spy = spy(extender, 'senderFn' as keyof ModifyExtender);
const videoConferenceExtender = await extender.extendVideoConference('video-conference-id');
assertSpyCall(_spy, 0, {
args: [
{
method: 'bridges:getVideoConferenceBridge:doGetById',
params: ['video-conference-id', 'deno-test'],
},
],
});
videoConferenceExtender.setStatus(4);
await extender.finish(videoConferenceExtender);
assertSpyCall(_spy, 1, {
args: [
{
method: 'bridges:getVideoConferenceBridge:doUpdate',
params: [videoConferenceExtender.getVideoConference(), 'deno-test'],
},
],
});
_spy.restore();
});
describe('Error Handling', () => {
describe('extendMessage', () => {
it('throws an instance of Error when senderFn throws an error', async () => {
const _stub = stub(extender, 'senderFn' as keyof ModifyExtender, () => Promise.reject(new Error('unit-test-error')) as any);
await assertRejects(() => extender.extendMessage('message-id', { _id: 'user-id' } as any), Error, 'unit-test-error');
_stub.restore();
});
it('throws an instance of Error when senderFn throws a jsonrpc error', async () => {
const _stub = stub(
extender,
'senderFn' as keyof ModifyExtender,
() => Promise.reject(jsonrpc.error('unit-test-error', new jsonrpc.JsonRpcError('unit-test-error', 1000))) as any,
);
await assertRejects(() => extender.extendMessage('message-id', { _id: 'user-id' } as any), Error, 'unit-test-error');
_stub.restore();
});
it('throws an instance of Error when senderFn throws an unknown value', async () => {
const _stub = stub(extender, 'senderFn' as keyof ModifyExtender, () => Promise.reject({}) as any);
await assertRejects(() => extender.extendMessage('message-id', { _id: 'user-id' } as any), Error, 'An unknown error occurred');
_stub.restore();
});
});
describe('extendRoom', () => {
it('throws an instance of Error when senderFn throws an error', async () => {
const _stub = stub(extender, 'senderFn' as keyof ModifyExtender, () => Promise.reject(new Error('unit-test-error')) as any);
await assertRejects(() => extender.extendRoom('room-id', { _id: 'user-id' } as any), Error, 'unit-test-error');
_stub.restore();
});
it('throws an instance of Error when senderFn throws a jsonrpc error', async () => {
const _stub = stub(
extender,
'senderFn' as keyof ModifyExtender,
() => Promise.reject(jsonrpc.error('unit-test-error', new jsonrpc.JsonRpcError('unit-test-error', 1000))) as any,
);
await assertRejects(() => extender.extendRoom('room-id', { _id: 'user-id' } as any), Error, 'unit-test-error');
_stub.restore();
});
it('throws an instance of Error when senderFn throws an unknown value', async () => {
const _stub = stub(extender, 'senderFn' as keyof ModifyExtender, () => Promise.reject({}) as any);
await assertRejects(() => extender.extendRoom('room-id', { _id: 'user-id' } as any), Error, 'An unknown error occurred');
_stub.restore();
});
});
describe('extendVideoConference', () => {
it('throws an instance of Error when senderFn throws an error', async () => {
const _stub = stub(extender, 'senderFn' as keyof ModifyExtender, () => Promise.reject(new Error('unit-test-error')) as any);
await assertRejects(() => extender.extendVideoConference('video-conference-id'), Error, 'unit-test-error');
_stub.restore();
});
it('throws an instance of Error when senderFn throws a jsonrpc error', async () => {
const _stub = stub(
extender,
'senderFn' as keyof ModifyExtender,
() => Promise.reject(jsonrpc.error('unit-test-error', new jsonrpc.JsonRpcError('unit-test-error', 1000))) as any,
);
await assertRejects(() => extender.extendVideoConference('video-conference-id'), Error, 'unit-test-error');
_stub.restore();
});
it('throws an instance of Error when senderFn throws an unknown value', async () => {
const _stub = stub(extender, 'senderFn' as keyof ModifyExtender, () => Promise.reject({}) as any);
await assertRejects(() => extender.extendVideoConference('video-conference-id'), Error, 'An unknown error occurred');
_stub.restore();
});
});
describe('finish', () => {
it('throws an instance of Error when senderFn throws an error', async () => {
const _stub = stub(extender, 'senderFn' as keyof ModifyExtender, () => Promise.reject(new Error('unit-test-error')) as any);
await assertRejects(() => extender.finish({ kind: 'message', getMessage: () => ({}) } as any), Error, 'unit-test-error');
_stub.restore();
});
it('throws an instance of Error when senderFn throws a jsonrpc error', async () => {
const _stub = stub(
extender,
'senderFn' as keyof ModifyExtender,
() => Promise.reject(jsonrpc.error('unit-test-error', new jsonrpc.JsonRpcError('unit-test-error', 1000))) as any,
);
await assertRejects(() => extender.finish({ kind: 'message', getMessage: () => ({}) } as any), Error, 'unit-test-error');
_stub.restore();
});
it('throws an instance of Error when senderFn throws an unknown value', async () => {
const _stub = stub(extender, 'senderFn' as keyof ModifyExtender, () => Promise.reject({}) as any);
await assertRejects(() => extender.finish({ kind: 'message', getMessage: () => ({}) } as any), Error, 'An unknown error occurred');
_stub.restore();
});
});
});
});