11// noinspection ES6RedundantAwait
22
3- import { beforeEach , describe , expect , it , vi } from 'vitest' ;
4- import type { CodexAuthRequest } from "../../CodexAuthMethod" ;
3+ import { afterEach , beforeEach , describe , expect , it , vi } from 'vitest' ;
4+ import { CODEX_API_KEY_ENV_VAR , OPENAI_API_KEY_ENV_VAR , type CodexAuthRequest } from "../../CodexAuthMethod" ;
55import type * as acp from "@agentclientprotocol/sdk" ;
66import {
77 createCodexMockTestFixture ,
@@ -25,6 +25,10 @@ describe('ACP server test', { timeout: 40_000 }, () => {
2525 vi . clearAllMocks ( ) ;
2626 } ) ;
2727
28+ afterEach ( ( ) => {
29+ vi . unstubAllEnvs ( ) ;
30+ } ) ;
31+
2832 const ignoredFields = [ "thread" , "cwd" , "id" , "createdAt" , "path" , "threadId" , "userAgent" , "sandbox" , "conversationId" , "origins" , "supportedReasoningEfforts" , "reasoningEffort" , "model" , "readOnlyAccess" , "approvalsReviewer" ] ;
2933
3034 it ( 'should throw error without authentication' , async ( ) => {
@@ -114,6 +118,74 @@ describe('ACP server test', { timeout: 40_000 }, () => {
114118 expect ( logoutResponse ) . toEqual ( { type : "unauthenticated" } ) ;
115119 } ) ;
116120
121+ it ( 'should authenticate with CODEX_API_KEY from the environment' , async ( ) => {
122+ const envFixture = createTestFixture ( ) ;
123+ const codexAcpAgent = envFixture . getCodexAcpAgent ( ) ;
124+ vi . stubEnv ( CODEX_API_KEY_ENV_VAR , "CODEX_ENV_TOKEN" ) ;
125+ vi . stubEnv ( OPENAI_API_KEY_ENV_VAR , "OPENAI_ENV_TOKEN" ) ;
126+
127+ await codexAcpAgent . initialize ( { protocolVersion : 1 } ) ;
128+ await envFixture . getCodexAcpClient ( ) . logout ( ) ;
129+ envFixture . clearCodexConnectionDump ( ) ;
130+
131+ await codexAcpAgent . authenticate ( { methodId : "api-key" } ) ;
132+
133+ const transportEvents = envFixture . getCodexConnectionEvents ( [ ] ) ;
134+ const loginRequest = transportEvents . find ( event =>
135+ event . eventType === "request" &&
136+ "method" in event &&
137+ event . method === "account/login/start"
138+ ) ;
139+ expect ( loginRequest ) . toEqual ( {
140+ eventType : "request" ,
141+ method : "account/login/start" ,
142+ params : {
143+ type : "apiKey" ,
144+ apiKey : "CODEX_ENV_TOKEN" ,
145+ }
146+ } ) ;
147+ await expect ( codexAcpAgent . extMethod ( "authentication/status" , { } ) ) . resolves . toEqual ( { type : "api-key" } ) ;
148+ } ) ;
149+
150+ it ( 'should fall back to OPENAI_API_KEY from the environment' , async ( ) => {
151+ const envFixture = createTestFixture ( ) ;
152+ const codexAcpAgent = envFixture . getCodexAcpAgent ( ) ;
153+ vi . stubEnv ( CODEX_API_KEY_ENV_VAR , "" ) ;
154+ vi . stubEnv ( OPENAI_API_KEY_ENV_VAR , "OPENAI_ENV_TOKEN" ) ;
155+
156+ await codexAcpAgent . initialize ( { protocolVersion : 1 } ) ;
157+ await envFixture . getCodexAcpClient ( ) . logout ( ) ;
158+ envFixture . clearCodexConnectionDump ( ) ;
159+
160+ await codexAcpAgent . authenticate ( { methodId : "api-key" } ) ;
161+
162+ const transportEvents = envFixture . getCodexConnectionEvents ( [ ] ) ;
163+ const loginRequest = transportEvents . find ( event =>
164+ event . eventType === "request" &&
165+ "method" in event &&
166+ event . method === "account/login/start"
167+ ) ;
168+ expect ( loginRequest ) . toEqual ( {
169+ eventType : "request" ,
170+ method : "account/login/start" ,
171+ params : {
172+ type : "apiKey" ,
173+ apiKey : "OPENAI_ENV_TOKEN" ,
174+ }
175+ } ) ;
176+ await expect ( codexAcpAgent . extMethod ( "authentication/status" , { } ) ) . resolves . toEqual ( { type : "api-key" } ) ;
177+ } ) ;
178+
179+ it ( 'should report a clear error when the selected API key env var is missing' , async ( ) => {
180+ const envFixture = createTestFixture ( ) ;
181+ const codexAcpAgent = envFixture . getCodexAcpAgent ( ) ;
182+ vi . stubEnv ( CODEX_API_KEY_ENV_VAR , "" ) ;
183+ vi . stubEnv ( OPENAI_API_KEY_ENV_VAR , "" ) ;
184+
185+ await expect ( codexAcpAgent . authenticate ( { methodId : "api-key" } ) )
186+ . rejects . toThrow ( `${ CODEX_API_KEY_ENV_VAR } or ${ OPENAI_API_KEY_ENV_VAR } is not set` ) ;
187+ } ) ;
188+
117189 it ( 'should authenticate with a gateway' , async ( ) => {
118190 const gatewayFixture = createTestFixture ( ) ;
119191 const codexAcpAgent = gatewayFixture . getCodexAcpAgent ( ) ;
0 commit comments