@nocobase/test 1.5.0-beta.3 → 1.5.0-beta.30
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/es/server/index.d.ts +3 -2
- package/es/server/memory-pub-sub-adapter.d.ts +30 -0
- package/es/server/mock-data-source.d.ts +14 -0
- package/{lib/server/mock-cluster.d.ts → es/server/mock-isolated-cluster.d.ts} +3 -3
- package/es/server/mock-server.d.ts +15 -3
- package/lib/client/renderAppOptions.js +2 -2
- package/lib/client/renderSettings.js +7 -14
- package/lib/e2e/e2eUtils.js +1 -0
- package/lib/server/index.d.ts +3 -2
- package/lib/server/index.js +5 -3
- package/lib/server/memory-pub-sub-adapter.d.ts +30 -0
- package/lib/server/memory-pub-sub-adapter.js +95 -0
- package/lib/server/mock-data-source.d.ts +14 -0
- package/lib/server/mock-data-source.js +51 -0
- package/{es/server/mock-cluster.d.ts → lib/server/mock-isolated-cluster.d.ts} +3 -3
- package/lib/server/{mock-cluster.js → mock-isolated-cluster.js} +8 -8
- package/lib/server/mock-server.d.ts +15 -3
- package/lib/server/mock-server.js +72 -5
- package/package.json +3 -3
- package/es/client/index.mjs +0 -2002
- package/es/e2e/index.mjs +0 -22725
- package/es/index.mjs +0 -297
- package/es/web/index.mjs +0 -1600
package/es/server/index.d.ts
CHANGED
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
9
|
import ws from 'ws';
|
|
10
|
-
export {
|
|
10
|
+
export { MockDatabase, mockDatabase } from '@nocobase/database';
|
|
11
11
|
export { default as supertest } from 'supertest';
|
|
12
|
+
export * from './memory-pub-sub-adapter';
|
|
13
|
+
export * from './mock-isolated-cluster';
|
|
12
14
|
export * from './mock-server';
|
|
13
|
-
export * from './mock-cluster';
|
|
14
15
|
export declare const pgOnly: () => any;
|
|
15
16
|
export declare const isPg: () => boolean;
|
|
16
17
|
export declare function randomStr(): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
/// <reference types="node" />
|
|
10
|
+
import { IPubSubAdapter } from '@nocobase/server';
|
|
11
|
+
import { EventEmitter } from 'events';
|
|
12
|
+
declare class TestEventEmitter extends EventEmitter {
|
|
13
|
+
emitAsync: (event: string | symbol, ...args: any[]) => Promise<boolean>;
|
|
14
|
+
}
|
|
15
|
+
export declare class MemoryPubSubAdapter implements IPubSubAdapter {
|
|
16
|
+
protected options: any;
|
|
17
|
+
protected emitter: TestEventEmitter;
|
|
18
|
+
connected: boolean;
|
|
19
|
+
static instances: Map<string, MemoryPubSubAdapter>;
|
|
20
|
+
static create(name?: string, options?: any): MemoryPubSubAdapter;
|
|
21
|
+
constructor(options?: any);
|
|
22
|
+
connect(): Promise<void>;
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
isConnected(): Promise<boolean>;
|
|
25
|
+
subscribe(channel: any, callback: any): Promise<void>;
|
|
26
|
+
unsubscribe(channel: any, callback: any): Promise<void>;
|
|
27
|
+
publish(channel: any, message: any): Promise<void>;
|
|
28
|
+
subscribeAll(callback: any): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
import { DataSource } from '@nocobase/data-source-manager';
|
|
10
|
+
export declare class MockDataSource extends DataSource {
|
|
11
|
+
static testConnection(options?: any): Promise<boolean>;
|
|
12
|
+
load(): Promise<void>;
|
|
13
|
+
createCollectionManager(options?: any): any;
|
|
14
|
+
}
|
|
@@ -6,18 +6,18 @@
|
|
|
6
6
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
|
-
type
|
|
9
|
+
type IsolatedClusterOptions = {
|
|
10
10
|
script?: string;
|
|
11
11
|
env?: Record<string, any>;
|
|
12
12
|
plugins?: string[];
|
|
13
13
|
instances?: number;
|
|
14
14
|
};
|
|
15
|
-
export declare class
|
|
15
|
+
export declare class MockIsolatedCluster {
|
|
16
16
|
private options;
|
|
17
17
|
private script;
|
|
18
18
|
private processes;
|
|
19
19
|
private mockApp;
|
|
20
|
-
constructor(options?:
|
|
20
|
+
constructor(options?: IsolatedClusterOptions);
|
|
21
21
|
start(): Promise<number[]>;
|
|
22
22
|
stop(): Promise<unknown[]>;
|
|
23
23
|
}
|
|
@@ -62,22 +62,34 @@ interface ExtendedAgent extends SuperAgentTest {
|
|
|
62
62
|
resource: (name: string, resourceOf?: any) => Resource;
|
|
63
63
|
}
|
|
64
64
|
export declare class MockServer extends Application {
|
|
65
|
+
registerMockDataSource(): void;
|
|
65
66
|
loadAndInstall(options?: any): Promise<void>;
|
|
66
67
|
cleanDb(): Promise<void>;
|
|
67
68
|
quickstart(options?: {
|
|
68
69
|
clean?: boolean;
|
|
69
70
|
}): Promise<void>;
|
|
70
71
|
destroy(options?: any): Promise<void>;
|
|
71
|
-
agent(): ExtendedAgent;
|
|
72
|
+
agent(callback?: any): ExtendedAgent;
|
|
72
73
|
protected createDatabase(options: ApplicationOptions): import("@nocobase/database").MockDatabase;
|
|
73
74
|
}
|
|
74
75
|
export declare function mockServer(options?: ApplicationOptions): MockServer;
|
|
75
76
|
export declare function startMockServer(options?: ApplicationOptions): Promise<MockServer>;
|
|
76
77
|
type BeforeInstallFn = (app: any) => Promise<void>;
|
|
77
|
-
export
|
|
78
|
+
export type MockServerOptions = ApplicationOptions & {
|
|
78
79
|
version?: string;
|
|
79
80
|
beforeInstall?: BeforeInstallFn;
|
|
80
81
|
skipInstall?: boolean;
|
|
81
82
|
skipStart?: boolean;
|
|
82
|
-
}
|
|
83
|
+
};
|
|
84
|
+
export type MockClusterOptions = MockServerOptions & {
|
|
85
|
+
number?: number;
|
|
86
|
+
clusterName?: string;
|
|
87
|
+
appName?: string;
|
|
88
|
+
};
|
|
89
|
+
export type MockCluster = {
|
|
90
|
+
nodes: MockServer[];
|
|
91
|
+
destroy: () => Promise<void>;
|
|
92
|
+
};
|
|
93
|
+
export declare function createMockCluster({ number, clusterName, appName, ...options }?: MockClusterOptions): Promise<MockCluster>;
|
|
94
|
+
export declare function createMockServer(options?: MockServerOptions): Promise<MockServer>;
|
|
83
95
|
export default mockServer;
|
|
@@ -42,12 +42,12 @@ __export(renderAppOptions_exports, {
|
|
|
42
42
|
});
|
|
43
43
|
module.exports = __toCommonJS(renderAppOptions_exports);
|
|
44
44
|
var import_react = __toESM(require("react"));
|
|
45
|
-
var
|
|
45
|
+
var import__ = require(".");
|
|
46
46
|
var import_web = require("../web");
|
|
47
47
|
var import_utils = require("./utils");
|
|
48
48
|
const renderAppOptions = /* @__PURE__ */ __name(async (options) => {
|
|
49
49
|
const App = (0, import_web.getAppComponent)(options);
|
|
50
|
-
const res = (0,
|
|
50
|
+
const res = (0, import__.render)(/* @__PURE__ */ import_react.default.createElement(App, null));
|
|
51
51
|
await (0, import_utils.WaitApp)();
|
|
52
52
|
return res;
|
|
53
53
|
}, "renderAppOptions");
|
|
@@ -7,11 +7,9 @@
|
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
var __create = Object.create;
|
|
11
10
|
var __defProp = Object.defineProperty;
|
|
12
11
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
13
12
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
14
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
15
13
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
16
14
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
17
15
|
var __export = (target, all) => {
|
|
@@ -26,14 +24,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
26
24
|
}
|
|
27
25
|
return to;
|
|
28
26
|
};
|
|
29
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
30
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
31
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
32
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
33
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
34
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
35
|
-
mod
|
|
36
|
-
));
|
|
37
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
38
28
|
var renderSettings_exports = {};
|
|
39
29
|
__export(renderSettings_exports, {
|
|
@@ -43,16 +33,19 @@ __export(renderSettings_exports, {
|
|
|
43
33
|
});
|
|
44
34
|
module.exports = __toCommonJS(renderSettings_exports);
|
|
45
35
|
var import_react = require("@testing-library/react");
|
|
46
|
-
var import_user_event = __toESM(require("@testing-library/user-event"));
|
|
47
36
|
var import_renderAppOptions = require("./renderAppOptions");
|
|
48
37
|
var import_utils = require("./utils");
|
|
49
38
|
async function showSettingsMenu(container = document) {
|
|
50
39
|
await (0, import_react.waitFor)(() => {
|
|
51
|
-
(0, import_utils.expectNoTsError)(container.querySelector('[aria-label^="designer-schema-settings-"]')).toBeInTheDocument();
|
|
40
|
+
return (0, import_utils.expectNoTsError)(container.querySelector('[aria-label^="designer-schema-settings-"]')).toBeInTheDocument();
|
|
52
41
|
});
|
|
53
|
-
await
|
|
42
|
+
const button = await (0, import_react.waitFor)(() => {
|
|
43
|
+
return container.querySelector('[aria-label^="designer-schema-settings-"]');
|
|
44
|
+
});
|
|
45
|
+
import_react.fireEvent.mouseEnter(button);
|
|
46
|
+
import_react.fireEvent.mouseOver(button);
|
|
54
47
|
await (0, import_react.waitFor)(() => {
|
|
55
|
-
(0, import_utils.expectNoTsError)(import_react.screen.queryByTestId("schema-settings-menu")).toBeInTheDocument();
|
|
48
|
+
return (0, import_utils.expectNoTsError)(import_react.screen.queryByTestId("schema-settings-menu")).toBeInTheDocument();
|
|
56
49
|
});
|
|
57
50
|
}
|
|
58
51
|
__name(showSettingsMenu, "showSettingsMenu");
|
package/lib/e2e/e2eUtils.js
CHANGED
|
@@ -862,6 +862,7 @@ async function expectSettingsMenu({
|
|
|
862
862
|
page,
|
|
863
863
|
unsupportedOptions
|
|
864
864
|
}) {
|
|
865
|
+
await page.waitForTimeout(100);
|
|
865
866
|
await showMenu();
|
|
866
867
|
for (const option of supportedOptions) {
|
|
867
868
|
await (0, import_test.expect)(page.getByRole("menuitem", { name: option })).toBeVisible();
|
package/lib/server/index.d.ts
CHANGED
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
9
|
import ws from 'ws';
|
|
10
|
-
export {
|
|
10
|
+
export { MockDatabase, mockDatabase } from '@nocobase/database';
|
|
11
11
|
export { default as supertest } from 'supertest';
|
|
12
|
+
export * from './memory-pub-sub-adapter';
|
|
13
|
+
export * from './mock-isolated-cluster';
|
|
12
14
|
export * from './mock-server';
|
|
13
|
-
export * from './mock-cluster';
|
|
14
15
|
export declare const pgOnly: () => any;
|
|
15
16
|
export declare const isPg: () => boolean;
|
|
16
17
|
export declare function randomStr(): string;
|
package/lib/server/index.js
CHANGED
|
@@ -54,8 +54,9 @@ var import_vitest = require("vitest");
|
|
|
54
54
|
var import_ws = __toESM(require("ws"));
|
|
55
55
|
var import_database = require("@nocobase/database");
|
|
56
56
|
var import_supertest = __toESM(require("supertest"));
|
|
57
|
+
__reExport(server_exports, require("./memory-pub-sub-adapter"), module.exports);
|
|
58
|
+
__reExport(server_exports, require("./mock-isolated-cluster"), module.exports);
|
|
57
59
|
__reExport(server_exports, require("./mock-server"), module.exports);
|
|
58
|
-
__reExport(server_exports, require("./mock-cluster"), module.exports);
|
|
59
60
|
const pgOnly = /* @__PURE__ */ __name(() => process.env.DB_DIALECT == "postgres" ? import_vitest.describe : import_vitest.describe.skip, "pgOnly");
|
|
60
61
|
const isPg = /* @__PURE__ */ __name(() => process.env.DB_DIALECT == "postgres", "isPg");
|
|
61
62
|
function randomStr() {
|
|
@@ -119,6 +120,7 @@ const createWsClient = /* @__PURE__ */ __name(async ({ serverPort, options = {}
|
|
|
119
120
|
startServerWithRandomPort,
|
|
120
121
|
supertest,
|
|
121
122
|
waitSecond,
|
|
122
|
-
...require("./
|
|
123
|
-
...require("./mock-cluster")
|
|
123
|
+
...require("./memory-pub-sub-adapter"),
|
|
124
|
+
...require("./mock-isolated-cluster"),
|
|
125
|
+
...require("./mock-server")
|
|
124
126
|
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
/// <reference types="node" />
|
|
10
|
+
import { IPubSubAdapter } from '@nocobase/server';
|
|
11
|
+
import { EventEmitter } from 'events';
|
|
12
|
+
declare class TestEventEmitter extends EventEmitter {
|
|
13
|
+
emitAsync: (event: string | symbol, ...args: any[]) => Promise<boolean>;
|
|
14
|
+
}
|
|
15
|
+
export declare class MemoryPubSubAdapter implements IPubSubAdapter {
|
|
16
|
+
protected options: any;
|
|
17
|
+
protected emitter: TestEventEmitter;
|
|
18
|
+
connected: boolean;
|
|
19
|
+
static instances: Map<string, MemoryPubSubAdapter>;
|
|
20
|
+
static create(name?: string, options?: any): MemoryPubSubAdapter;
|
|
21
|
+
constructor(options?: any);
|
|
22
|
+
connect(): Promise<void>;
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
isConnected(): Promise<boolean>;
|
|
25
|
+
subscribe(channel: any, callback: any): Promise<void>;
|
|
26
|
+
unsubscribe(channel: any, callback: any): Promise<void>;
|
|
27
|
+
publish(channel: any, message: any): Promise<void>;
|
|
28
|
+
subscribeAll(callback: any): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
15
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
16
|
+
var __export = (target, all) => {
|
|
17
|
+
for (var name in all)
|
|
18
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
19
|
+
};
|
|
20
|
+
var __copyProps = (to, from, except, desc) => {
|
|
21
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
22
|
+
for (let key of __getOwnPropNames(from))
|
|
23
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
24
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
25
|
+
}
|
|
26
|
+
return to;
|
|
27
|
+
};
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
30
|
+
var memory_pub_sub_adapter_exports = {};
|
|
31
|
+
__export(memory_pub_sub_adapter_exports, {
|
|
32
|
+
MemoryPubSubAdapter: () => MemoryPubSubAdapter
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(memory_pub_sub_adapter_exports);
|
|
35
|
+
var import_utils = require("@nocobase/utils");
|
|
36
|
+
var import_events = require("events");
|
|
37
|
+
const sleep = /* @__PURE__ */ __name((ms) => new Promise((resolve) => setTimeout(resolve, ms)), "sleep");
|
|
38
|
+
const _TestEventEmitter = class _TestEventEmitter extends import_events.EventEmitter {
|
|
39
|
+
};
|
|
40
|
+
__name(_TestEventEmitter, "TestEventEmitter");
|
|
41
|
+
let TestEventEmitter = _TestEventEmitter;
|
|
42
|
+
(0, import_utils.applyMixins)(TestEventEmitter, [import_utils.AsyncEmitter]);
|
|
43
|
+
const _MemoryPubSubAdapter = class _MemoryPubSubAdapter {
|
|
44
|
+
constructor(options = {}) {
|
|
45
|
+
this.options = options;
|
|
46
|
+
this.emitter = new TestEventEmitter();
|
|
47
|
+
}
|
|
48
|
+
emitter;
|
|
49
|
+
connected = false;
|
|
50
|
+
static create(name, options) {
|
|
51
|
+
if (!name) {
|
|
52
|
+
name = (0, import_utils.uid)();
|
|
53
|
+
}
|
|
54
|
+
if (!this.instances.has(name)) {
|
|
55
|
+
this.instances.set(name, new _MemoryPubSubAdapter(options));
|
|
56
|
+
}
|
|
57
|
+
return this.instances.get(name);
|
|
58
|
+
}
|
|
59
|
+
async connect() {
|
|
60
|
+
this.connected = true;
|
|
61
|
+
}
|
|
62
|
+
async close() {
|
|
63
|
+
this.connected = false;
|
|
64
|
+
}
|
|
65
|
+
async isConnected() {
|
|
66
|
+
return this.connected;
|
|
67
|
+
}
|
|
68
|
+
async subscribe(channel, callback) {
|
|
69
|
+
this.emitter.on(channel, callback);
|
|
70
|
+
}
|
|
71
|
+
async unsubscribe(channel, callback) {
|
|
72
|
+
this.emitter.off(channel, callback);
|
|
73
|
+
}
|
|
74
|
+
async publish(channel, message) {
|
|
75
|
+
console.log(this.connected, { channel, message });
|
|
76
|
+
if (!this.connected) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
await this.emitter.emitAsync(channel, message);
|
|
80
|
+
await this.emitter.emitAsync("__publish__", channel, message);
|
|
81
|
+
if (this.options.debounce) {
|
|
82
|
+
await sleep(Number(this.options.debounce));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async subscribeAll(callback) {
|
|
86
|
+
this.emitter.on("__publish__", callback);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
__name(_MemoryPubSubAdapter, "MemoryPubSubAdapter");
|
|
90
|
+
__publicField(_MemoryPubSubAdapter, "instances", /* @__PURE__ */ new Map());
|
|
91
|
+
let MemoryPubSubAdapter = _MemoryPubSubAdapter;
|
|
92
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
93
|
+
0 && (module.exports = {
|
|
94
|
+
MemoryPubSubAdapter
|
|
95
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
import { DataSource } from '@nocobase/data-source-manager';
|
|
10
|
+
export declare class MockDataSource extends DataSource {
|
|
11
|
+
static testConnection(options?: any): Promise<boolean>;
|
|
12
|
+
load(): Promise<void>;
|
|
13
|
+
createCollectionManager(options?: any): any;
|
|
14
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
15
|
+
var __export = (target, all) => {
|
|
16
|
+
for (var name in all)
|
|
17
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
18
|
+
};
|
|
19
|
+
var __copyProps = (to, from, except, desc) => {
|
|
20
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
21
|
+
for (let key of __getOwnPropNames(from))
|
|
22
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
23
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
24
|
+
}
|
|
25
|
+
return to;
|
|
26
|
+
};
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var mock_data_source_exports = {};
|
|
29
|
+
__export(mock_data_source_exports, {
|
|
30
|
+
MockDataSource: () => MockDataSource
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(mock_data_source_exports);
|
|
33
|
+
var import_data_source_manager = require("@nocobase/data-source-manager");
|
|
34
|
+
var import_test = require("@nocobase/test");
|
|
35
|
+
const _MockDataSource = class _MockDataSource extends import_data_source_manager.DataSource {
|
|
36
|
+
static testConnection(options) {
|
|
37
|
+
return Promise.resolve(true);
|
|
38
|
+
}
|
|
39
|
+
async load() {
|
|
40
|
+
await (0, import_test.waitSecond)(1e3);
|
|
41
|
+
}
|
|
42
|
+
createCollectionManager(options) {
|
|
43
|
+
return new import_data_source_manager.CollectionManager(options);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
__name(_MockDataSource, "MockDataSource");
|
|
47
|
+
let MockDataSource = _MockDataSource;
|
|
48
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
49
|
+
0 && (module.exports = {
|
|
50
|
+
MockDataSource
|
|
51
|
+
});
|
|
@@ -6,18 +6,18 @@
|
|
|
6
6
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
|
-
type
|
|
9
|
+
type IsolatedClusterOptions = {
|
|
10
10
|
script?: string;
|
|
11
11
|
env?: Record<string, any>;
|
|
12
12
|
plugins?: string[];
|
|
13
13
|
instances?: number;
|
|
14
14
|
};
|
|
15
|
-
export declare class
|
|
15
|
+
export declare class MockIsolatedCluster {
|
|
16
16
|
private options;
|
|
17
17
|
private script;
|
|
18
18
|
private processes;
|
|
19
19
|
private mockApp;
|
|
20
|
-
constructor(options?:
|
|
20
|
+
constructor(options?: IsolatedClusterOptions);
|
|
21
21
|
start(): Promise<number[]>;
|
|
22
22
|
stop(): Promise<unknown[]>;
|
|
23
23
|
}
|
|
@@ -35,17 +35,17 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
35
35
|
mod
|
|
36
36
|
));
|
|
37
37
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
38
|
-
var
|
|
39
|
-
__export(
|
|
40
|
-
|
|
38
|
+
var mock_isolated_cluster_exports = {};
|
|
39
|
+
__export(mock_isolated_cluster_exports, {
|
|
40
|
+
MockIsolatedCluster: () => MockIsolatedCluster
|
|
41
41
|
});
|
|
42
|
-
module.exports = __toCommonJS(
|
|
42
|
+
module.exports = __toCommonJS(mock_isolated_cluster_exports);
|
|
43
43
|
var import_node_path = __toESM(require("node:path"));
|
|
44
44
|
var import_node_child_process = require("node:child_process");
|
|
45
45
|
var import_portfinder = require("portfinder");
|
|
46
46
|
var import_utils = require("@nocobase/utils");
|
|
47
47
|
var import_mock_server = require("./mock-server");
|
|
48
|
-
const
|
|
48
|
+
const _MockIsolatedCluster = class _MockIsolatedCluster {
|
|
49
49
|
constructor(options = {}) {
|
|
50
50
|
this.options = options;
|
|
51
51
|
if (options.script) {
|
|
@@ -104,9 +104,9 @@ const _MockCluster = class _MockCluster {
|
|
|
104
104
|
);
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
|
-
__name(
|
|
108
|
-
let
|
|
107
|
+
__name(_MockIsolatedCluster, "MockIsolatedCluster");
|
|
108
|
+
let MockIsolatedCluster = _MockIsolatedCluster;
|
|
109
109
|
// Annotate the CommonJS export names for ESM import in node:
|
|
110
110
|
0 && (module.exports = {
|
|
111
|
-
|
|
111
|
+
MockIsolatedCluster
|
|
112
112
|
});
|
|
@@ -62,22 +62,34 @@ interface ExtendedAgent extends SuperAgentTest {
|
|
|
62
62
|
resource: (name: string, resourceOf?: any) => Resource;
|
|
63
63
|
}
|
|
64
64
|
export declare class MockServer extends Application {
|
|
65
|
+
registerMockDataSource(): void;
|
|
65
66
|
loadAndInstall(options?: any): Promise<void>;
|
|
66
67
|
cleanDb(): Promise<void>;
|
|
67
68
|
quickstart(options?: {
|
|
68
69
|
clean?: boolean;
|
|
69
70
|
}): Promise<void>;
|
|
70
71
|
destroy(options?: any): Promise<void>;
|
|
71
|
-
agent(): ExtendedAgent;
|
|
72
|
+
agent(callback?: any): ExtendedAgent;
|
|
72
73
|
protected createDatabase(options: ApplicationOptions): import("@nocobase/database").MockDatabase;
|
|
73
74
|
}
|
|
74
75
|
export declare function mockServer(options?: ApplicationOptions): MockServer;
|
|
75
76
|
export declare function startMockServer(options?: ApplicationOptions): Promise<MockServer>;
|
|
76
77
|
type BeforeInstallFn = (app: any) => Promise<void>;
|
|
77
|
-
export
|
|
78
|
+
export type MockServerOptions = ApplicationOptions & {
|
|
78
79
|
version?: string;
|
|
79
80
|
beforeInstall?: BeforeInstallFn;
|
|
80
81
|
skipInstall?: boolean;
|
|
81
82
|
skipStart?: boolean;
|
|
82
|
-
}
|
|
83
|
+
};
|
|
84
|
+
export type MockClusterOptions = MockServerOptions & {
|
|
85
|
+
number?: number;
|
|
86
|
+
clusterName?: string;
|
|
87
|
+
appName?: string;
|
|
88
|
+
};
|
|
89
|
+
export type MockCluster = {
|
|
90
|
+
nodes: MockServer[];
|
|
91
|
+
destroy: () => Promise<void>;
|
|
92
|
+
};
|
|
93
|
+
export declare function createMockCluster({ number, clusterName, appName, ...options }?: MockClusterOptions): Promise<MockCluster>;
|
|
94
|
+
export declare function createMockServer(options?: MockServerOptions): Promise<MockServer>;
|
|
83
95
|
export default mockServer;
|
|
@@ -38,6 +38,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
38
38
|
var mock_server_exports = {};
|
|
39
39
|
__export(mock_server_exports, {
|
|
40
40
|
MockServer: () => MockServer,
|
|
41
|
+
createMockCluster: () => createMockCluster,
|
|
41
42
|
createMockServer: () => createMockServer,
|
|
42
43
|
default: () => mock_server_default,
|
|
43
44
|
mockServer: () => mockServer,
|
|
@@ -46,10 +47,19 @@ __export(mock_server_exports, {
|
|
|
46
47
|
module.exports = __toCommonJS(mock_server_exports);
|
|
47
48
|
var import_database = require("@nocobase/database");
|
|
48
49
|
var import_server = require("@nocobase/server");
|
|
50
|
+
var import_utils = require("@nocobase/utils");
|
|
49
51
|
var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
|
|
50
52
|
var import_qs = __toESM(require("qs"));
|
|
51
53
|
var import_supertest = __toESM(require("supertest"));
|
|
54
|
+
var import_memory_pub_sub_adapter = require("./memory-pub-sub-adapter");
|
|
55
|
+
var import_mock_data_source = require("./mock-data-source");
|
|
56
|
+
var import_path = __toESM(require("path"));
|
|
57
|
+
var import_node_process = __toESM(require("node:process"));
|
|
58
|
+
var import_fs = require("fs");
|
|
52
59
|
const _MockServer = class _MockServer extends import_server.Application {
|
|
60
|
+
registerMockDataSource() {
|
|
61
|
+
this.dataSourceManager.factory.register("mock", import_mock_data_source.MockDataSource);
|
|
62
|
+
}
|
|
53
63
|
async loadAndInstall(options = {}) {
|
|
54
64
|
await this.load({ method: "install" });
|
|
55
65
|
if (options.afterLoad) {
|
|
@@ -80,8 +90,8 @@ const _MockServer = class _MockServer extends import_server.Application {
|
|
|
80
90
|
import_server.Gateway.getInstance().destroy();
|
|
81
91
|
await import_server.AppSupervisor.getInstance().destroy();
|
|
82
92
|
}
|
|
83
|
-
agent() {
|
|
84
|
-
const agent = import_supertest.default.agent(this.callback());
|
|
93
|
+
agent(callback) {
|
|
94
|
+
const agent = import_supertest.default.agent(callback || this.callback());
|
|
85
95
|
const prefix = this.resourcer.options.prefix;
|
|
86
96
|
const proxy = new Proxy(agent, {
|
|
87
97
|
get(target, method, receiver) {
|
|
@@ -94,7 +104,7 @@ const _MockServer = class _MockServer extends import_server.Application {
|
|
|
94
104
|
temp: true,
|
|
95
105
|
roleName
|
|
96
106
|
},
|
|
97
|
-
|
|
107
|
+
import_node_process.default.env.APP_KEY,
|
|
98
108
|
{
|
|
99
109
|
expiresIn: "1d"
|
|
100
110
|
}
|
|
@@ -167,6 +177,7 @@ const _MockServer = class _MockServer extends import_server.Application {
|
|
|
167
177
|
__name(_MockServer, "MockServer");
|
|
168
178
|
let MockServer = _MockServer;
|
|
169
179
|
function mockServer(options = {}) {
|
|
180
|
+
var _a;
|
|
170
181
|
if (typeof TextEncoder === "undefined") {
|
|
171
182
|
global.TextEncoder = require("util").TextEncoder;
|
|
172
183
|
}
|
|
@@ -182,10 +193,22 @@ function mockServer(options = {}) {
|
|
|
182
193
|
};
|
|
183
194
|
import_server.PluginManager.findPackagePatched = true;
|
|
184
195
|
}
|
|
185
|
-
const
|
|
196
|
+
const mockServerOptions = {
|
|
186
197
|
acl: false,
|
|
198
|
+
syncMessageManager: {
|
|
199
|
+
debounce: 500
|
|
200
|
+
},
|
|
187
201
|
...options
|
|
188
|
-
}
|
|
202
|
+
};
|
|
203
|
+
const app = new MockServer(mockServerOptions);
|
|
204
|
+
const basename = (_a = app.options.pubSubManager) == null ? void 0 : _a.channelPrefix;
|
|
205
|
+
if (basename) {
|
|
206
|
+
app.pubSubManager.setAdapter(
|
|
207
|
+
import_memory_pub_sub_adapter.MemoryPubSubAdapter.create(basename, {
|
|
208
|
+
debounce: 500
|
|
209
|
+
})
|
|
210
|
+
);
|
|
211
|
+
}
|
|
189
212
|
return app;
|
|
190
213
|
}
|
|
191
214
|
__name(mockServer, "mockServer");
|
|
@@ -195,7 +218,50 @@ async function startMockServer(options = {}) {
|
|
|
195
218
|
return app;
|
|
196
219
|
}
|
|
197
220
|
__name(startMockServer, "startMockServer");
|
|
221
|
+
async function createMockCluster({
|
|
222
|
+
number = 2,
|
|
223
|
+
clusterName = `cluster_${(0, import_utils.uid)()}`,
|
|
224
|
+
appName = `app_${(0, import_utils.uid)()}`,
|
|
225
|
+
...options
|
|
226
|
+
} = {}) {
|
|
227
|
+
const nodes = [];
|
|
228
|
+
let dbOptions;
|
|
229
|
+
for (let i = 0; i < number; i++) {
|
|
230
|
+
if (dbOptions) {
|
|
231
|
+
options["database"] = {
|
|
232
|
+
...dbOptions
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const app = await createMockServer({
|
|
236
|
+
...options,
|
|
237
|
+
skipSupervisor: true,
|
|
238
|
+
name: clusterName + "_" + appName,
|
|
239
|
+
pubSubManager: {
|
|
240
|
+
channelPrefix: clusterName
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
if (!dbOptions) {
|
|
244
|
+
dbOptions = app.db.options;
|
|
245
|
+
}
|
|
246
|
+
nodes.push(app);
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
nodes,
|
|
250
|
+
async destroy() {
|
|
251
|
+
for (const node of nodes) {
|
|
252
|
+
await node.destroy();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
__name(createMockCluster, "createMockCluster");
|
|
198
258
|
async function createMockServer(options = {}) {
|
|
259
|
+
const cachePath = import_path.default.join(import_node_process.default.cwd(), "storage", "cache");
|
|
260
|
+
try {
|
|
261
|
+
await import_fs.promises.rm(cachePath, { recursive: true, force: true });
|
|
262
|
+
await import_fs.promises.mkdir(cachePath, { recursive: true });
|
|
263
|
+
} catch (e) {
|
|
264
|
+
}
|
|
199
265
|
const { version, beforeInstall, skipInstall, skipStart, ...others } = options;
|
|
200
266
|
const app = mockServer(others);
|
|
201
267
|
if (!skipInstall) {
|
|
@@ -217,6 +283,7 @@ var mock_server_default = mockServer;
|
|
|
217
283
|
// Annotate the CommonJS export names for ESM import in node:
|
|
218
284
|
0 && (module.exports = {
|
|
219
285
|
MockServer,
|
|
286
|
+
createMockCluster,
|
|
220
287
|
createMockServer,
|
|
221
288
|
mockServer,
|
|
222
289
|
startMockServer
|