Migrate project from typing_practiceweb
This commit is contained in:
134
scripts/test_tower_e2e.js
Normal file
134
scripts/test_tower_e2e.js
Normal 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);
|
||||
Reference in New Issue
Block a user