Governed substrate for autonomous agents: scoped identity (passports), audited actions, MCP workspace. Infra IPs and secrets redacted for public release.
137 lines
3.9 KiB
TypeScript
137 lines
3.9 KiB
TypeScript
/**
|
|
* 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(
|
|
<AccordionChatItem
|
|
conversation={mockConversation}
|
|
isActive={false}
|
|
onSelect={mockOnSelect}
|
|
onDelete={mockOnDelete}
|
|
{...props}
|
|
/>
|
|
);
|
|
};
|
|
|
|
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();
|
|
});
|
|
});
|