@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.
@@ -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 { mockDatabase, MockDatabase } from '@nocobase/database';
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 ClusterOptions = {
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 MockCluster {
15
+ export declare class MockIsolatedCluster {
16
16
  private options;
17
17
  private script;
18
18
  private processes;
19
19
  private mockApp;
20
- constructor(options?: ClusterOptions);
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 declare function createMockServer(options?: ApplicationOptions & {
78
+ export type MockServerOptions = ApplicationOptions & {
78
79
  version?: string;
79
80
  beforeInstall?: BeforeInstallFn;
80
81
  skipInstall?: boolean;
81
82
  skipStart?: boolean;
82
- }): Promise<any>;
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 import_react2 = require("@testing-library/react");
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, import_react2.render)(/* @__PURE__ */ import_react.default.createElement(App, null));
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 import_user_event.default.hover(container.querySelector('[aria-label^="designer-schema-settings-"]'));
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");
@@ -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();
@@ -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 { mockDatabase, MockDatabase } from '@nocobase/database';
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;
@@ -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("./mock-server"),
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 ClusterOptions = {
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 MockCluster {
15
+ export declare class MockIsolatedCluster {
16
16
  private options;
17
17
  private script;
18
18
  private processes;
19
19
  private mockApp;
20
- constructor(options?: ClusterOptions);
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 mock_cluster_exports = {};
39
- __export(mock_cluster_exports, {
40
- MockCluster: () => MockCluster
38
+ var mock_isolated_cluster_exports = {};
39
+ __export(mock_isolated_cluster_exports, {
40
+ MockIsolatedCluster: () => MockIsolatedCluster
41
41
  });
42
- module.exports = __toCommonJS(mock_cluster_exports);
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 _MockCluster = class _MockCluster {
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(_MockCluster, "MockCluster");
108
- let MockCluster = _MockCluster;
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
- MockCluster
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 declare function createMockServer(options?: ApplicationOptions & {
78
+ export type MockServerOptions = ApplicationOptions & {
78
79
  version?: string;
79
80
  beforeInstall?: BeforeInstallFn;
80
81
  skipInstall?: boolean;
81
82
  skipStart?: boolean;
82
- }): Promise<any>;
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 app = new MockServer({
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.2",
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.2",
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": "8a9c29fdac5c6295dcc7abf00c3fa81bd9e01a36"
79
+ "gitHead": "f5ca1548fe8d8eda32699137434306c44a5df84c"
80
80
  }