const puppeteer = require('puppeteer'); async function testAPIs() { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); try { console.log('🧪 开始完整 API 测试...'); // 1. 访问登录页面 await page.goto('http://localhost:3000/auth/signin'); await page.waitForSelector('input[type="email"]'); // 2. 填写登录信息 await page.type('input[type="email"]', 'test@example.com'); await page.type('input[type="password"]', 'password123'); // 3. 点击登录 await Promise.all([ page.waitForNavigation(), page.click('button[type="submit"]') ]); // 4. 获取 cookies const cookies = await page.cookies(); const sessionCookie = cookies.find(c => c.name === 'next-auth.session-token'); if (!sessionCookie) { console.error('❌ 未找到 session cookie'); return; } console.log('✅ 登录成功,获取到 session'); // 5. 测试 API 端点 const testAPI = async (url, method = 'GET', data = null) => { const response = await page.evaluate(async (url, method, data, cookie) => { const options = { method, headers: { 'Content-Type': 'application/json', 'Cookie': `next-auth.session-token=${cookie}` } }; if (data) { options.body = JSON.stringify(data); } const res = await fetch(`http://localhost:3000${url}`, options); const text = await res.text(); try { return { status: res.status, data: JSON.parse(text) }; } catch { return { status: res.status, data: text }; } }, url, method, data, sessionCookie.value); console.log(`${method} ${url}: ${response.status}`); if (response.data) { console.log(JSON.stringify(response.data, null, 2)); } console.log('---'); return response; }; // 测试获取家族树列表 await testAPI('/api/trees'); // 测试创建家族树 const treeResponse = await testAPI('/api/trees', 'POST', { name: '测试家族树', description: 'API 测试创建' }); if (treeResponse.status === 201) { const treeId = treeResponse.data.tree.id; console.log(`✅ 创建家族树成功,ID: ${treeId}`); // 测试获取成员列表 await testAPI(`/api/trees/${treeId}/members`); // 测试创建成员 await testAPI(`/api/trees/${treeId}/members`, 'POST', { surname: '李', givenName: '测试', fullName: '李测试', gender: 'MALE', generation: 1, birthDate: '1990-01-01' }); // 再次获取成员列表 await testAPI(`/api/trees/${treeId}/members`); } console.log('✅ API 测试完成!'); } catch (error) { console.error('❌ 测试失败:', error); } finally { await browser.close(); } } testAPIs();