import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import '@testing-library/jest-dom'; import QuickResponse from './QuickResponse'; test('Renders with quick responses', () => { const quickResponses = [ { id: '1', content: 'Response 1' }, { id: '2', content: 'Response 2' }, { id: '3', content: 'Response 3' } ]; render(); expect(screen.getByText('Response 1')).toBeVisible(); expect(screen.getByText('Response 2')).toBeVisible(); expect(screen.getByText('Response 3')).toBeVisible(); }); test('Renders with compact styling', () => { const quickResponses = [{ id: '1', content: 'Compact response' }]; render(); expect(screen.getByText('Compact response').closest('.pf-v6-c-label')).toHaveClass('pf-m-compact'); }); test('Renders with custom className on response', () => { const quickResponses = [{ id: '1', content: 'Custom class response', className: 'custom-response-class' }]; render(); expect(screen.getByText('Custom class response').closest('.pf-v6-c-label')).toHaveClass('custom-response-class'); }); test('Renders with custom container className', () => { const quickResponses = [ { id: '1', content: 'Response 1' }, { id: '2', content: 'Response 2' } ]; render( ); expect(screen.getByText('Response 1').closest('.pf-v6-c-label-group')).toHaveClass('custom-container-class'); }); test('Spreads additional custom container props', () => { const quickResponses = [ { id: '1', content: 'Response 1' }, { id: '2', content: 'Response 2' } ]; render(); expect(screen.getByText('Response 1').closest('.pf-v6-c-label-group__list')).toHaveAttribute( 'id', 'custom-container-id' ); }); test('Renders with pf-chatbot__message-quick-response--selected class after click', async () => { const user = userEvent.setup(); const quickResponses = [ { id: '1', content: 'Response 1' }, { id: '2', content: 'Response 2' } ]; render(); await user.click(screen.getByText('Response 1')); expect(screen.getByText('Response 1').closest('.pf-v6-c-label')).toHaveClass( 'pf-chatbot__message-quick-response--selected' ); }); test('Does not calls onClick handler when not passed', async () => { const user = userEvent.setup(); const handleClick = jest.fn(); const quickResponses = [{ id: '1', content: 'Clickable response' }]; render(); await user.click(screen.getByText('Clickable response')); expect(handleClick).not.toHaveBeenCalled(); }); test('Calls onClick handler when passed', async () => { const user = userEvent.setup(); const handleClick = jest.fn(); const quickResponses = [{ id: '1', content: 'Clickable response', onClick: handleClick }]; render(); await user.click(screen.getByText('Clickable response')); expect(handleClick).toHaveBeenCalled(); }); test('Does not call onSelect when not passed', async () => { const user = userEvent.setup(); const handleSelect = jest.fn(); const quickResponses = [ { id: '1', content: 'Response 1' }, { id: '2', content: 'Response 2' } ]; render(); await user.click(screen.getByText('Response 2')); expect(handleSelect).not.toHaveBeenCalled(); }); test('Calls onSelect when passed', async () => { const user = userEvent.setup(); const handleSelect = jest.fn(); const quickResponses = [ { id: '1', content: 'Response 1' }, { id: '2', content: 'Response 2' } ]; render(); await user.click(screen.getByText('Response 2')); expect(handleSelect).toHaveBeenCalledWith('2'); }); test('Spreads additional response props', () => { const quickResponses = [{ id: '1', content: 'Response with props', isCompact: true, 'aria-label': 'Test label' }]; render(); expect(screen.getByText('Response with props').closest('.pf-v6-c-label')).toHaveAttribute('aria-label', 'Test label'); });