import { act, renderHook } from '@testing-library/react-native' import type { ConversationResource } from '../../types' import { useMarkLatestMessageRead } from '../use_mark_latest_message_read' const mockMarkRead = jest.fn() jest.mock('../use_conversations_actions', () => ({ useConversationsMarkRead: () => ({ markRead: mockMarkRead }), })) jest.mock('../use_app_state', () => ({ useAppState: () => 'active' })) const conversation = { id: 7, unreadCount: 3 } as ConversationResource beforeEach(() => mockMarkRead.mockReset()) describe('useMarkLatestMessageRead', () => { it('marks the conversation read on open', () => { renderHook(() => useMarkLatestMessageRead({ conversation, messages: [] })) expect(mockMarkRead).toHaveBeenCalledTimes(1) }) it('marks read once on mount even while disabled', () => { renderHook(() => useMarkLatestMessageRead({ conversation, messages: [], enabled: false })) expect(mockMarkRead).toHaveBeenCalledTimes(1) }) it('ignores unread bumps while disabled and marks read once enabled', () => { jest.useFakeTimers() const { rerender } = renderHook( props => useMarkLatestMessageRead({ ...props, messages: [] }), { initialProps: { conversation: { ...conversation, unreadCount: 0 }, enabled: false } } ) expect(mockMarkRead).toHaveBeenCalledTimes(1) rerender({ conversation: { ...conversation, unreadCount: 2 }, enabled: false }) act(() => jest.advanceTimersByTime(1000)) expect(mockMarkRead).toHaveBeenCalledTimes(1) rerender({ conversation: { ...conversation, unreadCount: 2 }, enabled: true }) act(() => jest.advanceTimersByTime(1000)) expect(mockMarkRead).toHaveBeenCalledTimes(2) jest.useRealTimers() }) })