import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { renderHook } from '@testing-library/react-native' import React from 'react' import { buildTestQueryClient } from '../../__utils__/query_client' import type { MessageResource } from '../../types' import { anchoredPageParam, livePageParam, MessagesWindow } from '../../utils/cache/messages_window' import { getMessagesQueryKey } from '../../utils/request/get_messages' import { useConversationMessagesJoltEvents } from '../use_conversation_messages_jolt_events' const handlers: Record void> = {} jest.mock('../use_jolt', () => ({ useJoltChannel: () => 'channel', useJoltEvent: (_channel: unknown, name: string, handler: (event: unknown) => void) => { handlers[name] = handler }, })) jest.mock('../use_current_person', () => ({ useCurrentPerson: () => ({ id: 1 }) })) jest.mock('../use_api_client', () => ({ useApiClient: () => ({ chat: {} }) })) jest.mock('../use_typing_status_cache', () => ({ TYPING_TIMEOUT_INTERVAL: 0, useTypingStatusCache: () => ({ addTypingEvent: jest.fn(), removeTypingEventById: jest.fn(), removeAllTypingEventsByAuthorId: jest.fn(), }), })) const conversationId = 7 const queryKey = getMessagesQueryKey({ conversation_id: conversationId }) let queryClient: QueryClient const wrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const message = (id: string, text = id) => ({ id, type: 'Message', text }) as MessageResource const seed = ( pageParam: MessagesWindow['pageParams'][number], ids: string[], meta: MessagesWindow['pages'][number]['meta'] = { count: 0, totalCount: 0 } ) => queryClient.setQueryData(queryKey, { pages: [{ data: ids.map(m => message(m)), links: {}, meta }], pageParams: [pageParam], }) const cachedRows = () => queryClient.getQueryData(queryKey)!.pages[0].data.map(m => `${m.id}:${m.text}`) const event = (name: 'message.created' | 'message.updated', sort_key: string, text: string) => ({ event: name, data: { data: { sort_key, text, author_id: 2, reply_root_id: null } }, }) beforeEach(() => { queryClient = buildTestQueryClient() renderHook(() => useConversationMessagesJoltEvents({ conversationId }), { wrapper }) }) describe('useConversationMessagesJoltEvents while behind the live edge', () => { beforeEach(() => seed(anchoredPageParam('A'), ['B', 'A'], { count: 0, totalCount: 0, prev: { idGt: 'B' } }) ) it('does not insert a created message into the window', () => { handlers['message.created'](event('message.created', 'Z', 'new')) expect(cachedRows()).toEqual(['B:B', 'A:A']) }) it('still applies an update to a loaded message', () => { handlers['message.updated'](event('message.updated', 'A', 'edited')) expect(cachedRows()).toEqual(['B:B', 'A:edited']) }) }) describe('useConversationMessagesJoltEvents at the live edge', () => { it('inserts a created message', () => { seed(livePageParam, ['B', 'A']) handlers['message.created'](event('message.created', 'Z', 'new')) expect(cachedRows()).toEqual(['Z:new', 'B:B', 'A:A']) }) })