// @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;
}) => (
),
}));
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('文档为空');
});
});