Files
go_bt/tests/security_chatgpt_pipeline.test.js

86 lines
4.0 KiB
JavaScript

'use strict';
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const vm = require('vm');
const { RECIPES, ATOM_STEPS } = require('../src/pipeline/recipes');
const recipe = RECIPES.security_chatgpt;
assert.ok(Array.isArray(recipe), '应注册独立的改密+2FA组合任务');
assert.strictEqual(recipe.length, 5);
assert.strictEqual(recipe[0], ATOM_STEPS.login.step, '组合任务只能在开始时登录一次');
assert.strictEqual(recipe[1], ATOM_STEPS.detect_country.step);
assert.strictEqual(recipe[2], ATOM_STEPS.change_language.step);
assert.strictEqual(recipe[3], ATOM_STEPS.change_password.step, '应先改密码');
assert.strictEqual(recipe[4], ATOM_STEPS.change_2fa.step, '改密后应直接改2FA');
assert.ok(!recipe.includes(ATOM_STEPS.chatgpt_register.step), '组合任务不得再执行ChatGPT登录/注册');
assert.strictEqual(
recipe.filter(step => step === ATOM_STEPS.login.step).length,
1,
'组合任务中不得重复执行Google登录步骤',
);
assert.deepStrictEqual(
RECIPES.change_password,
[ATOM_STEPS.login.step, ATOM_STEPS.detect_country.step, ATOM_STEPS.change_language.step, ATOM_STEPS.change_password.step],
'单独改密码任务必须保持原流程不变',
);
assert.deepStrictEqual(
RECIPES.change_2fa,
[ATOM_STEPS.login.step, ATOM_STEPS.detect_country.step, ATOM_STEPS.change_language.step, ATOM_STEPS.change_2fa.step],
'单独更改2FA任务必须保持原流程不变',
);
const root = path.join(__dirname, '..');
const html = fs.readFileSync(path.join(root, 'public', 'index.html'), 'utf8');
const app = fs.readFileSync(path.join(root, 'public', 'app.js'), 'utf8');
const runner = fs.readFileSync(path.join(root, 'src', 'workers', 'task_runner.js'), 'utf8');
assert.match(html, /@click="runSecurityChatgpt\(\)"[^>]*>改密\+2FA<\/button>/);
assert.match(html, /x-model="securityRunMode"[^>]*value="overwrite"|value="overwrite"[^>]*x-model="securityRunMode"/);
assert.match(html, /x-model="securityRunMode"[^>]*value="skip"|value="skip"[^>]*x-model="securityRunMode"/);
assert.match(html, /覆盖修改/);
assert.match(html, /跳过已完成/);
assert.match(app, /skipCompletedSecuritySteps\s*=\s*this\.securityRunMode\s*===\s*'skip'/);
assert.match(app, /runTask\('security_chatgpt',\s*\{\s*skipCompletedSecuritySteps\s*\}\)/);
assert.match(runner, /taskType !== 'security_chatgpt'/, '组合任务不得因后续失败自动从头重跑');
assert.match(
runner,
/proxyRetryAttempt\+\+;\s*\/\/[^\n]*\n\s*chatgptBrowserAttempt = 1;/,
'独立 ChatGPT 任务换代理后应重置当前代理的浏览器重开次数',
);
const uiContext = vm.createContext({
console, Set, Map, Date, JSON, Math, String, Number, Object, Array, RegExp, Promise,
Uint8Array, setTimeout, clearTimeout,
});
vm.runInContext(`${app}\nthis.__geminiApp = geminiApp;`, uiContext, { filename: 'public/app.js' });
const ui = uiContext.__geminiApp();
let submitted = null;
ui.runTask = (taskType, params) => { submitted = { taskType, params }; };
ui.isRunning = false;
ui.runSecurityChatgpt();
assert.strictEqual(ui.showSecurityRunModal, true, '点击组合按钮应先打开执行方式弹框');
assert.strictEqual(ui.securityRunMode, 'overwrite', '弹框默认保持现有覆盖逻辑');
assert.strictEqual(submitted, null, '未确认前不得启动任务');
ui.securityRunMode = 'skip';
ui.confirmSecurityTask();
assert.strictEqual(ui.showSecurityRunModal, false);
assert.strictEqual(submitted.taskType, 'security_chatgpt');
assert.strictEqual(submitted.params.skipCompletedSecuritySteps, true, '跳过模式必须传入显式布尔参数');
submitted = null;
ui.runSecurityChatgpt();
ui.confirmSecurityTask();
assert.strictEqual(submitted.params.skipCompletedSecuritySteps, false, '覆盖模式必须关闭跳过判断');
submitted = null;
ui.showSecurityRunModal = false;
ui.isRunning = true;
ui.runSecurityChatgpt();
assert.strictEqual(ui.showSecurityRunModal, false, '已有任务运行时不得再打开组合弹框');
assert.strictEqual(submitted, null);
console.log('security_chatgpt_pipeline.test.js: PASS');