import { DyFM_Msg_Message, DyFM_Msg_Conversation, DyFM_Msg_Type, DyFM_Msg_Status, DyFM_Msg_Participant, DyFM_Msg_ParticipantRole, DyFM_Msg_ConversationType, } from '@futdevpro/fsm-dynamo/messaging'; import { DyNTS_Msg_Util } from './msg.util'; import { DyNTS_Bot_MessageWrapper } from '../../bot/_models/bot-message-wrapper.interface'; describe('| DyNTS_Msg_Util', () => { describe('| botMessageToMsgMessage', () => { it('| should convert bot message to messaging system message', () => { const botMessage: DyNTS_Bot_MessageWrapper = { id: 'msg-123', content: 'Test message', authorId: 'user-123', authorName: 'testuser', authorDisplayName: 'Test User', channelId: 'channel-123', timestamp: new Date('2024-01-01T12:00:00Z').getTime(), rawPlatformMessage: { id: 'platform-123' }, } as any; const result = DyNTS_Msg_Util.botMessageToMsgMessage( botMessage, 'conv-123', 'issuer-123' ); expect(result).toBeInstanceOf(DyFM_Msg_Message); expect(result.conversationId).toBe('conv-123'); expect(result.content).toBe('Test message'); expect(result.type).toBe(DyFM_Msg_Type.userToUser); expect(result.status).toBe(DyFM_Msg_Status.sent); expect(result.senderId).toBe('user-123'); expect(result.senderName).toBe('testuser'); expect(result.senderDisplayName).toBe('Test User'); expect(result.platformMessageId).toBe('platform-123'); expect(result.platformChannelId).toBe('channel-123'); expect(result.__createdBy).toBe('issuer-123'); expect(result.__lastModifiedBy).toBe('issuer-123'); }); it('| should use message id when rawPlatformMessage id is not available', () => { const botMessage: DyNTS_Bot_MessageWrapper = { id: 'msg-123', content: 'Test message', authorId: 'user-123', channelId: 'channel-123', timestamp: new Date().getTime(), } as any; const result = DyNTS_Msg_Util.botMessageToMsgMessage( botMessage, 'conv-123', 'issuer-123' ); expect(result.platformMessageId).toBe('msg-123'); }); it('| should handle empty content', () => { const botMessage: DyNTS_Bot_MessageWrapper = { id: 'msg-123', content: '', authorId: 'user-123', channelId: 'channel-123', timestamp: new Date().getTime(), } as any; const result = DyNTS_Msg_Util.botMessageToMsgMessage( botMessage, 'conv-123', 'issuer-123' ); expect(result.content).toBe(''); }); }); describe('| createAIMessage', () => { it('| should create AI message with all parameters', () => { const result = DyNTS_Msg_Util.createAIMessage( 'conv-123', 'AI response', 'openai', 'gpt-4', 'ai-sender-123', 'issuer-123' ); expect(result).toBeInstanceOf(DyFM_Msg_Message); expect(result.conversationId).toBe('conv-123'); expect(result.content).toBe('AI response'); expect(result.type).toBe(DyFM_Msg_Type.aiToUser); expect(result.status).toBe(DyFM_Msg_Status.sent); expect(result.senderId).toBe('ai-sender-123'); expect(result.isAIGenerated).toBe(true); expect(result.aiProvider).toBe('openai'); expect(result.aiModel).toBe('gpt-4'); expect(result.__createdBy).toBe('issuer-123'); expect(result.__lastModifiedBy).toBe('issuer-123'); }); it('| should set sentAt to current date', () => { const before = new Date(); const result = DyNTS_Msg_Util.createAIMessage( 'conv-123', 'AI response', 'openai', 'gpt-4', 'ai-sender-123', 'issuer-123' ); const after = new Date(); expect(result.sentAt).toBeInstanceOf(Date); expect(result.sentAt!.getTime()).toBeGreaterThanOrEqual(before.getTime()); expect(result.sentAt!.getTime()).toBeLessThanOrEqual(after.getTime()); }); }); describe('| extractMentions', () => { it('| should extract mentions from message content', () => { const content = 'Hello @user1 and @user2!'; const result = DyNTS_Msg_Util.extractMentions(content); expect(result).toEqual(['user1', 'user2']); }); it('| should return empty array when no mentions', () => { const content = 'Hello world!'; const result = DyNTS_Msg_Util.extractMentions(content); expect(result).toEqual([]); }); it('| should handle multiple mentions', () => { const content = '@user1 @user2 @user3'; const result = DyNTS_Msg_Util.extractMentions(content); expect(result).toEqual(['user1', 'user2', 'user3']); }); it('| should handle mentions with underscores', () => { const content = 'Hello @user_name!'; const result = DyNTS_Msg_Util.extractMentions(content); expect(result).toEqual(['user_name']); }); it('| should handle empty string', () => { const result = DyNTS_Msg_Util.extractMentions(''); expect(result).toEqual([]); }); }); describe('| userCanAccessConversation', () => { it('| should return true when user is a participant', () => { const conversation = new DyFM_Msg_Conversation({ type: DyFM_Msg_ConversationType.direct, participants: [ { userId: 'user-123', role: DyFM_Msg_ParticipantRole.member, joinedAt: new Date(), }, { userId: 'user-456', role: DyFM_Msg_ParticipantRole.member, joinedAt: new Date(), }, ], }); const result = DyNTS_Msg_Util.userCanAccessConversation(conversation, 'user-123'); expect(result).toBe(true); }); it('| should return false when user is not a participant', () => { const conversation = new DyFM_Msg_Conversation({ type: DyFM_Msg_ConversationType.direct, participants: [ { userId: 'user-456', role: DyFM_Msg_ParticipantRole.member, joinedAt: new Date(), }, ], }); const result = DyNTS_Msg_Util.userCanAccessConversation(conversation, 'user-123'); expect(result).toBe(false); }); it('| should return false when participants array is empty', () => { const conversation = new DyFM_Msg_Conversation({ type: DyFM_Msg_ConversationType.direct, participants: [], }); const result = DyNTS_Msg_Util.userCanAccessConversation(conversation, 'user-123'); expect(result).toBe(false); }); it('| should return false when participants is undefined', () => { const conversation = new DyFM_Msg_Conversation({ type: DyFM_Msg_ConversationType.direct, participants: [], } as any); const result = DyNTS_Msg_Util.userCanAccessConversation(conversation, 'user-123'); expect(result).toBe(false); }); }); });