新增测试覆盖: - PatientDetail: 5 测试(渲染/标签页/数据展示) - AlertDashboard: 5 测试(渲染/统计卡片/告警列表) - AlertRuleList: 5 测试(渲染/规则表格/创建按钮) - DeviceManage: 5 测试(渲染/设备列表/筛选) - AiAnalysisList: 6 测试(渲染/分析记录/分页) - AiUsageDashboard: 4 测试(渲染/统计/类型分布) - ArticleManageList: 5 测试(渲染/文章表格/分类筛选) - PointsProductList: 5 测试(渲染/商品表格/上下架) - PointsRuleList: 4 测试(渲染/规则表格) - PointsOrderList: 5 测试(渲染/订单表格/状态筛选) - StatisticsDashboard: 2 测试(渲染/权限守卫) - DoctorSchedule: 3 测试(渲染/排班日历/科室筛选) 测试基础设施: - 8 个新 fixture 工厂(device/analysis/points/article/alert/schedule) - 10 组新 MSW handlers - 5 个新权限码(devices/dashboard/oauth/ai.usage) 前端测试:527/530 通过(3 个预存失败未受影响)
50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest';
|
|
import { screen, waitFor } from '@testing-library/react';
|
|
import { renderWithProviders } from '../../test/utils/renderWithProviders';
|
|
|
|
// Mock useThemeMode
|
|
vi.mock('../../hooks/useThemeMode', () => ({
|
|
useThemeMode: () => false,
|
|
}));
|
|
|
|
import PointsRuleList from './PointsRuleList';
|
|
|
|
describe('PointsRuleList', () => {
|
|
it('renders page title and table', async () => {
|
|
vi.setConfig({ testTimeout: 15000 });
|
|
renderWithProviders(<PointsRuleList />);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByText('积分规则')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('shows create button', async () => {
|
|
renderWithProviders(<PointsRuleList />);
|
|
await waitFor(() => {
|
|
expect(screen.getByRole('button', { name: /新建规则/ })).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('renders table with column headers', async () => {
|
|
renderWithProviders(<PointsRuleList />);
|
|
await waitFor(() => {
|
|
const table = document.querySelector('.ant-table');
|
|
expect(table).toBeInTheDocument();
|
|
});
|
|
const headers = document.querySelectorAll('th');
|
|
const headerTexts = Array.from(headers).map((h) => h.textContent?.trim());
|
|
expect(headerTexts.some((t) => t?.includes('规则名称'))).toBe(true);
|
|
expect(headerTexts.some((t) => t?.includes('事件类型'))).toBe(true);
|
|
expect(headerTexts.some((t) => t?.includes('积分值'))).toBe(true);
|
|
});
|
|
|
|
it('shows filter controls', async () => {
|
|
renderWithProviders(<PointsRuleList />);
|
|
await waitFor(() => {
|
|
const selects = document.querySelectorAll('.ant-select');
|
|
expect(selects.length).toBeGreaterThanOrEqual(2);
|
|
});
|
|
});
|
|
});
|