Skip to content

Commit 1df3923

Browse files
mock: fix mocking of Uint8Array and ArrayBuffers as provided mock-reponses (#3662) (#3689)
(cherry picked from commit 2d524cf) Co-authored-by: Aras Abbasi <[email protected]>
1 parent de943c4 commit 1df3923

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

lib/mock/mock-utils.js

+4
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ function matchKey (mockDispatch, { path, method, body, headers }) {
118118
function getResponseData (data) {
119119
if (Buffer.isBuffer(data)) {
120120
return data
121+
} else if (data instanceof Uint8Array) {
122+
return data
123+
} else if (data instanceof ArrayBuffer) {
124+
return data
121125
} else if (typeof data === 'object') {
122126
return JSON.stringify(data)
123127
} else {

test/mock-interceptor.js

+49
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const { MockInterceptor, MockScope } = require('../lib/mock/mock-interceptor')
66
const MockAgent = require('../lib/mock/mock-agent')
77
const { kDispatchKey } = require('../lib/mock/mock-symbols')
88
const { InvalidArgumentError } = require('../lib/core/errors')
9+
const { fetch } = require('../lib/web/fetch/index')
910

1011
describe('MockInterceptor - path', () => {
1112
test('should remove hash fragment from paths', t => {
@@ -257,3 +258,51 @@ describe('MockInterceptor - replyContentLength', () => {
257258
t.ok(result instanceof MockInterceptor)
258259
})
259260
})
261+
262+
describe('MockInterceptor - different payloads', () => {
263+
[
264+
// Buffer
265+
['arrayBuffer', 'ArrayBuffer', 'ArrayBuffer', new TextEncoder().encode('{"test":true}').buffer, new TextEncoder().encode('{"test":true}').buffer],
266+
['json', 'ArrayBuffer', 'Object', new TextEncoder().encode('{"test":true}').buffer, { test: true }],
267+
['bytes', 'ArrayBuffer', 'Uint8Array', new TextEncoder().encode('{"test":true}').buffer, new TextEncoder().encode('{"test":true}')],
268+
['text', 'ArrayBuffer', 'string', new TextEncoder().encode('{"test":true}').buffer, '{"test":true}'],
269+
270+
// Buffer
271+
['arrayBuffer', 'Buffer', 'ArrayBuffer', Buffer.from('{"test":true}'), new TextEncoder().encode('{"test":true}').buffer],
272+
['json', 'Buffer', 'Object', Buffer.from('{"test":true}'), { test: true }],
273+
['bytes', 'Buffer', 'Uint8Array', Buffer.from('{"test":true}'), new TextEncoder().encode('{"test":true}')],
274+
['text', 'Buffer', 'string', Buffer.from('{"test":true}'), '{"test":true}'],
275+
276+
// Uint8Array
277+
['arrayBuffer', 'Uint8Array', 'ArrayBuffer', new TextEncoder().encode('{"test":true}'), new TextEncoder().encode('{"test":true}').buffer],
278+
['json', 'Uint8Array', 'Object', new TextEncoder().encode('{"test":true}'), { test: true }],
279+
['bytes', 'Uint8Array', 'Uint8Array', new TextEncoder().encode('{"test":true}'), new TextEncoder().encode('{"test":true}')],
280+
['text', 'Uint8Array', 'string', new TextEncoder().encode('{"test":true}'), '{"test":true}'],
281+
282+
// string
283+
['arrayBuffer', 'string', 'ArrayBuffer', '{"test":true}', new TextEncoder().encode('{"test":true}').buffer],
284+
['json', 'string', 'Object', '{"test":true}', { test: true }],
285+
['bytes', 'string', 'Uint8Array', '{"test":true}', new TextEncoder().encode('{"test":true}')],
286+
['text', 'string', 'string', '{"test":true}', '{"test":true}'],
287+
288+
// object
289+
['arrayBuffer', 'Object', 'ArrayBuffer', { test: true }, new TextEncoder().encode('{"test":true}').buffer],
290+
['json', 'Object', 'Object', { test: true }, { test: true }],
291+
['bytes', 'Object', 'Uint8Array', { test: true }, new TextEncoder().encode('{"test":true}')],
292+
['text', 'Object', 'string', { test: true }, '{"test":true}']
293+
].forEach(([method, inputType, outputType, input, output]) => {
294+
test(`${inputType} will be returned as ${outputType} via ${method}()`, async (t) => {
295+
t = tspl(t, { plan: 1 })
296+
297+
const mockAgent = new MockAgent()
298+
mockAgent.disableNetConnect()
299+
mockAgent
300+
.get('https://localhost')
301+
.intercept({ path: '/' }).reply(200, input)
302+
303+
const response = await fetch('https://localhost', { dispatcher: mockAgent })
304+
305+
t.deepStrictEqual(await response[method](), output)
306+
})
307+
})
308+
})

test/mock-utils.js

+12
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,18 @@ describe('getResponseData', () => {
162162
const responseData = getResponseData(Buffer.from('test'))
163163
t.ok(Buffer.isBuffer(responseData))
164164
})
165+
166+
test('it should return Uint8Array untouched', (t) => {
167+
t = tspl(t, { plan: 1 })
168+
const responseData = getResponseData(new TextEncoder().encode('{"test":true}'))
169+
t.ok(responseData instanceof Uint8Array)
170+
})
171+
172+
test('it should return ArrayBuffers untouched', (t) => {
173+
t = tspl(t, { plan: 1 })
174+
const responseData = getResponseData(new TextEncoder().encode('{"test":true}').buffer)
175+
t.ok(responseData instanceof ArrayBuffer)
176+
})
165177
})
166178

167179
test('getStatusText', (t) => {

0 commit comments

Comments
 (0)