架构重构(候选 1-6): - storage/repository.py 按域拆分为包(target/scenario/run/campaign/result) - storage/db.py 按域拆分为包(eval/campaign/file/model_config/intelligent_eval) - intelligent_eval/lifecycle.py 按状态机阶段拆分为包 - services/runs.py 编排逻辑下沉 - Campaigns.tsx 拆分为 campaigns/ 子组件 测试补全(候选 7): 前端(+125 用例,107→232): - utils/ 纯函数:date/campaignTime/ruleLabels/fileTree/fileFormat/colors - stores/tabStore 状态管理 - 核心组件:FormDrawer/PageWrapper/ChatBubble/GeneratedMessages/SectionHeader/StatCard/TurnList - 业务组件:CaseBlock/CaseDetail/RuleOverview/WindowTimeline/RunList/TabBar/CampaignRunTimeline - 文件管理:FileCategoryTree/FileTable - hooks:sessionReducer/useFiles/useRunSession 后端(+38 用例,916→954): - targets API CRUD + 404 路径 - WebSocket 连接管理器 - proxy 头部重写(CSP/X-Frame-Options) - target 仓储 update 方法 - app 健康检查 + SPA 404 - scenarios 模板端点 + 404 - files API 边缘分支(404 场景 + 500 兜底) - files service update_category - 智能评估状态机迁移测试 门禁状态: - 前端:tsc 干净 + 232 passed - 后端:954 passed + ruff 全绿
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import { render, screen, fireEvent } from '@testing-library/react'
|
|
import { describe, expect, it, vi } from 'vitest'
|
|
import SectionHeader from './SectionHeader'
|
|
|
|
describe('SectionHeader', () => {
|
|
it('renders title', () => {
|
|
render(<SectionHeader title="标题" />)
|
|
expect(screen.getByText('标题')).toBeTruthy()
|
|
})
|
|
|
|
it('renders back button when onBack provided', () => {
|
|
const onBack = vi.fn()
|
|
render(<SectionHeader title="标题" onBack={onBack} />)
|
|
const btn = screen.getByText('返回')
|
|
expect(btn).toBeTruthy()
|
|
fireEvent.click(btn)
|
|
expect(onBack).toHaveBeenCalled()
|
|
})
|
|
|
|
it('uses custom backLabel', () => {
|
|
render(<SectionHeader title="标题" onBack={vi.fn()} backLabel="上一步" />)
|
|
expect(screen.getByText('上一步')).toBeTruthy()
|
|
})
|
|
|
|
it('does not render back button when onBack not provided', () => {
|
|
const { container } = render(<SectionHeader title="标题" />)
|
|
const buttons = container.querySelectorAll('button')
|
|
expect(buttons).toHaveLength(0)
|
|
})
|
|
|
|
it('renders actions', () => {
|
|
render(<SectionHeader title="标题" actions={<button>刷新</button>} />)
|
|
expect(screen.getByText('刷新')).toBeTruthy()
|
|
})
|
|
})
|