Files
d1kt/scripts/test_tower_e2e.js

135 lines
4.0 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 塔防游戏成绩提交端到端测试
* 测试流程:登录 -> 模拟成绩提交 -> 验证数据库存储 -> 检查排行榜
*/
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);