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)
})
})