@@ -628,7 +628,9 @@ describe("loaders", () => {
628628 ] ) ,
629629 ) ;
630630
631- const recovered = await loadSettingsRecoveringClobberedOAuthSelection ( path , projected ) ;
631+ const recovered = await loadSettingsRecoveringClobberedOAuthSelection ( path , projected , {
632+ persist : true ,
633+ } ) ;
632634 expect ( recovered ) . toEqual ( {
633635 defaultProvider : "codex/work" ,
634636 providers : {
@@ -655,14 +657,18 @@ describe("loaders", () => {
655657 path ,
656658 JSON . stringify ( { provider : "codex/work" , model : "gpt-special-custom" } ) ,
657659 ) ;
658- const recovered = await loadSettingsRecoveringClobberedOAuthSelection ( path , {
659- "codex/work" : {
660- baseURL : "https://chatgpt.com/backend-api" ,
661- apiKey : "oauth-token" ,
662- models : [ "gpt-5.2-codex" , "gpt-5.1-codex" ] ,
663- defaultModel : "gpt-5.2-codex" ,
660+ const recovered = await loadSettingsRecoveringClobberedOAuthSelection (
661+ path ,
662+ {
663+ "codex/work" : {
664+ baseURL : "https://chatgpt.com/backend-api" ,
665+ apiKey : "oauth-token" ,
666+ models : [ "gpt-5.2-codex" , "gpt-5.1-codex" ] ,
667+ defaultModel : "gpt-5.2-codex" ,
668+ } ,
664669 } ,
665- } ) ;
670+ { persist : true } ,
671+ ) ;
666672 expect ( recovered ) . toEqual ( {
667673 defaultProvider : "codex/work" ,
668674 providers : {
@@ -689,32 +695,67 @@ describe("loaders", () => {
689695 JSON . stringify ( { provider : "codex/work" , model : "gpt-5.1-codex" , apiKey : "nope" } ) ,
690696 ) ;
691697 await expect (
692- loadSettingsRecoveringClobberedOAuthSelection ( path , {
693- "codex/work" : {
694- baseURL : "https://chatgpt.com/backend-api" ,
695- apiKey : "oauth-token" ,
696- models : [ "gpt-5.1-codex" ] ,
698+ loadSettingsRecoveringClobberedOAuthSelection (
699+ path ,
700+ {
701+ "codex/work" : {
702+ baseURL : "https://chatgpt.com/backend-api" ,
703+ apiKey : "oauth-token" ,
704+ models : [ "gpt-5.1-codex" ] ,
705+ } ,
697706 } ,
698- } ) ,
707+ { persist : true } ,
708+ ) ,
709+ ) . rejects . toThrow ( / I n v a l i d s e t t i n g s s c h e m a / ) ;
710+ } finally {
711+ await rm ( dir , { recursive : true , force : true } ) ;
712+ }
713+ } ) ;
714+
715+ test ( "loadSettings fails closed on unmatched OAuth selections without touching the file" , async ( ) => {
716+ const dir = await mkdtemp ( join ( tmpdir ( ) , "ic-settings-" ) ) ;
717+ try {
718+ const path = join ( dir , "settings.json" ) ;
719+ const original = JSON . stringify ( { provider : "codex/missing" , model : "gpt-5.1-codex" } ) ;
720+ await writeFile ( path , original ) ;
721+ await expect (
722+ loadSettingsRecoveringClobberedOAuthSelection (
723+ path ,
724+ {
725+ "codex/work" : {
726+ baseURL : "https://chatgpt.com/backend-api" ,
727+ apiKey : "oauth-token" ,
728+ models : [ "gpt-5.1-codex" ] ,
729+ } ,
730+ } ,
731+ { persist : true } ,
732+ ) ,
699733 ) . rejects . toThrow ( / I n v a l i d s e t t i n g s s c h e m a / ) ;
734+ expect ( await readFile ( path , "utf8" ) ) . toBe ( original ) ;
700735 } finally {
701736 await rm ( dir , { recursive : true , force : true } ) ;
702737 }
703738 } ) ;
704739
705- test ( "loadSettings does not recover unmatched OAuth selections " , async ( ) => {
740+ test ( "loadSettingsRecoveringClobberedOAuthSelection leaves the file unchanged when persist is false " , async ( ) => {
706741 const dir = await mkdtemp ( join ( tmpdir ( ) , "ic-settings-" ) ) ;
707742 try {
708743 const path = join ( dir , "settings.json" ) ;
709- await writeFile ( path , JSON . stringify ( { provider : "codex/missing" , model : "gpt-5.1-codex" } ) ) ;
710- const recovered = await loadSettingsRecoveringClobberedOAuthSelection ( path , {
711- "codex/work" : {
712- baseURL : "https://chatgpt.com/backend-api" ,
713- apiKey : "oauth-token" ,
714- models : [ "gpt-5.1-codex" ] ,
744+ const original = JSON . stringify ( { provider : "codex/work" , model : "gpt-5.1-codex" } ) ;
745+ await writeFile ( path , original ) ;
746+ const recovered = await loadSettingsRecoveringClobberedOAuthSelection (
747+ path ,
748+ {
749+ "codex/work" : {
750+ baseURL : "https://chatgpt.com/backend-api" ,
751+ apiKey : "oauth-token" ,
752+ models : [ "gpt-5.1-codex" ] ,
753+ } ,
715754 } ,
716- } ) ;
717- expect ( recovered ) . toEqual ( { providers : { } } ) ;
755+ { persist : false } ,
756+ ) ;
757+ expect ( recovered ?. defaultProvider ) . toBe ( "codex/work" ) ;
758+ expect ( await readFile ( path , "utf8" ) ) . toBe ( original ) ;
718759 } finally {
719760 await rm ( dir , { recursive : true , force : true } ) ;
720761 }
0 commit comments