@nocobase/test 1.5.0-beta.2 → 1.5.0-beta.4
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 +14 -2
- 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 +14 -2
- package/lib/server/mock-server.js +60 -2
- 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,6 +62,7 @@ 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?: {
|
|
@@ -74,10 +75,21 @@ export declare class MockServer extends Application {
|
|
|
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,6 +62,7 @@ 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?: {
|
|
@@ -74,10 +75,21 @@ export declare class MockServer extends Application {
|
|
|
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,16 @@ __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");
|
|
52
56
|
const _MockServer = class _MockServer extends import_server.Application {
|
|
57
|
+
registerMockDataSource() {
|
|
58
|
+
this.dataSourceManager.factory.register("mock", import_mock_data_source.MockDataSource);
|
|
59
|
+
}
|
|
53
60
|
async loadAndInstall(options = {}) {
|
|
54
61
|
await this.load({ method: "install" });
|
|
55
62
|
if (options.afterLoad) {
|
|
@@ -167,6 +174,7 @@ const _MockServer = class _MockServer extends import_server.Application {
|
|
|
167
174
|
__name(_MockServer, "MockServer");
|
|
168
175
|
let MockServer = _MockServer;
|
|
169
176
|
function mockServer(options = {}) {
|
|
177
|
+
var _a;
|
|
170
178
|
if (typeof TextEncoder === "undefined") {
|
|
171
179
|
global.TextEncoder = require("util").TextEncoder;
|
|
172
180
|
}
|
|
@@ -182,10 +190,22 @@ function mockServer(options = {}) {
|
|
|
182
190
|
};
|
|
183
191
|
import_server.PluginManager.findPackagePatched = true;
|
|
184
192
|
}
|
|
185
|
-
const
|
|
193
|
+
const mockServerOptions = {
|
|
186
194
|
acl: false,
|
|
195
|
+
syncMessageManager: {
|
|
196
|
+
debounce: 500
|
|
197
|
+
},
|
|
187
198
|
...options
|
|
188
|
-
}
|
|
199
|
+
};
|
|
200
|
+
const app = new MockServer(mockServerOptions);
|
|
201
|
+
const basename = (_a = app.options.pubSubManager) == null ? void 0 : _a.channelPrefix;
|
|
202
|
+
if (basename) {
|
|
203
|
+
app.pubSubManager.setAdapter(
|
|
204
|
+
import_memory_pub_sub_adapter.MemoryPubSubAdapter.create(basename, {
|
|
205
|
+
debounce: 500
|
|
206
|
+
})
|
|
207
|
+
);
|
|
208
|
+
}
|
|
189
209
|
return app;
|
|
190
210
|
}
|
|
191
211
|
__name(mockServer, "mockServer");
|
|
@@ -195,6 +215,43 @@ async function startMockServer(options = {}) {
|
|
|
195
215
|
return app;
|
|
196
216
|
}
|
|
197
217
|
__name(startMockServer, "startMockServer");
|
|
218
|
+
async function createMockCluster({
|
|
219
|
+
number = 2,
|
|
220
|
+
clusterName = `cluster_${(0, import_utils.uid)()}`,
|
|
221
|
+
appName = `app_${(0, import_utils.uid)()}`,
|
|
222
|
+
...options
|
|
223
|
+
} = {}) {
|
|
224
|
+
const nodes = [];
|
|
225
|
+
let dbOptions;
|
|
226
|
+
for (let i = 0; i < number; i++) {
|
|
227
|
+
if (dbOptions) {
|
|
228
|
+
options["database"] = {
|
|
229
|
+
...dbOptions
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const app = await createMockServer({
|
|
233
|
+
...options,
|
|
234
|
+
skipSupervisor: true,
|
|
235
|
+
name: clusterName + "_" + appName,
|
|
236
|
+
pubSubManager: {
|
|
237
|
+
channelPrefix: clusterName
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
if (!dbOptions) {
|
|
241
|
+
dbOptions = app.db.options;
|
|
242
|
+
}
|
|
243
|
+
nodes.push(app);
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
nodes,
|
|
247
|
+
async destroy() {
|
|
248
|
+
for (const node of nodes) {
|
|
249
|
+
await node.destroy();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
__name(createMockCluster, "createMockCluster");
|
|
198
255
|
async function createMockServer(options = {}) {
|
|
199
256
|
const { version, beforeInstall, skipInstall, skipStart, ...others } = options;
|
|
200
257
|
const app = mockServer(others);
|
|
@@ -217,6 +274,7 @@ var mock_server_default = mockServer;
|
|
|
217
274
|
// Annotate the CommonJS export names for ESM import in node:
|
|
218
275
|
0 && (module.exports = {
|
|
219
276
|
MockServer,
|
|
277
|
+
createMockCluster,
|
|
220
278
|
createMockServer,
|
|
221
279
|
mockServer,
|
|
222
280
|
startMockServer
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocobase/test",
|
|
3
|
-
"version": "1.5.0-beta.
|
|
3
|
+
"version": "1.5.0-beta.4",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"module": "./src/index.ts",
|
|
6
6
|
"types": "./lib/index.d.ts",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@faker-js/faker": "8.1.0",
|
|
54
|
-
"@nocobase/server": "1.5.0-beta.
|
|
54
|
+
"@nocobase/server": "1.5.0-beta.4",
|
|
55
55
|
"@playwright/test": "^1.45.3",
|
|
56
56
|
"@testing-library/jest-dom": "^6.4.2",
|
|
57
57
|
"@testing-library/react": "^14.0.0",
|
|
@@ -76,5 +76,5 @@
|
|
|
76
76
|
"vitest-dom": "^0.1.1",
|
|
77
77
|
"ws": "^8.13.0"
|
|
78
78
|
},
|
|
79
|
-
"gitHead": "
|
|
79
|
+
"gitHead": "f5ca1548fe8d8eda32699137434306c44a5df84c"
|
|
80
80
|
}
|