From 5069700506865e6c44116379c157c12c8161cd9c Mon Sep 17 00:00:00 2001 From: Aleksei Androsov Date: Mon, 15 Jul 2019 04:42:49 +0300 Subject: [PATCH] fix: response.complete must be true after res.end (#1601) Fixes https://github.com/nock/nock/issues/1493 https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete --- lib/request_overrider.js | 4 ++++ tests/test_request_overrider.js | 27 ++++++++++++++++++++++++ tests/test_stream.js | 37 +++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/lib/request_overrider.js b/lib/request_overrider.js index 589344a11..9b45c659f 100644 --- a/lib/request_overrider.js +++ b/lib/request_overrider.js @@ -446,6 +446,8 @@ function RequestOverrider(req, options, interceptors, remove) { }) responseBody.on('end', function() { response.push(null) + // https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete + response.complete = true }) responseBody.on('error', function(err) { response.emit('error', err) @@ -536,6 +538,8 @@ function RequestOverrider(req, options, interceptors, remove) { } else { debug('ending response stream') response.push(null) + // https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete + response.complete = true interceptor.scope.emit('replied', req, interceptor) } }) diff --git a/tests/test_request_overrider.js b/tests/test_request_overrider.js index 48347a5f1..7dd8fae8b 100644 --- a/tests/test_request_overrider.js +++ b/tests/test_request_overrider.js @@ -523,3 +523,30 @@ test("mocked requests have 'method' property", t => { }) req.end() }) + +// https://github.com/nock/nock/issues/1493 +test("response have 'complete' property and it's true after end", t => { + const scope = nock('http://example.test') + .get('/') + .reply(200, 'Hello World!') + + const req = http.request( + { + host: 'example.test', + method: 'GET', + path: '/', + port: 80, + }, + res => { + res.on('end', () => { + t.is(res.complete, true) + scope.done() + t.end() + }) + // Streams start in 'paused' mode and must be started. + // See https://nodejs.org/api/stream.html#stream_class_stream_readable + res.resume() + } + ) + req.end() +}) diff --git a/tests/test_stream.js b/tests/test_stream.js index 637847324..1ff010bb9 100644 --- a/tests/test_stream.js +++ b/tests/test_stream.js @@ -77,6 +77,43 @@ test('pause response after data', t => { }, 0) }) +// https://github.com/nock/nock/issues/1493 +test("response have 'complete' property and it's true after end", t => { + const response = new stream.PassThrough() + const scope = nock('http://example.test') + .get('/') + // Node does not pause the 'end' event so we need to use a stream to simulate + // multiple 'data' events. + .reply(200, response) + + http.get( + { + host: 'example.test', + path: '/', + }, + res => { + let hasData = false + + res.on('data', () => { + hasData = true + }) + + res.on('end', () => { + t.true(hasData) + t.is(res.complete, true) + scope.done() + t.end() + }) + } + ) + + // Manually simulate multiple 'data' events. + response.emit('data', 'one') + setTimeout(() => { + response.end() + }, 0) +}) + // TODO Convert to async / got. test('response pipe', t => { const dest = (() => {