// @vitest-environment jsdom import { cleanup, fireEvent, render, screen } from '@testing-library/react'; import type { ReactNode } from 'react'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { ResourceDocumentPreviewDialog } from '../src/view/project-development/ResourceDocumentPreviewDialog'; import type { ProjectResource } from '../src/view/project-development/resourceProjectionModel'; vi.mock('../src/components/modal/ThemedModal', () => ({ ThemedModal: ({ children, ariaLabel, }: { children: ReactNode; ariaLabel: string; }) => (
{children}
), })); afterEach(cleanup); const resource: ProjectResource = { id: 'doc', path: 'docs/design.md', label: '设计文档', mediaType: 'text/markdown', category: 'document', subtype: 'document', manifestAssetId: 'doc', sourceLabel: '', taskTitle: null, producerTaskId: null, externalResourceId: null, referenceResourceIds: [], dependencies: [], dependencyDepth: 0, }; describe('ResourceDocumentPreviewDialog', () => { it('加载时通过现有详情回调请求正文,加载完成复用 Markdown 渲染', () => { const onRequestPreview = vi.fn(); const onClose = vi.fn(); const props = { resource, identity: 'doc:v1', onRequestPreview, onClose }; const { rerender } = render( , ); expect(screen.getByRole('status').textContent).toContain('加载'); expect(onRequestPreview).toHaveBeenCalledWith(resource, 'doc:v1', 'detail'); rerender( , ); expect(screen.getByRole('heading', { name: '标题' })).toBeTruthy(); fireEvent.click(screen.getByRole('button', { name: '关闭文档预览' })); expect(onClose).toHaveBeenCalledOnce(); }); it('失败显示错误与重试,换资源进入加载态时不残留旧正文', () => { const onRequestPreview = vi.fn(); const props = { resource, identity: 'doc:v1', onRequestPreview, onClose: vi.fn(), }; const { rerender } = render( , ); expect(screen.getByRole('alert').textContent).toBe('文档读取失败'); onRequestPreview.mockClear(); fireEvent.click(screen.getByRole('button', { name: '重试' })); expect(onRequestPreview).toHaveBeenCalledWith(resource, 'doc:v1', 'detail'); rerender( , ); expect(screen.queryByRole('alert')).toBeNull(); expect(screen.getByRole('status').textContent).toContain('加载'); }); it('空文档显示空态而不是永久加载', () => { render( , ); expect(screen.getByRole('status').textContent).toBe('文档为空'); }); });