run_v3_minimal.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. const fs = require('fs');
  2. const path = require('path');
  3. const BASE = 'http://cfc.iwintrue.com:80';
  4. const results = [];
  5. let adminToken = null;
  6. async function api(p, body, h = {}) {
  7. try {
  8. const r = await fetch(BASE + p, {
  9. method: 'POST',
  10. headers: { 'Content-Type': 'application/json', ...h },
  11. body: body ? JSON.stringify(body) : undefined,
  12. });
  13. const t = await r.text();
  14. let d;
  15. try { d = JSON.parse(t); } catch {}
  16. return { ok: r.ok, status: r.status, data: d, raw: t.slice(0, 200) };
  17. } catch (e) {
  18. return { ok: false, data: null, error: e.message };
  19. }
  20. }
  21. async function admin(p, body) {
  22. if (!adminToken) return { ok: false, data: null, error: 'notoken' };
  23. return api(p, body, { Authorization: 'Bearer ' + adminToken });
  24. }
  25. async function run() {
  26. let out = '=== CFC API v3 Test Results ===\n';
  27. out += 'Time: ' + new Date().toISOString() + '\n\n';
  28. // Login
  29. out += '[1] Login\n';
  30. await api('/api/admin-auth/send-code', { phone: '13800138000' });
  31. const lr = await api('/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 failed - ' + (lr.raw || 'no token') + '\n';
  37. }
  38. // NEW-01 Energy Rule Create
  39. out += '[2] NEW-01 Energy Rule Create\n';
  40. const er = await admin('/api/admin/energy-rule/create', {
  41. ruleName: 'AutoTest_NEW01_' + Date.now(),
  42. dimensionCode: 'body', eventType: 'checkin', energyValue: 5, status: 1,
  43. });
  44. if (er.ok || er.data?.code === 200) {
  45. const id = er.data?.data?.id || er.data?.id;
  46. out += ' PASS: Energy rule created, id=' + id + '\n';
  47. } else {
  48. out += ' FAIL: code=' + er.data?.code + ' msg=' + (er.data?.message || '') + '\n';
  49. }
  50. // NEW-02 SKU List
  51. out += '[3] NEW-02 SKU List\n';
  52. const sku = await admin('/api/admin/product/sku/list', { productId: 1 });
  53. if (sku.ok || sku.data?.code === 200) {
  54. const cnt = Array.isArray(sku.data?.data) ? sku.data.data.length : 0;
  55. out += ' PASS: SKU list, count=' + cnt + '\n';
  56. } else {
  57. out += ' FAIL: code=' + sku.data?.code + ' msg=' + (sku.data?.message || '') + '\n';
  58. }
  59. // NEW-03 Activity Publish
  60. out += '[4] NEW-03 Activity Publish\n';
  61. const act = await admin('/api/activity/create', {
  62. title: 'AutoTest_NEW03_' + Date.now(),
  63. dimensionCode: 'body',
  64. startTime: '2026-07-15 10:00:00',
  65. endTime: '2026-07-15 12:00:00',
  66. location: 'test',
  67. maxParticipants: 10,
  68. });
  69. const actId = act.data?.data?.id || act.data?.id;
  70. if (actId) {
  71. out += ' INFO: Activity created, id=' + actId + '\n';
  72. const pub = await admin('/api/activity/publish', { id: actId });
  73. if (pub.ok || pub.data?.code === 200) {
  74. out += ' PASS: Activity published\n';
  75. } else {
  76. out += ' FAIL: code=' + pub.data?.code + ' msg=' + (pub.data?.message || '') + '\n';
  77. }
  78. } else {
  79. out += ' FAIL: Activity creation failed - code=' + act.data?.code + '\n';
  80. }
  81. // ISSUE-001 Vendor unshelve
  82. out += '[5] ISSUE-001 Vendor unshelve\n';
  83. const vs = await api('/api/product/shelve', { productId: 7, action: 'unshelve' }, { 'X-User-Id': '81069' });
  84. if (vs.ok || vs.data?.code === 200) {
  85. out += ' PASS: Vendor unshelved product 7\n';
  86. } else {
  87. out += ' FAIL: code=' + vs.data?.code + ' msg=' + (vs.data?.message || '') + '\n';
  88. }
  89. // ISSUE-003 Create user
  90. out += '[6] ISSUE-003 Create user\n';
  91. const phone = '139' + String(Math.floor(Math.random() * 1e9)).padStart(9, '0');
  92. const cu = await admin('/api/admin/users/create', {
  93. phone, password: 'Test123456', name: 'AutoTestUser', role: 'parent',
  94. });
  95. if (cu.ok || cu.data?.code === 200) {
  96. const uid = cu.data?.data?.id || cu.data?.id;
  97. out += ' PASS: User created, id=' + uid + '\n';
  98. } else {
  99. out += ' FAIL: code=' + cu.data?.code + ' msg=' + (cu.data?.message || '') + '\n';
  100. }
  101. // New APIs
  102. out += '[7] New API: energy.grantEnergy\n';
  103. const ge = await admin('/api/energy/grantEnergy', { childId: 1, taskId: 1, amount: 10, dimensionCode: 'body' });
  104. if (ge.ok || ge.data?.code === 200) {
  105. out += ' PASS: grantEnergy ok\n';
  106. } else {
  107. out += ' FAIL: code=' + ge.data?.code + ' msg=' + (ge.data?.message || '') + '\n';
  108. }
  109. out += '[8] New API: points.checkAndGrantReward\n';
  110. const pr = await admin('/api/points/checkAndGrantReward', { childId: 1, amount: 5 });
  111. if (pr.ok || pr.data?.code === 200 || pr.data?.data === -1) {
  112. out += ' PASS: checkAndGrantReward, result=' + pr.data?.data + '\n';
  113. } else {
  114. out += ' FAIL: code=' + pr.data?.code + ' msg=' + (pr.data?.message || '') + '\n';
  115. }
  116. out += '[9] New API: growth.getRecordsByChild\n';
  117. const gr = await admin('/api/growth/record/child/1', {});
  118. if (gr.ok || gr.data?.code === 200) {
  119. const cnt = Array.isArray(gr.data?.data) ? gr.data.data.length : 0;
  120. out += ' PASS: getRecordsByChild, count=' + cnt + '\n';
  121. } else {
  122. out += ' FAIL: code=' + gr.data?.code + ' msg=' + (gr.data?.message || '') + '\n';
  123. }
  124. fs.writeFileSync(path.join(__dirname, 'v3_test_output.txt'), out, 'utf8');
  125. }
  126. run().then(() => {
  127. process.exit(0);
  128. }).catch(e => {
  129. fs.writeFileSync(path.join(__dirname, 'v3_test_output.txt'), 'ERROR: ' + e.message, 'utf8');
  130. process.exit(1);
  131. });