test(export): Mermaid 导出管线桩渲染回归(替换与 PNG 兜底)

jsdom 跑不了 mermaid.render(缺 SVG 布局 API),用 vi.mock 桩验证剪贴板版
Mermaid 被替换为渲染结果而非代码块;全量 80 通过 + 2 跳过。
This commit is contained in:
Muse
2026-11-14 11:23:38 +08:00
parent b2d36b7397
commit e8701d4eeb

View File

@@ -1,8 +1,17 @@
// 阶段 5 验收:主题注册表完整性、导出 HTML 管线(结构/表格/公式/代码)、HTML 导入转换。
import { describe, it, expect } from 'vitest'
import { describe, it, expect, vi } from 'vitest'
import { DOC_THEMES, docThemeById } from '../src/themes'
import { markdownToExportHtml, htmlToMarkdown, exportCss } from '../src/services/exportHtml'
// jsdom 里 mermaid.render 依赖真实 SVG 布局 API 会失败;用桩验证导出管线的
// 替换与兜底逻辑(真机栅格化 PNG 只能在 Windows 复验)
vi.mock('mermaid', () => ({
default: {
initialize: () => undefined,
render: async () => ({ svg: '<svg data-stub="mermaid"><text>图</text></svg>' }),
},
}))
describe('文档主题注册表', () => {
it('7 套主题 id 唯一且可查', () => {
expect(DOC_THEMES).toHaveLength(7)
@@ -87,3 +96,14 @@ describe('二轮验收:导出与导入', () => {
expect(md).not.toContain('color:red')
})
})
describe('二轮验收:Mermaid 导出替换', () => {
it('剪贴板版 Mermaid 经桩渲染后不再是代码块(PNG 栅格化失败退回 SVG)', async () => {
const html = await markdownToExportHtml('```mermaid\ngraph TD\n A-->B\n```\n', {
title: 't', themeId: 'default', imageMode: 'embed', forClipboard: true, mermaidPng: true,
highlight: false,
})
expect(html).toContain('data-stub="mermaid"')
expect(html).not.toContain('language-mermaid')
})
})