| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- const test = require('node:test');
- const assert = require('node:assert/strict');
- const fs = require('node:fs');
- const source = fs.readFileSync('background/steps/fetch-login-code.js', 'utf8');
- const globalScope = {};
- const api = new Function('self', `${source}; return self.MultiPageBackgroundStep8;`)(globalScope);
- test('step 8 submits login verification directly without replaying step 7', async () => {
- const calls = {
- ensureReady: 0,
- ensureReadyOptions: [],
- executeStep7: 0,
- sleep: [],
- resolveOptions: null,
- };
- const realDateNow = Date.now;
- Date.now = () => 123456;
- const executor = api.createStep8Executor({
- addLog: async () => {},
- chrome: {
- tabs: {
- update: async () => {},
- },
- },
- CLOUDFLARE_TEMP_EMAIL_PROVIDER: 'cloudflare-temp-email',
- confirmCustomVerificationStepBypass: async () => {},
- ensureStep8VerificationPageReady: async (options) => {
- calls.ensureReady += 1;
- calls.ensureReadyOptions.push(options || null);
- return { state: 'verification_page' };
- },
- executeStep7: async () => {
- calls.executeStep7 += 1;
- },
- getOAuthFlowRemainingMs: async () => 5000,
- getOAuthFlowStepTimeoutMs: async (defaultTimeoutMs) => Math.min(defaultTimeoutMs, 5000),
- getMailConfig: () => ({
- provider: 'qq',
- label: 'QQ 邮箱',
- source: 'mail-qq',
- url: 'https://mail.qq.com',
- navigateOnReuse: false,
- }),
- getState: async () => ({ email: 'user@example.com', password: 'secret' }),
- getTabId: async (sourceName) => (sourceName === 'signup-page' ? 1 : 2),
- HOTMAIL_PROVIDER: 'hotmail-api',
- isTabAlive: async () => true,
- isVerificationMailPollingError: () => false,
- LUCKMAIL_PROVIDER: 'luckmail-api',
- resolveVerificationStep: async (_step, _state, _mail, options) => {
- calls.resolveOptions = options;
- },
- reuseOrCreateTab: async () => {},
- setState: async () => {},
- setStepStatus: async () => {},
- shouldUseCustomRegistrationEmail: () => false,
- sleepWithStop: async (ms) => {
- calls.sleep.push(ms);
- },
- STANDARD_MAIL_VERIFICATION_RESEND_INTERVAL_MS: 25000,
- STEP7_MAIL_POLLING_RECOVERY_MAX_ATTEMPTS: 8,
- throwIfStopped: () => {},
- });
- try {
- await executor.executeStep8({
- email: 'user@example.com',
- password: 'secret',
- oauthUrl: 'https://oauth.example/latest',
- });
- } finally {
- Date.now = realDateNow;
- }
- assert.equal(calls.resolveOptions.beforeSubmit, undefined);
- assert.equal(calls.ensureReady, 1);
- assert.equal(calls.executeStep7, 0);
- assert.deepStrictEqual(calls.sleep, []);
- assert.equal(calls.resolveOptions.filterAfterTimestamp, 123456);
- assert.equal(typeof calls.resolveOptions.getRemainingTimeMs, 'function');
- assert.equal(await calls.resolveOptions.getRemainingTimeMs({ actionLabel: '登录验证码流程' }), 5000);
- assert.equal(calls.resolveOptions.resendIntervalMs, 25000);
- assert.deepStrictEqual(calls.ensureReadyOptions, [
- { timeoutMs: 5000 },
- ]);
- });
- test('step 8 disables resend interval for 2925 mailbox polling', async () => {
- let capturedOptions = null;
- const executor = api.createStep8Executor({
- addLog: async () => {},
- chrome: {
- tabs: {
- update: async () => {},
- },
- },
- CLOUDFLARE_TEMP_EMAIL_PROVIDER: 'cloudflare-temp-email',
- confirmCustomVerificationStepBypass: async () => {},
- ensureStep8VerificationPageReady: async () => ({ state: 'verification_page' }),
- executeStep7: async () => {},
- getOAuthFlowRemainingMs: async () => 8000,
- getOAuthFlowStepTimeoutMs: async (defaultTimeoutMs) => Math.min(defaultTimeoutMs, 8000),
- getMailConfig: () => ({
- provider: '2925',
- label: '2925 邮箱',
- source: 'mail-2925',
- url: 'https://2925.com',
- navigateOnReuse: false,
- }),
- getState: async () => ({ email: 'user@example.com', password: 'secret' }),
- getTabId: async (sourceName) => (sourceName === 'signup-page' ? 1 : 2),
- HOTMAIL_PROVIDER: 'hotmail-api',
- isTabAlive: async () => true,
- isVerificationMailPollingError: () => false,
- LUCKMAIL_PROVIDER: 'luckmail-api',
- resolveVerificationStep: async (_step, _state, _mail, options) => {
- capturedOptions = options;
- },
- reuseOrCreateTab: async () => {},
- setState: async () => {},
- setStepStatus: async () => {},
- shouldUseCustomRegistrationEmail: () => false,
- sleepWithStop: async () => {},
- STANDARD_MAIL_VERIFICATION_RESEND_INTERVAL_MS: 25000,
- STEP7_MAIL_POLLING_RECOVERY_MAX_ATTEMPTS: 8,
- throwIfStopped: () => {},
- });
- await executor.executeStep8({
- email: 'user@example.com',
- password: 'secret',
- oauthUrl: 'https://oauth.example/latest',
- });
- assert.equal(capturedOptions.resendIntervalMs, 0);
- assert.equal(capturedOptions.beforeSubmit, undefined);
- assert.equal(typeof capturedOptions.getRemainingTimeMs, 'function');
- });
- test('step 8 does not rerun step 7 when verification submit lands on add-phone', async () => {
- const calls = {
- executeStep7: 0,
- logs: [],
- };
- const executor = api.createStep8Executor({
- addLog: async (message, level = 'info') => {
- calls.logs.push({ message, level });
- },
- chrome: {
- tabs: {
- update: async () => {},
- },
- },
- CLOUDFLARE_TEMP_EMAIL_PROVIDER: 'cloudflare-temp-email',
- confirmCustomVerificationStepBypass: async () => {},
- ensureStep8VerificationPageReady: async () => ({ state: 'verification_page' }),
- executeStep7: async () => {
- calls.executeStep7 += 1;
- },
- getOAuthFlowRemainingMs: async () => 8000,
- getOAuthFlowStepTimeoutMs: async (defaultTimeoutMs) => Math.min(defaultTimeoutMs, 8000),
- getMailConfig: () => ({
- provider: 'qq',
- label: 'QQ 邮箱',
- source: 'mail-qq',
- url: 'https://mail.qq.com',
- navigateOnReuse: false,
- }),
- getState: async () => ({ email: 'user@example.com', password: 'secret' }),
- getTabId: async (sourceName) => (sourceName === 'signup-page' ? 1 : 2),
- HOTMAIL_PROVIDER: 'hotmail-api',
- isTabAlive: async () => true,
- isVerificationMailPollingError: () => false,
- LUCKMAIL_PROVIDER: 'luckmail-api',
- resolveVerificationStep: async () => {
- throw new Error('步骤 8:验证码提交后页面进入手机号页面,当前流程无法继续自动授权。 URL: https://auth.openai.com/add-phone');
- },
- reuseOrCreateTab: async () => {},
- setState: async () => {},
- setStepStatus: async () => {},
- shouldUseCustomRegistrationEmail: () => false,
- sleepWithStop: async () => {},
- STANDARD_MAIL_VERIFICATION_RESEND_INTERVAL_MS: 25000,
- STEP7_MAIL_POLLING_RECOVERY_MAX_ATTEMPTS: 8,
- throwIfStopped: () => {},
- });
- await assert.rejects(
- () => executor.executeStep8({
- email: 'user@example.com',
- password: 'secret',
- oauthUrl: 'https://oauth.example/latest',
- }),
- /add-phone/
- );
- assert.equal(calls.executeStep7, 0);
- assert.ok(!calls.logs.some(({ message }) => /准备从步骤 7 重新开始/.test(message)));
- });
|