test_cfc_api.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const http = require('http');
  2. const fs = require('fs');
  3. const BASE = 'cfc.iwintrue.com';
  4. const PORT = 80;
  5. let adminToken = null;
  6. let out = '';
  7. function post(path, body, headers) {
  8. return new Promise((resolve) => {
  9. const data = JSON.stringify(body);
  10. const h = { 'Content-Type': 'application/json', ...headers, 'Content-Length': Buffer.byteLength(data) };
  11. const req = http.request({ hostname: BASE, port: PORT, path, method: 'POST', headers: h }, (res) => {
  12. let d = '';
  13. res.on('data', c => d += c);
  14. res.on('end', () => {
  15. try { resolve({ ok: res.statusCode === 200, status: res.statusCode, data: JSON.parse(d) }); }
  16. catch { resolve({ ok: false, status: res.statusCode, raw: d.slice(0, 100) }); }
  17. });
  18. });
  19. req.on('error', () => resolve({ ok: false, error: 'network' }));
  20. req.write(data); req.end();
  21. });
  22. }
  23. async function admin(path, body) {
  24. if (!adminToken) return { ok: false, error: 'notoken' };
  25. return post(path, body, { Authorization: 'Bearer ' + adminToken });
  26. }
  27. async function run() {
  28. out += '=== CFC API v3 Results ===\n\n';
  29. // Login
  30. await post('/api/admin-auth/send-code', { phone: '13800138000' });
  31. const lr = await post('/api/admin-auth/login', { phone: '13800138000', code: '123456' });
  32. if (lr.data?.data?.token) {
  33. adminToken = lr.data.data.token;
  34. out += '[PASS] Admin login userId=' + (lr.data.data.adminId || 7) + '\n';
  35. } else {
  36. out += '[FAIL] Admin login - ' + (lr.raw || JSON.stringify(lr.data)) + '\n';
  37. fs.writeFileSync('C:/code/cfc/tests/v3_out.txt', out);
  38. return;
  39. }
  40. // NEW-01: Energy rule create
  41. const er = await admin('/api/admin/energy-rule/create', {
  42. ruleName: 'Auto_NEW01_' + Date.now(), dimensionCode: 'body', eventType: 'checkin', energyValue: 5, status: 1,
  43. });
  44. if (er.ok) out += '[PASS] NEW-01 energy-rule create id=' + (er.data?.data?.id || er.data?.id) + '\n';
  45. else out += '[FAIL] NEW-01 energy-rule create code=' + er.status + ' msg=' + (er.data?.message || '') + '\n';
  46. // NEW-02: SKU list
  47. const sku = await admin('/api/admin/product/sku/list', { productId: 1 });
  48. if (sku.ok) out += '[PASS] NEW-02 sku/list count=' + (Array.isArray(sku.data?.data) ? sku.data.data.length : 0) + '\n';
  49. else out += '[FAIL] NEW-02 sku/list code=' + sku.status + ' msg=' + (sku.data?.message || '') + '\n';
  50. // NEW-03: Activity create + publish
  51. const act = await admin('/api/activity/create', {
  52. title: 'Auto_NEW03_' + Date.now(), dimensionCode: 'body',
  53. startTime: '2026-07-15 10:00:00', endTime: '2026-07-15 12:00:00',
  54. location: 'test', maxParticipants: 10,
  55. });
  56. const actId = act.data?.data?.id || act.data?.id;
  57. if (actId) {
  58. out += '[INFO] Activity created id=' + actId + '\n';
  59. const pub = await admin('/api/activity/publish', { id: actId });
  60. if (pub.ok) out += '[PASS] NEW-03 activity publish id=' + actId + '\n';
  61. else out += '[FAIL] NEW-03 activity publish code=' + pub.status + ' msg=' + (pub.data?.message || '') + '\n';
  62. } else {
  63. out += '[FAIL] NEW-03 activity create code=' + act.status + '\n';
  64. }
  65. // ISSUE-001: Vendor unshelve
  66. const vs = await post('/api/product/shelve', { productId: 7, action: 'unshelve' }, { 'X-User-Id': '81069' });
  67. if (vs.ok) out += '[PASS] ISSUE-001 vendor unshelve product 7\n';
  68. else out += '[FAIL] ISSUE-001 vendor unshelve code=' + vs.status + ' msg=' + (vs.data?.message || '') + '\n';
  69. // ISSUE-003: Create user
  70. const phone = '139' + String(Math.floor(Math.random() * 1e9)).padStart(9, '0');
  71. const cu = await admin('/api/admin/users/create', { phone, password: 'Test123456', name: 'AutoTest', role: 'parent' });
  72. if (cu.ok) out += '[PASS] ISSUE-003 create user id=' + (cu.data?.data?.id || cu.data?.id) + '\n';
  73. else out += '[FAIL] ISSUE-003 create user code=' + cu.status + '\n';
  74. // New API: grantEnergy
  75. const ge = await admin('/api/energy/grantEnergy', { childId: 1, taskId: 1, amount: 10, dimensionCode: 'body' });
  76. if (ge.ok) out += '[PASS] energy.grantEnergy\n';
  77. else out += '[FAIL] energy.grantEnergy code=' + ge.status + ' msg=' + (ge.data?.message || '') + '\n';
  78. // New API: points.checkAndGrantReward
  79. const pr = await admin('/api/points/checkAndGrantReward', { childId: 1, amount: 5 });
  80. if (pr.ok || pr.data?.data === -1) out += '[PASS] points.checkAndGrantReward result=' + pr.data?.data + '\n';
  81. else out += '[FAIL] points.checkAndGrantReward code=' + pr.status + '\n';
  82. // New API: getRecordsByChild
  83. const gr = await admin('/api/growth/record/child/1', {});
  84. if (gr.ok) out += '[PASS] growth.getRecordsByChild count=' + (Array.isArray(gr.data?.data) ? gr.data.data.length : 0) + '\n';
  85. else out += '[FAIL] growth.getRecordsByChild code=' + gr.status + '\n';
  86. fs.writeFileSync('C:/code/cfc/tests/v3_out.txt', out);
  87. console.log('DONE'); // won't be seen but whatever
  88. }
  89. run().catch(e => {
  90. fs.writeFileSync('C:/code/cfc/tests/v3_out.txt', 'ERROR: ' + e.message);
  91. });