gongxiangp2/lib/__tests__/work-review-resubmission-ui.test.tsx

112 lines
4.0 KiB
TypeScript

/** @jest-environment jsdom */
import { fireEvent, render, screen, waitFor, within } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { WorkReviewSubmissionDialog } from '@/components/work-review/WorkReviewDialogs'
import { WorkReviewHeader } from '@/components/work-review/WorkReviewHeader'
import { uploadWorkReviewImages } from '@/lib/work-review-client'
import type { WorkReviewProject } from '@/types/work-review'
jest.mock('@/lib/work-review-client', () => ({
getWorkReviewReviewerOptions: jest.fn(),
uploadWorkReviewImages: jest.fn(),
}))
const project: WorkReviewProject = {
id: 'project-1',
title: '夏季新品主视觉',
description: '第一版说明',
workDate: '2026-07-30',
status: 'revision_required',
latestVersion: 1,
submitter: { id: 'submitter-1', name: '提交人' },
manager: { id: 'manager-1', name: '清云' },
finalReviewer: { id: 'final-1', name: '元泽' },
createdAt: '2026-07-30T00:00:00.000Z',
updatedAt: '2026-08-01T00:00:00.000Z',
versions: [],
permissions: { canResubmit: true, pendingReviewRoles: [] },
}
describe('作品修改版本入口', () => {
beforeAll(() => {
Object.defineProperty(URL, 'createObjectURL', { configurable: true, value: jest.fn(() => 'blob:preview') })
Object.defineProperty(URL, 'revokeObjectURL', { configurable: true, value: jest.fn() })
})
test('顶部按提交修改、返回看板的顺序展示操作', () => {
render(
<WorkReviewHeader
name="提交人"
secondaryAction={{ label: '提交修改', icon: 'add', onClick: jest.fn() }}
primaryAction={{ label: '返回看板', icon: 'back', onClick: jest.fn() }}
/>,
)
expect(screen.getAllByRole('button').map((button) => button.textContent?.trim())).toEqual([
'+提交修改',
'←返回看板',
])
})
test('V2 弹窗显示首版名称、原评审人与当天修改日期,并携带基准版本提交', async () => {
const user = userEvent.setup()
const onSubmit = jest.fn().mockResolvedValue(undefined)
jest.mocked(uploadWorkReviewImages).mockResolvedValue([{
uploadId: 'upload-1',
mimeType: 'image/webp',
width: 100,
height: 100,
kind: 'slice',
sourceName: '修改稿.png',
sourceIndex: 0,
sliceIndex: 0,
sliceCount: 1,
}])
render(
<WorkReviewSubmissionDialog
mode="resubmit"
project={project}
onClose={jest.fn()}
onSubmit={onSubmit}
/>,
)
expect(await screen.findByRole('heading', { name: '提交作品修改 V2' })).toBeInTheDocument()
const summary = screen.getByLabelText('V2 提交信息')
expect(within(summary).getByText('夏季新品主视觉')).toBeInTheDocument()
expect(within(summary).getByText('清云')).toBeInTheDocument()
const now = new Date()
const local = new Date(now.getTime() - now.getTimezoneOffset() * 60_000)
expect(within(summary).getByText(local.toISOString().slice(0, 10))).toBeInTheDocument()
expect(screen.queryByRole('combobox')).not.toBeInTheDocument()
const file = new File(['image'], '修改稿.png', { type: 'image/png' })
fireEvent.change(screen.getByLabelText('选择定调图片'), { target: { files: [file] } })
await user.click(screen.getByRole('button', { name: '提交修改 V2' }))
await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1))
expect(onSubmit).toHaveBeenCalledWith(expect.objectContaining({
expectedLatestVersion: 1,
submissionNote: '',
processedImages: [expect.objectContaining({ uploadId: 'upload-1' })],
processedReferenceImages: [],
}))
})
test('版本号随最新版本递增', async () => {
render(
<WorkReviewSubmissionDialog
mode="resubmit"
project={{ ...project, latestVersion: 3 }}
onClose={jest.fn()}
onSubmit={jest.fn()}
/>,
)
expect(await screen.findByRole('heading', { name: '提交作品修改 V4' })).toBeInTheDocument()
expect(screen.getByRole('button', { name: '提交修改 V4' })).toBeInTheDocument()
})
})