background-step5-submit-short-circuit.test.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. const test = require('node:test');
  2. const assert = require('node:assert/strict');
  3. const fs = require('node:fs');
  4. const source = fs.readFileSync('background/steps/fill-profile.js', 'utf8');
  5. const globalScope = {};
  6. const api = new Function('self', `${source}; return self.MultiPageBackgroundStep5;`)(globalScope);
  7. test('step 5 transport error returns immediately after completion signal arrives', async () => {
  8. const events = {
  9. redirectWaitCalls: 0,
  10. onboardingCalls: 0,
  11. logs: [],
  12. };
  13. const transportError = new Error('The message port closed before a response was received.');
  14. const executor = api.createStep5Executor({
  15. addLog: async (message, level) => {
  16. events.logs.push({ message, level: level || 'info' });
  17. },
  18. generateRandomBirthday: () => ({ year: 2003, month: 6, day: 19 }),
  19. generateRandomName: () => ({ firstName: 'Test', lastName: 'User' }),
  20. getState: async () => ({
  21. stepStatuses: {
  22. 5: 'completed',
  23. },
  24. }),
  25. getTabId: async () => 123,
  26. handleChatgptOnboardingSkip: async () => {
  27. events.onboardingCalls += 1;
  28. },
  29. isRetryableContentScriptTransportError: (error) => error === transportError,
  30. LOG_PREFIX: '[test]',
  31. sendToContentScript: async () => {
  32. throw transportError;
  33. },
  34. waitForStep5ChatgptRedirect: async () => {
  35. events.redirectWaitCalls += 1;
  36. return { id: 123, url: 'https://chatgpt.com/' };
  37. },
  38. });
  39. await executor.executeStep5();
  40. assert.equal(events.redirectWaitCalls, 0, '收到完成信号后不应再等待 ChatGPT 跳转');
  41. assert.equal(events.onboardingCalls, 0, '收到完成信号后不应再触发 onboarding 跳过');
  42. assert.ok(
  43. events.logs.some(({ message }) => /已收到完成信号,直接结束当前步骤/.test(message)),
  44. '应记录 Step 5 已按完成信号直接结束'
  45. );
  46. });