1- import { type AxiosInstance } from "axios" ;
2- import { EventEmitter } from "events" ;
1+ import { type AxiosInstance , type AxiosResponse } from "axios" ;
32import { type ReaderLike } from "eventsource" ;
4- import { type IncomingMessage } from "http" ;
5- import { describe , it , expect , vi , beforeEach } from "vitest" ;
3+ import { EventEmitter } from "node:events" ;
4+ import { type IncomingMessage } from "node:http" ;
5+ import { describe , it , expect , vi } from "vitest" ;
66
77import { createStreamingFetchAdapter } from "@/api/streamingFetchAdapter" ;
88
99const TEST_URL = "https://example.com/api" ;
1010
1111describe ( "createStreamingFetchAdapter" , ( ) => {
12- let mockAxios : AxiosInstance ;
13-
14- beforeEach ( ( ) => {
15- vi . resetAllMocks ( ) ;
16- mockAxios = {
17- request : vi . fn ( ) ,
18- } as unknown as AxiosInstance ;
19- } ) ;
20-
2112 describe ( "Request Handling" , ( ) => {
2213 it ( "passes URL, signal, and responseType to axios" , async ( ) => {
14+ const mockAxios = createAxiosMock ( ) ;
2315 const mockStream = createMockStream ( ) ;
2416 setupAxiosResponse ( mockAxios , 200 , { } , mockStream ) ;
2517
@@ -37,7 +29,8 @@ describe("createStreamingFetchAdapter", () => {
3729 } ) ;
3830 } ) ;
3931
40- it ( "applies headers in correct precedence order (config > init)" , async ( ) => {
32+ it ( "applies headers in correct precedence order (config overrides init)" , async ( ) => {
33+ const mockAxios = createAxiosMock ( ) ;
4134 const mockStream = createMockStream ( ) ;
4235 setupAxiosResponse ( mockAxios , 200 , { } , mockStream ) ;
4336
@@ -88,6 +81,7 @@ describe("createStreamingFetchAdapter", () => {
8881
8982 describe ( "Response Properties" , ( ) => {
9083 it ( "returns response with correct properties" , async ( ) => {
84+ const mockAxios = createAxiosMock ( ) ;
9185 const mockStream = createMockStream ( ) ;
9286 setupAxiosResponse (
9387 mockAxios ,
@@ -102,11 +96,13 @@ describe("createStreamingFetchAdapter", () => {
10296 expect ( response . url ) . toBe ( TEST_URL ) ;
10397 expect ( response . status ) . toBe ( 200 ) ;
10498 expect ( response . headers . get ( "content-type" ) ) . toBe ( "text/event-stream" ) ;
99+ // Headers are lowercased when we retrieve them
105100 expect ( response . headers . get ( "CoNtEnT-TyPe" ) ) . toBe ( "text/event-stream" ) ;
106101 expect ( response . body ?. getReader ) . toBeDefined ( ) ;
107102 } ) ;
108103
109104 it ( "detects redirected requests" , async ( ) => {
105+ const mockAxios = createAxiosMock ( ) ;
110106 const mockStream = createMockStream ( ) ;
111107 const mockResponse = {
112108 status : 200 ,
@@ -117,7 +113,7 @@ describe("createStreamingFetchAdapter", () => {
117113 responseUrl : "https://redirect.com/api" ,
118114 } ,
119115 } ,
120- } ;
116+ } as AxiosResponse < IncomingMessage > ;
121117 vi . mocked ( mockAxios . request ) . mockResolvedValue ( mockResponse ) ;
122118
123119 const adapter = createStreamingFetchAdapter ( mockAxios ) ;
@@ -178,22 +174,14 @@ describe("createStreamingFetchAdapter", () => {
178174 expect ( mockStream . destroy ) . toHaveBeenCalled ( ) ;
179175 } ) ;
180176 } ) ;
181-
182- async function setupReaderTest ( ) : Promise < {
183- mockStream : IncomingMessage ;
184- reader : ReaderLike | ReadableStreamDefaultReader < Uint8Array < ArrayBuffer > > ;
185- } > {
186- const mockStream = createMockStream ( ) ;
187- setupAxiosResponse ( mockAxios , 200 , { } , mockStream ) ;
188-
189- const adapter = createStreamingFetchAdapter ( mockAxios ) ;
190- const response = await adapter ( TEST_URL ) ;
191- const reader = response . body ! . getReader ( ) ;
192-
193- return { mockStream, reader } ;
194- }
195177} ) ;
196178
179+ function createAxiosMock ( ) : AxiosInstance {
180+ return {
181+ request : vi . fn ( ) ,
182+ } as unknown as AxiosInstance ;
183+ }
184+
197185function createMockStream ( ) : IncomingMessage {
198186 const stream = new EventEmitter ( ) as IncomingMessage ;
199187 stream . destroy = vi . fn ( ) ;
@@ -212,3 +200,21 @@ function setupAxiosResponse(
212200 data : stream ,
213201 } ) ;
214202}
203+
204+ async function setupReaderTest ( ) : Promise < {
205+ mockStream : IncomingMessage ;
206+ reader : ReaderLike | ReadableStreamDefaultReader < Uint8Array < ArrayBuffer > > ;
207+ } > {
208+ const mockAxios = createAxiosMock ( ) ;
209+ const mockStream = createMockStream ( ) ;
210+ setupAxiosResponse ( mockAxios , 200 , { } , mockStream ) ;
211+
212+ const adapter = createStreamingFetchAdapter ( mockAxios ) ;
213+ const response = await adapter ( TEST_URL ) ;
214+ const reader = response . body ?. getReader ( ) ;
215+ if ( reader === undefined ) {
216+ throw new Error ( "Reader is undefined" ) ;
217+ }
218+
219+ return { mockStream, reader } ;
220+ }
0 commit comments