'use strict'; const assert = require('assert'); const servicePath = require.resolve('../src/services/language_service'); const stepPath = require.resolve('../src/pipeline/steps/change_language'); const languageService = require(servicePath); const originalChangeLanguage = languageService.changeLanguageFromPage; function makeContext(taskType) { const dbWrites = []; const messages = []; const logs = []; return { account: { email: 'language-test@example.com' }, page: { url: () => 'https://myaccount.google.com/language' }, taskType, results: {}, shouldStop: false, failure: null, log: message => logs.push(message), dbWrite: async (...args) => { dbWrites.push(args); }, updateMessage: async (...args) => { messages.push(args); }, dbWrites, messages, logs, }; } (async () => { try { languageService.changeLanguageFromPage = async () => [false, '未找到可点击的保存按钮']; delete require.cache[stepPath]; const changeLanguageStep = require(stepPath); const combo = makeContext('aistudio_combo'); await changeLanguageStep(combo); assert.strictEqual(combo.shouldStop, false, 'AI Studio 组合流程不应被语言切换失败中止'); assert.strictEqual(combo.failure, null); assert.strictEqual(combo.results.changeLanguage.warning, true); assert.strictEqual(combo.dbWrites.length, 0, '可降级警告不应污染账号失败原因'); assert(combo.logs.some(line => line.includes('继续后续流程'))); const standalone = makeContext('change_language'); await changeLanguageStep(standalone); assert.strictEqual(standalone.shouldStop, true, '单独改语言任务失败时仍应停止并报错'); assert(standalone.failure && standalone.failure.msg.includes('改语言失败')); assert.strictEqual(standalone.dbWrites.length, 1); console.log('change_language_step.test.js: PASS'); } finally { languageService.changeLanguageFromPage = originalChangeLanguage; delete require.cache[stepPath]; } })().catch(error => { console.error(error && error.stack ? error.stack : error); process.exitCode = 1; });