Files
go_bt/tests/aistudio_deleted_existing_propagation.test.js

48 lines
2.7 KiB
JavaScript

'use strict';
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const servicePath = path.join(__dirname, '..', 'src', 'services', 'aistudio_api_key_service.js');
const source = fs.readFileSync(servicePath, 'utf8');
const start = source.indexOf('async function processAistudioApiKey');
const end = source.indexOf('\nmodule.exports =', start);
assert(start >= 0 && end > start, '必须存在 processAistudioApiKey 实现');
const implementation = source.slice(start, end);
const tryIndex = implementation.indexOf('\n try {');
const stateIndex = implementation.indexOf('let deletedExisting = false;');
assert(stateIndex >= 0, '必须跟踪线上旧 key 是否已被删除');
assert(tryIndex >= 0 && stateIndex < tryIndex,
'deletedExisting 必须声明在 try 外,异常处理才能访问删除状态');
assert.match(
implementation,
/catch\s*\(error\)[\s\S]*?return\s*\{\s*ok:\s*false,\s*data:\s*null,\s*msg,\s*deletedExisting,\s*clearedPreferredProjectId\s*\};/,
'异常返回必须携带 deletedExisting 和失效项目状态,供上层同步清理数据库记录',
);
const lateStart = implementation.indexOf('for (let lateRecovery = 1;');
const lateEnd = implementation.indexOf('\n if (!created.ok)', lateStart + 10);
const lateRecovery = implementation.slice(lateStart, lateEnd);
const lateCountBranch = lateRecovery.indexOf('if (lateCount > 0)');
const unconditionalRecreate = lateRecovery.lastIndexOf('created = await createKey(page, log, {');
assert(lateStart >= 0 && lateEnd > lateStart, '必须存在列表晚到恢复分支');
assert(lateRecovery.includes('lateRecovery <= 2'),
'列表 0→1 连续抖动时应允许最多两轮恢复,同时防止无限循环');
assert(lateRecovery.includes('waitForLateExistingRows(page, 5000)'),
'刷新后必须给列表数据稳定时间,不能立即把 0 当成无旧 Key');
assert(lateCountBranch >= 0 && unconditionalRecreate > lateCountBranch,
'列表刷新后即使旧行已经自然消失,也必须重新创建 Key,不能保留 lateExisting 失败结果');
assert(lateRecovery.includes('syncExistingAistudioApiKey(page, account, log'),
'创建流程中才出现的 Key 必须直接读取保存,不能再次删除重建');
assert(!lateRecovery.includes('deleteAllKeys('),
'lateExisting 恢复分支禁止删除 Key,避免把本轮刚创建成功的 Key 当作旧 Key 删除');
assert(lateRecovery.includes('recoveredLateKey: true'),
'安全读取晚到 Key 后必须直接作为成功结果返回');
assert(lateRecovery.includes('allowMissingPreferredProjectRecovery,'),
'列表晚到恢复后必须保留新旧项目判定参数,防止新项目被误判失效');
console.log('aistudio_deleted_existing_propagation.test.js: PASS');