import { describe, it, expect } from 'vitest'; import { decodeHTMLEntities, htmlToText, htmlToMarkdown, isBlockedPage, computeRelevance, } from '../src/main/html-utils.js'; describe('decodeHTMLEntities', () => { it('解码常见命名实体', () => { expect(decodeHTMLEntities('<div>&"x"')).toBe('
正文内容
'; const text = htmlToText(html); expect(text).toContain('正文内容'); expect(text).not.toContain('alert'); expect(text).not.toContain('display:none'); }); it('块级标签转为换行', () => { const text = htmlToText('hello & goodbye
'); expect(text).toBe('hello & goodbye'); }); it('空输入返回空', () => { expect(htmlToText('')).toBe(''); }); }); describe('htmlToMarkdown', () => { it('标题转为 Markdown 标题', () => { const md = htmlToMarkdown('const x = 1;');
expect(md).toContain('```');
expect(md).toContain('const x = 1;');
});
it('列表项转为 - 列表', () => {
const md = htmlToMarkdown('正常内容
'.repeat(50) + ''; expect(isBlockedPage(html)).toBe(false); }); }); describe('computeRelevance', () => { it('无 query 返回中性 50 分', () => { expect(computeRelevance('', '标题', '摘要')).toBe(50); }); it('CJK 关键词命中标题得高分', () => { const score = computeRelevance('rust 语言', 'Rust 语言教程', '本教程介绍 rust'); expect(score).toBeGreaterThanOrEqual(25); }); it('英文词命中标题得 15 分', () => { const score = computeRelevance('rust backend', 'rust backend guide', 'a guide'); expect(score).toBeGreaterThanOrEqual(15); }); it('完全无关标题得 0 分', () => { const score = computeRelevance('rust', 'cooking recipes', 'food'); expect(score).toBe(0); }); it('得分上限 100', () => { const score = computeRelevance('rust language guide', 'rust language guide', 'rust language guide'); expect(score).toBeLessThanOrEqual(100); }); });