import { fireEvent, render } from '@testing-library/react-native' import React from 'react' import type { ConversationSearchResultResource } from '../../../../types' import { ConversationResults } from '../conversation_results' const buildResults = (count: number, prefix = 'Conversation') => Array.from({ length: count }, (_, index) => ({ type: 'conversation' as const, id: `${prefix}-${index + 1}`, title: `${prefix} ${index + 1}`, url: `/conversations/${index + 1}`, extra: { avatar: { previewAvatarUrls: [] } }, })) satisfies ConversationSearchResultResource[] describe('ConversationResults', () => { it('caps at five rows until View more is pressed, then offers View less', () => { const view = render() expect(view.getByText('Conversation 5')).toBeTruthy() expect(view.queryByText('Conversation 6')).toBeNull() fireEvent.press(view.getByText('View more')) expect(view.getByText('Conversation 6')).toBeTruthy() expect(view.getByText('View less')).toBeTruthy() expect(view.queryByText('View more')).toBeNull() }) it('renders no footer for five or fewer results', () => { const view = render() expect(view.getByText('Conversation 4')).toBeTruthy() expect(view.queryByText('View more')).toBeNull() }) it('stays expanded when the parent re-renders with a new results array', () => { const view = render() fireEvent.press(view.getByText('View more')) view.rerender() expect(view.getByText('Conversation 6')).toBeTruthy() expect(view.getByText('View less')).toBeTruthy() }) it('passes the pressed result and its position to onSelect', () => { const onSelect = jest.fn() const results = buildResults(2) const view = render() fireEvent.press(view.getByText('Conversation 2')) expect(onSelect).toHaveBeenCalledWith(results[1], 1) }) })