Skip to content

Commit 8682d85

Browse files
committed
test: add unit tests around isMessageEqual and isAttachmentEqual props
1 parent cebd7cf commit 8682d85

File tree

2 files changed

+193
-0
lines changed

2 files changed

+193
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import React from 'react';
2+
3+
import { Text } from 'react-native';
4+
5+
import { act, cleanup, render, waitFor } from '@testing-library/react-native';
6+
7+
import { OverlayProvider } from '../../../contexts/overlayContext/OverlayProvider';
8+
import { getOrCreateChannelApi } from '../../../mock-builders/api/getOrCreateChannel';
9+
10+
import { useMockedApis } from '../../../mock-builders/api/useMockedApis';
11+
import dispatchMessageUpdateEvent from '../../../mock-builders/event/messageUpdated';
12+
import { generateChannelResponse } from '../../../mock-builders/generator/channel';
13+
import { generateMember } from '../../../mock-builders/generator/member';
14+
import { generateMessage } from '../../../mock-builders/generator/message';
15+
import { generateUser } from '../../../mock-builders/generator/user';
16+
import { getTestClientWithUser } from '../../../mock-builders/mock';
17+
import { Channel } from '../../Channel/Channel';
18+
import { Chat } from '../../Chat/Chat';
19+
import { MessageList } from '../../MessageList/MessageList';
20+
21+
describe('Message', () => {
22+
let channel;
23+
let chatClient;
24+
25+
const user = generateUser({ id: 'id', name: 'name' });
26+
const messages = [
27+
generateMessage({
28+
attachments: [{ customField: 'custom-field', type: 'test' }],
29+
user,
30+
}),
31+
];
32+
33+
beforeEach(async () => {
34+
const members = [generateMember({ user })];
35+
const mockedChannel = generateChannelResponse({
36+
members,
37+
messages,
38+
});
39+
40+
chatClient = await getTestClientWithUser(user);
41+
useMockedApis(chatClient, [getOrCreateChannelApi(mockedChannel)]);
42+
channel = chatClient.channel('messaging', mockedChannel.id);
43+
await channel.watch();
44+
});
45+
46+
afterEach(() => {
47+
jest.clearAllMocks();
48+
cleanup();
49+
});
50+
51+
const getMessageWithCustomFields = () => {
52+
const isAttachmentEqualHandler = (prevProps, nextProps) => {
53+
const propsEqual = prevProps.customField === nextProps.customField;
54+
if (!propsEqual) return false;
55+
return true;
56+
};
57+
58+
return (
59+
<OverlayProvider>
60+
<Chat client={chatClient}>
61+
<Channel
62+
Card={({ customField, type }) => {
63+
if (type === 'test') {
64+
return <Text testID='attachment-custom-field'>{customField}</Text>;
65+
}
66+
}}
67+
channel={channel}
68+
isAttachmentEqual={isAttachmentEqualHandler}
69+
>
70+
<MessageList />
71+
</Channel>
72+
</Chat>
73+
</OverlayProvider>
74+
);
75+
};
76+
77+
it('should render attachment with custom field', async () => {
78+
const { getByText } = render(getMessageWithCustomFields());
79+
80+
await waitFor(() => {
81+
expect(getByText('custom-field')).toBeTruthy();
82+
});
83+
84+
act(() => {
85+
dispatchMessageUpdateEvent(
86+
chatClient,
87+
{
88+
...messages[0],
89+
attachments: [{ customField: 'custom-field-2', type: 'test' }],
90+
updated_at: new Date(),
91+
},
92+
channel,
93+
);
94+
});
95+
96+
await waitFor(() => {
97+
expect(getByText('custom-field-2')).toBeTruthy();
98+
});
99+
});
100+
});
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import React from 'react';
2+
3+
import { Text } from 'react-native';
4+
5+
import { act, cleanup, render, waitFor } from '@testing-library/react-native';
6+
7+
import { useMessageContext } from '../../../contexts/messageContext/MessageContext';
8+
import { OverlayProvider } from '../../../contexts/overlayContext/OverlayProvider';
9+
import { getOrCreateChannelApi } from '../../../mock-builders/api/getOrCreateChannel';
10+
11+
import { useMockedApis } from '../../../mock-builders/api/useMockedApis';
12+
import dispatchMessageUpdateEvent from '../../../mock-builders/event/messageUpdated';
13+
import { generateChannelResponse } from '../../../mock-builders/generator/channel';
14+
import { generateMember } from '../../../mock-builders/generator/member';
15+
import { generateMessage } from '../../../mock-builders/generator/message';
16+
import { generateUser } from '../../../mock-builders/generator/user';
17+
import { getTestClientWithUser } from '../../../mock-builders/mock';
18+
import { Channel } from '../../Channel/Channel';
19+
import { Chat } from '../../Chat/Chat';
20+
import { MessageList } from '../../MessageList/MessageList';
21+
22+
describe('Message', () => {
23+
let channel;
24+
let chatClient;
25+
26+
const user = generateUser({ id: 'id', name: 'name' });
27+
const messages = [generateMessage({ customField: 'custom-field', user })];
28+
29+
beforeEach(async () => {
30+
const members = [generateMember({ user })];
31+
const mockedChannel = generateChannelResponse({
32+
members,
33+
messages,
34+
});
35+
36+
chatClient = await getTestClientWithUser(user);
37+
useMockedApis(chatClient, [getOrCreateChannelApi(mockedChannel)]);
38+
channel = chatClient.channel('messaging', mockedChannel.id);
39+
await channel.watch();
40+
});
41+
42+
afterEach(() => {
43+
jest.clearAllMocks();
44+
cleanup();
45+
});
46+
47+
const getMessageWithCustomFields = () => {
48+
const isMessageEqualHandler = (prevProps, nextProps) => {
49+
const propsEqual = prevProps.customField === nextProps.customField;
50+
if (!propsEqual) return false;
51+
return true;
52+
};
53+
54+
const CustomMessageStatusComponent = () => {
55+
const { message } = useMessageContext();
56+
return <Text testID='message-custom-field'>{message.customField}</Text>;
57+
};
58+
59+
return (
60+
<OverlayProvider>
61+
<Chat client={chatClient}>
62+
<Channel
63+
channel={channel}
64+
isMessageEqual={isMessageEqualHandler}
65+
MessageStatus={CustomMessageStatusComponent}
66+
>
67+
<MessageList />
68+
</Channel>
69+
</Chat>
70+
</OverlayProvider>
71+
);
72+
};
73+
74+
it('should render message with custom field', async () => {
75+
const { getByText } = render(getMessageWithCustomFields());
76+
77+
await waitFor(() => {
78+
expect(getByText('custom-field')).toBeTruthy();
79+
});
80+
81+
act(() => {
82+
dispatchMessageUpdateEvent(
83+
chatClient,
84+
{ ...messages[0], customField: 'custom-field-2', updated_at: new Date() },
85+
channel,
86+
);
87+
});
88+
89+
await waitFor(() => {
90+
expect(getByText('custom-field-2')).toBeTruthy();
91+
});
92+
});
93+
});

0 commit comments

Comments
 (0)