import { describe, expect, it } from 'vitest'
import { renderMarkdown, renderMarkdownDiff } from './markdown'
describe('renderMarkdown', () => {
it('一行文字是一个段落;段内换行是软换行,空行分段', () => {
expect(renderMarkdown('读配置。')).toBe('
读配置。
\n')
expect(renderMarkdown('第一行\n接着写\n\n第二段')).toBe('第一行\n接着写
\n第二段
\n')
})
it('行内代码(含双反引号)、强调、列表、代码块、标题、引用、表格', () => {
expect(renderMarkdown('先过 :func:`normalize_phone`,打印 ``user`` 时 **脱敏**')).toBe(
'先过 :func:normalize_phone,打印 user 时 脱敏
\n',
)
expect(renderMarkdown('- 甲\n- 乙')).toBe('\n')
expect(renderMarkdown('```ts\nload(\'a\')\n```')).toBe('load(\'a\')\n
\n')
expect(renderMarkdown('例子:\n\n f(1)')).toBe('例子:
\nf(1)\n
\n')
expect(renderMarkdown('# 标题')).toBe('标题
\n')
expect(renderMarkdown('> 引用')).toBe('\n引用
\n
\n')
expect(renderMarkdown('| a | b |\n| - | - |\n| 1 | 2 |')).toContain('')
})
it('源码里的 HTML 当文字显示', () => {
expect(renderMarkdown('用 mask ')).toBe(
'用 <b>mask</b> <script>alert(1)</script>
\n',
)
expect(renderMarkdown('块
')).toBe('<div onclick="x()">块</div>
\n')
})
it('带协议的网址、邮箱自动成链接;不带协议的文件名不算', () => {
expect(renderMarkdown('见 https://example.com/phone')).toBe('见 https://example.com/phone
\n')
expect(renderMarkdown('[文档](http://example.com)')).toBe('文档
\n')
expect(renderMarkdown('找 dev@example.com')).toContain('')
expect(renderMarkdown('改 sample.py 和 README.md')).toBe('改 sample.py 和 README.md
\n')
})
it('链接只认 http / https / mailto,别的照原文显示;图片不渲染', () => {
expect(renderMarkdown('[点](javascript:alert(1))')).not.toContain(' {
expect(renderMarkdown('[文档](https://example.com "接口说明")')).toBe('文档
\n')
expect(renderMarkdown('[文档](https://example.com "")')).toBe('文档
\n')
})
})
describe('renderMarkdownDiff', () => {
it('照常排版,新加的字包进 、删掉的包进 ', () => {
expect(renderMarkdownDiff([{ text: '放锁' }, { text: '前', change: 'del' }, { text: '都', change: 'add' }, { text: '必须比对 `token`' }]))
.toBe('放锁前都必须比对 token
\n')
})
it('跨行的一截逐行包,新加的列表项留住列表记号', () => {
expect(renderMarkdownDiff([{ text: '- a\n' }, { text: '- b\n- c', change: 'add' }]))
.toBe('\n')
})
it('行中间的一截不把前面的字当块记号', () => {
expect(renderMarkdownDiff([{ text: '共 ' }, { text: '# 3', change: 'add' }])).toBe('共 # 3
\n')
})
})