@@ -1122,7 +1122,11 @@ describe("codex manager cli commands", () => {
11221122 error : "" ,
11231123 } ;
11241124 assessOpencodeAccountPoolMock . mockResolvedValue ( assessment ) ;
1125- importAccountsMock . mockRejectedValueOnce ( new Error ( "import locked" ) ) ;
1125+ const importError = makeErrnoError (
1126+ "operation not permitted, open 'C:\\Users\\alice\\AppData\\Local\\OpenCode\\openai-codex-accounts.json'" ,
1127+ "EPERM" ,
1128+ ) ;
1129+ importAccountsMock . mockRejectedValueOnce ( importError ) ;
11261130 confirmMock . mockResolvedValueOnce ( true ) ;
11271131 promptLoginModeMock
11281132 . mockResolvedValueOnce ( { mode : "import-opencode" } )
@@ -1137,11 +1141,14 @@ describe("codex manager cli commands", () => {
11371141 "/mock/.opencode/openai-codex-accounts.json" ,
11381142 ) ;
11391143 expect ( promptLoginModeMock ) . toHaveBeenCalledTimes ( 2 ) ;
1144+ expect ( errorSpy ) . toHaveBeenCalledWith (
1145+ "Import failed: EPERM: operation not permitted, open 'openai-codex-accounts.json'" ,
1146+ ) ;
11401147 expect (
11411148 errorSpy . mock . calls . some ( ( [ message ] ) =>
1142- String ( message ) . includes ( "Import failed:" )
1149+ String ( message ) . includes ( "C:\\Users\\alice\\AppData\\Local\\OpenCode" ) ,
11431150 ) ,
1144- ) . toBe ( true ) ;
1151+ ) . toBe ( false ) ;
11451152 errorSpy . mockRestore ( ) ;
11461153 } ) ;
11471154
@@ -1178,6 +1185,8 @@ describe("codex manager cli commands", () => {
11781185 it . each ( [
11791186 {
11801187 label : "would exceed the account limit" ,
1188+ expectedLog :
1189+ "Import would exceed the account limit (2 current, 5 after import). Remove accounts first." ,
11811190 assessment : {
11821191 backup : {
11831192 name : "openai-codex-accounts.json" ,
@@ -1206,6 +1215,7 @@ describe("codex manager cli commands", () => {
12061215 } ,
12071216 {
12081217 label : "is not eligible for restore" ,
1218+ expectedLog : "OpenCode account pool is not importable." ,
12091219 assessment : {
12101220 backup : {
12111221 name : "openai-codex-accounts.json" ,
@@ -1234,7 +1244,7 @@ describe("codex manager cli commands", () => {
12341244 } ,
12351245 ] ) (
12361246 "skips confirmation and import when the OpenCode assessment $label" ,
1237- async ( { assessment } ) => {
1247+ async ( { assessment, expectedLog } ) => {
12381248 setInteractiveTTY ( true ) ;
12391249 loadAccountsMock . mockResolvedValue ( {
12401250 version : 3 ,
@@ -1253,6 +1263,7 @@ describe("codex manager cli commands", () => {
12531263 promptLoginModeMock
12541264 . mockResolvedValueOnce ( { mode : "import-opencode" } )
12551265 . mockResolvedValueOnce ( { mode : "cancel" } ) ;
1266+ const logSpy = vi . spyOn ( console , "log" ) . mockImplementation ( ( ) => { } ) ;
12561267 const { runCodexMultiAuthCli } = await import ( "../lib/codex-manager.js" ) ;
12571268
12581269 const exitCode = await runCodexMultiAuthCli ( [ "auth" , "login" ] ) ;
@@ -1262,6 +1273,8 @@ describe("codex manager cli commands", () => {
12621273 expect ( confirmMock ) . not . toHaveBeenCalled ( ) ;
12631274 expect ( importAccountsMock ) . not . toHaveBeenCalled ( ) ;
12641275 expect ( promptLoginModeMock ) . toHaveBeenCalledTimes ( 2 ) ;
1276+ expect ( logSpy ) . toHaveBeenCalledWith ( expectedLog ) ;
1277+ logSpy . mockRestore ( ) ;
12651278 } ,
12661279 ) ;
12671280
0 commit comments