import { defaultIfEmpty, firstValueFrom } from 'rxjs'; import { type Message } from '../../shared-kernel'; import { dispatchIncomingMessage } from './messages-incoming.handlers'; function createMessage(overrides: Partial = {}): Message { return { id: 'message-1', roomId: 'room-1', senderId: 'user-1', senderName: 'User 1', content: 'hello', timestamp: 1, reactions: [], isDeleted: false, ...overrides }; } function createContext(overrides: Record = {}) { return { db: { getMessages: vi.fn() }, webrtc: { sendToPeer: vi.fn() }, attachments: {}, debugging: {}, currentUser: null, currentRoom: null, ...overrides } as const; } describe('dispatchIncomingMessage room-scoped sync', () => { it('requests sync for event room even when another room is viewed', async () => { const getMessages = vi.fn(async (roomId: string) => roomId === 'room-b' ? [createMessage({ roomId: 'room-b', timestamp: 10, editedAt: 10 })] : [createMessage({ roomId: 'room-a', timestamp: 100, editedAt: 100 })]); const sendToPeer = vi.fn(); const context = createContext({ db: { getMessages }, webrtc: { sendToPeer }, currentRoom: { id: 'room-a' } }); await firstValueFrom( dispatchIncomingMessage( { type: 'chat-sync-summary', roomId: 'room-b', fromPeerId: 'peer-1', count: 2, lastUpdated: 20 } as never, context as never ).pipe(defaultIfEmpty(null)) ); expect(getMessages).toHaveBeenCalledWith('room-b', expect.any(Number), 0); expect(sendToPeer).toHaveBeenCalledWith('peer-1', { type: 'chat-sync-request', roomId: 'room-b' }); }); it('sends full sync for requested room even when another room is viewed', async () => { const roomBMessages = [ createMessage({ id: 'message-b1', roomId: 'room-b', timestamp: 5 }), createMessage({ id: 'message-b2', roomId: 'room-b', timestamp: 15 }) ]; const getMessages = vi.fn(async (roomId: string) => roomId === 'room-b' ? roomBMessages : [createMessage({ id: 'message-a1', roomId: 'room-a', timestamp: 200 })]); const sendToPeer = vi.fn(); const context = createContext({ db: { getMessages }, webrtc: { sendToPeer }, currentRoom: { id: 'room-a' } }); await firstValueFrom( dispatchIncomingMessage( { type: 'chat-sync-request', roomId: 'room-b', fromPeerId: 'peer-2' } as never, context as never ).pipe(defaultIfEmpty(null)) ); expect(getMessages).toHaveBeenCalledWith('room-b', expect.any(Number), 0); expect(sendToPeer).toHaveBeenCalledWith('peer-2', { type: 'chat-sync-full', roomId: 'room-b', messages: roomBMessages }); }); });