@acmekit/test-utils 2.13.81 → 2.13.83
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/dist/acmekit-test-runner-utils/bootstrap-app.d.ts +3 -1
- package/dist/acmekit-test-runner-utils/bootstrap-app.d.ts.map +1 -1
- package/dist/acmekit-test-runner-utils/bootstrap-app.js +6 -2
- package/dist/acmekit-test-runner-utils/bootstrap-app.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-test-runner.d.ts +54 -0
- package/dist/integration-test-runner.d.ts.map +1 -0
- package/dist/integration-test-runner.js +193 -0
- package/dist/integration-test-runner.js.map +1 -0
- package/dist/pipeline/errors.d.ts +13 -0
- package/dist/pipeline/errors.d.ts.map +1 -0
- package/dist/pipeline/errors.js +25 -0
- package/dist/pipeline/errors.js.map +1 -0
- package/dist/pipeline/pipeline.d.ts +31 -0
- package/dist/pipeline/pipeline.d.ts.map +1 -0
- package/dist/pipeline/pipeline.js +92 -0
- package/dist/pipeline/pipeline.js.map +1 -0
- package/dist/pipeline/stages/config.d.ts +23 -0
- package/dist/pipeline/stages/config.d.ts.map +1 -0
- package/dist/pipeline/stages/config.js +148 -0
- package/dist/pipeline/stages/config.js.map +1 -0
- package/dist/pipeline/stages/database.d.ts +28 -0
- package/dist/pipeline/stages/database.d.ts.map +1 -0
- package/dist/pipeline/stages/database.js +276 -0
- package/dist/pipeline/stages/database.js.map +1 -0
- package/dist/pipeline/stages/http.d.ts +18 -0
- package/dist/pipeline/stages/http.d.ts.map +1 -0
- package/dist/pipeline/stages/http.js +67 -0
- package/dist/pipeline/stages/http.js.map +1 -0
- package/dist/pipeline/stages/module.d.ts +20 -0
- package/dist/pipeline/stages/module.d.ts.map +1 -0
- package/dist/pipeline/stages/module.js +104 -0
- package/dist/pipeline/stages/module.js.map +1 -0
- package/dist/pipeline/stages/plugin-resources.d.ts +13 -0
- package/dist/pipeline/stages/plugin-resources.d.ts.map +1 -0
- package/dist/pipeline/stages/plugin-resources.js +94 -0
- package/dist/pipeline/stages/plugin-resources.js.map +1 -0
- package/dist/pipeline/stages/proxy.d.ts +23 -0
- package/dist/pipeline/stages/proxy.d.ts.map +1 -0
- package/dist/pipeline/stages/proxy.js +99 -0
- package/dist/pipeline/stages/proxy.js.map +1 -0
- package/dist/pipeline/types.d.ts +133 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +29 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/plugin-test-runner.d.ts.map +1 -1
- package/dist/plugin-test-runner.js +27 -1
- package/dist/plugin-test-runner.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { AcmeKitContainer } from "@acmekit/framework/types";
|
|
2
|
-
export declare function startApp({ cwd, env, }?: {
|
|
2
|
+
export declare function startApp({ cwd, env, syntheticConfig, isAcmeKitProject, }?: {
|
|
3
3
|
cwd?: string;
|
|
4
4
|
env?: Record<any, any>;
|
|
5
|
+
syntheticConfig?: Record<string, any>;
|
|
6
|
+
isAcmeKitProject?: boolean;
|
|
5
7
|
}): Promise<{
|
|
6
8
|
shutdown: () => Promise<void>;
|
|
7
9
|
container: AcmeKitContainer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-app.d.ts","sourceRoot":"","sources":["../../src/acmekit-test-runner-utils/bootstrap-app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"bootstrap-app.d.ts","sourceRoot":"","sources":["../../src/acmekit-test-runner-utils/bootstrap-app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAkD3D,wBAAsB,QAAQ,CAAC,EAC7B,GAAG,EACH,GAAQ,EACR,eAAe,EACf,gBAAgB,GACjB,GAAE;IACD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CACtB,GAAG,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,SAAS,EAAE,gBAAgB,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb,CAAC,CAmFD"}
|
|
@@ -10,7 +10,7 @@ const express_1 = __importDefault(require("express"));
|
|
|
10
10
|
const get_port_1 = __importDefault(require("get-port"));
|
|
11
11
|
const path_1 = require("path");
|
|
12
12
|
const utils_2 = require("./utils");
|
|
13
|
-
async function bootstrapApp({ cwd, env = {}, } = {}) {
|
|
13
|
+
async function bootstrapApp({ cwd, env = {}, syntheticConfig, isAcmeKitProject, } = {}) {
|
|
14
14
|
const app = (0, express_1.default)();
|
|
15
15
|
(0, utils_2.applyEnvVarsToProcess)(env);
|
|
16
16
|
// Register a health check endpoint
|
|
@@ -22,6 +22,8 @@ async function bootstrapApp({ cwd, env = {}, } = {}) {
|
|
|
22
22
|
const { container, shutdown } = await loaders({
|
|
23
23
|
directory: (0, path_1.resolve)(cwd || process.cwd()),
|
|
24
24
|
expressApp: app,
|
|
25
|
+
...(syntheticConfig ? { syntheticConfig } : {}),
|
|
26
|
+
...(isAcmeKitProject !== undefined ? { isAcmeKitProject } : {}),
|
|
25
27
|
});
|
|
26
28
|
const PORT = process.env.PORT ? parseInt(process.env.PORT) : await (0, get_port_1.default)();
|
|
27
29
|
return {
|
|
@@ -36,7 +38,7 @@ async function bootstrapApp({ cwd, env = {}, } = {}) {
|
|
|
36
38
|
throw error;
|
|
37
39
|
}
|
|
38
40
|
}
|
|
39
|
-
async function startApp({ cwd, env = {}, } = {}) {
|
|
41
|
+
async function startApp({ cwd, env = {}, syntheticConfig, isAcmeKitProject, } = {}) {
|
|
40
42
|
let expressServer;
|
|
41
43
|
let acmekitShutdown = async () => void 0;
|
|
42
44
|
let container;
|
|
@@ -44,6 +46,8 @@ async function startApp({ cwd, env = {}, } = {}) {
|
|
|
44
46
|
const { app, port, container: appContainer, shutdown: appShutdown, } = await bootstrapApp({
|
|
45
47
|
cwd,
|
|
46
48
|
env,
|
|
49
|
+
syntheticConfig,
|
|
50
|
+
isAcmeKitProject,
|
|
47
51
|
});
|
|
48
52
|
container = appContainer;
|
|
49
53
|
acmekitShutdown = appShutdown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-app.js","sourceRoot":"","sources":["../../src/acmekit-test-runner-utils/bootstrap-app.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"bootstrap-app.js","sourceRoot":"","sources":["../../src/acmekit-test-runner-utils/bootstrap-app.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ export * from "./acmekit-test-runner-utils";
|
|
|
7
7
|
export { default as MockEventBusService } from "./mock-event-bus-service";
|
|
8
8
|
export * from "./module-test-runner";
|
|
9
9
|
export * from "./plugin-test-runner";
|
|
10
|
+
export * from "./integration-test-runner";
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,iBAAiB,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,cAAc,MAAM,UAAU,CAAA;AAC1C,cAAc,gBAAgB,CAAA;AAC9B,OAAO,KAAK,SAAS,MAAM,QAAQ,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACzE,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,iBAAiB,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,cAAc,MAAM,UAAU,CAAA;AAC1C,cAAc,gBAAgB,CAAA;AAC9B,OAAO,KAAK,SAAS,MAAM,QAAQ,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACzE,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,2BAA2B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -50,4 +50,5 @@ var mock_event_bus_service_1 = require("./mock-event-bus-service");
|
|
|
50
50
|
Object.defineProperty(exports, "MockEventBusService", { enumerable: true, get: function () { return __importDefault(mock_event_bus_service_1).default; } });
|
|
51
51
|
__exportStar(require("./module-test-runner"), exports);
|
|
52
52
|
__exportStar(require("./plugin-test-runner"), exports);
|
|
53
|
+
__exportStar(require("./integration-test-runner"), exports);
|
|
53
54
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gEAA+C;AAC/C,2DAA0C;AAC1C,iDAA8B;AAC9B,oDAAmC;AACnC,wDAAqC;AACrC,8DAA2C;AAC3C,mEAAyE;AAAhE,8IAAA,OAAO,OAAuB;AACvC,uDAAoC;AACpC,uDAAoC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gEAA+C;AAC/C,2DAA0C;AAC1C,iDAA8B;AAC9B,oDAAmC;AACnC,wDAAqC;AACrC,8DAA2C;AAC3C,mEAAyE;AAAhE,8IAAA,OAAO,OAAuB;AACvC,uDAAoC;AACpC,uDAAoC;AACpC,4DAAyC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { TestRunnerError } from "./pipeline/errors";
|
|
2
|
+
import { IntegrationTestOptions, IntegrationTestRunnerConfig } from "./pipeline/types";
|
|
3
|
+
export { IntegrationTestOptions, IntegrationTestRunnerConfig };
|
|
4
|
+
export { TestRunnerError };
|
|
5
|
+
/**
|
|
6
|
+
* Unified integration test runner for AcmeKit.
|
|
7
|
+
*
|
|
8
|
+
* Replaces acmekitIntegrationTestRunner, pluginIntegrationTestRunner,
|
|
9
|
+
* and moduleIntegrationTestRunner with a single function.
|
|
10
|
+
*
|
|
11
|
+
* @example App mode (HTTP tests):
|
|
12
|
+
* ```ts
|
|
13
|
+
* integrationTestRunner({
|
|
14
|
+
* mode: "app",
|
|
15
|
+
* cwd: __dirname,
|
|
16
|
+
* testSuite: ({ api, getContainer }) => {
|
|
17
|
+
* it("should respond", async () => {
|
|
18
|
+
* const res = await api.get("/health")
|
|
19
|
+
* expect(res.status).toBe(200)
|
|
20
|
+
* })
|
|
21
|
+
* }
|
|
22
|
+
* })
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example Plugin mode (container tests):
|
|
26
|
+
* ```ts
|
|
27
|
+
* integrationTestRunner({
|
|
28
|
+
* mode: "plugin",
|
|
29
|
+
* pluginPath: process.cwd(),
|
|
30
|
+
* testSuite: ({ container }) => {
|
|
31
|
+
* it("should resolve service", () => {
|
|
32
|
+
* expect(container.resolve(MY_MODULE)).toBeDefined()
|
|
33
|
+
* })
|
|
34
|
+
* }
|
|
35
|
+
* })
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @example Module mode:
|
|
39
|
+
* ```ts
|
|
40
|
+
* integrationTestRunner({
|
|
41
|
+
* mode: "module",
|
|
42
|
+
* moduleName: "blog",
|
|
43
|
+
* resolve: "./src/modules/blog",
|
|
44
|
+
* testSuite: ({ service }) => {
|
|
45
|
+
* it("should create", async () => {
|
|
46
|
+
* const result = await service.createBlogPosts([{ title: "Hi" }])
|
|
47
|
+
* expect(result).toHaveLength(1)
|
|
48
|
+
* })
|
|
49
|
+
* }
|
|
50
|
+
* })
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function integrationTestRunner<TService = any>(config: IntegrationTestRunnerConfig<TService>): void;
|
|
54
|
+
//# sourceMappingURL=integration-test-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-test-runner.d.ts","sourceRoot":"","sources":["../src/integration-test-runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAQnD,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAG5B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,CAAA;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,GAAG,GAAG,EAClD,MAAM,EAAE,2BAA2B,CAAC,QAAQ,CAAC,QAmJ9C"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestRunnerError = void 0;
|
|
4
|
+
exports.integrationTestRunner = integrationTestRunner;
|
|
5
|
+
const database_1 = require("./database");
|
|
6
|
+
const errors_1 = require("./pipeline/errors");
|
|
7
|
+
Object.defineProperty(exports, "TestRunnerError", { enumerable: true, get: function () { return errors_1.TestRunnerError; } });
|
|
8
|
+
const pipeline_1 = require("./pipeline/pipeline");
|
|
9
|
+
const config_1 = require("./pipeline/stages/config");
|
|
10
|
+
const database_2 = require("./pipeline/stages/database");
|
|
11
|
+
const http_1 = require("./pipeline/stages/http");
|
|
12
|
+
const module_1 = require("./pipeline/stages/module");
|
|
13
|
+
const plugin_resources_1 = require("./pipeline/stages/plugin-resources");
|
|
14
|
+
const proxy_1 = require("./pipeline/stages/proxy");
|
|
15
|
+
const types_1 = require("./pipeline/types");
|
|
16
|
+
/**
|
|
17
|
+
* Unified integration test runner for AcmeKit.
|
|
18
|
+
*
|
|
19
|
+
* Replaces acmekitIntegrationTestRunner, pluginIntegrationTestRunner,
|
|
20
|
+
* and moduleIntegrationTestRunner with a single function.
|
|
21
|
+
*
|
|
22
|
+
* @example App mode (HTTP tests):
|
|
23
|
+
* ```ts
|
|
24
|
+
* integrationTestRunner({
|
|
25
|
+
* mode: "app",
|
|
26
|
+
* cwd: __dirname,
|
|
27
|
+
* testSuite: ({ api, getContainer }) => {
|
|
28
|
+
* it("should respond", async () => {
|
|
29
|
+
* const res = await api.get("/health")
|
|
30
|
+
* expect(res.status).toBe(200)
|
|
31
|
+
* })
|
|
32
|
+
* }
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @example Plugin mode (container tests):
|
|
37
|
+
* ```ts
|
|
38
|
+
* integrationTestRunner({
|
|
39
|
+
* mode: "plugin",
|
|
40
|
+
* pluginPath: process.cwd(),
|
|
41
|
+
* testSuite: ({ container }) => {
|
|
42
|
+
* it("should resolve service", () => {
|
|
43
|
+
* expect(container.resolve(MY_MODULE)).toBeDefined()
|
|
44
|
+
* })
|
|
45
|
+
* }
|
|
46
|
+
* })
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @example Module mode:
|
|
50
|
+
* ```ts
|
|
51
|
+
* integrationTestRunner({
|
|
52
|
+
* mode: "module",
|
|
53
|
+
* moduleName: "blog",
|
|
54
|
+
* resolve: "./src/modules/blog",
|
|
55
|
+
* testSuite: ({ service }) => {
|
|
56
|
+
* it("should create", async () => {
|
|
57
|
+
* const result = await service.createBlogPosts([{ title: "Hi" }])
|
|
58
|
+
* expect(result).toHaveLength(1)
|
|
59
|
+
* })
|
|
60
|
+
* }
|
|
61
|
+
* })
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
function integrationTestRunner(config) {
|
|
65
|
+
// ── Validate ──
|
|
66
|
+
(0, types_1.validateConfig)(config);
|
|
67
|
+
// ── Resolve defaults ──
|
|
68
|
+
const mode = config.mode;
|
|
69
|
+
const http = config.http ?? mode === "app";
|
|
70
|
+
const cwd = config.cwd ?? config.acmekitConfigFile ?? process.cwd();
|
|
71
|
+
// Resolve dbName eagerly (same as old runners' constructors)
|
|
72
|
+
const tempName = parseInt(process.env.JEST_WORKER_ID || "1");
|
|
73
|
+
let dbName = config.dbName ?? "";
|
|
74
|
+
if (!dbName) {
|
|
75
|
+
if (mode === "app") {
|
|
76
|
+
const { ulid } = require("ulid");
|
|
77
|
+
dbName = `acmekit-${(config.moduleName ?? ulid()).toLowerCase()}-integration-${tempName}`;
|
|
78
|
+
}
|
|
79
|
+
else if (mode === "plugin") {
|
|
80
|
+
const safeName = (config.pluginPath ?? "unknown")
|
|
81
|
+
.replace(/[^a-z0-9]/gi, "-")
|
|
82
|
+
.toLowerCase()
|
|
83
|
+
.slice(0, 30);
|
|
84
|
+
dbName = `acmekit-plugin-${safeName}-integ-${tempName}`;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const safeName = (config.moduleName ?? "test").toLowerCase().slice(0, 30);
|
|
88
|
+
dbName = `acmekit-${safeName}-integ-${tempName}`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// ── Build context ──
|
|
92
|
+
const ctx = {
|
|
93
|
+
mode,
|
|
94
|
+
http,
|
|
95
|
+
cwd,
|
|
96
|
+
dbConfig: {
|
|
97
|
+
dbName,
|
|
98
|
+
clientUrl: (0, database_1.getDatabaseURL)(dbName),
|
|
99
|
+
schema: config.schema ?? "public",
|
|
100
|
+
debug: config.debug ?? false,
|
|
101
|
+
},
|
|
102
|
+
env: config.env ?? {},
|
|
103
|
+
pluginPath: config.pluginPath,
|
|
104
|
+
pluginOptions: config.pluginOptions,
|
|
105
|
+
additionalModules: config.additionalModules,
|
|
106
|
+
moduleName: config.moduleName,
|
|
107
|
+
moduleResolve: config.resolve,
|
|
108
|
+
moduleModels: config.moduleModels,
|
|
109
|
+
moduleOptions: config.moduleOptions,
|
|
110
|
+
moduleDependencies: config.moduleDependencies,
|
|
111
|
+
joinerConfig: config.joinerConfig,
|
|
112
|
+
injectedDependencies: config.injectedDependencies,
|
|
113
|
+
disableAutoTeardown: config.disableAutoTeardown,
|
|
114
|
+
// Runtime state (set by stages)
|
|
115
|
+
syntheticConfig: null,
|
|
116
|
+
pgConnection: null,
|
|
117
|
+
dbUtils: null,
|
|
118
|
+
MikroOrmWrapper: null,
|
|
119
|
+
discoveredModels: [],
|
|
120
|
+
container: null,
|
|
121
|
+
acmekitApp: null,
|
|
122
|
+
moduleService: null,
|
|
123
|
+
apiUtils: null,
|
|
124
|
+
expressPort: null,
|
|
125
|
+
loadedApplication: null,
|
|
126
|
+
shutdown: [],
|
|
127
|
+
plugins: [],
|
|
128
|
+
allModulesConfig: {},
|
|
129
|
+
moduleOptionsConfig: null,
|
|
130
|
+
hooks: config.hooks ?? {},
|
|
131
|
+
};
|
|
132
|
+
// ── Compose pipeline ──
|
|
133
|
+
const pipeline = new pipeline_1.TestBootstrapPipeline(ctx);
|
|
134
|
+
const proxyStage = new proxy_1.ProxyStage(ctx);
|
|
135
|
+
// ConfigStage always runs first (resolves config)
|
|
136
|
+
pipeline.use(new config_1.ConfigStage());
|
|
137
|
+
// DatabaseStage sets up DB based on mode
|
|
138
|
+
pipeline.use(new database_2.DatabaseStage());
|
|
139
|
+
// ModuleStage initializes modules (skipped for app+http, handled by HttpStage)
|
|
140
|
+
pipeline.use(new module_1.ModuleStage());
|
|
141
|
+
// HttpStage starts Express when http: true
|
|
142
|
+
if (http) {
|
|
143
|
+
pipeline.use(new http_1.HttpStage());
|
|
144
|
+
}
|
|
145
|
+
// PluginResourceStage loads subscribers/workflows/jobs for plugins
|
|
146
|
+
// Skip when http: true — HttpStage boots the full framework which loads resources
|
|
147
|
+
if (mode === "plugin" && !http) {
|
|
148
|
+
pipeline.use(new plugin_resources_1.PluginResourceStage());
|
|
149
|
+
}
|
|
150
|
+
// ProxyStage creates fixture proxies (always last)
|
|
151
|
+
pipeline.use(proxyStage);
|
|
152
|
+
// ── Register process handlers ──
|
|
153
|
+
const handleSignal = async () => {
|
|
154
|
+
await pipeline.destroy();
|
|
155
|
+
process.exit(0);
|
|
156
|
+
};
|
|
157
|
+
pipeline.registerSignalHandler("SIGTERM", handleSignal);
|
|
158
|
+
pipeline.registerSignalHandler("SIGINT", handleSignal);
|
|
159
|
+
// ── Wire Jest lifecycle ──
|
|
160
|
+
return describe("", () => {
|
|
161
|
+
beforeAll(async () => {
|
|
162
|
+
if (ctx.hooks.beforeSetup) {
|
|
163
|
+
await ctx.hooks.beforeSetup();
|
|
164
|
+
}
|
|
165
|
+
await pipeline.setup();
|
|
166
|
+
if (ctx.hooks.afterSetup) {
|
|
167
|
+
await ctx.hooks.afterSetup({
|
|
168
|
+
container: ctx.container,
|
|
169
|
+
acmekitApp: ctx.acmekitApp,
|
|
170
|
+
api: ctx.apiUtils,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
beforeEach(async () => {
|
|
175
|
+
if (ctx.hooks.beforeReset) {
|
|
176
|
+
await ctx.hooks.beforeReset();
|
|
177
|
+
}
|
|
178
|
+
await pipeline.reset();
|
|
179
|
+
if (ctx.hooks.afterReset) {
|
|
180
|
+
await ctx.hooks.afterReset();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
afterAll(async () => {
|
|
184
|
+
await pipeline.destroy();
|
|
185
|
+
if (global.gc) {
|
|
186
|
+
global.gc();
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
// Run test suite with proxy options
|
|
190
|
+
config.testSuite(proxyStage.getOptions());
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=integration-test-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-test-runner.js","sourceRoot":"","sources":["../src/integration-test-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error with stage context for clear test diagnostics.
|
|
3
|
+
*
|
|
4
|
+
* Instead of: TypeError: Cannot read properties of undefined (reading '__joinerConfig')
|
|
5
|
+
* Shows: [ConfigStage] setup failed: Could not load module — file not found. Did you build?
|
|
6
|
+
*/
|
|
7
|
+
export declare class TestRunnerError extends Error {
|
|
8
|
+
readonly stage: string;
|
|
9
|
+
readonly phase: "setup" | "reset" | "destroy";
|
|
10
|
+
readonly cause?: Error;
|
|
11
|
+
constructor(message: string, stage: string, phase: "setup" | "reset" | "destroy", cause?: Error);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/pipeline/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,KAAK,EAAE,MAAM,CAAA;IAC7B,SAAgB,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;IACpD,SAAgB,KAAK,CAAC,EAAE,KAAK,CAAA;gBAG3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,EACpC,KAAK,CAAC,EAAE,KAAK;CAchB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestRunnerError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Error with stage context for clear test diagnostics.
|
|
6
|
+
*
|
|
7
|
+
* Instead of: TypeError: Cannot read properties of undefined (reading '__joinerConfig')
|
|
8
|
+
* Shows: [ConfigStage] setup failed: Could not load module — file not found. Did you build?
|
|
9
|
+
*/
|
|
10
|
+
class TestRunnerError extends Error {
|
|
11
|
+
constructor(message, stage, phase, cause) {
|
|
12
|
+
const fullMessage = `[${stage}] ${phase} failed: ${message}`;
|
|
13
|
+
super(fullMessage);
|
|
14
|
+
this.name = "TestRunnerError";
|
|
15
|
+
this.stage = stage;
|
|
16
|
+
this.phase = phase;
|
|
17
|
+
this.cause = cause;
|
|
18
|
+
// Preserve original stack if available
|
|
19
|
+
if (cause?.stack) {
|
|
20
|
+
this.stack = `${this.stack}\n\nCaused by: ${cause.stack}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.TestRunnerError = TestRunnerError;
|
|
25
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/pipeline/errors.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,MAAa,eAAgB,SAAQ,KAAK;IAKxC,YACE,OAAe,EACf,KAAa,EACb,KAAoC,EACpC,KAAa;QAEb,MAAM,WAAW,GAAG,IAAI,KAAK,KAAK,KAAK,YAAY,OAAO,EAAE,CAAA;QAC5D,KAAK,CAAC,WAAW,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAElB,uCAAuC;QACvC,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,kBAAkB,KAAK,CAAC,KAAK,EAAE,CAAA;QAC3D,CAAC;IACH,CAAC;CACF;AAvBD,0CAuBC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BootstrapStage, PipelineContext } from "./types";
|
|
2
|
+
export declare class TestBootstrapPipeline {
|
|
3
|
+
private ctx;
|
|
4
|
+
private stages;
|
|
5
|
+
private isFirstReset;
|
|
6
|
+
private destroyed;
|
|
7
|
+
private signalHandlers;
|
|
8
|
+
constructor(ctx: PipelineContext);
|
|
9
|
+
/**
|
|
10
|
+
* Add a stage to the pipeline. Stages execute in order added.
|
|
11
|
+
*/
|
|
12
|
+
use(stage: BootstrapStage): this;
|
|
13
|
+
/**
|
|
14
|
+
* Register a process signal handler that will be cleaned up on destroy.
|
|
15
|
+
*/
|
|
16
|
+
registerSignalHandler(signal: string, handler: () => Promise<void>): void;
|
|
17
|
+
/**
|
|
18
|
+
* Run all stages' setup() in order. Called once in beforeAll.
|
|
19
|
+
*/
|
|
20
|
+
setup(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Reset state between tests. Called in beforeEach.
|
|
23
|
+
* Skips the first call (state is already fresh from setup).
|
|
24
|
+
*/
|
|
25
|
+
reset(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Tear down all stages in reverse order. Called once in afterAll.
|
|
28
|
+
*/
|
|
29
|
+
destroy(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAEzD,qBAAa,qBAAqB;IAOpB,OAAO,CAAC,GAAG;IANvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAO;IAC3B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAClB;gBAEgB,GAAG,EAAE,eAAe;IAExC;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAKhC;;OAEG;IACH,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC3B,IAAI;IAKP;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5B;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B/B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestBootstrapPipeline = void 0;
|
|
4
|
+
const errors_1 = require("./errors");
|
|
5
|
+
class TestBootstrapPipeline {
|
|
6
|
+
constructor(ctx) {
|
|
7
|
+
this.ctx = ctx;
|
|
8
|
+
this.stages = [];
|
|
9
|
+
this.isFirstReset = true;
|
|
10
|
+
this.destroyed = false;
|
|
11
|
+
this.signalHandlers = [];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Add a stage to the pipeline. Stages execute in order added.
|
|
15
|
+
*/
|
|
16
|
+
use(stage) {
|
|
17
|
+
this.stages.push(stage);
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Register a process signal handler that will be cleaned up on destroy.
|
|
22
|
+
*/
|
|
23
|
+
registerSignalHandler(signal, handler) {
|
|
24
|
+
process.on(signal, handler);
|
|
25
|
+
this.signalHandlers.push({ signal, handler });
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run all stages' setup() in order. Called once in beforeAll.
|
|
29
|
+
*/
|
|
30
|
+
async setup() {
|
|
31
|
+
for (const stage of this.stages) {
|
|
32
|
+
try {
|
|
33
|
+
await stage.setup(this.ctx);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// Tear down any stages that already set up successfully
|
|
37
|
+
await this.destroy();
|
|
38
|
+
throw new errors_1.TestRunnerError(error.message, stage.name, "setup", error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Pipeline setup complete
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Reset state between tests. Called in beforeEach.
|
|
45
|
+
* Skips the first call (state is already fresh from setup).
|
|
46
|
+
*/
|
|
47
|
+
async reset() {
|
|
48
|
+
if (this.isFirstReset) {
|
|
49
|
+
this.isFirstReset = false;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
for (const stage of this.stages) {
|
|
53
|
+
try {
|
|
54
|
+
await stage.reset(this.ctx);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new errors_1.TestRunnerError(error.message, stage.name, "reset", error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Tear down all stages in reverse order. Called once in afterAll.
|
|
63
|
+
*/
|
|
64
|
+
async destroy() {
|
|
65
|
+
// Guard against double-destroy (signal handler + afterAll)
|
|
66
|
+
if (this.destroyed)
|
|
67
|
+
return;
|
|
68
|
+
this.destroyed = true;
|
|
69
|
+
const errors = [];
|
|
70
|
+
// Destroy in reverse order (last setup = first destroyed)
|
|
71
|
+
for (const stage of [...this.stages].reverse()) {
|
|
72
|
+
try {
|
|
73
|
+
await stage.destroy(this.ctx);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Collect errors but continue destroying other stages
|
|
77
|
+
errors.push(new errors_1.TestRunnerError(error.message, stage.name, "destroy", error));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Clean up only our signal handlers (not all listeners)
|
|
81
|
+
for (const { signal, handler } of this.signalHandlers) {
|
|
82
|
+
process.removeListener(signal, handler);
|
|
83
|
+
}
|
|
84
|
+
this.signalHandlers = [];
|
|
85
|
+
if (errors.length > 0) {
|
|
86
|
+
const messages = errors.map((e) => e.message).join("\n");
|
|
87
|
+
throw new Error(`Errors during pipeline destroy:\n${messages}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.TestBootstrapPipeline = TestBootstrapPipeline;
|
|
92
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/pipeline/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BootstrapStage, PipelineContext } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* ConfigStage — resolves module configuration based on mode.
|
|
4
|
+
*
|
|
5
|
+
* App mode: reads acmekit-config.ts, overrides DB URL, disables admin.
|
|
6
|
+
* Plugin mode: uses defineConfig with plugin registered, discovers modules from plugin.
|
|
7
|
+
* Module mode: builds minimal config for a single module.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ConfigStage implements BootstrapStage {
|
|
10
|
+
name: string;
|
|
11
|
+
setup(ctx: PipelineContext): Promise<void>;
|
|
12
|
+
reset(_ctx: PipelineContext): Promise<void>;
|
|
13
|
+
destroy(_ctx: PipelineContext): Promise<void>;
|
|
14
|
+
private setupAppConfig;
|
|
15
|
+
private setupPluginConfig;
|
|
16
|
+
private setupModuleConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Extract module service name from __joinerConfig.
|
|
19
|
+
* Same logic as plugin-test-runner.ts.
|
|
20
|
+
*/
|
|
21
|
+
private resolveModuleName;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/pipeline/stages/config.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1D;;;;;;GAMG;AACH,qBAAa,WAAY,YAAW,cAAc;IAChD,IAAI,SAAgB;IAEd,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1C,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YAMrC,cAAc;YAQd,iBAAiB;IAuD/B,OAAO,CAAC,iBAAiB;IAkCzB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAkB1B"}
|