import { test, describe } from 'node:test'; import assert from 'node:assert'; import { existsSync, mkdirSync, writeFileSync, rmSync } from 'fs'; import { join } from 'path'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // 导入要测试的模块 import { parseRemoteType, generateScriptTag, lookupFiles, injectScriptToHtml, removeInjectedScripts } from '../../lib/utils.js'; describe('工具函数', () => { const testDir = join(__dirname, 'fixtures'); test.before(() => { if (!existsSync(testDir)) { mkdirSync(testDir, { recursive: true }); } }); test.after(() => { const filesToClean = [ 'test1.html', 'test2.html', 'subdir/test3.html', 'subdir/test4.html' ]; filesToClean.forEach(file => { const filePath = join(testDir, file); if (existsSync(filePath)) { rmSync(filePath); } }); const subDir = join(testDir, 'subdir'); if (existsSync(subDir)) { rmSync(subDir, { recursive: true }); } }); describe('parseRemoteType', () => { test('应该识别 HTTP URL', () => { assert.strictEqual(parseRemoteType('http://localhost:9000/monitor.js'), 'url'); assert.strictEqual(parseRemoteType('http://example.com/script.js'), 'url'); }); test('应该识别 HTTPS URL', () => { assert.strictEqual(parseRemoteType('https://cdn.example.com/monitor.js'), 'url'); assert.strictEqual(parseRemoteType('https://localhost:3000/dev-monitor.js'), 'url'); }); test('应该识别绝对路径', () => { assert.strictEqual(parseRemoteType('/scripts/monitor.js'), 'absolute-path'); assert.strictEqual(parseRemoteType('/assets/dev-monitor.js'), 'absolute-path'); assert.strictEqual(parseRemoteType('/path/to/script.js'), 'absolute-path'); }); test('应该处理相对路径', () => { try { parseRemoteType('./script.js'); assert.fail('应该抛出错误'); } catch (error) { assert.match(error.message, /不支持的远程路径格式/); } }); test('应该处理空字符串', () => { try { parseRemoteType(''); assert.fail('应该抛出错误'); } catch (error) { assert.match(error.message, /不支持的远程路径格式/); } }); }); describe('generateScriptTag', () => { test('应该生成 URL 类型的脚本标签', () => { const tag = generateScriptTag('http://localhost:9000/monitor.js', 'url'); assert.strictEqual(tag, ''); }); test('应该生成绝对路径类型的脚本标签', () => { const tag = generateScriptTag('/scripts/monitor.js', 'absolute-path'); assert.strictEqual(tag, ''); }); test('应该处理不同的路径格式', () => { const testCases = [ 'https://cdn.example.com/monitor.js', 'http://localhost:3000/dev-monitor.js', '/assets/scripts/dev-monitor.js', '/scripts/monitor.js' ]; testCases.forEach(path => { const type = parseRemoteType(path); const tag = generateScriptTag(path, type); assert.match(tag, /^'; const result = injectScriptToHtml(html, scriptTag); assert.match(result, /'; const result = injectScriptToHtml(html, scriptTag); assert.match(result, //); }); test('应该处理没有 标签的情况', () => { const html = `Testcontent`; const scriptTag = ''; const result = injectScriptToHtml(html, scriptTag); assert.match(result, /'; const result = injectScriptToHtml(html, scriptTag); assert.match(result, /'; const result = injectScriptToHtml(html, scriptTag); assert.match(result, /

Hello World

`; const result = removeInjectedScripts(htmlWithInjection); assert.match(result, /\s*\s*Test<\/title>\s*<\/head>/); assert(!result.includes('dev-monitor.js')); assert(!result.includes('injected by dev-inject')); }); test('应该处理多个注入的脚本', () => { const htmlWithMultiple = `<html><head> <script src="/script1.js"></script> <!-- injected by dev-inject --> <title>Test `; const result = removeInjectedScripts(htmlWithMultiple); assert(!result.includes('script1.js')); assert(!result.includes('script2.js')); assert(!result.includes('injected by dev-inject')); }); test('应该保留非注入的脚本', () => { const htmlWithMixed = ` Test `; const result = removeInjectedScripts(htmlWithMixed); assert(result.includes('normal-script.js')); assert(!result.includes('injected-script.js')); assert(!result.includes('injected by dev-inject')); }); test('应该处理没有注入脚本的 HTML', () => { const normalHtml = `Testcontent`; const result = removeInjectedScripts(normalHtml); assert.strictEqual(result, normalHtml); }); }); describe('边界情况和错误处理', () => { test('应该处理特殊字符', () => { const html = 'Test & "Special" Characters'; const scriptTag = ''; const result = injectScriptToHtml(html, scriptTag); assert(result.includes('script.js')); }); test('应该处理非常长的 HTML', () => { const longHtml = '' + ''.repeat(1000) + ''; const scriptTag = ''; const result = injectScriptToHtml(longHtml, scriptTag); assert(result.length > longHtml.length); assert(result.includes('test.js')); }); test('应该处理格式不规范的 HTML', () => { const malformedHtml = 'Testcontent'; const scriptTag = ''; const result = injectScriptToHtml(malformedHtml, scriptTag); assert(result.includes('test.js')); }); }); });