@@ -62,13 +62,16 @@ describe("checkOAuthProviderScope", () => {
6262 expect ( expired . access ) . toBe ( "refreshed-codex" ) ;
6363 } ) ;
6464
65- test ( "codex: reports a definitive staged refresh rejection as invalid credentials " , async ( ) => {
65+ test ( "codex: blocks a definitive staged refresh rejection" , async ( ) => {
6666 const expired = { ...codexTokens , expiresAt : 0 } ;
6767 stubFetch ( ( ) => new Response ( JSON . stringify ( { error : "invalid_grant" } ) , { status : 400 } ) ) ;
6868
6969 const result = await checkOAuthProviderScope ( "codex" , expired ) ;
7070
71- expect ( result . status ) . toBe ( "invalid-credentials" ) ;
71+ expect ( result . status ) . toBe ( "blocked" ) ;
72+ if ( result . status === "blocked" ) {
73+ expect ( result . message ) . toMatch ( / e x p i r e d | r e v o k e d / i) ;
74+ }
7275 } ) ;
7376
7477 test ( "codex: reports a transient staged refresh failure as unavailable" , async ( ) => {
@@ -82,21 +85,20 @@ describe("checkOAuthProviderScope", () => {
8285 expect ( result . status ) . toBe ( "unavailable" ) ;
8386 } ) ;
8487
85- test ( "codex: insufficient-scope on a definitive 403" , async ( ) => {
88+ test ( "codex: blocks a definitive 403 without surfacing the raw body " , async ( ) => {
8689 stubFetch ( ( ) => new Response ( "forbidden" , { status : 403 } ) ) ;
8790 const result = await checkOAuthProviderScope ( "codex" , codexTokens ) ;
88- expect ( result . status ) . toBe ( "insufficient-scope " ) ;
89- if ( result . status === "insufficient-scope " ) {
91+ expect ( result . status ) . toBe ( "blocked " ) ;
92+ if ( result . status === "blocked " ) {
9093 expect ( result . message ) . toMatch ( / r e c o n n e c t / i) ;
91- // Must never surface the raw response body.
9294 expect ( result . message ) . not . toContain ( "forbidden" ) ;
9395 }
9496 } ) ;
9597
96- test ( "codex: insufficient-scope on a definitive 401" , async ( ) => {
98+ test ( "codex: blocks a definitive 401" , async ( ) => {
9799 stubFetch ( ( ) => new Response ( "nope" , { status : 401 } ) ) ;
98100 const result = await checkOAuthProviderScope ( "codex" , codexTokens ) ;
99- expect ( result . status ) . toBe ( "insufficient-scope " ) ;
101+ expect ( result . status ) . toBe ( "blocked " ) ;
100102 } ) ;
101103
102104 test ( "codex: unavailable on a network failure, not blocked" , async ( ) => {
@@ -144,13 +146,16 @@ describe("checkOAuthProviderScope", () => {
144146 expect ( expired . access ) . toBe ( "refreshed-xai" ) ;
145147 } ) ;
146148
147- test ( "xai: reports a definitive staged refresh rejection as invalid credentials " , async ( ) => {
149+ test ( "xai: blocks a definitive staged refresh rejection" , async ( ) => {
148150 const expired = { ...xaiTokens , expiresAt : 0 } ;
149151 stubFetch ( ( ) => new Response ( JSON . stringify ( { error : "revoked" } ) , { status : 401 } ) ) ;
150152
151153 const result = await checkOAuthProviderScope ( "xai" , expired ) ;
152154
153- expect ( result . status ) . toBe ( "invalid-credentials" ) ;
155+ expect ( result . status ) . toBe ( "blocked" ) ;
156+ if ( result . status === "blocked" ) {
157+ expect ( result . message ) . toMatch ( / e x p i r e d | r e v o k e d / i) ;
158+ }
154159 } ) ;
155160
156161 test ( "xai: reports a transient staged refresh failure as unavailable" , async ( ) => {
@@ -164,10 +169,10 @@ describe("checkOAuthProviderScope", () => {
164169 expect ( result . status ) . toBe ( "unavailable" ) ;
165170 } ) ;
166171
167- test ( "xai: insufficient-scope on a definitive 403" , async ( ) => {
172+ test ( "xai: blocks a definitive 403" , async ( ) => {
168173 stubFetch ( ( ) => new Response ( "forbidden" , { status : 403 } ) ) ;
169174 const result = await checkOAuthProviderScope ( "xai" , xaiTokens ) ;
170- expect ( result . status ) . toBe ( "insufficient-scope " ) ;
175+ expect ( result . status ) . toBe ( "blocked " ) ;
171176 } ) ;
172177
173178 test ( "xai: unavailable on a timeout-style abort" , async ( ) => {
0 commit comments