mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-03-21 19:08:17 +08:00
- Fix locale index: remove wrong 'cli-manager' prefix from flattenMessages (production i18n bug)
- Fix DialogStyleContext test: correct expected style for multi-select ('modal' not 'drawer')
- Fix useNotifications test: correct FIFO toast ordering (store appends, not prepends)
- Fix CcwToolsMcpCard test: add missing fetchRootDirectories mock
- Fix TickerMarquee test: add IntlProvider, handle duplicate marquee elements
- Fix useCommands test: add QueryClient/IntlProvider wrappers and workflowStore mock
- Fix Header test: remove obsolete LanguageSwitcher tests, add DialogStyleContext mock
- Fix QueuePage test: add non-empty mock data to prevent empty state rendering
- Fix EndpointsPage test: handle multiple matching elements with getAllByText
- Rewrite chartHooksIntegration test: mock fetch() instead of api.get(), add workflowStore
- Rewrite DashboardIntegration test: match current HomePage widget structure
- Fix A2UI components test: add DialogStyleContext mock
- Fix AnalysisPage/DiscoveryPage tests: add missing hook mocks
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
129 lines
4.3 KiB
TypeScript
129 lines
4.3 KiB
TypeScript
// ========================================
|
|
// Queue Page Tests
|
|
// ========================================
|
|
// Tests for the issue queue page with i18n
|
|
|
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
import { render, screen } from '@/test/i18n';
|
|
import { QueuePage } from './QueuePage';
|
|
import { useWorkflowStore } from '@/stores/workflowStore';
|
|
import type { IssueQueue } from '@/lib/api';
|
|
|
|
// Mock queue data
|
|
const mockQueueData = {
|
|
tasks: [
|
|
{ id: 'task-1', title: 'Task 1', status: 'pending', priority: 1 },
|
|
{ id: 'task-2', title: 'Task 2', status: 'pending', priority: 2 },
|
|
] as any[],
|
|
solutions: [
|
|
{ id: 'sol-1', title: 'Solution 1', status: 'pending' },
|
|
] as any[],
|
|
conflicts: [],
|
|
execution_groups: ['group-1'],
|
|
grouped_items: { 'parallel-group': [{ id: 'task-1' }] as any[] },
|
|
} satisfies IssueQueue;
|
|
|
|
// Mock hooks at top level
|
|
vi.mock('@/hooks', () => ({
|
|
useIssueQueue: () => ({
|
|
data: mockQueueData,
|
|
isLoading: false,
|
|
isFetching: false,
|
|
error: null,
|
|
refetch: vi.fn(),
|
|
}),
|
|
useQueueMutations: () => ({
|
|
activateQueue: vi.fn(),
|
|
deactivateQueue: vi.fn(),
|
|
deleteQueue: vi.fn(),
|
|
mergeQueues: vi.fn(),
|
|
isActivating: false,
|
|
isDeactivating: false,
|
|
isDeleting: false,
|
|
isMerging: false,
|
|
}),
|
|
}));
|
|
|
|
describe('QueuePage', () => {
|
|
beforeEach(() => {
|
|
useWorkflowStore.setState({ projectPath: '/test/path' });
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('with en locale', () => {
|
|
it('should render page title', () => {
|
|
render(<QueuePage />, { locale: 'en' });
|
|
expect(screen.getByText(/Issue Queue/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render page description', () => {
|
|
render(<QueuePage />, { locale: 'en' });
|
|
expect(screen.getByText(/Manage issue execution queue/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render stats cards', () => {
|
|
render(<QueuePage />, { locale: 'en' });
|
|
expect(screen.getAllByText(/Total Items/i).length).toBeGreaterThan(0);
|
|
expect(screen.getAllByText(/Groups/i).length).toBeGreaterThan(0);
|
|
expect(screen.getAllByText(/Tasks/i).length).toBeGreaterThan(0);
|
|
expect(screen.getAllByText(/Solutions/i).length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('should render refresh button', () => {
|
|
render(<QueuePage />, { locale: 'en' });
|
|
const refreshButton = screen.getByRole('button', { name: /refresh/i });
|
|
expect(refreshButton).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
describe('with zh locale', () => {
|
|
it('should render translated title', () => {
|
|
render(<QueuePage />, { locale: 'zh' });
|
|
expect(screen.getByText(/问题队列/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render translated description', () => {
|
|
render(<QueuePage />, { locale: 'zh' });
|
|
expect(screen.getByText(/管理问题执行队列/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render translated stats', () => {
|
|
render(<QueuePage />, { locale: 'zh' });
|
|
expect(screen.getAllByText(/总项目/i).length).toBeGreaterThan(0);
|
|
expect(screen.getAllByText(/执行组/i).length).toBeGreaterThan(0);
|
|
expect(screen.getAllByText(/任务/i).length).toBeGreaterThan(0);
|
|
expect(screen.getAllByText(/解决方案/i).length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('should render translated refresh button', () => {
|
|
render(<QueuePage />, { locale: 'zh' });
|
|
const refreshButton = screen.getByRole('button', { name: /刷新/i });
|
|
expect(refreshButton).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
describe('conflicts warning', () => {
|
|
it('should show conflicts warning when conflicts exist', () => {
|
|
// This test would require modifying the mock data
|
|
// For now, we just verify the page renders without crashing
|
|
render(<QueuePage />, { locale: 'en' });
|
|
const page = screen.getByText(/Issue Queue/i);
|
|
expect(page).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
describe('accessibility', () => {
|
|
it('should have proper heading structure', () => {
|
|
render(<QueuePage />, { locale: 'en' });
|
|
const heading = screen.getByRole('heading', { level: 1, name: /Issue Queue/i });
|
|
expect(heading).toBeInTheDocument();
|
|
});
|
|
|
|
it('should have accessible refresh button', () => {
|
|
render(<QueuePage />, { locale: 'en' });
|
|
const refreshButton = screen.getByRole('button', { name: /refresh/i });
|
|
expect(refreshButton).toBeInTheDocument();
|
|
});
|
|
});
|
|
});
|