import { fireEvent, render, screen } from '@testing-library/react'
import DetailImageSorter from '@/components/upload/DetailImageSorter'
const images = [
{
id: 'detail-1',
file: new File(['first'], '1.jpg', { type: 'image/jpeg' }),
preview: 'blob:first',
previewStatus: 'ready' as const,
sortOrder: 0,
},
{
id: 'detail-2',
file: new File(['second'], '2.jpg', { type: 'image/jpeg' }),
preview: 'blob:second',
previewStatus: 'ready' as const,
sortOrder: 1,
},
]
describe('DetailImageSorter', () => {
test('加载中和不可用详情图只显示占位,不渲染空 src', () => {
const { container } = render(
,
)
expect(screen.getAllByRole('img', { name: 'loading.jpg:正在生成缩略图' })).toHaveLength(2)
expect(screen.getAllByRole('img', { name: 'unavailable.jpg:预览不可用' })).toHaveLength(2)
expect(container.querySelector('img')).toBeNull()
expect(container.querySelector('img[src=""]')).toBeNull()
})
test('外部文件拖到已有详情图上时应继续交给外层上传区域处理', () => {
const onOuterDrop = jest.fn()
render(
,
)
const externalFile = new File(['new-detail'], '3.jpg', { type: 'image/jpeg' })
const thumbnail = screen.getByAltText('缩略图 1')
fireEvent.dragOver(thumbnail, {
dataTransfer: {
files: [externalFile],
types: ['Files'],
dropEffect: 'copy',
},
})
fireEvent.drop(thumbnail, {
dataTransfer: {
files: [externalFile],
types: ['Files'],
dropEffect: 'copy',
},
})
expect(onOuterDrop).toHaveBeenCalledTimes(1)
})
test('详情图内部拖拽仍应完成排序且不触发外层文件上传', () => {
const onChange = jest.fn()
const onOuterDrop = jest.fn()
render(
,
)
const firstThumbnail = screen.getByAltText('缩略图 1')
const secondThumbnail = screen.getByAltText('缩略图 2')
const dataTransfer = {
files: [],
types: [],
effectAllowed: 'none',
dropEffect: 'none',
}
fireEvent.dragStart(firstThumbnail, { dataTransfer })
fireEvent.dragOver(secondThumbnail, { dataTransfer })
fireEvent.drop(secondThumbnail, { dataTransfer })
expect(onChange).toHaveBeenCalledWith([
expect.objectContaining({ id: 'detail-2', sortOrder: 0 }),
expect.objectContaining({ id: 'detail-1', sortOrder: 1 }),
])
expect(onOuterDrop).not.toHaveBeenCalled()
})
})