@eggjs/mock 7.0.0-beta.34 → 7.0.0-beta.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/rolldown_runtime.js +7 -0
- package/dist/app/extend/agent.d.ts +38 -34
- package/dist/app/extend/agent.js +48 -46
- package/dist/app/extend/application.d.ts +171 -167
- package/dist/app/extend/application.js +382 -442
- package/dist/app/middleware/cluster_app_mock.d.ts +5 -2
- package/dist/app/middleware/cluster_app_mock.js +95 -100
- package/dist/app.d.ts +9 -5
- package/dist/app.js +17 -18
- package/dist/bootstrap.d.ts +9 -5
- package/dist/bootstrap.js +11 -12
- package/dist/index.d.ts +20 -17
- package/dist/index.js +39 -78
- package/dist/inject_mocha.d.ts +1 -1
- package/dist/inject_mocha.js +27 -28
- package/dist/lib/agent_handler.d.ts +7 -3
- package/dist/lib/agent_handler.js +22 -20
- package/dist/lib/app.d.ts +7 -3
- package/dist/lib/app.js +246 -287
- package/dist/lib/app_handler.d.ts +9 -5
- package/dist/lib/app_handler.js +48 -61
- package/dist/lib/cluster.d.ts +122 -118
- package/dist/lib/cluster.js +278 -335
- package/dist/lib/context.d.ts +4 -1
- package/dist/lib/context.js +10 -11
- package/dist/lib/format_options.d.ts +9 -4
- package/dist/lib/format_options.js +60 -88
- package/dist/lib/inject_context.d.ts +8 -5
- package/dist/lib/inject_context.js +103 -123
- package/dist/lib/mock_agent.d.ts +8 -4
- package/dist/lib/mock_agent.js +42 -42
- package/dist/lib/mock_custom_loader.d.ts +4 -1
- package/dist/lib/mock_custom_loader.js +34 -33
- package/dist/lib/mock_http_server.d.ts +6 -2
- package/dist/lib/mock_http_server.js +16 -17
- package/dist/lib/mock_httpclient.d.ts +38 -34
- package/dist/lib/mock_httpclient.js +106 -142
- package/dist/lib/parallel/agent.d.ts +22 -18
- package/dist/lib/parallel/agent.js +106 -112
- package/dist/lib/parallel/app.d.ts +23 -19
- package/dist/lib/parallel/app.js +93 -106
- package/dist/lib/parallel/util.d.ts +5 -2
- package/dist/lib/parallel/util.js +56 -63
- package/dist/lib/prerequire.d.ts +1 -1
- package/dist/lib/prerequire.js +1 -25
- package/dist/lib/request_call_function.d.ts +1 -1
- package/dist/lib/request_call_function.js +34 -47
- package/dist/lib/restore.d.ts +4 -1
- package/dist/lib/restore.js +14 -11
- package/dist/lib/start-cluster.d.ts +1 -2
- package/dist/lib/start-cluster.js +15 -14
- package/dist/lib/supertest.d.ts +14 -9
- package/dist/lib/supertest.js +32 -36
- package/dist/lib/tmp/empty.d.ts +1 -1
- package/dist/lib/tmp/empty.js +1 -2
- package/dist/lib/types.d.ts +71 -67
- package/dist/lib/types.js +1 -2
- package/dist/lib/utils.d.ts +11 -8
- package/dist/lib/utils.js +34 -63
- package/dist/register.d.ts +11 -7
- package/dist/register.js +36 -40
- package/dist/typings/index.d.ts +1 -0
- package/package.json +36 -39
|
@@ -1,445 +1,385 @@
|
|
|
1
|
-
import { debuglog } from 'node:util';
|
|
2
|
-
import http, { IncomingMessage } from 'node:http';
|
|
3
|
-
import fs from 'node:fs';
|
|
4
|
-
import assert from 'node:assert';
|
|
5
|
-
import mergeDescriptors from 'merge-descriptors';
|
|
6
|
-
import { isAsyncFunction, isObject } from 'is-type-of';
|
|
7
|
-
import { mock, restore } from 'mm';
|
|
8
|
-
import { Transport, Logger } from 'egg-logger';
|
|
9
|
-
import { Application } from 'egg';
|
|
10
1
|
import { getMockAgent, restoreMockAgent } from "../../lib/mock_agent.js";
|
|
11
|
-
import { createMockHttpClient
|
|
12
|
-
import { request
|
|
13
|
-
import {} from "
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
assert(match, `Can't find ${type}:"${str}" in ${filepath}, log content: ...${content.substring(content.length - 500)}`);
|
|
387
|
-
}
|
|
388
|
-
else {
|
|
389
|
-
assert(!match, `Find ${type}:"${str}" in ${filepath}, log content: ...${content.substring(content.length - 500)}`);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* expect str/regexp in the logger, if your server disk is slow, please call `mockLog()` first.
|
|
394
|
-
* @param {String|RegExp} str - test str or regexp
|
|
395
|
-
* @param {String|Logger} [logger] - logger instance, default is `ctx.logger`
|
|
396
|
-
* @function App#expectLog
|
|
397
|
-
*/
|
|
398
|
-
expectLog(str, logger) {
|
|
399
|
-
this.__checkExpectLog(true, str, logger);
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* not expect str/regexp in the logger, if your server disk is slow, please call `mockLog()` first.
|
|
403
|
-
* @param {String|RegExp} str - test str or regexp
|
|
404
|
-
* @param {String|Logger} [logger] - logger instance, default is `ctx.logger`
|
|
405
|
-
* @function App#notExpectLog
|
|
406
|
-
*/
|
|
407
|
-
notExpectLog(str, logger) {
|
|
408
|
-
this.__checkExpectLog(false, str, logger);
|
|
409
|
-
}
|
|
410
|
-
async backgroundTasksFinished() {
|
|
411
|
-
const tasks = this._backgroundTasks;
|
|
412
|
-
debug('waiting %d background tasks', tasks.length);
|
|
413
|
-
if (tasks.length === 0)
|
|
414
|
-
return;
|
|
415
|
-
this._backgroundTasks = [];
|
|
416
|
-
await Promise.all(tasks);
|
|
417
|
-
debug('finished %d background tasks', tasks.length);
|
|
418
|
-
if (this._backgroundTasks.length) {
|
|
419
|
-
debug('new background tasks created: %s', this._backgroundTasks.length);
|
|
420
|
-
await this.backgroundTasksFinished();
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
get _backgroundTasks() {
|
|
424
|
-
if (!this[BACKGROUND_TASKS]) {
|
|
425
|
-
this[BACKGROUND_TASKS] = [];
|
|
426
|
-
}
|
|
427
|
-
return this[BACKGROUND_TASKS];
|
|
428
|
-
}
|
|
429
|
-
set _backgroundTasks(tasks) {
|
|
430
|
-
this[BACKGROUND_TASKS] = tasks;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
2
|
+
import { createMockHttpClient } from "../../lib/mock_httpclient.js";
|
|
3
|
+
import { request } from "../../lib/supertest.js";
|
|
4
|
+
import { Application } from "egg";
|
|
5
|
+
import assert from "node:assert";
|
|
6
|
+
import { mock, restore } from "mm";
|
|
7
|
+
import { debuglog } from "node:util";
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import http, { IncomingMessage } from "node:http";
|
|
10
|
+
import { Logger, Transport } from "egg-logger";
|
|
11
|
+
import { isAsyncFunction, isObject } from "is-type-of";
|
|
12
|
+
import mergeDescriptors from "merge-descriptors";
|
|
13
|
+
|
|
14
|
+
//#region src/app/extend/application.ts
|
|
15
|
+
const debug = debuglog("egg/mock/app/extend/application");
|
|
16
|
+
const ORIGIN_TYPES = Symbol("@eggjs/mock originTypes");
|
|
17
|
+
const BACKGROUND_TASKS = Symbol("Application#backgroundTasks");
|
|
18
|
+
const REUSED_CTX = Symbol("Context#reusedInSuite");
|
|
19
|
+
var ApplicationUnittest = class extends Application {
|
|
20
|
+
_mockHttpClient;
|
|
21
|
+
/**
|
|
22
|
+
* mock Context
|
|
23
|
+
* @function App#mockContext
|
|
24
|
+
* @param {Object} data - ctx data
|
|
25
|
+
* @param {Object} [options] - mock ctx options
|
|
26
|
+
* @example
|
|
27
|
+
* ```js
|
|
28
|
+
* const ctx = app.mockContext({
|
|
29
|
+
* user: {
|
|
30
|
+
* name: 'Jason'
|
|
31
|
+
* }
|
|
32
|
+
* });
|
|
33
|
+
* console.log(ctx.user.name); // Jason
|
|
34
|
+
*
|
|
35
|
+
* // controller
|
|
36
|
+
* module.exports = function*() {
|
|
37
|
+
* this.body = this.user.name;
|
|
38
|
+
* };
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
mockContext(data, options) {
|
|
42
|
+
data = data ?? {};
|
|
43
|
+
function mockRequest(req$1) {
|
|
44
|
+
for (const key in data?.headers) {
|
|
45
|
+
mock(req$1.headers, key, data.headers[key]);
|
|
46
|
+
mock(req$1.headers, key.toLowerCase(), data.headers[key]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const mockCtxStorage = this.options.mockCtxStorage ?? true;
|
|
50
|
+
options = Object.assign({ mockCtxStorage }, options);
|
|
51
|
+
if ("_customMockContext" in this && typeof this._customMockContext === "function") this._customMockContext(data);
|
|
52
|
+
for (const key in data) mock(this.context, key, data[key]);
|
|
53
|
+
const req = this.mockRequest(data);
|
|
54
|
+
const res = new http.ServerResponse(req);
|
|
55
|
+
if (options.reuseCtxStorage !== false) {
|
|
56
|
+
if (this.currentContext && !this.currentContext[REUSED_CTX]) {
|
|
57
|
+
mockRequest(this.currentContext.request.req);
|
|
58
|
+
this.currentContext[REUSED_CTX] = true;
|
|
59
|
+
return this.currentContext;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const ctx = this.createContext(req, res);
|
|
63
|
+
if (options.mockCtxStorage) mock(this.ctxStorage, "getStore", () => ctx);
|
|
64
|
+
return ctx;
|
|
65
|
+
}
|
|
66
|
+
async mockContextScope(fn, data) {
|
|
67
|
+
const ctx = this.mockContext(data, {
|
|
68
|
+
mockCtxStorage: false,
|
|
69
|
+
reuseCtxStorage: false
|
|
70
|
+
});
|
|
71
|
+
return await this.ctxStorage.run(ctx, async () => {
|
|
72
|
+
return await fn(ctx);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* mock cookie session
|
|
77
|
+
* @function App#mockSession
|
|
78
|
+
* @param {Object} data - session object
|
|
79
|
+
*/
|
|
80
|
+
mockSession(data) {
|
|
81
|
+
if (!data) return this;
|
|
82
|
+
if (isObject(data) && !("save" in data)) Object.defineProperty(data, "save", {
|
|
83
|
+
value: () => {},
|
|
84
|
+
enumerable: false
|
|
85
|
+
});
|
|
86
|
+
mock(this.context, "session", data);
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Mock service
|
|
91
|
+
* @function App#mockService
|
|
92
|
+
* @param {String} service - name
|
|
93
|
+
* @param {String} methodName - method
|
|
94
|
+
* @param {Object|Function|Error} fn - mock you data
|
|
95
|
+
*/
|
|
96
|
+
mockService(service, methodName, fn) {
|
|
97
|
+
if (typeof service === "string") {
|
|
98
|
+
const splits = service.split(".");
|
|
99
|
+
service = this.serviceClasses;
|
|
100
|
+
for (const key of splits) service = service[key];
|
|
101
|
+
service = service.prototype || service;
|
|
102
|
+
}
|
|
103
|
+
this._mockFn(service, methodName, fn);
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* mock service that return error
|
|
108
|
+
* @function App#mockServiceError
|
|
109
|
+
* @param {String} service - name
|
|
110
|
+
* @param {String} methodName - method
|
|
111
|
+
* @param {Error} [err] - error information
|
|
112
|
+
*/
|
|
113
|
+
mockServiceError(service, methodName, err) {
|
|
114
|
+
if (typeof err === "string") err = new Error(err);
|
|
115
|
+
if (!err) err = /* @__PURE__ */ new Error(`mock ${methodName} error`);
|
|
116
|
+
this.mockService(service, methodName, err);
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
_mockFn(obj, name, data) {
|
|
120
|
+
const origin = obj[name];
|
|
121
|
+
assert(typeof origin === "function", `property ${name} in original object must be function`);
|
|
122
|
+
if (!obj[ORIGIN_TYPES]) obj[ORIGIN_TYPES] = {};
|
|
123
|
+
let type = obj[ORIGIN_TYPES][name];
|
|
124
|
+
if (!type) type = obj[ORIGIN_TYPES][name] = isAsyncFunction(origin) ? "async" : "sync";
|
|
125
|
+
if (typeof data === "function") {
|
|
126
|
+
const fn = data;
|
|
127
|
+
if (type === "async" && !isAsyncFunction(fn)) {
|
|
128
|
+
mock(obj, name, function(...args) {
|
|
129
|
+
return new Promise((resolve) => {
|
|
130
|
+
resolve(fn.apply(this, args));
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
mock(obj, name, fn);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (type === "async") {
|
|
139
|
+
mock(obj, name, () => {
|
|
140
|
+
return new Promise((resolve, reject) => {
|
|
141
|
+
if (data instanceof Error) return reject(data);
|
|
142
|
+
resolve(data);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
mock(obj, name, () => {
|
|
148
|
+
if (data instanceof Error) throw data;
|
|
149
|
+
return data;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* mock request
|
|
154
|
+
* @function App#mockRequest
|
|
155
|
+
* @param {Request} req - mock request
|
|
156
|
+
*/
|
|
157
|
+
mockRequest(req) {
|
|
158
|
+
req = { ...req };
|
|
159
|
+
const headers = req.headers ?? {};
|
|
160
|
+
for (const key in req.headers) headers[key.toLowerCase()] = req.headers[key];
|
|
161
|
+
if (!headers["x-forwarded-for"]) headers["x-forwarded-for"] = "127.0.0.1";
|
|
162
|
+
headers["x-mock-request-from"] = "@eggjs/mock";
|
|
163
|
+
req.headers = headers;
|
|
164
|
+
mergeDescriptors(req, {
|
|
165
|
+
query: {},
|
|
166
|
+
querystring: "",
|
|
167
|
+
host: "127.0.0.1",
|
|
168
|
+
hostname: "127.0.0.1",
|
|
169
|
+
protocol: "http",
|
|
170
|
+
secure: "false",
|
|
171
|
+
method: "GET",
|
|
172
|
+
url: "/",
|
|
173
|
+
path: "/",
|
|
174
|
+
socket: {
|
|
175
|
+
remoteAddress: "127.0.0.1",
|
|
176
|
+
remotePort: 7001
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
return req;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* mock cookies
|
|
183
|
+
* @function App#mockCookies
|
|
184
|
+
*/
|
|
185
|
+
mockCookies(cookies) {
|
|
186
|
+
if (!cookies) return this;
|
|
187
|
+
const createContext = this.createContext;
|
|
188
|
+
mock(this, "createContext", function(req, res) {
|
|
189
|
+
const ctx = createContext.call(this, req, res);
|
|
190
|
+
const getCookie = ctx.cookies.get;
|
|
191
|
+
mock(ctx.cookies, "get", function(key, opts) {
|
|
192
|
+
if (cookies[key]) return cookies[key];
|
|
193
|
+
return getCookie.call(this, key, opts);
|
|
194
|
+
});
|
|
195
|
+
return ctx;
|
|
196
|
+
});
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* mock header
|
|
201
|
+
* @function App#mockHeaders
|
|
202
|
+
*/
|
|
203
|
+
mockHeaders(headers) {
|
|
204
|
+
if (!headers) return this;
|
|
205
|
+
const getHeader = this.request.get;
|
|
206
|
+
mock(this.request, "get", function(field) {
|
|
207
|
+
const value = findHeaders(headers, field);
|
|
208
|
+
if (value) return value;
|
|
209
|
+
return getHeader.call(this, field);
|
|
210
|
+
});
|
|
211
|
+
return this;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* mock csrf
|
|
215
|
+
* @function App#mockCsrf
|
|
216
|
+
* @since 1.11
|
|
217
|
+
*/
|
|
218
|
+
mockCsrf() {
|
|
219
|
+
mock(this.context, "assertCSRF", () => {});
|
|
220
|
+
mock(this.context, "assertCsrf", () => {});
|
|
221
|
+
return this;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* mock httpclient
|
|
225
|
+
* @alias mockHttpClient
|
|
226
|
+
* @function App#mockHttpclient
|
|
227
|
+
*/
|
|
228
|
+
mockHttpclient(mockUrl, mockMethod, mockResult) {
|
|
229
|
+
return this.mockHttpClient(mockUrl, mockMethod, mockResult);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* mock httpclient
|
|
233
|
+
* @function App#mockHttpClient
|
|
234
|
+
*/
|
|
235
|
+
mockHttpClient(mockUrl, mockMethod, mockResult) {
|
|
236
|
+
if (!this._mockHttpClient) this._mockHttpClient = createMockHttpClient(this);
|
|
237
|
+
this._mockHttpClient(mockUrl, mockMethod, mockResult);
|
|
238
|
+
return this;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* @deprecated Please use app.mockHttpClient instead of app.mockUrllib
|
|
242
|
+
*/
|
|
243
|
+
mockUrllib(mockUrl, mockMethod, mockResult) {
|
|
244
|
+
this.deprecate("[@eggjs/mock] Please use app.mockHttpClient instead of app.mockUrllib");
|
|
245
|
+
return this.mockHttpClient(mockUrl, mockMethod, mockResult);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* get mock httpclient agent
|
|
249
|
+
* @function App#mockHttpclientAgent
|
|
250
|
+
*/
|
|
251
|
+
mockAgent() {
|
|
252
|
+
return getMockAgent(this);
|
|
253
|
+
}
|
|
254
|
+
async mockAgentRestore() {
|
|
255
|
+
await restoreMockAgent();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* @see mm#restore
|
|
259
|
+
* @function App#mockRestore
|
|
260
|
+
*/
|
|
261
|
+
async mockRestore() {
|
|
262
|
+
await this.mockAgentRestore();
|
|
263
|
+
restore();
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* @see mm
|
|
267
|
+
* @function App#mm
|
|
268
|
+
*/
|
|
269
|
+
get mm() {
|
|
270
|
+
return mock;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* override loadAgent
|
|
274
|
+
* @function App#loadAgent
|
|
275
|
+
*/
|
|
276
|
+
loadAgent() {}
|
|
277
|
+
/**
|
|
278
|
+
* mock serverEnv
|
|
279
|
+
* @function App#mockEnv
|
|
280
|
+
* @param {String} env - serverEnv
|
|
281
|
+
*/
|
|
282
|
+
mockEnv(env) {
|
|
283
|
+
mock(this.config, "env", env);
|
|
284
|
+
mock(this.config, "serverEnv", env);
|
|
285
|
+
debug("mock env: %o", env);
|
|
286
|
+
return this;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* http request helper
|
|
290
|
+
* @function App#httpRequest
|
|
291
|
+
* @return {SupertestRequest} req - supertest request
|
|
292
|
+
* @see https://github.com/visionmedia/supertest
|
|
293
|
+
*/
|
|
294
|
+
httpRequest() {
|
|
295
|
+
return request(this);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* collection logger message, then can be use on `expectLog()`
|
|
299
|
+
* @param {String|Logger} [logger] - logger instance, default is `app.logger`
|
|
300
|
+
* @function App#mockLog
|
|
301
|
+
*/
|
|
302
|
+
mockLog(logger) {
|
|
303
|
+
logger = logger ?? this.logger;
|
|
304
|
+
if (typeof logger === "string") logger = this.getLogger(logger);
|
|
305
|
+
if ("_mockLogs" in logger && logger._mockLogs) return;
|
|
306
|
+
const transport = new Transport(logger.options);
|
|
307
|
+
const log = logger.log;
|
|
308
|
+
const mockLogs = [];
|
|
309
|
+
mock(logger, "_mockLogs", mockLogs);
|
|
310
|
+
mock(logger, "log", (level, args, meta) => {
|
|
311
|
+
const message = transport.log(level, args, meta);
|
|
312
|
+
mockLogs.push(message);
|
|
313
|
+
log.apply(logger, [
|
|
314
|
+
level,
|
|
315
|
+
args,
|
|
316
|
+
meta
|
|
317
|
+
]);
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
__checkExpectLog(expectOrNot, str, logger) {
|
|
321
|
+
logger = logger || this.logger;
|
|
322
|
+
if (typeof logger === "string") logger = this.getLogger(logger);
|
|
323
|
+
const filepath = logger.options.file;
|
|
324
|
+
let content;
|
|
325
|
+
if ("_mockLogs" in logger && logger._mockLogs) content = logger._mockLogs.join("\n");
|
|
326
|
+
else content = fs.readFileSync(filepath, "utf8");
|
|
327
|
+
let match;
|
|
328
|
+
let type;
|
|
329
|
+
if (str instanceof RegExp) {
|
|
330
|
+
match = str.test(content);
|
|
331
|
+
type = "RegExp";
|
|
332
|
+
} else {
|
|
333
|
+
match = content.includes(String(str));
|
|
334
|
+
type = "String";
|
|
335
|
+
}
|
|
336
|
+
if (expectOrNot) assert(match, `Can't find ${type}:"${str}" in ${filepath}, log content: ...${content.substring(content.length - 500)}`);
|
|
337
|
+
else assert(!match, `Find ${type}:"${str}" in ${filepath}, log content: ...${content.substring(content.length - 500)}`);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* expect str/regexp in the logger, if your server disk is slow, please call `mockLog()` first.
|
|
341
|
+
* @param {String|RegExp} str - test str or regexp
|
|
342
|
+
* @param {String|Logger} [logger] - logger instance, default is `ctx.logger`
|
|
343
|
+
* @function App#expectLog
|
|
344
|
+
*/
|
|
345
|
+
expectLog(str, logger) {
|
|
346
|
+
this.__checkExpectLog(true, str, logger);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* not expect str/regexp in the logger, if your server disk is slow, please call `mockLog()` first.
|
|
350
|
+
* @param {String|RegExp} str - test str or regexp
|
|
351
|
+
* @param {String|Logger} [logger] - logger instance, default is `ctx.logger`
|
|
352
|
+
* @function App#notExpectLog
|
|
353
|
+
*/
|
|
354
|
+
notExpectLog(str, logger) {
|
|
355
|
+
this.__checkExpectLog(false, str, logger);
|
|
356
|
+
}
|
|
357
|
+
async backgroundTasksFinished() {
|
|
358
|
+
const tasks = this._backgroundTasks;
|
|
359
|
+
debug("waiting %d background tasks", tasks.length);
|
|
360
|
+
if (tasks.length === 0) return;
|
|
361
|
+
this._backgroundTasks = [];
|
|
362
|
+
await Promise.all(tasks);
|
|
363
|
+
debug("finished %d background tasks", tasks.length);
|
|
364
|
+
if (this._backgroundTasks.length) {
|
|
365
|
+
debug("new background tasks created: %s", this._backgroundTasks.length);
|
|
366
|
+
await this.backgroundTasksFinished();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
get _backgroundTasks() {
|
|
370
|
+
if (!this[BACKGROUND_TASKS]) this[BACKGROUND_TASKS] = [];
|
|
371
|
+
return this[BACKGROUND_TASKS];
|
|
372
|
+
}
|
|
373
|
+
set _backgroundTasks(tasks) {
|
|
374
|
+
this[BACKGROUND_TASKS] = tasks;
|
|
375
|
+
}
|
|
376
|
+
};
|
|
433
377
|
function findHeaders(headers, key) {
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
for (const headerKey in headers) {
|
|
439
|
-
if (key === headerKey.toLowerCase()) {
|
|
440
|
-
return headers[headerKey];
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
return null;
|
|
378
|
+
if (!headers || !key) return null;
|
|
379
|
+
key = key.toLowerCase();
|
|
380
|
+
for (const headerKey in headers) if (key === headerKey.toLowerCase()) return headers[headerKey];
|
|
381
|
+
return null;
|
|
444
382
|
}
|
|
445
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sSUFBSSxFQUFFLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsT0FBTyxnQkFBZ0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNuQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBcUMsTUFBTSxZQUFZLENBQUM7QUFDbEYsT0FBTyxFQUFnQixXQUFXLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxvQkFBb0IsR0FJckIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxJQUFJLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUUxRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUN2RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBQy9ELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FB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
|
|
383
|
+
|
|
384
|
+
//#endregion
|
|
385
|
+
export { ApplicationUnittest as default };
|