// src/pages/agent-office/components/AgentCard.test.jsx import { describe, it, expect, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import AgentCard from './AgentCard.jsx'; describe('AgentCard', () => { it('에이전트의 displayName을 표시', () => { render( {}} />); expect(screen.getByText('주식 트레이더')).toBeInTheDocument(); }); it('working 상태일 때 dot에 working 클래스 부여', () => { const { container } = render( {}} /> ); const dot = container.querySelector('.ao-card-dot'); expect(dot).toHaveClass('working'); }); it('working 상태에서는 pulse 클래스도 부여', () => { const { container } = render( {}} /> ); const dot = container.querySelector('.ao-card-dot'); expect(dot).toHaveClass('pulse'); }); it('idle 상태에는 pulse 클래스 부여하지 않음', () => { const { container } = render( {}} /> ); const dot = container.querySelector('.ao-card-dot'); expect(dot).not.toHaveClass('pulse'); }); it('agentState 없으면 idle로 fallback', () => { const { container } = render( {}} /> ); const dot = container.querySelector('.ao-card-dot'); expect(dot).toHaveClass('idle'); }); it('notificationCount > 0이면 뱃지 표시', () => { render( {}} />); expect(screen.getByText('3')).toBeInTheDocument(); }); it('notificationCount === 0이면 뱃지 없음', () => { const { container } = render( {}} /> ); expect(container.querySelector('.ao-card-badge')).toBeNull(); }); it('notificationCount > 9이면 9+ 표시', () => { render( {}} />); expect(screen.getByText('9+')).toBeInTheDocument(); }); it('클릭 시 onClick 호출', () => { const onClick = vi.fn(); const { container } = render( ); fireEvent.click(container.querySelector('.ao-card')); expect(onClick).toHaveBeenCalledTimes(1); }); it('active prop 시 카드에 active 클래스 부여', () => { const { container } = render( {}} /> ); expect(container.querySelector('.ao-card')).toHaveClass('active'); }); });