Skip to content

Commit 8162306

Browse files
committed
Add unit tests
1 parent dbcd952 commit 8162306

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
import { renderHook } from '@testing-library/react-hooks';
2+
import { useMessageActions } from '../hooks/useMessageActions';
3+
import { UserMessageCreateParams, FileMessageCreateParams } from '@sendbird/chat/message';
4+
5+
const mockEventHandlers = {
6+
message: {
7+
onSendMessageFailed: jest.fn(),
8+
onUpdateMessageFailed: jest.fn(),
9+
onFileUploadFailed: jest.fn(),
10+
},
11+
};
12+
13+
jest.mock('../../../../hooks/useSendbirdStateContext', () => ({
14+
__esModule: true,
15+
default: () => ({
16+
eventHandlers: mockEventHandlers,
17+
}),
18+
}));
19+
20+
describe('useMessageActions', () => {
21+
const mockParams = {
22+
sendUserMessage: jest.fn(),
23+
sendFileMessage: jest.fn(),
24+
sendMultipleFilesMessage: jest.fn(),
25+
updateUserMessage: jest.fn(),
26+
scrollToBottom: jest.fn(),
27+
replyType: 'NONE',
28+
};
29+
30+
beforeEach(() => {
31+
jest.clearAllMocks();
32+
});
33+
34+
describe('processParams', () => {
35+
it('should handle successful user message', async () => {
36+
const { result } = renderHook(() => useMessageActions(mockParams));
37+
const params: UserMessageCreateParams = { message: 'test' };
38+
39+
await result.current.sendUserMessage(params);
40+
41+
expect(mockParams.sendUserMessage).toHaveBeenCalledWith(
42+
expect.objectContaining({ message: 'test' }),
43+
expect.any(Function),
44+
);
45+
});
46+
47+
it('should handle void return from onBeforeSendFileMessage', async () => {
48+
const onBeforeSendFileMessage = jest.fn();
49+
const { result } = renderHook(() => useMessageActions({
50+
...mockParams,
51+
onBeforeSendFileMessage,
52+
}),
53+
);
54+
55+
const fileParams: FileMessageCreateParams = {
56+
file: new File([], 'test.txt'),
57+
};
58+
59+
await result.current.sendFileMessage(fileParams);
60+
61+
expect(onBeforeSendFileMessage).toHaveBeenCalled();
62+
expect(mockParams.sendFileMessage).toHaveBeenCalledWith(
63+
expect.objectContaining(fileParams),
64+
expect.any(Function),
65+
);
66+
});
67+
68+
it('should handle file upload error', async () => {
69+
// Arrange
70+
const error = new Error('Upload failed');
71+
const onBeforeSendFileMessage = jest.fn().mockRejectedValue(error);
72+
const fileParams: FileMessageCreateParams = {
73+
file: new File([], 'test.txt'),
74+
fileName: 'test.txt',
75+
};
76+
77+
const { result } = renderHook(() => useMessageActions({
78+
...mockParams,
79+
onBeforeSendFileMessage,
80+
}),
81+
);
82+
83+
// Act & Assert
84+
await expect(async () => {
85+
await result.current.sendFileMessage(fileParams);
86+
}).rejects.toThrow('Upload failed');
87+
88+
// Wait for next tick to ensure all promises are resolved
89+
await new Promise(process.nextTick);
90+
91+
expect(onBeforeSendFileMessage).toHaveBeenCalled();
92+
expect(mockEventHandlers.message.onFileUploadFailed).toHaveBeenCalledWith(error);
93+
expect(mockEventHandlers.message.onSendMessageFailed).toHaveBeenCalledWith(
94+
expect.objectContaining({
95+
file: fileParams.file,
96+
fileName: fileParams.fileName,
97+
}),
98+
error,
99+
);
100+
});
101+
102+
it('should handle message update error', async () => {
103+
// Arrange
104+
const error = new Error('Update failed');
105+
const onBeforeUpdateUserMessage = jest.fn().mockRejectedValue(error);
106+
const messageParams = {
107+
messageId: 1,
108+
message: 'update message',
109+
};
110+
111+
const { result } = renderHook(() => useMessageActions({
112+
...mockParams,
113+
onBeforeUpdateUserMessage,
114+
}),
115+
);
116+
117+
// Act & Assert
118+
await expect(async () => {
119+
await result.current.updateUserMessage(messageParams.messageId, {
120+
message: messageParams.message,
121+
});
122+
}).rejects.toThrow('Update failed');
123+
124+
// Wait for next tick to ensure all promises are resolved
125+
await new Promise(process.nextTick);
126+
127+
expect(onBeforeUpdateUserMessage).toHaveBeenCalled();
128+
expect(mockEventHandlers.message.onUpdateMessageFailed).toHaveBeenCalledWith(
129+
expect.objectContaining({
130+
message: messageParams.message,
131+
}),
132+
error,
133+
);
134+
});
135+
136+
it('should preserve modified params from onBefore handlers', async () => {
137+
const onBeforeSendUserMessage = jest.fn().mockImplementation((params) => ({
138+
...params,
139+
message: 'modified',
140+
}));
141+
142+
const { result } = renderHook(() => useMessageActions({
143+
...mockParams,
144+
onBeforeSendUserMessage,
145+
}),
146+
);
147+
148+
await result.current.sendUserMessage({ message: 'original' });
149+
150+
expect(mockParams.sendUserMessage).toHaveBeenCalledWith(
151+
expect.objectContaining({ message: 'modified' }),
152+
expect.any(Function),
153+
);
154+
});
155+
});
156+
});

0 commit comments

Comments
 (0)