@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.
@@ -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,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 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,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 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,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
- process.env.APP_KEY,
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 app = new MockServer({
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