Skip to content

Commit 3ed25be

Browse files
authored
fix: util functions logic of verifying message type (#700)
fix: util functions logic of verifying message type refer to the `is~~~` method first rather than the messageType to verify each message type * isAdminMessage, isUserMessage, isFileMessage refer to the messageType only when those methods don't exist [UIKIT-4301](https://sendbird.atlassian.net/browse/UIKIT-4301)
1 parent e2476c5 commit 3ed25be

File tree

2 files changed

+105
-4
lines changed

2 files changed

+105
-4
lines changed

src/utils/__tests__/utils.spec.js

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { binarySearch, isUrl } from '../index';
1+
import { UIKitMessageTypes, binarySearch, getUIKitMessageType, isAdminMessage, isFileMessage, isUrl, isUserMessage } from '../index';
22

33
describe('Global-utils', () => {
44
it('should find right index with binarySearch', () => {
@@ -18,6 +18,95 @@ describe('Global-utils', () => {
1818
});
1919
});
2020

21+
describe('Global-utils: verify message type util functions', () => {
22+
it('should return true for each message', () => {
23+
const mockUserMessage = {
24+
messageId: 0,
25+
isUserMessage: () => true,
26+
isFileMessage: () => false,
27+
isAdminMessage: () => false,
28+
messageType: 'user',
29+
};
30+
expect(isUserMessage(mockUserMessage)).toBe(true);
31+
expect(isFileMessage(mockUserMessage)).toBe(false);
32+
expect(isAdminMessage(mockUserMessage)).toBe(false);
33+
const mockFileMessage = {
34+
messageId: 1,
35+
isUserMessage: () => false,
36+
isFileMessage: () => true,
37+
isAdminMessage: () => false,
38+
messageType: 'file',
39+
};
40+
expect(isUserMessage(mockFileMessage)).toBe(false);
41+
expect(isFileMessage(mockFileMessage)).toBe(true);
42+
expect(isAdminMessage(mockFileMessage)).toBe(false);
43+
const mockAdminMessage = {
44+
messageId: 2,
45+
isUserMessage: () => false,
46+
isFileMessage: () => false,
47+
isAdminMessage: () => true,
48+
messageType: 'admin',
49+
};
50+
expect(isUserMessage(mockAdminMessage)).toBe(false);
51+
expect(isFileMessage(mockAdminMessage)).toBe(false);
52+
expect(isAdminMessage(mockAdminMessage)).toBe(true);
53+
});
54+
55+
it('should return true with incomplete properties', () => {
56+
expect(isUserMessage({ isUserMessage: () => true })).toBe(true);
57+
expect(isUserMessage({ messageType: 'user' })).toBe(true);
58+
expect(isFileMessage({ isFileMessage: () => true })).toBe(true);
59+
expect(isFileMessage({ messageType: 'file' })).toBe(true);
60+
expect(isAdminMessage({ isAdminMessage: () => true })).toBe(true);
61+
expect(isAdminMessage({ messageType: 'admin' })).toBe(true);
62+
});
63+
64+
it('should refer to the method first rather than messageType', () => {
65+
const mockUserMessage = {
66+
messageId: 0,
67+
isUserMessage: () => true,
68+
isFileMessage: () => false,
69+
isAdminMessage: () => false,
70+
messageType: 'file',
71+
};
72+
expect(isUserMessage(mockUserMessage)).toBe(true);
73+
expect(isFileMessage(mockUserMessage)).toBe(false);
74+
expect(isAdminMessage(mockUserMessage)).toBe(false);
75+
expect(isUserMessage({ isUserMessage: () => false, messageType: 'user' })).toBe(false);
76+
const mockFileMessage = {
77+
messageId: 1,
78+
isUserMessage: () => false,
79+
isFileMessage: () => true,
80+
isAdminMessage: () => false,
81+
messageType: 'admin',
82+
};
83+
expect(isUserMessage(mockFileMessage)).toBe(false);
84+
expect(isFileMessage(mockFileMessage)).toBe(true);
85+
expect(isAdminMessage(mockFileMessage)).toBe(false);
86+
expect(isFileMessage({ isFileMessage: () => false, messsageType: 'file' })).toBe(false);
87+
const mockAdminMessage = {
88+
messageId: 2,
89+
isUserMessage: () => false,
90+
isFileMessage: () => false,
91+
isAdminMessage: () => true,
92+
messageType: 'user',
93+
};
94+
expect(isUserMessage(mockAdminMessage)).toBe(false);
95+
expect(isFileMessage(mockAdminMessage)).toBe(false);
96+
expect(isAdminMessage(mockAdminMessage)).toBe(true);
97+
expect(isAdminMessage({ isAdminMessage: () => false, messageType: 'admin' })).toBe(false);
98+
});
99+
100+
it('should verify edge case of MultipleFilesMessage', () => {
101+
expect(
102+
getUIKitMessageType({
103+
isFileMessage: () => false,
104+
messageType: 'file',
105+
})
106+
).toBe(UIKitMessageTypes.UNKNOWN);
107+
})
108+
});
109+
21110
describe('isURL', () => {
22111
it('should return true for valid URLs', () => {
23112
const validURLs = [

src/utils/index.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,25 @@ export const isSentStatus = (state: string): boolean => (
128128
);
129129

130130
export const isAdminMessage = (message: AdminMessage | UserMessage | FileMessage): boolean => (
131-
message && (message?.isAdminMessage?.() || (message?.messageType === 'admin'))
131+
message && (
132+
message['isAdminMessage'] && typeof message.isAdminMessage === 'function'
133+
? message.isAdminMessage()
134+
: message?.messageType === 'admin'
135+
)
132136
);
133137
export const isUserMessage = (message: AdminMessage | UserMessage | FileMessage): boolean => (
134-
message && (message?.isUserMessage?.() || (message?.messageType === 'user'))
138+
message && (
139+
message['isUserMessage'] && typeof message.isUserMessage === 'function'
140+
? message.isUserMessage()
141+
: message?.messageType === 'user'
142+
)
135143
);
136144
export const isFileMessage = (message: AdminMessage | UserMessage | FileMessage): boolean => (
137-
message && (message?.isFileMessage?.() || (message?.messageType === 'file'))
145+
message && (
146+
message['isFileMessage'] && typeof message.isFileMessage === 'function'
147+
? message.isFileMessage()
148+
: message?.messageType === 'file'
149+
)
138150
);
139151
export const isParentMessage = (message: AdminMessage | UserMessage | FileMessage): boolean => (
140152
!message.parentMessageId && !message.parentMessage && (message.threadInfo?.replyCount ?? 0) > 0

0 commit comments

Comments
 (0)