Skip to content

Commit 5ec308c

Browse files
committed
Add a test for thenStream errors
1 parent 3d36289 commit 5ec308c

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

test/integration/handlers/stream-response.spec.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { Buffer } from 'buffer';
2-
import { PassThrough } from 'stream';
3-
4-
import * as semver from 'semver';
2+
import { PassThrough, Readable } from 'stream';
3+
import { delay, getDeferred, ErrorLike } from '@httptoolkit/util';
54

65
import { getLocal } from "../../..";
7-
import { expect, fetch, isNode, delay } from "../../test-utils";
6+
import { expect, fetch, isNode, nodeOnly } from "../../test-utils";
87

98
describe("Streaming response handler", function () {
109

@@ -28,15 +27,9 @@ describe("Streaming response handler", function () {
2827
await delay(100);
2928
stream.write(Buffer.from('world'));
3029

31-
if (!process.version || semver.major(process.version) >= 8) {
32-
let arrayBuffer = new Uint8Array(1);
33-
arrayBuffer[0] = '!'.charCodeAt(0);
34-
stream.write(arrayBuffer);
35-
} else {
36-
// Node < 8 doesn't support streaming array buffers
37-
stream.write('!');
38-
}
39-
stream.end();
30+
let arrayBuffer = new Uint8Array(1);
31+
arrayBuffer[0] = '!'.charCodeAt(0);
32+
stream.end(arrayBuffer);
4033

4134
await expect(responsePromise).to.have.status(200);
4235
await expect(responsePromise).to.have.responseText('Hello\nworld!');
@@ -82,4 +75,27 @@ describe("Streaming response handler", function () {
8275
await expect(response2).to.have.responseText('World');
8376
});
8477

78+
nodeOnly(() => {
79+
it("should abort the response if the stream throws an error", async () => {
80+
const serverResponseStream = new PassThrough();
81+
await server.forGet('/stream').thenStream(200, serverResponseStream);
82+
83+
serverResponseStream.write('Hello\n');
84+
85+
const response = await fetch(server.urlFor('/stream'));
86+
87+
expect(response.status).to.equal(200);
88+
89+
const clientResponseStream = response.body as any as Readable;
90+
expect(clientResponseStream.read().toString()).to.equal('Hello\n');
91+
92+
const errorPromise = getDeferred<Error>();
93+
clientResponseStream.on('error', (err) => errorPromise.resolve(err));
94+
95+
serverResponseStream.destroy(new Error("Stream error"));
96+
const error: ErrorLike = await errorPromise;
97+
expect(error.code).to.equal('ERR_STREAM_PREMATURE_CLOSE');
98+
});
99+
});
100+
85101
});

0 commit comments

Comments
 (0)