// REQ-USR-003: KpiBoard KPI 合并网格 + 空数据(BR11 / empty 态 / D5)
import { describe, it, expect, vi } from 'vitest';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { ConfigProvider, App as AntdApp } from 'antd';
import zhCN from 'antd/locale/zh_CN';
import KpiBoard from '../../src/pages/home/HomePage/KpiBoard';
import { KPI_ROWS, KPI_HEADERS } from '../../src/pages/home/HomePage/dashboardData';
function renderBoard(ui: React.ReactElement) {
return render(
{ui}
,
);
}
describe('KpiBoard', () => {
it('renders 7 column headers', () => {
renderBoard();
KPI_HEADERS.forEach((h) => {
expect(screen.getByText(h)).toBeInTheDocument();
});
});
it('renders all kpi rows with item/desc/today/total', () => {
renderBoard();
expect(screen.getByText('01/04【新增】新报价单')).toBeInTheDocument();
expect(screen.getByText('02/04 审核后报价单->客户确认价格')).toBeInTheDocument();
// 红色统计数(red 行)
const red = screen.getAllByText('16');
expect(red.length).toBeGreaterThanOrEqual(1);
});
it('renders Empty when rows is empty', () => {
renderBoard();
expect(screen.getByTestId('kpi-empty')).toBeInTheDocument();
// AntD Empty 默认描述「暂无数据」(可能在
与 svg
各出现一次)
expect(screen.getAllByText('暂无数据').length).toBeGreaterThanOrEqual(1);
});
it('KPI item/desc rendered as link-styled text without navigation', async () => {
const onNav = vi.fn();
renderBoard();
const item = screen.getByText('01/04【新增】新报价单');
await userEvent.click(item);
// 纯展示,不发生路由跳转
expect(onNav).not.toHaveBeenCalled();
});
});