Files
go_bt/tests/chatgpt_pipeline_session_guard.test.js
T

123 lines
4.3 KiB
JavaScript

'use strict';
const assert = require('assert');
async function loadStepWithResult(result) {
const servicePath = require.resolve('../src/services/chatgpt_service');
const screenshotPath = require.resolve('../src/utils/screenshot');
const stepPath = require.resolve('../src/pipeline/steps/chatgpt_register');
const service = require(servicePath);
const screenshot = require(screenshotPath);
const originalLogin = service.loginOrRegisterChatGPT;
const originalScreenshot = screenshot.saveErrorScreenshot;
service.loginOrRegisterChatGPT = async () => result;
screenshot.saveErrorScreenshot = async () => null;
delete require.cache[stepPath];
const step = require(stepPath);
service.loginOrRegisterChatGPT = originalLogin;
screenshot.saveErrorScreenshot = originalScreenshot;
return step;
}
function makeContext({ saveResult = true, existingSession = null } = {}) {
const writes = [];
const statuses = [];
const messages = [];
const ctx = {
account: { email: 'target@example.com' },
page: { url: () => 'https://chatgpt.com/' },
params: { age: 23, clearAuthState: false },
log: () => {},
results: {},
shouldStop: false,
dbWrite: async (name, args) => {
writes.push({ name, args });
if (name === 'getAccount') {
return {
chatgpt_session: existingSession,
password_changed: 0,
fa_changed: 0,
};
}
if (name === 'updateAccountChatgptResult') {
return args[1] === '失败' ? true : saveResult;
}
return true;
},
updateStatus: async (_email, status) => { statuses.push(status); },
updateMessage: async (_email, message) => { messages.push(message); },
};
return { ctx, writes, statuses, messages };
}
(async () => {
const wrongSession = {
user: { email: 'other@example.com' },
expires: '2099-01-01T00:00:00.000Z',
};
const successExits = [
{ name: 'existing-session', created: false, status: '已登录' },
{ name: 'home-direct-session', created: false, status: '已登录' },
{ name: 'home-probe-session', created: false, status: '已登录' },
{ name: 'all-set-probe-session', created: true, status: '已注册' },
];
for (const exit of successExits) {
const step = await loadStepWithResult({
ok: true,
created: exit.created,
status: exit.status,
session: wrongSession,
source: exit.name,
});
const { ctx, writes } = makeContext();
await step(ctx);
assert.strictEqual(ctx.results.chatgptRegister.success, false, `${exit.name} 错邮箱Session不得成功`);
assert.strictEqual(ctx.results.chatgptRegister.code, 'CHATGPT_ACCOUNT_MISMATCH');
const persistedWrongSession = writes.some(item => item.name === 'updateAccountChatgptResult'
&& item.args[1] !== '失败'
&& item.args[2]);
assert.strictEqual(persistedWrongSession, false, `${exit.name} 错邮箱Session不得落库`);
}
const validStep = await loadStepWithResult({
ok: true,
created: false,
status: '已登录',
session: {
user: { email: 'target@example.com' },
expires: '2099-01-01T00:00:00.000Z',
},
});
const validContext = makeContext();
await validStep(validContext.ctx);
assert.strictEqual(validContext.ctx.results.chatgptRegister.success, true);
const validSave = validContext.writes.find(item => item.name === 'updateAccountChatgptResult'
&& item.args[1] === '已登录');
assert(validSave, '目标邮箱Session应正常保存');
const failedSaveStep = await loadStepWithResult({
ok: true,
created: false,
status: '已登录',
session: {
user: { email: 'target@example.com' },
expires: '2099-01-01T00:00:00.000Z',
},
});
const failedSaveContext = makeContext({ saveResult: false });
await failedSaveStep(failedSaveContext.ctx);
assert.strictEqual(failedSaveContext.ctx.results.chatgptRegister.success, false);
assert.strictEqual(failedSaveContext.ctx.results.chatgptRegister.code, 'DB_SAVE_FAILED');
assert.strictEqual(failedSaveContext.ctx.shouldStop, true);
assert(failedSaveContext.statuses.includes('ChatGPT失败'));
assert(failedSaveContext.writes.some(item => item.name === 'updateAccountStatusReason'
&& item.args[1] === 'DB_SAVE_FAILED'));
console.log('chatgpt_pipeline_session_guard.test.js: PASS');
})().catch(error => {
console.error(error);
process.exitCode = 1;
});