gongxiangp2/components/department-dashboard/CoreMetricDetail.test.tsx
2026-08-26 12:23:05 +08:00

261 lines
11 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { fireEvent, render, screen } from '@testing-library/react'
import CoreMetricDetail from './CoreMetricDetail'
import { getCoreMetric } from './core-metrics'
jest.mock('next-auth/react', () => ({
useSession: () => ({ data: { user: { name: '本地超级管理员' } } }),
signOut: jest.fn(),
}))
describe('CoreMetricDetail', () => {
it('按品牌与当前节点处理人展示真实进行中项目', () => {
const metric = getCoreMetric('ongoing-projects')!
render(
<CoreMetricDetail
metric={metric}
projectInsights={{
items: [{
id: 'project-1',
businessId: 'BUSINESS-1',
title: '夏季主视觉过稿',
status: 'RUNNING',
processCode: 'PROC-3571C915-0506-4490-A91A-8AA7EA33F838',
projectType: '美术设计流程',
brand: '亿家达',
requesterName: '林需求',
requesterDepartment: '品牌中心',
initiatorName: '荀瑶',
initiatorDepartment: '运营中心A-事业四部-品类九部-淘系四组',
originatorUserId: 'ding-1',
originatorDeptName: '品牌中心',
sourceCreatedAt: '2026-08-10T00:00:00.000Z',
sourceUpdatedAt: '2026-08-14T02:30:00.000Z',
activeTaskCount: 1,
taskCount: 3,
schemeFieldCount: 12,
latestTaskStatus: 'RUNNING',
activeTasks: [{
taskId: 'task-1',
activityId: 'activity-1',
nodeName: '部门负责人审批',
assigneeUserId: 'ding-owner-1',
assigneeName: '陈负责人',
assigneeDepartment: '品牌中心/创意设计部',
isBrandCenter: true,
isLeadership: false,
isActive: true,
reviewPassed: false,
result: null,
createdAt: '2026-08-14T02:00:00.000Z',
finishedAt: null,
}],
}],
total: 1,
sync: { total: 1, lastSyncedAt: '2026-08-14T02:30:00.000Z', syncStatus: 'ready' },
}}
/>,
)
expect(screen.getByRole('heading', { level: 1, name: '进行中项目' })).toBeInTheDocument()
expect(screen.getAllByText('夏季主视觉过稿').length).toBeGreaterThan(0)
expect(screen.getAllByText('部门负责人审批').length).toBeGreaterThan(0)
expect(screen.getByText(/发起时间不早于 2026 年 4 月 1 日的未完结流程快照/)).toBeInTheDocument()
expect(screen.queryByRole('link', { name: /返回核心指标/ })).not.toBeInTheDocument()
fireEvent.click(screen.getByRole('tab', { name: /项目负责人/ }))
expect(screen.getByText('负责人按当前未完结节点的处理人统计;并行处理会分别计入对应人员。')).toBeInTheDocument()
expect(screen.getAllByText('陈负责人').length).toBeGreaterThan(0)
fireEvent.click(screen.getByRole('tab', { name: /发起人维度/ }))
expect(screen.getByText('发起人进行中数量')).toBeInTheDocument()
expect(screen.getByText('发起人按钉钉唯一标识匹配人员架构;所在部门以 HR 花名册为准。')).toBeInTheDocument()
expect(screen.getByRole('columnheader', { name: '排名' })).toBeInTheDocument()
expect(screen.getByRole('columnheader', { name: '发起人' })).toBeInTheDocument()
expect(screen.getByRole('columnheader', { name: '所在部门' })).toBeInTheDocument()
expect(screen.getByRole('columnheader', { name: '进行中数量' })).toBeInTheDocument()
expect(screen.getAllByText('荀瑶').length).toBeGreaterThan(0)
expect(screen.getAllByText('运营中心A-事业四部-品类九部-淘系四组').length).toBeGreaterThan(0)
})
it('未接入的指标只展示诚实的明细框架', () => {
render(<CoreMetricDetail metric={getCoreMetric('risks')!} />)
expect(screen.getByRole('heading', { level: 1, name: '风险' })).toBeInTheDocument()
expect(screen.getByText(/当前不展示虚构记录/)).toBeInTheDocument()
expect(screen.getByText('数据源待接入')).toBeInTheDocument()
})
it('按六品牌切换查看本月完成与当前进行中的美术设计流程', () => {
const baseProject = {
businessId: 'BUSINESS-1',
title: '新品主视觉申请',
status: 'COMPLETED',
processCode: 'PROC-3571C915-0506-4490-A91A-8AA7EA33F838',
projectType: '美术设计流程',
brand: '亿家达',
requesterName: '林需求',
requesterDepartment: '品牌中心',
initiatorName: '荀瑶',
initiatorDepartment: '运营中心A-事业四部-品类九部',
originatorUserId: 'ding-1',
originatorDeptName: '运营中心A',
sourceCreatedAt: '2026-04-20T00:00:00.000Z',
sourceUpdatedAt: '2026-08-14T02:30:00.000Z',
activeTaskCount: 0,
taskCount: 0,
schemeFieldCount: 0,
latestTaskStatus: null,
activeTasks: [],
result: 'AGREE',
}
render(
<CoreMetricDetail
metric={getCoreMetric('monthly-launches')!}
monthlyLaunches={{
summary: {
completed: 1,
ongoing: 1,
total: 2,
monthStart: '2026-07-31T16:00:00.000Z',
monthEnd: '2026-08-31T16:00:00.000Z',
lastSyncedAt: '2026-08-14T02:30:00.000Z',
syncStatus: 'ready',
},
brands: [
{ brand: '亿家达', completed: 1, ongoing: 1, total: 2 },
{ brand: '卓禾', completed: 0, ongoing: 0, total: 0 },
{ brand: '欧意朗', completed: 0, ongoing: 0, total: 0 },
{ brand: '顾家', completed: 0, ongoing: 0, total: 0 },
{ brand: '索菲亚', completed: 0, ongoing: 0, total: 0 },
{ brand: '朴美', completed: 0, ongoing: 0, total: 0 },
],
items: [
{
...baseProject,
id: 'completed-1',
launchStatus: 'completed',
sourceFinishedAt: '2026-08-12T03:00:00.000Z',
reviewPassedAt: '2026-08-12T02:30:00.000Z',
reviewerName: '清云',
},
{
...baseProject,
id: 'ongoing-1',
businessId: 'BUSINESS-2',
title: '新品场景设计申请',
status: 'RUNNING',
launchStatus: 'ongoing',
sourceFinishedAt: null,
reviewPassedAt: null,
reviewerName: null,
activeTaskCount: 1,
activeTasks: [{
taskId: 'task-1',
activityId: 'activity-1',
nodeName: '品牌负责人审批',
assigneeUserId: 'ding-owner',
assigneeName: '陈负责人',
assigneeDepartment: '品牌中心',
isBrandCenter: true,
isLeadership: false,
isActive: true,
reviewPassed: false,
result: null,
createdAt: '2026-08-14T02:00:00.000Z',
finishedAt: null,
}],
},
],
}}
/>,
)
expect(screen.getByRole('heading', { level: 1, name: '本月上新' })).toBeInTheDocument()
expect(screen.getByText('1/2')).toBeInTheDocument()
expect(screen.getByRole('heading', { name: '亿家达 · 已完成新品' })).toBeInTheDocument()
expect(screen.getAllByText('新品主视觉申请').length).toBeGreaterThan(0)
fireEvent.click(screen.getByRole('button', { name: '查看亿家达进行中新品明细,共1条' }))
expect(screen.getByRole('heading', { name: '亿家达 · 进行中新品' })).toBeInTheDocument()
expect(screen.getAllByText('新品场景设计申请').length).toBeGreaterThan(0)
expect(screen.getAllByText(/品牌负责人审批/).length).toBeGreaterThan(0)
})
it('在按时交付明细中只用黄色数值呈现阈值状态', () => {
render(<CoreMetricDetail metric={getCoreMetric('on-time-delivery')!} />)
expect(screen.getByLabelText('按时交付示例值94.6%,黄色区间90%–95%')).toHaveClass('text-[#a88a00]')
expect(screen.queryByText('黄色区间 · 90%–95%')).not.toBeInTheDocument()
})
it('展示首轮通过真实公式与每个作品的 V1 审核结果', () => {
render(
<CoreMetricDetail
metric={getCoreMetric('first-pass-rate')!}
firstPassPage={{
summary: {
totalUploads: 3,
firstPassApproved: 1,
rate: 33.3,
statusBreakdown: { approved: 1, revisionRequired: 1, pendingReview: 1, unknown: 0 },
readAt: '2026-08-14T02:00:00.000Z',
},
items: [
{
id: 'approved-v1',
title: '已通过作品',
currentStatus: 'approved',
latestVersion: 1,
submitterName: '林一',
managerName: '陈主管',
finalReviewerName: '元泽',
workDate: '2026-08-10T00:00:00.000Z',
updatedAt: '2026-08-14T02:30:00.000Z',
firstVersionStatus: 'approved',
firstVersionSubmittedAt: '2026-08-10T02:00:00.000Z',
firstVersionCompletedAt: '2026-08-11T02:00:00.000Z',
},
{
id: 'revision-v1',
title: '首轮退修作品',
currentStatus: 'revision_required',
latestVersion: 1,
submitterName: '林二',
managerName: '陈主管',
finalReviewerName: '元泽',
workDate: '2026-08-11T00:00:00.000Z',
updatedAt: '2026-08-14T02:30:00.000Z',
firstVersionStatus: 'revision_required',
firstVersionSubmittedAt: '2026-08-11T02:00:00.000Z',
firstVersionCompletedAt: '2026-08-12T02:00:00.000Z',
},
{
id: 'pending-v1',
title: '评审中作品',
currentStatus: 'pending_review',
latestVersion: 1,
submitterName: '林三',
managerName: '陈主管',
finalReviewerName: '元泽',
workDate: '2026-08-12T00:00:00.000Z',
updatedAt: '2026-08-14T02:30:00.000Z',
firstVersionStatus: 'pending_review',
firstVersionSubmittedAt: '2026-08-12T02:00:00.000Z',
firstVersionCompletedAt: null,
},
],
pagination: { page: 1, pageSize: 20, total: 3, totalPages: 1 },
}}
/>,
)
expect(screen.getByRole('heading', { level: 1, name: '首轮通过' })).toBeInTheDocument()
expect(screen.getByText('首轮通过率 = V1 审核通过作品数 ÷ 全部上传作品数 × 100%')).toBeInTheDocument()
expect(screen.getByText('当前口径:1 ÷ 3 = 33.3%')).toBeInTheDocument()
expect(screen.getAllByText('首轮通过').length).toBeGreaterThan(0)
expect(screen.getAllByText('首轮未通过').length).toBeGreaterThan(0)
expect(screen.getAllByText('首轮评审中 · 仅计入分母').length).toBeGreaterThan(0)
expect(screen.getByRole('link', { name: /打开作品过稿数据源/ })).toHaveAttribute('href', 'https://sc.jiansun.vip/work-review')
})
})