This commit is contained in:
Mrx
2026-02-25 11:45:21 +08:00
parent 5043657470
commit 4ccf2ec354
35 changed files with 6151 additions and 26 deletions

View File

@@ -0,0 +1,280 @@
/**
* 静态页面生成器测试脚本
*/
import { generateAllPages, generatePage } from './generateStaticPages.js';
import { generateStaticHTML } from './pageTemplates.js';
import fs from 'fs';
import path from 'path';
console.log('='.repeat(60));
console.log(' 天远查 - 静态页面生成器测试');
console.log('='.repeat(60));
console.log();
// 测试结果统计
let passedTests = 0;
let failedTests = 0;
// 测试函数
function test(name, fn) {
try {
fn();
console.log(`${name}`);
passedTests++;
} catch (error) {
console.log(`${name}`);
console.log(` 错误: ${error.message}`);
failedTests++;
}
}
// 断言函数
function assert(condition, message) {
if (!condition) {
throw new Error(message || '断言失败');
}
}
console.log('🧪 开始测试...\n');
// 测试 1: 测试基本的 HTML 生成
test('测试基本的 HTML 生成', () => {
const seoConfig = {
title: '测试标题',
description: '测试描述',
keywords: '测试关键词'
};
const html = generateStaticHTML(seoConfig, { path: '/test' });
assert(html.includes('<!DOCTYPE html>'), '应该包含 DOCTYPE 声明');
assert(html.includes('测试标题'), '应该包含标题');
assert(html.includes('测试描述'), '应该包含描述');
assert(html.includes('测试关键词'), '应该包含关键词');
assert(html.includes('og:title'), '应该包含 Open Graph 标签');
assert(html.includes('twitter:card'), '应该包含 Twitter Cards 标签');
assert(html.includes('application/ld+json'), '应该包含结构化数据');
});
// 测试 2: 测试默认内容生成
test('测试默认内容生成', () => {
const seoConfig = {
title: '测试页面',
description: '这是一个测试页面',
keywords: '测试'
};
const html = generateStaticHTML(seoConfig, { path: '/test' });
assert(html.includes('关于测试页面'), '应该包含关于标题');
assert(html.includes('核心功能'), '应该包含核心功能');
assert(html.includes('为什么选择天远查?'), '应该包含选择理由');
assert(html.includes('应用场景'), '应该包含应用场景');
});
// 测试 3: 测试路由内容生成
test('测试路由内容生成', () => {
const seoConfig = {
title: '司法涉诉核验',
description: '司法风险检测中心',
keywords: '司法,诉讼'
};
const html = generateStaticHTML(seoConfig, {
path: '/inquire/category/lawsuit',
content: generateContentByRoute('/inquire/category/lawsuit', seoConfig)
});
assert(html.includes('司法涉诉核验服务'), '应该包含司法涉诉标题');
assert(html.includes('开庭公告查询'), '应该包含开庭公告');
assert(html.includes('裁判文书查询'), '应该包含裁判文书');
});
// 测试 4: 测试文件名生成
test('测试文件名生成', () => {
const paths = [
{ input: '/', expected: 'index.html' },
{ input: '/help', expected: 'help.html' },
{ input: '/inquire/category/lawsuit', expected: 'inquire-category-lawsuit.html' },
{ input: '/agent/promote', expected: 'agent-promote.html' }
];
paths.forEach(({ input, expected }) => {
const filename = input
.replace(/^\//, '')
.replace(/\/+/g, '-')
.replace(/:/g, '-');
const result = filename ? `${filename}.html` : 'index.html';
assert(result === expected, `路径 ${input} 应该生成文件名 ${expected}`);
});
});
// 测试 5: 测试静态页面目录创建
test('测试静态页面目录创建', () => {
const outputDir = path.join(__dirname, '../static-pages-test');
// 清理测试目录(如果存在)
if (fs.existsSync(outputDir)) {
fs.rmSync(outputDir, { recursive: true, force: true });
}
// 创建目录
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
assert(fs.existsSync(outputDir), '应该创建输出目录');
// 清理测试目录
fs.rmSync(outputDir, { recursive: true, force: true });
});
// 测试 6: 测试单个页面生成
test('测试单个页面生成', () => {
const testDir = path.join(__dirname, '../static-pages-test');
// 清理测试目录(如果存在)
if (fs.existsSync(testDir)) {
fs.rmSync(testDir, { recursive: true, force: true });
}
fs.mkdirSync(testDir, { recursive: true });
const seoConfig = {
title: '测试页面',
description: '测试描述',
keywords: '测试'
};
const filepath = path.join(testDir, 'test.html');
// 临时修改 generatePage 的输出目录
const originalDir = path.join(__dirname, '../static-pages');
// 生成测试文件
const content = generateStaticHTML(seoConfig, { path: '/test' });
fs.writeFileSync(filepath, content, 'utf-8');
assert(fs.existsSync(filepath), '应该生成测试文件');
// 验证文件内容
const fileContent = fs.readFileSync(filepath, 'utf-8');
assert(fileContent.includes('测试页面'), '文件应该包含标题');
// 清理测试目录
fs.rmSync(testDir, { recursive: true, force: true });
});
// 测试 7: 测试 SEO 配置完整性
test('测试 SEO 配置完整性', () => {
const seoConfigs = {
'/': {
title: '天远查官网_企业与婚姻关联风险核验_综合履约背景核验',
description: '天远查官网(TianYuanCha)聚合官方公示数据...',
keywords: '天远查,婚姻状态风险, 配偶背景核验'
},
'/inquire/category/lawsuit': {
title: '司法涉诉核验_个人及企业法律诉讼记录_履约风险评估_天远查',
description: '天远查司法风险检测中心...',
keywords: '司法案件核验,法律诉讼记录'
}
};
for (const [path, config] of Object.entries(seoConfigs)) {
assert(config.title, `路由 ${path} 应该有 title`);
assert(config.description, `路由 ${path} 应该有 description`);
assert(config.keywords, `路由 ${path} 应该有 keywords`);
}
});
// 测试 8: 测试 Open Graph 标签
test('测试 Open Graph 标签', () => {
const seoConfig = {
title: '测试标题',
description: '测试描述',
keywords: '测试'
};
const html = generateStaticHTML(seoConfig, { path: '/test' });
assert(html.includes('og:type'), '应该包含 og:type');
assert(html.includes('og:url'), '应该包含 og:url');
assert(html.includes('og:title'), '应该包含 og:title');
assert(html.includes('og:description'), '应该包含 og:description');
assert(html.includes('og:site_name'), '应该包含 og:site_name');
assert(html.includes('og:locale'), '应该包含 og:locale');
});
// 测试 9: 测试结构化数据
test('测试结构化数据', () => {
const seoConfig = {
title: '测试标题',
description: '测试描述',
keywords: '测试'
};
const html = generateStaticHTML(seoConfig, { path: '/test' });
assert(html.includes('@context'), '应该包含 @context');
assert(html.includes('@type'), '应该包含 @type');
assert(html.includes('WebPage'), '应该包含 WebPage 类型');
assert(html.includes('Organization'), '应该包含 Organization 类型');
});
// 测试 10: 测试 canonical URL
test('测试 canonical URL', () => {
const seoConfig = {
title: '测试标题',
description: '测试描述',
keywords: '测试'
};
const html = generateStaticHTML(seoConfig, {
path: '/test/page',
canonical: 'https://www.tianyuancha.cn'
});
assert(html.includes('https://www.tianyuancha.cn/test/page'), '应该包含完整的 canonical URL');
});
// 运行实际生成测试
console.log('\n🚀 运行实际生成测试...\n');
test('生成所有静态页面', () => {
try {
generateAllPages();
const staticDir = path.join(__dirname, '../static-pages');
assert(fs.existsSync(staticDir), '应该生成 static-pages 目录');
const files = fs.readdirSync(staticDir);
assert(files.length > 0, '应该生成至少一个文件');
assert(files.includes('index.html'), '应该生成 index.html');
assert(files.includes('sitemap.xml'), '应该生成 sitemap.xml');
assert(files.includes('robots.txt'), '应该生成 robots.txt');
console.log(` 生成了 ${files.length} 个文件`);
} catch (error) {
console.log(` 错误: ${error.message}`);
throw error;
}
});
// 输出测试结果
console.log('\n' + '='.repeat(60));
console.log(' 测试结果');
console.log('='.repeat(60));
console.log(`✅ 通过: ${passedTests}`);
console.log(`❌ 失败: ${failedTests}`);
console.log(`📊 总计: ${passedTests + failedTests}`);
console.log();
if (failedTests === 0) {
console.log('🎉 所有测试通过!');
process.exit(0);
} else {
console.log('⚠️ 部分测试失败,请检查错误信息');
process.exit(1);
}