Migrate project from typing_practiceweb

This commit is contained in:
2026-05-14 16:04:14 +08:00
parent dbc5425706
commit 0e87d5546d
225 changed files with 92811 additions and 0 deletions

134
scripts/test_tower_e2e.js Normal file
View File

@@ -0,0 +1,134 @@
/**
* 塔防游戏成绩提交端到端测试
* 测试流程:登录 -> 模拟成绩提交 -> 验证数据库存储 -> 检查排行榜
*/
const fetch = globalThis.fetch || require('node-fetch');
const BASE_URL = 'http://localhost:5001';
const TEST_USERNAME = 'testuser';
const TEST_PASSWORD = 'testpass123';
let token = null;
let userId = null;
let sessionCookie = null;
async function request(method, path, body = null, headers = {}) {
const url = `${BASE_URL}${path}`;
const options = {
method,
headers: {
'Content-Type': 'application/json',
...headers,
},
};
if (body) {
options.body = JSON.stringify(body);
}
try {
const res = await fetch(url, options);
const text = await res.text();
let data;
try {
data = JSON.parse(text);
} catch (e) {
data = text;
}
return { status: res.status, data };
} catch (e) {
console.error(`Request error (${method} ${path}):`, e.message);
return { status: 0, data: null };
}
}
async function test() {
console.log('🎮 Tower Defense E2E Test Started\n');
// 1. 尝试注册或登录
console.log('1⃣ Registering/logging in...');
const registerRes = await request('POST', '/api/auth/register', {
username: TEST_USERNAME,
password: TEST_PASSWORD,
email: 'testuser@example.com',
fullname: 'Test User',
});
if (registerRes.status !== 201 && registerRes.status !== 409) {
console.error('❌ Register failed:', registerRes);
return;
}
// 2. 登录
const loginRes = await request('POST', '/api/auth/login', {
username: TEST_USERNAME,
password: TEST_PASSWORD,
});
if (loginRes.status !== 200) {
console.error('❌ Login failed:', loginRes);
return;
}
token = loginRes.data?.token;
userId = loginRes.data?.user?._id;
console.log(`✅ Logged in. Token: ${token?.substring(0, 20)}... UserId: ${userId}`);
// 3. 提交成绩
console.log('\n2⃣ Submitting tower defense score...');
const score = Math.floor(Math.random() * 5000) + 1000;
const wave = Math.floor(Math.random() * 10) + 1;
const timeSeconds = Math.floor(Math.random() * 300) + 60;
const submitRes = await request('POST', '/api/tower-defense/record',
{ wave, score, timeSeconds },
{ Authorization: `Bearer ${token}` }
);
if (submitRes.status !== 201) {
console.error('❌ Score submission failed:', submitRes);
return;
}
console.log(`✅ Score submitted: wave=${wave}, score=${score}, time=${timeSeconds}s`);
console.log(` Response:`, submitRes.data);
// 4. 获取个人最佳
console.log('\n3⃣ Fetching personal best...');
const bestRes = await request('GET', '/api/tower-defense/personal-best', null, {
Authorization: `Bearer ${token}`,
});
if (bestRes.status === 200 && bestRes.data?.hasBest) {
console.log(`✅ Personal best found: score=${bestRes.data.bestScore}, wave=${bestRes.data.bestWave}`);
} else {
console.error('⚠️ No personal best found:', bestRes);
}
// 5. 获取排行榜
console.log('\n4⃣ Fetching leaderboard...');
const leaderRes = await request('GET', '/api/tower-defense/leaderboard?page=1&limit=10');
if (leaderRes.status === 200 && leaderRes.data?.records?.length > 0) {
console.log(`✅ Leaderboard retrieved (${leaderRes.data.records.length} records)`);
console.log(' Top 3:');
leaderRes.data.records.slice(0, 3).forEach((rec, i) => {
console.log(` ${i + 1}. ${rec.fullname}: score=${rec.bestScore}, wave=${rec.bestWave}, games=${rec.totalGames}`);
});
// 检查我们的用户是否在榜单中
const found = leaderRes.data.records.some(r => String(r.userId) === String(userId));
if (found) {
console.log(`✅ Current user found in leaderboard!`);
} else {
console.log(`⚠️ Current user NOT found in leaderboard (may be filtered or paginated)`);
}
} else {
console.error('❌ Leaderboard fetch failed:', leaderRes);
}
console.log('\n✅ E2E Test Complete!\n');
}
// 等待服务器启动并运行测试
setTimeout(test, 3000);