@@ -12,27 +12,20 @@ import { Anthropic } from "@anthropic-ai/sdk"
1212import { OPEN_AI_CODEX_SERVICE_TIER_KEY , OpenAiCodexServiceTier , SERVICE_TIER_KEY } from "@roo-code/types"
1313import { OpenAiCodexHandler , transformLunaResponsesLiteBody } from "../openai-codex"
1414import { openAiCodexOAuthManager } from "../../../integrations/openai-codex/oauth"
15+ import { asyncStreamFrom , collectStream } from "../../../test-utils/stream"
1516
1617function createCompletedStream ( ) {
17- return {
18- async * [ Symbol . asyncIterator ] ( ) {
19- yield {
20- type : "response.completed" ,
21- response : {
22- id : "response-1" ,
23- status : "completed" ,
24- output : [ ] ,
25- usage : { input_tokens : 1 , output_tokens : 1 } ,
26- } ,
27- }
18+ return asyncStreamFrom ( [
19+ {
20+ type : "response.completed" ,
21+ response : {
22+ id : "response-1" ,
23+ status : "completed" ,
24+ output : [ ] ,
25+ usage : { input_tokens : 1 , output_tokens : 1 } ,
26+ } ,
2827 } ,
29- }
30- }
31-
32- async function drainStream ( stream : AsyncIterable < unknown > ) {
33- for await ( const _chunk of stream ) {
34- // Drain the response stream.
35- }
28+ ] )
3629}
3730
3831describe ( "OpenAiCodexHandler.getModel" , ( ) => {
@@ -92,7 +85,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
9285 const mockCreate = vitest . fn ( ) . mockResolvedValue ( createCompletedStream ( ) )
9386 Reflect . set ( handler , "client" , { responses : { create : mockCreate } } )
9487
95- await drainStream ( handler . createMessage ( "System prompt" , [ ] ) )
88+ await collectStream ( handler . createMessage ( "System prompt" , [ ] ) )
9689
9790 const [ body ] = mockCreate . mock . calls [ 0 ]
9891 expect ( body ) . toMatchObject ( {
@@ -117,7 +110,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
117110 const mockCreate = vitest . fn ( ) . mockResolvedValue ( createCompletedStream ( ) )
118111 Reflect . set ( handler , "client" , { responses : { create : mockCreate } } )
119112
120- await drainStream ( handler . createMessage ( "System prompt" , [ ] ) )
113+ await collectStream ( handler . createMessage ( "System prompt" , [ ] ) )
121114
122115 expect ( mockCreate . mock . calls [ 0 ] [ 0 ] ) . not . toHaveProperty ( SERVICE_TIER_KEY )
123116 } )
@@ -147,7 +140,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
147140 } )
148141 vitest . stubGlobal ( "fetch" , mockFetch )
149142
150- await drainStream ( handler . createMessage ( "System prompt" , [ ] ) )
143+ await collectStream ( handler . createMessage ( "System prompt" , [ ] ) )
151144
152145 expect ( JSON . parse ( mockFetch . mock . calls [ 0 ] [ 1 ] . body ) ) . toMatchObject ( {
153146 stream : true ,
@@ -166,19 +159,17 @@ describe("OpenAiCodexHandler.createMessage", () => {
166159 responses : {
167160 create : vitest . fn ( ) . mockImplementation ( async ( body : any ) => {
168161 capturedInput . push ( ...( body . input ?? [ ] ) )
169- return {
170- async * [ Symbol . asyncIterator ] ( ) {
171- yield {
172- type : "response.completed" ,
173- response : {
174- id : "r1" ,
175- status : "completed" ,
176- output : [ ] ,
177- usage : { input_tokens : 1 , output_tokens : 1 } ,
178- } ,
179- }
162+ return asyncStreamFrom ( [
163+ {
164+ type : "response.completed" ,
165+ response : {
166+ id : "r1" ,
167+ status : "completed" ,
168+ output : [ ] ,
169+ usage : { input_tokens : 1 , output_tokens : 1 } ,
170+ } ,
180171 } ,
181- }
172+ ] )
182173 } ) ,
183174 } ,
184175 }
@@ -193,10 +184,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
193184 } ,
194185 ]
195186
196- const stream = handler . createMessage ( "system" , messages )
197- for await ( const _ of stream ) {
198- // consume
199- }
187+ await collectStream ( handler . createMessage ( "system" , messages ) )
200188
201189 // URL image is skipped; only the text input_text block should be present
202190 const userMsg = capturedInput . find ( ( item : any ) => item . role === "user" )
@@ -215,19 +203,17 @@ describe("OpenAiCodexHandler.createMessage", () => {
215203 responses : {
216204 create : vitest . fn ( ) . mockImplementation ( async ( body : any ) => {
217205 capturedInput . push ( ...( body . input ?? [ ] ) )
218- return {
219- async * [ Symbol . asyncIterator ] ( ) {
220- yield {
221- type : "response.completed" ,
222- response : {
223- id : "r1" ,
224- status : "completed" ,
225- output : [ ] ,
226- usage : { input_tokens : 1 , output_tokens : 1 } ,
227- } ,
228- }
206+ return asyncStreamFrom ( [
207+ {
208+ type : "response.completed" ,
209+ response : {
210+ id : "r1" ,
211+ status : "completed" ,
212+ output : [ ] ,
213+ usage : { input_tokens : 1 , output_tokens : 1 } ,
214+ } ,
229215 } ,
230- }
216+ ] )
231217 } ) ,
232218 } ,
233219 }
@@ -242,10 +228,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
242228 } ,
243229 ]
244230
245- const stream = handler . createMessage ( "system" , messages )
246- for await ( const _ of stream ) {
247- // consume
248- }
231+ await collectStream ( handler . createMessage ( "system" , messages ) )
249232
250233 const userMsg = capturedInput . find ( ( item : any ) => item . role === "user" )
251234 expect ( userMsg ?. content ) . toContainEqual ( {
@@ -423,7 +406,7 @@ describe("OpenAiCodexHandler Luna Responses Lite requests", () => {
423406 const mockCreate = vitest . fn ( ) . mockResolvedValue ( createCompletedStream ( ) )
424407 ; ( handler as any ) . client = { responses : { create : mockCreate } }
425408
426- await drainStream (
409+ await collectStream (
427410 handler . createMessage ( "Luna instructions" , [ { role : "user" , content : "Hello" } ] , {
428411 taskId : "task-luna" ,
429412 tools : [
@@ -498,7 +481,7 @@ describe("OpenAiCodexHandler Luna Responses Lite requests", () => {
498481 } )
499482 vitest . stubGlobal ( "fetch" , mockFetch )
500483
501- await drainStream (
484+ await collectStream (
502485 handler . createMessage ( "Instructions" , [ { role : "user" , content : "Fallback" } ] , {
503486 taskId : "task-fallback" ,
504487 tools : [ ] ,
@@ -549,7 +532,7 @@ describe("OpenAiCodexHandler Luna Responses Lite requests", () => {
549532 } )
550533 vitest . stubGlobal ( "fetch" , mockFetch )
551534
552- await drainStream (
535+ await collectStream (
553536 handler . createMessage ( "Instructions" , [ { role : "user" , content : "Retry" } ] , {
554537 taskId : "task-retry" ,
555538 tools : [ ] ,
@@ -591,7 +574,7 @@ describe("OpenAiCodexHandler Luna Responses Lite requests", () => {
591574 const mockCreate = vitest . fn ( ) . mockResolvedValue ( createCompletedStream ( ) )
592575 ; ( handler as any ) . client = { responses : { create : mockCreate } }
593576
594- await drainStream (
577+ await collectStream (
595578 handler . createMessage ( "Normal instructions" , [ { role : "user" , content : "Hello" } ] , {
596579 taskId : "task-normal" ,
597580 tools : [ ] ,
0 commit comments