@eggjs/mock 7.0.0-beta.20 → 7.0.0-beta.21

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.
Files changed (96) hide show
  1. package/dist/app/extend/agent.d.ts +33 -38
  2. package/dist/app/extend/agent.js +46 -5
  3. package/dist/app/extend/application.d.ts +171 -5
  4. package/dist/app/extend/application.js +445 -9
  5. package/dist/app/middleware/cluster_app_mock.d.ts +2 -5
  6. package/dist/app/middleware/cluster_app_mock.js +99 -96
  7. package/dist/app.d.ts +5 -9
  8. package/dist/app.js +18 -17
  9. package/dist/bootstrap.d.ts +5 -15
  10. package/dist/bootstrap.js +13 -29
  11. package/dist/index.d.ts +77 -10
  12. package/dist/index.js +90 -22
  13. package/dist/inject_mocha.d.ts +1 -1
  14. package/dist/inject_mocha.js +35 -23
  15. package/dist/lib/agent_handler.d.ts +3 -10
  16. package/dist/lib/agent_handler.js +24 -9
  17. package/dist/lib/app.d.ts +3 -6
  18. package/dist/lib/app.js +291 -14
  19. package/dist/lib/app_handler.d.ts +5 -6
  20. package/dist/lib/app_handler.js +69 -21
  21. package/dist/lib/cluster.d.ts +121 -6
  22. package/dist/lib/cluster.js +340 -7
  23. package/dist/lib/context.d.ts +1 -4
  24. package/dist/lib/context.js +11 -3
  25. package/dist/lib/format_options.d.ts +2 -7
  26. package/dist/lib/format_options.js +93 -4
  27. package/dist/lib/inject_context.d.ts +1 -4
  28. package/dist/lib/inject_context.js +126 -22
  29. package/dist/lib/mock_agent.d.ts +4 -8
  30. package/dist/lib/mock_agent.js +45 -3
  31. package/dist/lib/mock_custom_loader.d.ts +1 -4
  32. package/dist/lib/mock_custom_loader.js +34 -3
  33. package/dist/lib/mock_http_server.d.ts +2 -6
  34. package/dist/lib/mock_http_server.js +18 -3
  35. package/dist/lib/mock_httpclient.d.ts +36 -2
  36. package/dist/lib/mock_httpclient.js +146 -4
  37. package/dist/lib/parallel/agent.d.ts +20 -5
  38. package/dist/lib/parallel/agent.js +117 -8
  39. package/dist/lib/parallel/app.d.ts +19 -24
  40. package/dist/lib/parallel/app.js +111 -9
  41. package/dist/lib/parallel/util.d.ts +3 -2
  42. package/dist/lib/parallel/util.js +66 -4
  43. package/dist/lib/prerequire.d.ts +1 -1
  44. package/dist/lib/prerequire.js +25 -1
  45. package/dist/lib/request_call_function.d.ts +1 -1
  46. package/dist/lib/request_call_function.js +47 -34
  47. package/dist/lib/restore.d.ts +1 -2
  48. package/dist/lib/restore.js +13 -9
  49. package/dist/lib/start-cluster.d.ts +2 -1
  50. package/dist/lib/start-cluster.js +14 -15
  51. package/dist/lib/supertest.d.ts +11 -2
  52. package/dist/lib/supertest.js +40 -5
  53. package/dist/lib/tmp/empty.d.ts +1 -1
  54. package/dist/lib/tmp/empty.js +2 -1
  55. package/dist/lib/types.d.ts +72 -3
  56. package/dist/lib/types.js +2 -3
  57. package/dist/lib/utils.d.ts +8 -11
  58. package/dist/lib/utils.js +69 -3
  59. package/dist/register.d.ts +7 -11
  60. package/dist/register.js +41 -55
  61. package/package.json +7 -7
  62. package/dist/agent-BKYkjoCx.js +0 -111
  63. package/dist/agent-CHCe8tnW.d.ts +0 -24
  64. package/dist/agent-DZ_fHoxJ.js +0 -48
  65. package/dist/agent_handler-DeUtoRVT.js +0 -26
  66. package/dist/app-6Bn3F5Uw.js +0 -252
  67. package/dist/app-CoypamK1.js +0 -99
  68. package/dist/app-l47a-gqT.d.ts +0 -7
  69. package/dist/app_handler-CkiK6fyC.js +0 -55
  70. package/dist/app_handler-Gp5J9X-v.d.ts +0 -9
  71. package/dist/application-BPpvw5dg.d.ts +0 -175
  72. package/dist/application-LrKwuOKn.js +0 -385
  73. package/dist/cluster-CA_hr9eV.js +0 -283
  74. package/dist/cluster-RTfUwmUd.d.ts +0 -126
  75. package/dist/context-BIduDy1M.js +0 -10
  76. package/dist/format_options-LRnReKde.js +0 -65
  77. package/dist/index-BtBMDZg8.d.ts +0 -78
  78. package/dist/inject_context-BxpcF-ds.js +0 -106
  79. package/dist/inject_mocha-BVf8v6El.js +0 -38
  80. package/dist/inject_mocha-Daf1Aj8M.d.ts +0 -1
  81. package/dist/mock_agent-CxT7Q0_N.js +0 -45
  82. package/dist/mock_custom_loader-f_tHRojG.js +0 -35
  83. package/dist/mock_http_server-De0r07gr.js +0 -17
  84. package/dist/mock_httpclient-1EgQkMxi.d.ts +0 -40
  85. package/dist/mock_httpclient-B6UVI7GS.js +0 -110
  86. package/dist/restore-BL0cE0KG.d.ts +0 -4
  87. package/dist/restore-CVQYXquh.js +0 -16
  88. package/dist/src-D22EjdGo.js +0 -47
  89. package/dist/supertest-BIds28yL.d.ts +0 -16
  90. package/dist/supertest-Cg412Los.js +0 -39
  91. package/dist/types-CPNMyF89.js +0 -1
  92. package/dist/types-CjZ-JeCo.d.ts +0 -75
  93. package/dist/typings/index.d.ts +0 -1
  94. package/dist/util-1xYBaaoh.d.ts +0 -6
  95. package/dist/util-BpppqTXv.js +0 -59
  96. package/dist/utils-MhP_Krx1.js +0 -40
@@ -1,9 +1,24 @@
1
- import "../utils-MhP_Krx1.js";
2
- import "../format_options-LRnReKde.js";
3
- import "../context-BIduDy1M.js";
4
- import "../mock_custom_loader-f_tHRojG.js";
5
- import "../util-BpppqTXv.js";
6
- import "../agent-BKYkjoCx.js";
7
- import { closeAgent, setupAgent } from "../agent_handler-DeUtoRVT.js";
8
-
9
- export { closeAgent, setupAgent };
1
+ import { debuglog } from 'node:util';
2
+ import { createAgent, MockAgent } from "./parallel/agent.js";
3
+ import { getEggOptions } from "./utils.js";
4
+ const debug = debuglog('egg/mock/lib/agent_handler');
5
+ let agent;
6
+ export async function setupAgent() {
7
+ debug('setupAgent call, env.ENABLE_MOCHA_PARALLEL: %s, process.env.AUTO_AGENT: %s, agent: %s', process.env.ENABLE_MOCHA_PARALLEL, process.env.AUTO_AGENT, !!agent);
8
+ if (agent) {
9
+ await agent.ready();
10
+ return agent;
11
+ }
12
+ if (process.env.ENABLE_MOCHA_PARALLEL && process.env.AUTO_AGENT) {
13
+ agent = createAgent(getEggOptions());
14
+ await agent.ready();
15
+ }
16
+ return agent;
17
+ }
18
+ export async function closeAgent() {
19
+ debug('setupAgent call, agent: %s', !!agent);
20
+ if (agent) {
21
+ await agent.close();
22
+ }
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRfaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYWdlbnRfaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUVyRCxJQUFJLEtBQWdCLENBQUM7QUFFckIsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVO0lBQzlCLEtBQUssQ0FDSCx1RkFBdUYsRUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQ3RCLENBQUMsQ0FBQyxLQUFLLENBQ1IsQ0FBQztJQUNGLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoRSxLQUFLLEdBQUcsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDckMsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVTtJQUM5QixLQUFLLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0FBQ0gsQ0FBQyJ9
package/dist/lib/app.d.ts CHANGED
@@ -1,6 +1,3 @@
1
- import "../mock_httpclient-1EgQkMxi.js";
2
- import "../supertest-BIds28yL.js";
3
- import "../types-CjZ-JeCo.js";
4
- import "../application-BPpvw5dg.js";
5
- import { createApp } from "../app-l47a-gqT.js";
6
- export { createApp };
1
+ import type { MockOptions } from './types.ts';
2
+ import ApplicationUnittest from '../app/extend/application.ts';
3
+ export declare function createApp(createOptions?: MockOptions): ApplicationUnittest;
package/dist/lib/app.js CHANGED
@@ -1,14 +1,291 @@
1
- import "../mock_http_server-De0r07gr.js";
2
- import "../utils-MhP_Krx1.js";
3
- import "../supertest-Cg412Los.js";
4
- import "../format_options-LRnReKde.js";
5
- import "../context-BIduDy1M.js";
6
- import "../mock_custom_loader-f_tHRojG.js";
7
- import "../mock_agent-CxT7Q0_N.js";
8
- import "../mock_httpclient-B6UVI7GS.js";
9
- import "../types-CPNMyF89.js";
10
- import "../application-LrKwuOKn.js";
11
- import "../agent-DZ_fHoxJ.js";
12
- import { createApp } from "../app-6Bn3F5Uw.js";
13
-
14
- export { createApp };
1
+ import { debuglog } from 'node:util';
2
+ import { strict as assert } from 'node:assert';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { Base } from 'sdk-base';
6
+ import { detectPort } from 'detect-port';
7
+ import { importModule } from '@eggjs/utils';
8
+ import { sleep, rimraf, getProperty, getSourceDirname } from "./utils.js";
9
+ import { formatOptions } from "./format_options.js";
10
+ import { context } from "./context.js";
11
+ import { setCustomLoader } from "./mock_custom_loader.js";
12
+ import { createServer } from "./mock_http_server.js";
13
+ import ApplicationUnittest from "../app/extend/application.js";
14
+ import AgentUnittest from "../app/extend/agent.js";
15
+ const debug = debuglog('egg/mock/lib/app');
16
+ const apps = new Map();
17
+ const APP_INIT = Symbol('appInit');
18
+ const MESSENGER = Symbol('messenger');
19
+ const MOCK_APP_METHOD = ['ready', 'closed', 'isClosed', 'close', '_agent', '_app', 'on', 'once', 'then'];
20
+ class MockApplicationWorker extends Base {
21
+ _agent;
22
+ _app;
23
+ baseDir;
24
+ [APP_INIT] = false;
25
+ _initOnListeners;
26
+ _initOnceListeners;
27
+ constructor(options) {
28
+ super({
29
+ initMethod: '_init',
30
+ ...options,
31
+ });
32
+ this.baseDir = options.baseDir;
33
+ this._initOnListeners = new Set();
34
+ this._initOnceListeners = new Set();
35
+ }
36
+ async _init() {
37
+ if (this.options.beforeInit) {
38
+ await this.options.beforeInit(this);
39
+ // init once
40
+ this.options.beforeInit = undefined;
41
+ }
42
+ if (this.options.clean !== false) {
43
+ const logDir = path.join(this.options.baseDir, 'logs');
44
+ try {
45
+ if (os.platform() === 'win32') {
46
+ await sleep(1000);
47
+ }
48
+ await rimraf(logDir);
49
+ }
50
+ catch (err) {
51
+ console.error(`remove log dir ${logDir} failed: ${err.stack}`);
52
+ }
53
+ const runDir = path.join(this.options.baseDir, 'run');
54
+ try {
55
+ if (os.platform() === 'win32') {
56
+ await sleep(1000);
57
+ }
58
+ await rimraf(runDir);
59
+ }
60
+ catch (err) {
61
+ console.error(`remove run dir ${runDir} failed: ${err.stack}`);
62
+ }
63
+ }
64
+ this.options.clusterPort = await detectPort();
65
+ debug('[init] options: %o', this.options);
66
+ const egg = await importModule(this.options.framework);
67
+ assert(egg.Agent, `should export Agent class from framework ${this.options.framework}`);
68
+ const Agent = egg.Agent;
69
+ const agent = (this._agent = new Agent({ ...this.options }));
70
+ debug('agent instantiate');
71
+ await agent.ready();
72
+ debug('agent ready');
73
+ const ApplicationClass = bindMessenger(egg.Application, agent);
74
+ const app = (this._app = new ApplicationClass({ ...this.options }));
75
+ // https://github.com/eggjs/egg/blob/8bb7c7e7d59d6aeca4b2ed1eb580368dcb731a4d/lib/egg.js#L125
76
+ // egg single mode mount this at start(), so egg-mock should impel it.
77
+ app.agent = agent;
78
+ Reflect.set(agent, 'app', app);
79
+ // egg-mock plugin need to override egg context
80
+ Object.assign(app.context, context);
81
+ debug('app instantiate');
82
+ this[APP_INIT] = true;
83
+ debug('this[APP_INIT] = true');
84
+ this.#bindEvent();
85
+ debug('http server instantiate');
86
+ createServer(app);
87
+ await app.ready();
88
+ // work for config ready
89
+ setCustomLoader(app);
90
+ const msg = {
91
+ action: 'egg-ready',
92
+ data: this.options,
93
+ };
94
+ app.messenger.onMessage(msg);
95
+ agent.messenger.onMessage(msg);
96
+ debug('app ready');
97
+ }
98
+ #bindEvent() {
99
+ debug('bind cache events to app');
100
+ for (const args of this._initOnListeners) {
101
+ debug('on(%s), use cache and pass to app', args);
102
+ this._app.on(args[0], args[1]);
103
+ this.removeListener(args[0], args[1]);
104
+ }
105
+ for (const args of this._initOnceListeners) {
106
+ debug('once(%s), use cache and pass to app', args);
107
+ this._app.once(args[0], args[1]);
108
+ this.removeListener(args[0], args[1]);
109
+ }
110
+ }
111
+ on(...args) {
112
+ if (this[APP_INIT]) {
113
+ debug('on(%s), pass to app', args);
114
+ this._app.on(args[0], args[1]);
115
+ }
116
+ else {
117
+ debug('on(%s), cache it because app has not init', args);
118
+ this._initOnListeners.add(args);
119
+ super.on(args[0], args[1]);
120
+ }
121
+ return this;
122
+ }
123
+ once(...args) {
124
+ if (this[APP_INIT]) {
125
+ debug('once(%s), pass to app', args);
126
+ this._app.once(args[0], args[1]);
127
+ }
128
+ else {
129
+ debug('once(%s), cache it because app has not init', args);
130
+ this._initOnceListeners.add(args);
131
+ // maybe some edge case bug here
132
+ super.on(args[0], args[1]);
133
+ }
134
+ return this;
135
+ }
136
+ /**
137
+ * close app
138
+ */
139
+ async _close() {
140
+ const baseDir = this.baseDir;
141
+ if (this._app) {
142
+ await this._app.close();
143
+ }
144
+ else {
145
+ // when app init throws an exception, must wait for app quit gracefully
146
+ await sleep(200);
147
+ }
148
+ if (this._agent) {
149
+ await this._agent.close();
150
+ }
151
+ apps.delete(baseDir);
152
+ debug('delete app cache %s, remain %s', baseDir, [...apps.keys()]);
153
+ if (os.platform() === 'win32') {
154
+ await sleep(1000);
155
+ }
156
+ }
157
+ /**
158
+ * @deprecated please use isClosed instead, keep compatible with old version
159
+ */
160
+ get closed() {
161
+ return this.isClosed;
162
+ }
163
+ }
164
+ export function createApp(createOptions) {
165
+ const options = formatOptions({
166
+ ...createOptions,
167
+ mode: 'all-in-one-process',
168
+ });
169
+ debug('[createApp] options: %o', options);
170
+ if (options.cache && apps.has(options.baseDir)) {
171
+ const app = apps.get(options.baseDir);
172
+ // return cache when it hasn't been killed
173
+ if (app && !app.isClosed) {
174
+ debug('use cache app %s', options.baseDir);
175
+ return app;
176
+ }
177
+ // delete the cache when it's closed
178
+ apps.delete(options.baseDir);
179
+ }
180
+ const appWorker = new MockApplicationWorker(options);
181
+ const proxyApp = new Proxy(appWorker, {
182
+ get(target, prop) {
183
+ // don't delegate properties on MockApplication
184
+ if (MOCK_APP_METHOD.includes(prop)) {
185
+ return getProperty(target, prop);
186
+ }
187
+ if (!target[APP_INIT]) {
188
+ throw new Error(`can't get ${prop} before ready`);
189
+ }
190
+ // it's asynchronous when agent and app are loading,
191
+ // so should get the properties after loader ready
192
+ debug('proxy handler.get %s', prop);
193
+ return target._app[prop];
194
+ },
195
+ set(target, prop, value) {
196
+ if (MOCK_APP_METHOD.includes(prop))
197
+ return true;
198
+ if (!target[APP_INIT])
199
+ throw new Error(`can't set ${prop} before ready`);
200
+ debug('proxy handler.set %s', prop);
201
+ target._app[prop] = value;
202
+ return true;
203
+ },
204
+ defineProperty(target, prop, descriptor) {
205
+ // can't define properties on MockApplication
206
+ if (MOCK_APP_METHOD.includes(prop))
207
+ return true;
208
+ if (!target[APP_INIT])
209
+ throw new Error(`can't defineProperty ${prop} before ready`);
210
+ debug('proxy handler.defineProperty %s', prop);
211
+ Object.defineProperty(target._app, prop, descriptor);
212
+ return true;
213
+ },
214
+ deleteProperty(target, prop) {
215
+ // can't delete properties on MockApplication
216
+ if (MOCK_APP_METHOD.includes(prop))
217
+ return true;
218
+ if (!target[APP_INIT])
219
+ throw new Error(`can't delete ${prop} before ready`);
220
+ debug('proxy handler.deleteProperty %s', prop);
221
+ delete target._app[prop];
222
+ return true;
223
+ },
224
+ getOwnPropertyDescriptor(target, prop) {
225
+ if (MOCK_APP_METHOD.includes(prop)) {
226
+ return Object.getOwnPropertyDescriptor(target, prop);
227
+ }
228
+ if (!target[APP_INIT]) {
229
+ throw new Error(`can't getOwnPropertyDescriptor ${prop} before ready`);
230
+ }
231
+ debug('proxy handler.getOwnPropertyDescriptor %s', prop);
232
+ return Object.getOwnPropertyDescriptor(target._app, prop);
233
+ },
234
+ getPrototypeOf(target) {
235
+ if (!target[APP_INIT]) {
236
+ throw new Error("can't getPrototypeOf before ready");
237
+ }
238
+ debug('proxy handler.getPrototypeOf %s');
239
+ return Object.getPrototypeOf(target._app);
240
+ },
241
+ });
242
+ apps.set(options.baseDir, proxyApp);
243
+ return proxyApp;
244
+ }
245
+ function bindMessenger(ApplicationClass, agent) {
246
+ const agentMessenger = agent.messenger;
247
+ return class MessengerApplication extends ApplicationClass {
248
+ [MESSENGER];
249
+ constructor(options) {
250
+ super(options);
251
+ // enable app to send to a random agent
252
+ this.messenger.sendRandom = (action, data) => {
253
+ this.messenger.sendToAgent(action, data);
254
+ };
255
+ // enable agent to send to a random app
256
+ agentMessenger.on('egg-ready', () => {
257
+ agentMessenger.sendRandom = (action, data) => {
258
+ agentMessenger.sendToApp(action, data);
259
+ return agentMessenger;
260
+ };
261
+ });
262
+ agentMessenger.send = new Proxy(agentMessenger.send, {
263
+ apply: this._sendMessage.bind(this),
264
+ });
265
+ }
266
+ _sendMessage(_target, _thisArg, [action, data, to]) {
267
+ const appMessenger = this.messenger;
268
+ setImmediate(() => {
269
+ if (to === 'app') {
270
+ appMessenger.onMessage({ action, data });
271
+ }
272
+ else {
273
+ agentMessenger.onMessage({ action, data });
274
+ }
275
+ });
276
+ }
277
+ get messenger() {
278
+ return this[MESSENGER];
279
+ }
280
+ set messenger(m) {
281
+ m.send = new Proxy(m.send, {
282
+ apply: this._sendMessage.bind(this),
283
+ });
284
+ this[MESSENGER] = m;
285
+ }
286
+ get [Symbol.for('egg#eggPath')]() {
287
+ return path.join(getSourceDirname(), 'lib/tmp');
288
+ }
289
+ };
290
+ }
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxJQUFJLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBRTdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sbUJBQW1CLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFFbkQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUM7QUFDcEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0QyxNQUFNLGVBQWUsR0FBRyxDQUFDLE9B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
@@ -1,6 +1,5 @@
1
- import "../mock_httpclient-1EgQkMxi.js";
2
- import "../supertest-BIds28yL.js";
3
- import "../types-CjZ-JeCo.js";
4
- import "../application-BPpvw5dg.js";
5
- import { getApp, getBootstrapApp, setGetAppCallback, setupApp } from "../app_handler-Gp5J9X-v.js";
6
- export { getApp, getBootstrapApp, setGetAppCallback, setupApp };
1
+ import ApplicationUnittest from '../app/extend/application.ts';
2
+ export declare function setupApp(): ApplicationUnittest;
3
+ export declare function setGetAppCallback(cb: (suite: unknown, test?: unknown) => any): void;
4
+ export declare function getApp(suite?: unknown, test?: unknown): Promise<any>;
5
+ export declare function getBootstrapApp(): ApplicationUnittest;
@@ -1,21 +1,69 @@
1
- import "../mock_http_server-De0r07gr.js";
2
- import "../utils-MhP_Krx1.js";
3
- import "../supertest-Cg412Los.js";
4
- import "../format_options-LRnReKde.js";
5
- import "../cluster-CA_hr9eV.js";
6
- import "../context-BIduDy1M.js";
7
- import "../mock_custom_loader-f_tHRojG.js";
8
- import "../mock_agent-CxT7Q0_N.js";
9
- import "../mock_httpclient-B6UVI7GS.js";
10
- import "../types-CPNMyF89.js";
11
- import "../application-LrKwuOKn.js";
12
- import "../agent-DZ_fHoxJ.js";
13
- import "../app-6Bn3F5Uw.js";
14
- import "../restore-CVQYXquh.js";
15
- import "../util-BpppqTXv.js";
16
- import "../app-CoypamK1.js";
17
- import "../agent-BKYkjoCx.js";
18
- import "../agent_handler-DeUtoRVT.js";
19
- import { getApp, getBootstrapApp, setGetAppCallback, setupApp } from "../app_handler-CkiK6fyC.js";
20
-
21
- export { getApp, getBootstrapApp, setGetAppCallback, setupApp };
1
+ import { debuglog } from 'node:util';
2
+ import { createApp as createParallelApp } from "./parallel/app.js";
3
+ import { setupAgent } from "./agent_handler.js";
4
+ import { createApp } from "./app.js";
5
+ import { restore } from "./restore.js";
6
+ import { getEggOptions } from "./utils.js";
7
+ import ApplicationUnittest from "../app/extend/application.js";
8
+ const debug = debuglog('egg/mock/lib/app_handler');
9
+ globalThis.__eggMockAppInstance = null;
10
+ export function setupApp() {
11
+ let app = globalThis.__eggMockAppInstance;
12
+ if (app) {
13
+ debug('return exists app');
14
+ return app;
15
+ }
16
+ const options = getEggOptions();
17
+ debug('env.ENABLE_MOCHA_PARALLEL: %s, process.env.AUTO_AGENT: %s', process.env.ENABLE_MOCHA_PARALLEL, process.env.AUTO_AGENT);
18
+ if (process.env.ENABLE_MOCHA_PARALLEL && process.env.AUTO_AGENT) {
19
+ // setup agent first
20
+ app = createParallelApp({
21
+ ...options,
22
+ beforeInit: async (parallelApp) => {
23
+ const agent = await setupAgent();
24
+ parallelApp.options.clusterPort = agent.options.clusterPort;
25
+ debug('mockParallelApp beforeInit get clusterPort: %s', parallelApp.options.clusterPort);
26
+ },
27
+ });
28
+ debug('mockParallelApp app: %s', !!app);
29
+ }
30
+ else {
31
+ app = createApp(options);
32
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
33
+ // @ts-ignore
34
+ if (typeof beforeAll === 'function') {
35
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
36
+ // @ts-ignore
37
+ // jest
38
+ beforeAll(() => app.ready());
39
+ }
40
+ // @ts-ignore mocha tsd
41
+ if (typeof afterEach === 'function') {
42
+ // mocha and jest
43
+ // @ts-ignore mocha tsd
44
+ afterEach(() => app.backgroundTasksFinished());
45
+ // @ts-ignore mocha tsd
46
+ afterEach(restore);
47
+ }
48
+ }
49
+ globalThis.__eggMockAppInstance = app;
50
+ return app;
51
+ }
52
+ let getAppCallback;
53
+ export function setGetAppCallback(cb) {
54
+ getAppCallback = cb;
55
+ }
56
+ export async function getApp(suite, test) {
57
+ if (getAppCallback) {
58
+ return getAppCallback(suite, test);
59
+ }
60
+ const app = globalThis.__eggMockAppInstance;
61
+ if (app) {
62
+ await app.ready();
63
+ }
64
+ return app;
65
+ }
66
+ export function getBootstrapApp() {
67
+ return globalThis.__eggMockAppInstance;
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwX2hhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2FwcF9oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLFNBQVMsSUFBSSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLG1CQUFtQixNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBTW5ELFVBQVUsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFFdkMsTUFBTSxVQUFVLFFBQVE7SUFDdEIsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLG9CQUFxQixDQUFDO0lBQzNDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDUixLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUNoQyxLQUFLLENBQ0gsMkRBQTJELEVBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUN2QixDQUFDO0lBQ0YsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEUsb0JBQW9CO1FBQ3BCLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQztZQUN0QixHQUFHLE9BQU87WUFDVixVQUFVLEVBQUUsS0FBSyxFQUFDLFdBQVcsRUFBQyxFQUFFO2dCQUM5QixNQUFNLEtBQUssR0FBRyxNQUFNLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDNUQsS0FBSyxDQUFDLGdEQUFnRCxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0YsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztTQUFNLENBQUM7UUFDTixHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBbUMsQ0FBQztRQUMzRCw2REFBNkQ7UUFDN0QsYUFBYTtRQUNiLElBQUksT0FBTyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDcEMsNkRBQTZEO1lBQzdELGFBQWE7WUFDYixPQUFPO1lBQ1AsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCx1QkFBdUI7UUFDdkIsSUFBSSxPQUFPLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxpQkFBaUI7WUFDakIsdUJBQXVCO1lBQ3ZCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLHVCQUF1QjtZQUN2QixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFDRCxVQUFVLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0lBQ3RDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELElBQUksY0FBdUQsQ0FBQztBQUU1RCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsRUFBMkM7SUFDM0UsY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQUMsS0FBZSxFQUFFLElBQWM7SUFDMUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQixPQUFPLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxvQkFBcUIsQ0FBQztJQUM3QyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlO0lBQzdCLE9BQU8sVUFBVSxDQUFDLG9CQUFxQixDQUFDO0FBQzFDLENBQUMifQ==
@@ -1,6 +1,121 @@
1
- import "../mock_httpclient-1EgQkMxi.js";
2
- import "../supertest-BIds28yL.js";
3
- import "../types-CjZ-JeCo.js";
4
- import "../application-BPpvw5dg.js";
5
- import { ClusterApplication, MockClusterApplication, createCluster, restore } from "../cluster-RTfUwmUd.js";
6
- export { ClusterApplication, MockClusterApplication, createCluster, restore };
1
+ import { Coffee } from 'coffee';
2
+ import type { MockClusterOptions, MockClusterApplicationOptions } from './types.ts';
3
+ import type ApplicationUnittest from '../app/extend/application.ts';
4
+ declare global {
5
+ var eggMockMasterPort: number;
6
+ }
7
+ /**
8
+ * A cluster version of egg.Application, you can test with supertest
9
+ * @example
10
+ * ```js
11
+ * const mm = require('mm');
12
+ * const request = require('supertest');
13
+ *
14
+ * describe('ClusterApplication', () => {
15
+ * let app;
16
+ * before(function (done) {
17
+ * app = mm.cluster({ baseDir });
18
+ * app.ready(done);
19
+ * });
20
+ *
21
+ * after(function () {
22
+ * app.close();
23
+ * });
24
+ *
25
+ * it('should 200', function (done) {
26
+ * request(app.callback())
27
+ * .get('/')
28
+ * .expect(200, done);
29
+ * });
30
+ * });
31
+ */
32
+ export declare class ClusterApplication extends Coffee {
33
+ [key: string | symbol]: any;
34
+ options: MockClusterApplicationOptions;
35
+ port: number;
36
+ baseDir: string;
37
+ closed: boolean;
38
+ private _address;
39
+ /**
40
+ * @class
41
+ * @param {Object} options
42
+ * - {String} baseDir - The directory of the application
43
+ * - {Object} plugins - Custom you plugins
44
+ * - {String} framework - The directory of the egg framework
45
+ * - {Boolean} [cache=true] - Cache application based on baseDir
46
+ * - {Boolean} [coverage=true] - Switch on process coverage, but it'll be slower
47
+ * - {Boolean} [clean=true] - Remove $baseDir/logs
48
+ * - {Object} [opt] - opt pass to coffee, such as { execArgv: ['--debug'] }
49
+ * ```
50
+ */
51
+ constructor(options: MockClusterApplicationOptions);
52
+ /**
53
+ * the process that forked
54
+ * @member {ChildProcess}
55
+ */
56
+ get process(): any;
57
+ /**
58
+ * Compatible API for supertest
59
+ */
60
+ callback(): this;
61
+ /**
62
+ * Compatible API for supertest
63
+ * @member {String} url
64
+ * @private
65
+ */
66
+ get url(): string;
67
+ /**
68
+ * Compatible API for supertest
69
+ */
70
+ address(): {
71
+ port: number;
72
+ address: string | undefined;
73
+ };
74
+ /**
75
+ * Compatible API for supertest
76
+ */
77
+ listen(): this;
78
+ /**
79
+ * kill the process
80
+ */
81
+ close(): Promise<void>;
82
+ get isClosed(): boolean;
83
+ get router(): {
84
+ pathFor(url: string): any;
85
+ };
86
+ /**
87
+ * get app[property] value in app worker
88
+ */
89
+ getAppInstanceProperty(property: string): any;
90
+ /**
91
+ * collection logger message, then can be use on `expectLog()`
92
+ * it's different from `app.expectLog()`, only support string params.
93
+ *
94
+ * @param {String} [logger] - logger instance name, default is `logger`
95
+ * @function ClusterApplication#expectLog
96
+ */
97
+ mockLog(logger?: string): void;
98
+ /**
99
+ * expect str in the logger
100
+ * it's different from `app.expectLog()`, only support string params.
101
+ *
102
+ * @param {String} str - test str
103
+ * @param {String} [logger] - logger instance name, default is `logger`
104
+ * @function ClusterApplication#expectLog
105
+ */
106
+ expectLog(str: string, logger?: string): void;
107
+ /**
108
+ * not expect str in the logger
109
+ * it's different from `app.notExpectLog()`, only support string params.
110
+ *
111
+ * @param {String} str - test str
112
+ * @param {String} [logger] - logger instance name, default is `logger`
113
+ * @function ClusterApplication#notExpectLog
114
+ */
115
+ notExpectLog(str: string, logger?: string): void;
116
+ httpRequest(): import("./supertest.ts").EggTestRequest;
117
+ _callFunctionOnAppWorker(method: string, args?: any[], property?: any, needResult?: boolean): any;
118
+ }
119
+ export type MockClusterApplication = ClusterApplication & ApplicationUnittest;
120
+ export declare function createCluster(initOptions?: MockClusterOptions): MockClusterApplication;
121
+ export declare function restore(): Promise<void>;