smoke-cloud-functions.mjs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const FN_URL = 'https://server.fmode.cn/api/functions';
  2. const APP_ID = 'ncloudmaster';
  3. const fn = {
  4. manifest: 'VWejNK8E5z',
  5. task: 'yL6opHxC4D',
  6. history: 'cegZcOyOH0',
  7. result: 'XPv6Sym2I6',
  8. remix: 'LjcaC94Kno',
  9. voice: 'LHBMMcDP4n',
  10. quickly: '',
  11. proxy: 'wzwnEuAhwb',
  12. jimeng: 'WUkf74lVE5',
  13. douyin: 'HArHym0smi',
  14. douyinInsight: 'pzBTvs6UcE',
  15. upload: 'VHS0noRP7Q',
  16. authCredit: '',
  17. };
  18. const checks = [
  19. ['manifest.list', fn.manifest, { action: 'list' }, true],
  20. ['task.list', fn.task, { action: 'list' }, true],
  21. ['history.list', fn.history, { action: 'list' }, true],
  22. ['result.list', fn.result, { action: 'list' }, true],
  23. ['remix.listAll', fn.remix, { action: 'listAll' }, true],
  24. ['voice.listProfiles', fn.voice, { action: 'listProfiles' }, true],
  25. ['upload.token.probe', fn.upload, { action: 'createUploadToken', filename: 'probe.txt', mimeType: 'text/plain', kind: 'probe' }, true],
  26. ['jimeng.unknownAction', fn.jimeng, { action: 'unknown' }, false],
  27. ['douyin.unknownRoute', fn.douyin, { action: 'call', route: 'unknown' }, false],
  28. ['douyinInsight.authGuard', fn.douyinInsight, { action: 'listTopics' }, false],
  29. ['proxy.unknownAction', fn.proxy, { action: 'foo' }, false],
  30. ['quickly.configured', fn.quickly, { action: 'query', taskId: 'probe' }, null],
  31. ['authCredit.configured', fn.authCredit, { action: 'me' }, null],
  32. ];
  33. async function call(id, body) {
  34. const response = await fetch(FN_URL, {
  35. method: 'POST',
  36. headers: {
  37. 'Content-Type': 'application/json',
  38. 'X-Parse-Application-Id': APP_ID,
  39. },
  40. body: JSON.stringify({ id, _ApplicationId: APP_ID, ...body }),
  41. });
  42. const text = await response.text();
  43. try {
  44. return JSON.parse(text);
  45. } catch {
  46. return { code: response.status, success: false, error: text };
  47. }
  48. }
  49. let failed = 0;
  50. for (const [name, id, body, expectSuccess] of checks) {
  51. if (!id) {
  52. console.log(`SKIP ${name}: function id is empty`);
  53. continue;
  54. }
  55. try {
  56. const result = await call(id, body);
  57. const ok = expectSuccess === null
  58. ? true
  59. : expectSuccess
  60. ? result?.code === 200 && result?.success !== false
  61. : result?.code >= 400 || result?.success === false;
  62. if (!ok) failed += 1;
  63. console.log(`${ok ? 'OK' : 'FAIL'} ${name}: ${JSON.stringify(result).slice(0, 500)}`);
  64. } catch (error) {
  65. failed += 1;
  66. console.log(`FAIL ${name}: ${error?.message || error}`);
  67. }
  68. }
  69. if (failed > 0) {
  70. console.error(`Cloud function smoke failed: ${failed}`);
  71. process.exit(1);
  72. }
  73. console.log('Cloud function smoke passed');