/**
* web_search 搜索引擎 HTML 解析器单元测试(v0.4.1 测试补齐 → v0.7.5 扩充)
* 覆盖:node-html-parser 结构化解析(主层)、自域名链接过滤、
* 相对链接补全、空/异常 HTML 容错、结构变体、正则降级路径。
*/
import { describe, it, expect } from 'vitest';
import { parseBing, parseBaidu, parseSogou, parse360 } from '../web-search';
import { normalizeUrl } from '../network-utils';
describe('parseBing — 结构化解析', () => {
const BING_HTML = `
-
这是第一条结果的摘要内容,讲述 TypeScript 高级用法。
-
-
不应出现在结果中。
`;
it('解析结果块并提取 title/url/snippet', () => {
const results = parseBing(BING_HTML);
expect(results).toHaveLength(2);
expect(results[0]).toMatchObject({
title: '第一篇 TypeScript 文章',
url: 'https://example.com/article-1',
snippet: '这是第一条结果的摘要内容,讲述 TypeScript 高级用法。',
engine: 'bing',
weight: 90,
});
expect(results[1].url).toBe('https://example.com/article-2');
});
it('过滤指向 bing.com 自身域名的链接', () => {
const results = parseBing(BING_HTML);
expect(results.some((r) => r.url.includes('bing.com'))).toBe(false);
});
it('空 HTML 返回空数组', () => {
expect(parseBing('')).toHaveLength(0);
expect(parseBing('')).toHaveLength(0);
});
it('损坏 HTML(未闭合标签)不抛错', () => {
const results = parseBing(
'