Skip to content

Commit 22c494e

Browse files
committed
test(apps): add tests for ModifyDeleter accessor
Fixes #39795
1 parent 315d2f5 commit 22c494e

2 files changed

Lines changed: 126 additions & 126 deletions

File tree

packages/apps-engine/tests/server/accessors/ModifyDeleter.spec.ts

Lines changed: 0 additions & 126 deletions
This file was deleted.
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import * as assert from 'node:assert';
2+
import { afterEach, beforeEach, describe, it, mock } from 'node:test';
3+
4+
import type { IMessage } from '../../../src/definition/messages';
5+
import type { IUser } from '../../../src/definition/users';
6+
import { UserType } from '../../../src/definition/users';
7+
import { ModifyDeleter } from '../../../src/server/accessors/ModifyDeleter';
8+
import type { AppBridges, MessageBridge, RoomBridge, UserBridge } from '../../../src/server/bridges';
9+
import { TestData } from '../../test-data/utilities';
10+
11+
describe('ModifyDeleter', () => {
12+
let mockAppId: string;
13+
let mockRoomBridge: RoomBridge;
14+
let mockMessageBridge: MessageBridge;
15+
let mockUserBridge: UserBridge;
16+
let mockBridges: AppBridges;
17+
18+
beforeEach(() => {
19+
mockAppId = 'testing-app';
20+
21+
mockRoomBridge = {
22+
doDelete(roomId: string, appId: string): Promise<void> {
23+
return Promise.resolve();
24+
},
25+
doRemoveUsers(roomId: string, usernames: Array<string>, appId: string): Promise<void> {
26+
return Promise.resolve();
27+
},
28+
} as RoomBridge;
29+
30+
mockMessageBridge = {
31+
doDelete(message: IMessage, user: IUser, appId: string): Promise<void> {
32+
return Promise.resolve();
33+
},
34+
} as MessageBridge;
35+
36+
mockUserBridge = {
37+
doDeleteUsersCreatedByApp(appId: string, userType: UserType): Promise<boolean> {
38+
return Promise.resolve(true);
39+
},
40+
} as UserBridge;
41+
42+
const rmBridge = mockRoomBridge;
43+
const msgBridge = mockMessageBridge;
44+
const usrBridge = mockUserBridge;
45+
mockBridges = {
46+
getRoomBridge: () => rmBridge,
47+
getMessageBridge: () => msgBridge,
48+
getUserBridge: () => usrBridge,
49+
} as AppBridges;
50+
});
51+
52+
afterEach(() => {
53+
mock.restoreAll();
54+
});
55+
56+
it('deleteRoom delegates to RoomBridge', async () => {
57+
const md = new ModifyDeleter(mockBridges, mockAppId);
58+
const spy = mock.method(mockRoomBridge, 'doDelete');
59+
60+
await md.deleteRoom('room-id');
61+
62+
assert.strictEqual(spy.mock.calls.length, 1);
63+
assert.deepStrictEqual(spy.mock.calls[0].arguments, ['room-id', mockAppId]);
64+
});
65+
66+
it('deleteMessage delegates to MessageBridge', async () => {
67+
const md = new ModifyDeleter(mockBridges, mockAppId);
68+
const spy = mock.method(mockMessageBridge, 'doDelete');
69+
70+
const message = TestData.getMessage();
71+
const user = TestData.getUser();
72+
await md.deleteMessage(message, user);
73+
74+
assert.strictEqual(spy.mock.calls.length, 1);
75+
assert.deepStrictEqual(spy.mock.calls[0].arguments, [message, user, mockAppId]);
76+
});
77+
78+
it('deleteUsers delegates to UserBridge and returns result', async () => {
79+
const md = new ModifyDeleter(mockBridges, mockAppId);
80+
const spy = mock.method(mockUserBridge, 'doDeleteUsersCreatedByApp');
81+
82+
const result = await md.deleteUsers('app-id', UserType.APP);
83+
84+
assert.strictEqual(result, true);
85+
assert.strictEqual(spy.mock.calls.length, 1);
86+
assert.deepStrictEqual(spy.mock.calls[0].arguments, ['app-id', UserType.APP]);
87+
88+
await md.deleteUsers('app-id', UserType.BOT);
89+
assert.deepStrictEqual(spy.mock.calls[1].arguments, ['app-id', UserType.BOT]);
90+
});
91+
92+
it('removeUsersFromRoom delegates to RoomBridge', async () => {
93+
const md = new ModifyDeleter(mockBridges, mockAppId);
94+
const spy = mock.method(mockRoomBridge, 'doRemoveUsers');
95+
96+
const usernames = ['user1', 'user2', 'user3'];
97+
await md.removeUsersFromRoom('room-id', usernames);
98+
99+
assert.strictEqual(spy.mock.calls.length, 1);
100+
assert.deepStrictEqual(spy.mock.calls[0].arguments, ['room-id', usernames, mockAppId]);
101+
});
102+
103+
it('removeUsersFromRoom accepts exactly 50 users', async () => {
104+
const md = new ModifyDeleter(mockBridges, mockAppId);
105+
const spy = mock.method(mockRoomBridge, 'doRemoveUsers');
106+
107+
const fiftyUsers = Array.from({ length: 50 }, (_, i) => `user${i}`);
108+
await md.removeUsersFromRoom('room-id', fiftyUsers);
109+
110+
assert.strictEqual(spy.mock.calls.length, 1);
111+
assert.deepStrictEqual(spy.mock.calls[0].arguments, ['room-id', fiftyUsers, mockAppId]);
112+
});
113+
114+
it('removeUsersFromRoom throws when exceeding 50 users', async () => {
115+
const md = new ModifyDeleter(mockBridges, mockAppId);
116+
const spy = mock.method(mockRoomBridge, 'doRemoveUsers');
117+
118+
const tooManyUsers = Array.from({ length: 51 }, (_, i) => `user${i}`);
119+
120+
await assert.rejects(
121+
() => md.removeUsersFromRoom('room-id', tooManyUsers),
122+
{ name: 'Error', message: 'A maximum of 50 members can be removed in a single call' },
123+
);
124+
assert.strictEqual(spy.mock.calls.length, 0);
125+
});
126+
});

0 commit comments

Comments
 (0)