const fs = require('fs'); const path = require('path'); const BASE = 'http://cfc.iwintrue.com:80'; const results = []; let adminToken = null; async function api(p, body, h = {}) { try { const r = await fetch(BASE + p, { method: 'POST', headers: { 'Content-Type': 'application/json', ...h }, body: body ? JSON.stringify(body) : undefined, }); const t = await r.text(); let d; try { d = JSON.parse(t); } catch {} return { ok: r.ok, status: r.status, data: d, raw: t.slice(0, 200) }; } catch (e) { return { ok: false, data: null, error: e.message }; } } async function admin(p, body) { if (!adminToken) return { ok: false, data: null, error: 'notoken' }; return api(p, body, { Authorization: 'Bearer ' + adminToken }); } async function run() { let out = '=== CFC API v3 Test Results ===\n'; out += 'Time: ' + new Date().toISOString() + '\n\n'; // Login out += '[1] Login\n'; await api('/api/admin-auth/send-code', { phone: '13800138000' }); const lr = await api('/api/admin-auth/login', { phone: '13800138000', code: '123456' }); if (lr.data?.data?.token) { adminToken = lr.data.data.token; out += ' PASS: Admin login, userId=' + (lr.data.data.adminId || 7) + '\n'; } else { out += ' FAIL: Admin login failed - ' + (lr.raw || 'no token') + '\n'; } // NEW-01 Energy Rule Create out += '[2] NEW-01 Energy Rule Create\n'; const er = await admin('/api/admin/energy-rule/create', { ruleName: 'AutoTest_NEW01_' + Date.now(), dimensionCode: 'body', eventType: 'checkin', energyValue: 5, status: 1, }); if (er.ok || er.data?.code === 200) { const id = er.data?.data?.id || er.data?.id; out += ' PASS: Energy rule created, id=' + id + '\n'; } else { out += ' FAIL: code=' + er.data?.code + ' msg=' + (er.data?.message || '') + '\n'; } // NEW-02 SKU List out += '[3] NEW-02 SKU List\n'; const sku = await admin('/api/admin/product/sku/list', { productId: 1 }); if (sku.ok || sku.data?.code === 200) { const cnt = Array.isArray(sku.data?.data) ? sku.data.data.length : 0; out += ' PASS: SKU list, count=' + cnt + '\n'; } else { out += ' FAIL: code=' + sku.data?.code + ' msg=' + (sku.data?.message || '') + '\n'; } // NEW-03 Activity Publish out += '[4] NEW-03 Activity Publish\n'; const act = await admin('/api/activity/create', { title: 'AutoTest_NEW03_' + Date.now(), dimensionCode: 'body', startTime: '2026-07-15 10:00:00', endTime: '2026-07-15 12:00:00', location: 'test', maxParticipants: 10, }); const actId = act.data?.data?.id || act.data?.id; if (actId) { out += ' INFO: Activity created, id=' + actId + '\n'; const pub = await admin('/api/activity/publish', { id: actId }); if (pub.ok || pub.data?.code === 200) { out += ' PASS: Activity published\n'; } else { out += ' FAIL: code=' + pub.data?.code + ' msg=' + (pub.data?.message || '') + '\n'; } } else { out += ' FAIL: Activity creation failed - code=' + act.data?.code + '\n'; } // ISSUE-001 Vendor unshelve out += '[5] ISSUE-001 Vendor unshelve\n'; const vs = await api('/api/product/shelve', { productId: 7, action: 'unshelve' }, { 'X-User-Id': '81069' }); if (vs.ok || vs.data?.code === 200) { out += ' PASS: Vendor unshelved product 7\n'; } else { out += ' FAIL: code=' + vs.data?.code + ' msg=' + (vs.data?.message || '') + '\n'; } // ISSUE-003 Create user out += '[6] ISSUE-003 Create user\n'; const phone = '139' + String(Math.floor(Math.random() * 1e9)).padStart(9, '0'); const cu = await admin('/api/admin/users/create', { phone, password: 'Test123456', name: 'AutoTestUser', role: 'parent', }); if (cu.ok || cu.data?.code === 200) { const uid = cu.data?.data?.id || cu.data?.id; out += ' PASS: User created, id=' + uid + '\n'; } else { out += ' FAIL: code=' + cu.data?.code + ' msg=' + (cu.data?.message || '') + '\n'; } // New APIs out += '[7] New API: energy.grantEnergy\n'; const ge = await admin('/api/energy/grantEnergy', { childId: 1, taskId: 1, amount: 10, dimensionCode: 'body' }); if (ge.ok || ge.data?.code === 200) { out += ' PASS: grantEnergy ok\n'; } else { out += ' FAIL: code=' + ge.data?.code + ' msg=' + (ge.data?.message || '') + '\n'; } out += '[8] New API: points.checkAndGrantReward\n'; const pr = await admin('/api/points/checkAndGrantReward', { childId: 1, amount: 5 }); if (pr.ok || pr.data?.code === 200 || pr.data?.data === -1) { out += ' PASS: checkAndGrantReward, result=' + pr.data?.data + '\n'; } else { out += ' FAIL: code=' + pr.data?.code + ' msg=' + (pr.data?.message || '') + '\n'; } out += '[9] New API: growth.getRecordsByChild\n'; const gr = await admin('/api/growth/record/child/1', {}); if (gr.ok || gr.data?.code === 200) { const cnt = Array.isArray(gr.data?.data) ? gr.data.data.length : 0; out += ' PASS: getRecordsByChild, count=' + cnt + '\n'; } else { out += ' FAIL: code=' + gr.data?.code + ' msg=' + (gr.data?.message || '') + '\n'; } fs.writeFileSync(path.join(__dirname, 'v3_test_output.txt'), out, 'utf8'); } run().then(() => { process.exit(0); }).catch(e => { fs.writeFileSync(path.join(__dirname, 'v3_test_output.txt'), 'ERROR: ' + e.message, 'utf8'); process.exit(1); });