91 lines
2.8 KiB
TypeScript
91 lines
2.8 KiB
TypeScript
/** @jest-environment jsdom */
|
||
|
||
import { fireEvent, render, screen, within } from '@testing-library/react'
|
||
import { WorkReviewProjectCard } from '@/components/work-review/WorkReviewProjectCard'
|
||
import type { WorkReviewProject } from '@/types/work-review'
|
||
|
||
const project: WorkReviewProject = {
|
||
id: 'project-1',
|
||
title: 'GBSFY-SJZ0024详情',
|
||
description: '测试',
|
||
workDate: '2026-08-01',
|
||
status: 'pending_review',
|
||
latestVersion: 1,
|
||
submitter: { id: 'submitter-1', name: '无邪' },
|
||
manager: { id: 'manager-1', name: '魔礼红' },
|
||
finalReviewer: { id: 'final-1', name: '元泽' },
|
||
createdAt: '2026-08-01T02:50:00.000Z',
|
||
updatedAt: '2026-08-01T02:50:00.000Z',
|
||
versions: [{
|
||
id: 'version-1',
|
||
version: 1,
|
||
submissionNote: null,
|
||
status: 'pending_review',
|
||
submittedAt: '2026-08-01T02:50:00.000Z',
|
||
completedAt: null,
|
||
imageUrls: [],
|
||
imageGroups: [],
|
||
referenceImageUrls: [],
|
||
referenceImageGroups: [],
|
||
reviews: [],
|
||
}],
|
||
permissions: {
|
||
canResubmit: false,
|
||
pendingReviewRoles: [],
|
||
},
|
||
}
|
||
|
||
function renderCard(expanded: boolean, options?: { canDelete?: boolean; onDelete?: () => void; onToggle?: () => void }) {
|
||
return render(
|
||
<WorkReviewProjectCard
|
||
project={project}
|
||
expanded={expanded}
|
||
canDelete={Boolean(options?.canDelete)}
|
||
onToggle={options?.onToggle || jest.fn()}
|
||
onDelete={options?.onDelete || jest.fn()}
|
||
onResubmit={jest.fn()}
|
||
onReview={jest.fn()}
|
||
/>,
|
||
)
|
||
}
|
||
|
||
describe('WorkReviewProjectCard', () => {
|
||
test('keeps the collapsed summary consistent and moves the description into details', () => {
|
||
renderCard(false)
|
||
|
||
const summary = screen.getByRole('button', { name: '查看作品详情:GBSFY-SJZ0024详情' })
|
||
expect(within(summary).queryByText('测试')).not.toBeInTheDocument()
|
||
expect(screen.queryByText('作品说明')).not.toBeInTheDocument()
|
||
})
|
||
|
||
test('preserves the project description in the expanded content', () => {
|
||
renderCard(true)
|
||
|
||
expect(screen.getByText('作品说明')).toBeInTheDocument()
|
||
expect(screen.getByText('测试')).toBeInTheDocument()
|
||
})
|
||
|
||
test('shows an independent delete action only when permission is granted', () => {
|
||
const onDelete = jest.fn()
|
||
const onToggle = jest.fn()
|
||
const { rerender } = renderCard(false, { onDelete, onToggle })
|
||
|
||
expect(screen.queryByRole('button', { name: '删除作品:GBSFY-SJZ0024详情' })).not.toBeInTheDocument()
|
||
rerender(
|
||
<WorkReviewProjectCard
|
||
project={project}
|
||
expanded={false}
|
||
canDelete
|
||
onToggle={onToggle}
|
||
onDelete={onDelete}
|
||
onResubmit={jest.fn()}
|
||
onReview={jest.fn()}
|
||
/>,
|
||
)
|
||
|
||
fireEvent.click(screen.getByRole('button', { name: '删除作品:GBSFY-SJZ0024详情' }))
|
||
expect(onDelete).toHaveBeenCalledTimes(1)
|
||
expect(onToggle).not.toHaveBeenCalled()
|
||
})
|
||
})
|