@@ -3497,6 +3497,7 @@ describe("codex manager cli commands", () => {
34973497 . mockResolvedValueOnce ( { mode : "restore-backup" } )
34983498 . mockResolvedValueOnce ( { mode : "cancel" } ) ;
34993499 const errorSpy = vi . spyOn ( console , "error" ) . mockImplementation ( ( ) => { } ) ;
3500+ const logSpy = vi . spyOn ( console , "log" ) . mockImplementation ( ( ) => { } ) ;
35003501
35013502 try {
35023503 const { runCodexMultiAuthCli } = await import ( "../lib/codex-manager.js" ) ;
@@ -3512,11 +3513,67 @@ describe("codex manager cli commands", () => {
35123513 "Could not read backup directory: EPERM: operation not permitted" ,
35133514 ) ,
35143515 ) ;
3516+ expect ( logSpy ) . not . toHaveBeenCalledWith (
3517+ expect . stringContaining ( "No named backups found." ) ,
3518+ ) ;
35153519 } finally {
3520+ logSpy . mockRestore ( ) ;
35163521 errorSpy . mockRestore ( ) ;
35173522 }
35183523 } ) ;
35193524
3525+ it ( "does not claim backups are missing when every assessment fails" , async ( ) => {
3526+ setInteractiveTTY ( true ) ;
3527+ const now = Date . now ( ) ;
3528+ loadAccountsMock . mockResolvedValue ( null ) ;
3529+ listNamedBackupsMock . mockResolvedValue ( [
3530+ {
3531+ name : "busy-backup" ,
3532+ path : "/mock/backups/busy-backup.json" ,
3533+ createdAt : null ,
3534+ updatedAt : now ,
3535+ sizeBytes : 128 ,
3536+ version : 3 ,
3537+ accountCount : 1 ,
3538+ schemaErrors : [ ] ,
3539+ valid : true ,
3540+ loadError : undefined ,
3541+ } ,
3542+ ] ) ;
3543+ assessNamedBackupRestoreMock . mockRejectedValueOnce (
3544+ makeErrnoError ( "backup directory busy" , "EBUSY" ) ,
3545+ ) ;
3546+ promptLoginModeMock
3547+ . mockResolvedValueOnce ( { mode : "restore-backup" } )
3548+ . mockResolvedValueOnce ( { mode : "cancel" } ) ;
3549+ const warnSpy = vi . spyOn ( console , "warn" ) . mockImplementation ( ( ) => { } ) ;
3550+ const logSpy = vi . spyOn ( console , "log" ) . mockImplementation ( ( ) => { } ) ;
3551+
3552+ try {
3553+ const { runCodexMultiAuthCli } = await import ( "../lib/codex-manager.js" ) ;
3554+ const exitCode = await runCodexMultiAuthCli ( [ "auth" , "login" ] ) ;
3555+
3556+ expect ( exitCode ) . toBe ( 0 ) ;
3557+ expect ( promptLoginModeMock ) . toHaveBeenCalledTimes ( 2 ) ;
3558+ expect ( selectMock ) . not . toHaveBeenCalled ( ) ;
3559+ expect ( restoreNamedBackupMock ) . not . toHaveBeenCalled ( ) ;
3560+ expect ( warnSpy ) . toHaveBeenCalledWith (
3561+ expect . stringContaining (
3562+ 'Skipped backup assessment for "busy-backup": backup directory busy' ,
3563+ ) ,
3564+ ) ;
3565+ expect ( warnSpy ) . toHaveBeenCalledWith (
3566+ "Could not inspect any named backups. Resolve the backup read errors and try again." ,
3567+ ) ;
3568+ expect ( logSpy ) . not . toHaveBeenCalledWith (
3569+ expect . stringContaining ( "No named backups found." ) ,
3570+ ) ;
3571+ } finally {
3572+ logSpy . mockRestore ( ) ;
3573+ warnSpy . mockRestore ( ) ;
3574+ }
3575+ } ) ;
3576+
35203577 it ( "keeps healthy backups selectable when one assessment fails" , async ( ) => {
35213578 setInteractiveTTY ( true ) ;
35223579 loadAccountsMock . mockResolvedValue ( null ) ;
0 commit comments