@@ -5,6 +5,7 @@ import os from "node:os";
55import path from "node:path" ;
66import { spawnSync } from "node:child_process" ;
77import { fileURLToPath } from "node:url" ;
8+ import { syncUserSettingsFile } from "../src/engine_selection_settings.mjs" ;
89
910const __filename = fileURLToPath ( import . meta. url ) ;
1011const __dirname = path . dirname ( __filename ) ;
@@ -466,3 +467,44 @@ test("install 遇到非法 settings.json 时会备份后重建当前版本结构
466467 fs . rmSync ( tempRoot , { recursive : true , force : true } ) ;
467468 }
468469} ) ;
470+
471+ test ( "settings.json 在首次读取瞬间异常、重读后合法时不会产生备份文件" , ( ) => {
472+ const tempRoot = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , "helloloop-settings-retry-" ) ) ;
473+ const helloLoopHome = path . join ( tempRoot , "helloloop-home" ) ;
474+ const settingsFile = path . join ( helloLoopHome , "settings.json" ) ;
475+ const originalReadFileSync = fs . readFileSync ;
476+ let firstRead = true ;
477+
478+ writeJson ( settingsFile , {
479+ defaultEngine : "" ,
480+ lastSelectedEngine : "codex" ,
481+ notifications : {
482+ email : {
483+ enabled : false ,
484+ } ,
485+ } ,
486+ } ) ;
487+
488+ fs . readFileSync = ( ( filePath , ...args ) => {
489+ if ( String ( filePath ) === settingsFile && firstRead ) {
490+ firstRead = false ;
491+ return "{ invalid" ;
492+ }
493+ return originalReadFileSync . call ( fs , filePath , ...args ) ;
494+ } ) ;
495+
496+ try {
497+ const result = syncUserSettingsFile ( { userSettingsFile : settingsFile } ) ;
498+ assert . equal ( result . action , "synced" ) ;
499+ assert . equal ( result . backupFile , "" ) ;
500+ assert . equal ( result . recoveredAfterRetry , true ) ;
501+ const backupFiles = fs . readdirSync ( helloLoopHome )
502+ . filter ( ( item ) => item . startsWith ( "settings.json.invalid-" ) && item . endsWith ( ".bak" ) ) ;
503+ assert . deepEqual ( backupFiles , [ ] ) ;
504+ const settings = readJson ( settingsFile ) ;
505+ assert . equal ( settings . lastSelectedEngine , "codex" ) ;
506+ } finally {
507+ fs . readFileSync = originalReadFileSync ;
508+ fs . rmSync ( tempRoot , { recursive : true , force : true } ) ;
509+ }
510+ } ) ;
0 commit comments