Skip to content

Commit 83d678e

Browse files
committed
chore: add do-original-call.test.js
1 parent 9ea7994 commit 83d678e

File tree

3 files changed

+118
-7
lines changed

3 files changed

+118
-7
lines changed

src/dummy/fetch.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { IncomingMessage } from 'http';
22
import simpleRequest from '../common/request';
3-
import { isArrayBuffer, str2arrayBuffer } from '../common/utils';
3+
import { isArrayBuffer, str2arrayBuffer, tryToParseJson } from '../common/utils';
44
import { HTTPStatusCodes } from '../config';
55
import { AnyObject, FetchRequest } from '../types';
66

@@ -37,7 +37,13 @@ function getResponse(url: string, responseBody: string, responseObject: Incoming
3737
? new Headers({ ...responseObjectHeaders, 'x-powered-by': 'http-request-mock' })
3838
: { ...responseObjectHeaders, 'x-powered-by': 'http-request-mock' };
3939

40-
const body = typeof Blob === 'function'
40+
const isBlobAvailable = typeof Blob === 'function'
41+
&& typeof Blob.prototype.text === 'function'
42+
&& typeof Blob.prototype.arrayBuffer === 'function'
43+
&& typeof Blob.prototype.slice === 'function'
44+
&& typeof Blob.prototype.stream === 'function';
45+
46+
const body = isBlobAvailable
4147
? new Blob([typeof data === 'string' ? data : JSON.stringify(data)])
4248
: data;
4349

@@ -47,6 +53,7 @@ function getResponse(url: string, responseBody: string, responseObject: Incoming
4753
return response;
4854
}
4955

56+
5057
const response = {
5158
body,
5259
bodyUsed: false,
@@ -58,7 +65,7 @@ function getResponse(url: string, responseBody: string, responseObject: Incoming
5865
url,
5966
type: 'basic', // cors
6067
// response data depends on prepared data
61-
json: () => Promise.resolve(data),
68+
json: () => Promise.resolve(tryToParseJson(data)),
6269
arrayBuffer: () => {
6370
if (isArrayBuffer(data)) {
6471
return Promise.resolve(data);

src/interceptor/fetch.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,16 @@ export default class FetchInterceptor extends Base{
152152
if (typeof Headers === 'function' && res.headers instanceof Headers) {
153153
res.headers.forEach((val: string, key: string) => (headers[key.toLocaleLowerCase()] = val));
154154
}
155-
responseBlob = await res.blob();
156-
responseText = await responseBlob.text();
157-
responseBuffer = await responseBlob.arrayBuffer();
158-
responseJson = tryToParseJson(responseText);
155+
const isBlobAvailable = typeof Blob === 'function'
156+
&& typeof Blob.prototype.text === 'function'
157+
&& typeof Blob.prototype.arrayBuffer === 'function'
158+
&& typeof Blob.prototype.slice === 'function'
159+
&& typeof Blob.prototype.stream === 'function';
160+
161+
responseBlob = isBlobAvailable ? await res.blob() : null;
162+
responseText = isBlobAvailable ? await responseBlob.text() : await res.text();
163+
responseBuffer = isBlobAvailable ? await responseBlob.arrayBuffer() : null;
164+
responseJson = responseText === null ? null : tryToParseJson(responseText);
159165
return { status, headers, responseText, responseJson, responseBuffer, responseBlob, error: null };
160166
} catch(err) {
161167
return { status, headers, responseText, responseJson, responseBuffer, responseBlob, error: err as Error };

test/do-original-call.test.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import axios from 'axios';
2+
import xhrAdapter from 'axios/lib/adapters/xhr';
3+
import https from 'https';
4+
import HttpRequestMock from '../src/index';
5+
6+
describe('do original call', () => {
7+
it('requestInfo should have doOriginalCall method for "xhr"', async () => {
8+
let doOriginalCall;
9+
const mocker = HttpRequestMock.setupForUnitTest('xhr');
10+
axios.defaults.adapter = xhrAdapter; // use xhr adapter
11+
12+
mocker.mock({
13+
url: 'https://jsonplaceholder.typicode.com/todos/1',
14+
response: async function(requestInfo) {
15+
doOriginalCall = requestInfo.doOriginalCall;
16+
return { data: 'fake' };
17+
}
18+
});
19+
20+
21+
const res = await axios('https://jsonplaceholder.typicode.com/todos/1?test=1').then((response) => {
22+
return response.data;
23+
});
24+
expect(res).toMatchObject({ data: 'fake' });
25+
expect(typeof doOriginalCall).toBe('function');
26+
});
27+
28+
it('requestInfo should have doOriginalCall method for "fetch"', async () => {
29+
let doOriginalCall;
30+
const mocker = HttpRequestMock.setupForUnitTest('fetch'); // fetch on node
31+
mocker.mock({
32+
url: 'https://jsonplaceholder.typicode.com/todos/1',
33+
response: async function(requestInfo) {
34+
doOriginalCall = requestInfo.doOriginalCall;
35+
// console.log('original response:', await requestInfo.doOriginalCall());
36+
return { data: 'fake' };
37+
}
38+
});
39+
40+
const res = await global.fetch('https://jsonplaceholder.typicode.com/todos/1?test=1')
41+
.then((response) => response.json())
42+
.then((data) => data);
43+
expect(res).toMatchObject({ data: 'fake' });
44+
expect(typeof doOriginalCall).toBe('function');
45+
});
46+
47+
it('requestInfo should have doOriginalCall method for "wx.request"', async () => {
48+
let doOriginalCall;
49+
const mocker = HttpRequestMock.setupForUnitTest('wx');
50+
51+
mocker.mock({
52+
url: 'https://jsonplaceholder.typicode.com/todos/1',
53+
response: async function(requestInfo) {
54+
doOriginalCall = requestInfo.doOriginalCall;
55+
return { data: 'fake' };
56+
}
57+
});
58+
59+
const res = await new Promise(resolve => {
60+
// eslint-disable-next-line no-undef
61+
wx.request({
62+
url: 'https://jsonplaceholder.typicode.com/todos/1?test=1',
63+
success(res) {
64+
resolve(res.data);
65+
}
66+
});
67+
});
68+
69+
expect(res).toMatchObject({ data: 'fake' });
70+
expect(typeof doOriginalCall).toBe('function');
71+
});
72+
73+
74+
it('requestInfo should have doOriginalCall method for "https.get"', async () => {
75+
let doOriginalCall;
76+
const mocker = HttpRequestMock.setupForUnitTest('node');
77+
78+
mocker.mock({
79+
url: 'https://jsonplaceholder.typicode.com/todos/1',
80+
response: async function(requestInfo) {
81+
doOriginalCall = requestInfo.doOriginalCall;
82+
// console.log('original response:', await requestInfo.doOriginalCall());
83+
return { data: 'fake' };
84+
}
85+
});
86+
87+
const res = await new Promise(resolve => {
88+
let buffer = '';
89+
https.get('https://jsonplaceholder.typicode.com/todos/1', (res) => {
90+
res.on('data', chunk => (buffer += chunk));
91+
res.on('end', () => resolve(JSON.parse(buffer)));
92+
});
93+
});
94+
95+
expect(res).toMatchObject({ data: 'fake' });
96+
expect(typeof doOriginalCall).toBe('function');
97+
});
98+
});

0 commit comments

Comments
 (0)