-
Notifications
You must be signed in to change notification settings - Fork 1
/
mock-requests.js
98 lines (77 loc) · 2.07 KB
/
mock-requests.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
'use strict';
const fs = require('fs');
const path = require('path');
const urlLib = require('url');
const got = require('got');
const log = require('npmlog');
const mode = (function () {
if (process.env.DEMO) {
return 'demo';
}
if (process.env.RECORD) {
return 'record';
}
return 'none';
})();
function makeKey(query) {
const url = urlLib.parse(query);
return url.hostname + ':' + url.pathname.split('/').filter(Boolean).join('.');
}
function getFilename(key) {
return path.join(__dirname, 'fixtures', `${key}.txt`);
}
function record(query, options) {
const key = makeKey(query);
return got(query)
.then(req => req.body)
.then(data => {
fs.writeFileSync(getFilename(key), data);
return {
body: options.json ? JSON.parse(data) : data
};
});
}
function delay(data) {
const latency = 900 + Math.random() * 100;
return new Promise(resolve => {
setTimeout(() => {
resolve(data);
}, latency);
});
}
function mock(query, options) {
const key = makeKey(query);
const promise = new Promise((resolve, reject) => {
fs.readFile(getFilename(key), (err, data) => {
if (err) {
return reject(err);
}
resolve(data.toString());
});
});
return promise
.then(data => {
return {
body: options.json ? JSON.parse(data) : data
};
})
.then(delay);
}
function fakeGot(query, options) {
options = options || {};
if (mode === 'record') {
return record(query, options);
}
if (mode === 'demo') {
let start = Date.now();
return mock(query, options)
.then(result => {
const url = query.split('?')[0];
start = Date.now() - start;
log.info(`← GET ${url} ${start} ms`);
return result;
});
}
return got(query, options);
}
require.cache[require.resolve('got')].exports = fakeGot;