@@ -6,6 +6,7 @@ import { ReadableStream } from 'node:stream/web';
66import { setTimeout } from 'node:timers/promises' ;
77
88import { FileDownload } from '@crawlee/http' ;
9+ import { FetchHttpClient } from '@crawlee/http-client' ;
910import express from 'express' ;
1011import { startExpressAppPromise } from 'test/shared/_helper.js' ;
1112import { afterAll , beforeAll , expect , test } from 'vitest' ;
@@ -95,8 +96,9 @@ test('requestHandler - reading bytes synchronously', async () => {
9596
9697 const fileUrl = new URL ( '/file?size=1024&seed=123' , url ) . toString ( ) ;
9798
98- await crawler . run ( [ fileUrl ] ) ;
99+ const stats = await crawler . run ( [ fileUrl ] ) ;
99100
101+ expect ( stats . requestsFailed ) . toBe ( 0 ) ;
100102 expect ( results ) . toHaveLength ( 1 ) ;
101103 expect ( results [ 0 ] . length ) . toBe ( 1024 ) ;
102104 expect ( results [ 0 ] ) . toEqual ( await ReadableStreamGenerator . getUint8Array ( 1024 , 123 ) ) ;
@@ -116,25 +118,29 @@ test('requestHandler - streaming response body', async () => {
116118
117119 const fileUrl = new URL ( '/file?size=1024&seed=456' , url ) . toString ( ) ;
118120
119- await crawler . run ( [ fileUrl ] ) ;
121+ const stats = await crawler . run ( [ fileUrl ] ) ;
120122
123+ expect ( stats . requestsFailed ) . toBe ( 0 ) ;
121124 expect ( result . length ) . toBe ( 1024 ) ;
122125 expect ( result ) . toEqual ( await ReadableStreamGenerator . getUint8Array ( 1024 , 456 ) ) ;
123126} ) ;
124127
125128test ( 'requestHandler receives response' , async ( ) => {
129+ const fileUrl = new URL ( '/file?size=1024&seed=321' , url ) . toString ( ) ;
130+
126131 const crawler = new FileDownload ( {
127132 maxRequestRetries : 0 ,
128133 requestHandler : async ( { response } ) => {
129134 expect ( response ?. headers . get ( 'content-type' ) ) . toBe ( 'application/octet-stream' ) ;
130135 expect ( response ?. status ) . toBe ( 200 ) ;
131136 expect ( response ?. statusText ) . toBe ( 'OK' ) ;
137+ expect ( response ?. url ) . toBe ( fileUrl ) ;
132138 } ,
133139 } ) ;
134140
135- const fileUrl = new URL ( '/file?size=1024&seed=456' , url ) . toString ( ) ;
141+ const stats = await crawler . run ( [ fileUrl ] ) ;
136142
137- await crawler . run ( [ fileUrl ] ) ;
143+ expect ( stats . requestsFailed ) . toBe ( 0 ) ;
138144} ) ;
139145
140146test ( 'crawler waits for the stream to be consumed' , async ( ) => {
@@ -146,8 +152,12 @@ test('crawler waits for the stream to be consumed', async () => {
146152 } ,
147153 } ) ;
148154
155+ // Use FetchHttpClient so response.body is a real streaming ReadableStream
156+ // (the default GotScrapingHttpClient buffers the entire response, making
157+ // the body complete instantly and the test a no-op).
149158 const crawler = new FileDownload ( {
150159 maxRequestRetries : 0 ,
160+ httpClient : new FetchHttpClient ( ) ,
151161 requestHandler : async ( { response } ) => {
152162 pipelineWithCallbacks ( response . body ?? ReadableStream . from ( [ ] ) , bufferingStream , ( err ) => {
153163 if ( ! err ) {
@@ -162,7 +172,9 @@ test('crawler waits for the stream to be consumed', async () => {
162172
163173 // waits for a second after every kilobyte sent.
164174 const fileUrl = new URL ( `/file?size=${ 5 * 1024 } &seed=789&throttle=1000` , url ) . toString ( ) ;
165- await crawler . run ( [ fileUrl ] ) ;
175+ const stats = await crawler . run ( [ fileUrl ] ) ;
176+
177+ expect ( stats . requestsFailed ) . toBe ( 0 ) ;
166178
167179 // Wait for the stream to finish (pipeline is async)
168180 await new Promise < void > ( ( resolve ) => {
0 commit comments