/** * AccordionChatItem Component Tests * TASK-043: Accordion Chat UI + Sub-Agents Settings */ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import { AccordionChatItem } from '../AccordionChatItem'; const mockConversation = { id: 1, title: 'Test Conversation', type: 'chat', agentIcon: '🤖', agentName: 'Test Agent', messagesCount: 10, updatedAt: '2026-01-17T10:00:00Z', participants: [ { user_id: 1, name: 'John Doe', email: 'john@test.com' }, { user_id: 2, name: 'Jane Doe', email: 'jane@test.com' } ], spaceName: 'Test Space' }; describe('AccordionChatItem', () => { const mockOnSelect = vi.fn(); const mockOnDelete = vi.fn(); beforeEach(() => { vi.clearAllMocks(); }); const renderComponent = (props = {}) => { return render( ); }; it('renders conversation title', () => { renderComponent(); expect(screen.getByText('Test Conversation')).toBeInTheDocument(); }); it('renders agent icon', () => { renderComponent(); expect(screen.getByText('🤖')).toBeInTheDocument(); }); it('shows messages count', () => { renderComponent(); expect(screen.getByText(/10/)).toBeInTheDocument(); }); it('calls onSelect when clicked', () => { renderComponent(); fireEvent.click(screen.getByText('Test Conversation')); expect(mockOnSelect).toHaveBeenCalledWith(mockConversation.id); }); it('highlights when isActive is true', () => { const { container } = renderComponent({ isActive: true }); // Just verify component renders properly when active expect(screen.getByText('Test Conversation')).toBeInTheDocument(); // Component should render without errors when active }); it('shows expand button for participants', () => { renderComponent(); const expandButton = screen.getByTitle(/Показать участников|Свернуть/i); expect(expandButton).toBeInTheDocument(); }); it('expands to show participants when clicked', () => { renderComponent(); const expandButton = screen.getByTitle(/Показать участников|Свернуть/i); fireEvent.click(expandButton); expect(screen.getByText('John Doe')).toBeInTheDocument(); expect(screen.getByText('Jane Doe')).toBeInTheDocument(); }); it('has delete button', () => { renderComponent(); // Delete button exists with Trash2 icon class const allButtons = screen.getAllByRole('button'); // There should be at least 3 buttons: select, expand, delete expect(allButtons.length).toBeGreaterThanOrEqual(2); }); it('calls onDelete when delete button is clicked', () => { renderComponent(); // Find delete button by its class or position (last button) const allButtons = screen.getAllByRole('button'); const deleteButton = allButtons[allButtons.length - 1]; // Delete is last button fireEvent.click(deleteButton); expect(mockOnDelete).toHaveBeenCalledWith(mockConversation.id); }); it('uses provided title', () => { renderComponent({ conversation: { ...mockConversation, title: 'My Chat Title' } }); expect(screen.getByText('My Chat Title')).toBeInTheDocument(); }); it('shows space name if available', () => { renderComponent(); // Space name is visible in the subtitle area expect(screen.getByText('Test Space')).toBeInTheDocument(); }); it('does not expand when clicking on main content', () => { renderComponent(); // Click on title (should select, not expand) fireEvent.click(screen.getByText('Test Conversation')); // Should call onSelect, not expand expect(mockOnSelect).toHaveBeenCalled(); }); });