144 lines
4.9 KiB
JavaScript
144 lines
4.9 KiB
JavaScript
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 () => {},
|
|
shouldSkipLoginVerificationForCpaCallback: () => false,
|
|
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 () => {},
|
|
shouldSkipLoginVerificationForCpaCallback: () => false,
|
|
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');
|
|
});
|