import { mockAppRoot } from '@rocket.chat/mock-providers'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import SearchAnswerPanel, { type SearchAnswerPanelProps } from './SearchAnswerPanel'; import '@testing-library/jest-dom'; const defaultProps: SearchAnswerPanelProps = { isLoading: false, disabled: false, emptyReason: 'No sources are available.', onGenerate: jest.fn(), }; const renderPanel = (props: Partial = {}) => render(, { wrapper: mockAppRoot() .withTranslations('en', 'core', { Search_AI_answer: 'AI answer', Search_AI_answer_ready: 'Generate an answer from these sources.', Search_AI_answer_provider: 'Generated by {{provider}} using {{model}}', Search_AI_answer_error: 'The answer could not be generated.', Generate: 'Generate', Regenerate: 'Regenerate', Loading: 'Loading', }) .build(), }); describe('SearchAnswerPanel', () => { it('offers to generate an answer when sources are available', async () => { const user = userEvent.setup(); const onGenerate = jest.fn(); renderPanel({ onGenerate }); expect(screen.getByText('Generate an answer from these sources.')).toBeInTheDocument(); await user.click(screen.getByRole('button', { name: 'Generate' })); expect(onGenerate).toHaveBeenCalledTimes(1); }); it('renders the disabled reason when an answer cannot be generated', () => { renderPanel({ disabled: true, emptyReason: 'No related messages were found.' }); expect(screen.getByText('No related messages were found.')).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Generate' })).toBeDisabled(); }); it('renders a loading state and disables generation', () => { renderPanel({ isLoading: true }); expect(screen.getByLabelText('Loading')).toHaveAttribute('aria-busy', 'true'); expect(screen.getByRole('button', { name: 'Loading' })).toBeDisabled(); }); it('renders markdown and provider metadata for a generated answer', () => { renderPanel({ answer: '**Deployment** completed successfully.', provider: { name: 'OpenAI compatible', model: 'example-model' }, }); expect(screen.getByText('Deployment').tagName).toBe('STRONG'); expect(screen.getByText('Generated by OpenAI compatible using example-model')).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Regenerate' })).toBeEnabled(); }); it('renders a generation error instead of the answer content', () => { renderPanel({ error: new Error('request failed') }); expect(screen.getByText('The answer could not be generated.')).toBeInTheDocument(); expect(screen.queryByText('Generate an answer from these sources.')).not.toBeInTheDocument(); }); });