112 lines
4.0 KiB
TypeScript
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()
|
|
})
|
|
})
|