@backstage/backend-test-utils 1.0.1-next.0 → 1.0.1-next.2
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/CHANGELOG.md +29 -0
- package/dist/backend-app-api/src/lib/DependencyGraph.cjs.js +182 -0
- package/dist/backend-app-api/src/lib/DependencyGraph.cjs.js.map +1 -0
- package/dist/backend-app-api/src/wiring/ServiceRegistry.cjs.js +240 -0
- package/dist/backend-app-api/src/wiring/ServiceRegistry.cjs.js.map +1 -0
- package/dist/cache/TestCaches.cjs.js +159 -0
- package/dist/cache/TestCaches.cjs.js.map +1 -0
- package/dist/cache/memcache.cjs.js +62 -0
- package/dist/cache/memcache.cjs.js.map +1 -0
- package/dist/cache/redis.cjs.js +62 -0
- package/dist/cache/redis.cjs.js.map +1 -0
- package/dist/cache/types.cjs.js +25 -0
- package/dist/cache/types.cjs.js.map +1 -0
- package/dist/database/TestDatabases.cjs.js +128 -0
- package/dist/database/TestDatabases.cjs.js.map +1 -0
- package/dist/database/mysql.cjs.js +188 -0
- package/dist/database/mysql.cjs.js.map +1 -0
- package/dist/database/postgres.cjs.js +143 -0
- package/dist/database/postgres.cjs.js.map +1 -0
- package/dist/database/sqlite.cjs.js +40 -0
- package/dist/database/sqlite.cjs.js.map +1 -0
- package/dist/database/types.cjs.js +68 -0
- package/dist/database/types.cjs.js.map +1 -0
- package/dist/filesystem/MockDirectory.cjs.js +152 -0
- package/dist/filesystem/MockDirectory.cjs.js.map +1 -0
- package/dist/index.cjs.js +25 -2327
- package/dist/index.cjs.js.map +1 -1
- package/dist/msw/registerMswTestHooks.cjs.js +10 -0
- package/dist/msw/registerMswTestHooks.cjs.js.map +1 -0
- package/dist/next/services/MockAuthService.cjs.js +111 -0
- package/dist/next/services/MockAuthService.cjs.js.map +1 -0
- package/dist/next/services/MockHttpAuthService.cjs.js +87 -0
- package/dist/next/services/MockHttpAuthService.cjs.js.map +1 -0
- package/dist/next/services/MockRootLoggerService.cjs.js +49 -0
- package/dist/next/services/MockRootLoggerService.cjs.js.map +1 -0
- package/dist/next/services/MockUserInfoService.cjs.js +26 -0
- package/dist/next/services/MockUserInfoService.cjs.js.map +1 -0
- package/dist/next/services/mockCredentials.cjs.js +148 -0
- package/dist/next/services/mockCredentials.cjs.js.map +1 -0
- package/dist/next/services/mockServices.cjs.js +294 -0
- package/dist/next/services/mockServices.cjs.js.map +1 -0
- package/dist/next/wiring/ServiceFactoryTester.cjs.js +61 -0
- package/dist/next/wiring/ServiceFactoryTester.cjs.js.map +1 -0
- package/dist/next/wiring/TestBackend.cjs.js +258 -0
- package/dist/next/wiring/TestBackend.cjs.js.map +1 -0
- package/dist/util/errorHandler.cjs.js +18 -0
- package/dist/util/errorHandler.cjs.js.map +1 -0
- package/dist/util/getDockerImageForName.cjs.js +8 -0
- package/dist/util/getDockerImageForName.cjs.js.map +1 -0
- package/dist/util/isDockerDisabledForTests.cjs.js +8 -0
- package/dist/util/isDockerDisabledForTests.cjs.js.map +1 -0
- package/package.json +11 -11
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendAppApi = require('@backstage/backend-app-api');
|
|
4
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
5
|
+
var mockServices = require('../services/mockServices.cjs.js');
|
|
6
|
+
require('../services/mockCredentials.cjs.js');
|
|
7
|
+
var config = require('@backstage/config');
|
|
8
|
+
var express = require('express');
|
|
9
|
+
var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
|
|
10
|
+
var discovery = require('@backstage/backend-defaults/discovery');
|
|
11
|
+
|
|
12
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
13
|
+
|
|
14
|
+
var express__default = /*#__PURE__*/_interopDefaultCompat(express);
|
|
15
|
+
|
|
16
|
+
const defaultServiceFactories = [
|
|
17
|
+
mockServices.mockServices.auth.factory(),
|
|
18
|
+
mockServices.mockServices.cache.factory(),
|
|
19
|
+
mockServices.mockServices.rootConfig.factory(),
|
|
20
|
+
mockServices.mockServices.database.factory(),
|
|
21
|
+
mockServices.mockServices.httpAuth.factory(),
|
|
22
|
+
mockServices.mockServices.httpRouter.factory(),
|
|
23
|
+
mockServices.mockServices.lifecycle.factory(),
|
|
24
|
+
mockServices.mockServices.logger.factory(),
|
|
25
|
+
mockServices.mockServices.permissions.factory(),
|
|
26
|
+
mockServices.mockServices.rootHealth.factory(),
|
|
27
|
+
mockServices.mockServices.rootLifecycle.factory(),
|
|
28
|
+
mockServices.mockServices.rootLogger.factory(),
|
|
29
|
+
mockServices.mockServices.scheduler.factory(),
|
|
30
|
+
mockServices.mockServices.userInfo.factory(),
|
|
31
|
+
mockServices.mockServices.urlReader.factory(),
|
|
32
|
+
mockServices.mockServices.events.factory()
|
|
33
|
+
];
|
|
34
|
+
function createPluginsForOrphanModules(features) {
|
|
35
|
+
const pluginIds = /* @__PURE__ */ new Set();
|
|
36
|
+
const modulePluginIds = /* @__PURE__ */ new Set();
|
|
37
|
+
for (const feature of features) {
|
|
38
|
+
if (isInternalBackendRegistrations(feature)) {
|
|
39
|
+
const registrations = feature.getRegistrations();
|
|
40
|
+
for (const registration of registrations) {
|
|
41
|
+
if (registration.type === "plugin") {
|
|
42
|
+
pluginIds.add(registration.pluginId);
|
|
43
|
+
} else if (registration.type === "module") {
|
|
44
|
+
modulePluginIds.add(registration.pluginId);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const pluginId of pluginIds) {
|
|
50
|
+
modulePluginIds.delete(pluginId);
|
|
51
|
+
}
|
|
52
|
+
return Array.from(modulePluginIds).map(
|
|
53
|
+
(pluginId) => backendPluginApi.createBackendPlugin({
|
|
54
|
+
pluginId,
|
|
55
|
+
register(reg) {
|
|
56
|
+
reg.registerInit({ deps: {}, async init() {
|
|
57
|
+
} });
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
function createExtensionPointTestModules(features, extensionPointTuples) {
|
|
63
|
+
if (!extensionPointTuples) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
const registrations = features.flatMap((feature) => {
|
|
67
|
+
if (isInternalBackendRegistrations(feature)) {
|
|
68
|
+
return feature.getRegistrations();
|
|
69
|
+
}
|
|
70
|
+
return [];
|
|
71
|
+
});
|
|
72
|
+
const extensionPointMap = new Map(
|
|
73
|
+
extensionPointTuples.map((ep) => [ep[0].id, ep])
|
|
74
|
+
);
|
|
75
|
+
const extensionPointsToSort = new Set(extensionPointMap.keys());
|
|
76
|
+
const extensionPointsByPlugin = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const registration of registrations) {
|
|
78
|
+
if (registration.type === "module") {
|
|
79
|
+
const testDep = Object.values(registration.init.deps).filter(
|
|
80
|
+
(dep) => extensionPointsToSort.has(dep.id)
|
|
81
|
+
);
|
|
82
|
+
if (testDep.length > 0) {
|
|
83
|
+
let points = extensionPointsByPlugin.get(registration.pluginId);
|
|
84
|
+
if (!points) {
|
|
85
|
+
points = [];
|
|
86
|
+
extensionPointsByPlugin.set(registration.pluginId, points);
|
|
87
|
+
}
|
|
88
|
+
for (const { id } of testDep) {
|
|
89
|
+
points.push(id);
|
|
90
|
+
extensionPointsToSort.delete(id);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (extensionPointsToSort.size > 0) {
|
|
96
|
+
const list = Array.from(extensionPointsToSort).map((id) => `'${id}'`).join(", ");
|
|
97
|
+
throw new Error(
|
|
98
|
+
`Unable to determine the plugin ID of extension point(s) ${list}. Tested extension points must be depended on by one or more tested modules.`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
const modules = [];
|
|
102
|
+
for (const [pluginId, pluginExtensionPointIds] of extensionPointsByPlugin) {
|
|
103
|
+
modules.push(
|
|
104
|
+
backendPluginApi.createBackendModule({
|
|
105
|
+
pluginId,
|
|
106
|
+
moduleId: "test-extension-point-registration",
|
|
107
|
+
register(reg) {
|
|
108
|
+
for (const id of pluginExtensionPointIds) {
|
|
109
|
+
const tuple = extensionPointMap.get(id);
|
|
110
|
+
reg.registerExtensionPoint(...tuple);
|
|
111
|
+
}
|
|
112
|
+
reg.registerInit({ deps: {}, async init() {
|
|
113
|
+
} });
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
return modules;
|
|
119
|
+
}
|
|
120
|
+
function isPromise(value) {
|
|
121
|
+
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
122
|
+
}
|
|
123
|
+
function unwrapFeature(feature) {
|
|
124
|
+
return typeof feature === "function" ? feature() : feature;
|
|
125
|
+
}
|
|
126
|
+
const backendInstancesToCleanUp = new Array();
|
|
127
|
+
async function startTestBackend(options) {
|
|
128
|
+
const { extensionPoints, ...otherOptions } = options;
|
|
129
|
+
const features = await Promise.all(
|
|
130
|
+
options.features?.map(async (val) => {
|
|
131
|
+
if (isPromise(val)) {
|
|
132
|
+
const { default: feature } = await val;
|
|
133
|
+
return unwrapFeature(feature);
|
|
134
|
+
}
|
|
135
|
+
return unwrapFeature(val);
|
|
136
|
+
}) ?? []
|
|
137
|
+
);
|
|
138
|
+
let server;
|
|
139
|
+
const rootHttpRouterFactory = backendPluginApi.createServiceFactory({
|
|
140
|
+
service: backendPluginApi.coreServices.rootHttpRouter,
|
|
141
|
+
deps: {
|
|
142
|
+
config: backendPluginApi.coreServices.rootConfig,
|
|
143
|
+
lifecycle: backendPluginApi.coreServices.rootLifecycle,
|
|
144
|
+
rootLogger: backendPluginApi.coreServices.rootLogger,
|
|
145
|
+
health: backendPluginApi.coreServices.rootHealth
|
|
146
|
+
},
|
|
147
|
+
async factory({ config, lifecycle, rootLogger, health }) {
|
|
148
|
+
const router = rootHttpRouter.DefaultRootHttpRouter.create();
|
|
149
|
+
const logger = rootLogger.child({ service: "rootHttpRouter" });
|
|
150
|
+
const app = express__default.default();
|
|
151
|
+
const middleware = rootHttpRouter.MiddlewareFactory.create({ config, logger });
|
|
152
|
+
const healthRouter = rootHttpRouter.createHealthRouter({ health });
|
|
153
|
+
app.use(healthRouter);
|
|
154
|
+
app.use(router.handler());
|
|
155
|
+
app.use(middleware.notFound());
|
|
156
|
+
app.use(middleware.error());
|
|
157
|
+
server = await rootHttpRouter.createHttpServer(
|
|
158
|
+
app,
|
|
159
|
+
{ listen: { host: "", port: 0 } },
|
|
160
|
+
{ logger }
|
|
161
|
+
);
|
|
162
|
+
lifecycle.addShutdownHook(() => server.stop(), { logger });
|
|
163
|
+
await server.start();
|
|
164
|
+
return router;
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
const discoveryFactory = backendPluginApi.createServiceFactory({
|
|
168
|
+
service: backendPluginApi.coreServices.discovery,
|
|
169
|
+
deps: {
|
|
170
|
+
rootHttpRouter: backendPluginApi.coreServices.rootHttpRouter
|
|
171
|
+
},
|
|
172
|
+
async factory() {
|
|
173
|
+
if (!server) {
|
|
174
|
+
throw new Error("Test server not started yet");
|
|
175
|
+
}
|
|
176
|
+
const port = server.port();
|
|
177
|
+
const discovery$1 = discovery.HostDiscovery.fromConfig(
|
|
178
|
+
new config.ConfigReader({
|
|
179
|
+
backend: { baseUrl: `http://localhost:${port}`, listen: { port } }
|
|
180
|
+
})
|
|
181
|
+
);
|
|
182
|
+
return discovery$1;
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
const backend = backendAppApi.createSpecializedBackend({
|
|
186
|
+
...otherOptions,
|
|
187
|
+
defaultServiceFactories: [
|
|
188
|
+
...defaultServiceFactories,
|
|
189
|
+
rootHttpRouterFactory,
|
|
190
|
+
discoveryFactory
|
|
191
|
+
]
|
|
192
|
+
});
|
|
193
|
+
backendInstancesToCleanUp.push(backend);
|
|
194
|
+
for (const m of createExtensionPointTestModules(features, extensionPoints)) {
|
|
195
|
+
backend.add(m);
|
|
196
|
+
}
|
|
197
|
+
for (const p of createPluginsForOrphanModules(features)) {
|
|
198
|
+
backend.add(p);
|
|
199
|
+
}
|
|
200
|
+
for (const feature of features) {
|
|
201
|
+
backend.add(feature);
|
|
202
|
+
}
|
|
203
|
+
await backend.start();
|
|
204
|
+
return Object.assign(backend, {
|
|
205
|
+
get server() {
|
|
206
|
+
if (!server) {
|
|
207
|
+
throw new Error("TestBackend server is not available");
|
|
208
|
+
}
|
|
209
|
+
return server;
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
let registered = false;
|
|
214
|
+
function registerTestHooks() {
|
|
215
|
+
if (typeof afterAll !== "function") {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (registered) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
registered = true;
|
|
222
|
+
afterAll(async () => {
|
|
223
|
+
await Promise.all(
|
|
224
|
+
backendInstancesToCleanUp.map(async (backend) => {
|
|
225
|
+
try {
|
|
226
|
+
await backend.stop();
|
|
227
|
+
} catch (error) {
|
|
228
|
+
console.error(`Failed to stop backend after tests, ${error}`);
|
|
229
|
+
}
|
|
230
|
+
})
|
|
231
|
+
);
|
|
232
|
+
backendInstancesToCleanUp.length = 0;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
registerTestHooks();
|
|
236
|
+
function toInternalBackendFeature(feature) {
|
|
237
|
+
if (feature.$$type !== "@backstage/BackendFeature") {
|
|
238
|
+
throw new Error(`Invalid BackendFeature, bad type '${feature.$$type}'`);
|
|
239
|
+
}
|
|
240
|
+
const internal = feature;
|
|
241
|
+
if (internal.version !== "v1") {
|
|
242
|
+
throw new Error(
|
|
243
|
+
`Invalid BackendFeature, bad version '${internal.version}'`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
return internal;
|
|
247
|
+
}
|
|
248
|
+
function isInternalBackendRegistrations(feature) {
|
|
249
|
+
const internal = toInternalBackendFeature(feature);
|
|
250
|
+
if (internal.featureType === "registrations") {
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
return "getRegistrations" in internal;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
exports.defaultServiceFactories = defaultServiceFactories;
|
|
257
|
+
exports.startTestBackend = startTestBackend;
|
|
258
|
+
//# sourceMappingURL=TestBackend.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestBackend.cjs.js","sources":["../../../src/next/wiring/TestBackend.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Backend, createSpecializedBackend } from '@backstage/backend-app-api';\nimport {\n createServiceFactory,\n BackendFeature,\n ExtensionPoint,\n coreServices,\n createBackendModule,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { mockServices } from '../services';\nimport { ConfigReader } from '@backstage/config';\nimport express from 'express';\n// Direct internal import to avoid duplication\n// eslint-disable-next-line @backstage/no-forbidden-package-imports\nimport {\n InternalBackendFeature,\n InternalBackendRegistrations,\n} from '@backstage/backend-plugin-api/src/wiring/types';\nimport {\n DefaultRootHttpRouter,\n ExtendedHttpServer,\n MiddlewareFactory,\n createHealthRouter,\n createHttpServer,\n} from '@backstage/backend-defaults/rootHttpRouter';\nimport { HostDiscovery } from '@backstage/backend-defaults/discovery';\n\n/** @public */\nexport interface TestBackendOptions<TExtensionPoints extends any[]> {\n extensionPoints?: readonly [\n ...{\n [index in keyof TExtensionPoints]: [\n ExtensionPoint<TExtensionPoints[index]>,\n Partial<TExtensionPoints[index]>,\n ];\n },\n ];\n features?: Array<BackendFeature | Promise<{ default: BackendFeature }>>;\n}\n\n/** @public */\nexport interface TestBackend extends Backend {\n /**\n * Provides access to the underling HTTP server for use with utilities\n * such as `supertest`.\n *\n * If the root http router service has been replaced, this will throw an error.\n */\n readonly server: ExtendedHttpServer;\n}\n\nexport const defaultServiceFactories = [\n mockServices.auth.factory(),\n mockServices.cache.factory(),\n mockServices.rootConfig.factory(),\n mockServices.database.factory(),\n mockServices.httpAuth.factory(),\n mockServices.httpRouter.factory(),\n mockServices.lifecycle.factory(),\n mockServices.logger.factory(),\n mockServices.permissions.factory(),\n mockServices.rootHealth.factory(),\n mockServices.rootLifecycle.factory(),\n mockServices.rootLogger.factory(),\n mockServices.scheduler.factory(),\n mockServices.userInfo.factory(),\n mockServices.urlReader.factory(),\n mockServices.events.factory(),\n];\n\n/**\n * Given a set of features, return an array of plugins that ensures that each\n * module in the provided set of features has a corresponding plugin.\n * @internal\n */\nfunction createPluginsForOrphanModules(features: Array<BackendFeature>) {\n const pluginIds = new Set<string>();\n const modulePluginIds = new Set<string>();\n\n for (const feature of features) {\n if (isInternalBackendRegistrations(feature)) {\n const registrations = feature.getRegistrations();\n for (const registration of registrations) {\n if (registration.type === 'plugin') {\n pluginIds.add(registration.pluginId);\n } else if (registration.type === 'module') {\n modulePluginIds.add(registration.pluginId);\n }\n }\n }\n }\n\n for (const pluginId of pluginIds) {\n modulePluginIds.delete(pluginId);\n }\n\n return Array.from(modulePluginIds).map(pluginId =>\n createBackendPlugin({\n pluginId,\n register(reg) {\n reg.registerInit({ deps: {}, async init() {} });\n },\n }),\n );\n}\n\n/**\n * Given a set of extension points and features, find the extension\n * points that we mock and tie them to the correct plugin ID.\n * @returns\n */\nfunction createExtensionPointTestModules(\n features: Array<BackendFeature>,\n extensionPointTuples?: readonly [\n ref: ExtensionPoint<unknown>,\n impl: unknown,\n ][],\n): Array<BackendFeature> {\n if (!extensionPointTuples) {\n return [];\n }\n\n const registrations = features.flatMap(feature => {\n if (isInternalBackendRegistrations(feature)) {\n return feature.getRegistrations();\n }\n return [];\n });\n\n const extensionPointMap = new Map(\n extensionPointTuples.map(ep => [ep[0].id, ep]),\n );\n const extensionPointsToSort = new Set(extensionPointMap.keys());\n const extensionPointsByPlugin = new Map<string, string[]>();\n\n for (const registration of registrations) {\n if (registration.type === 'module') {\n const testDep = Object.values(registration.init.deps).filter(dep =>\n extensionPointsToSort.has(dep.id),\n );\n if (testDep.length > 0) {\n let points = extensionPointsByPlugin.get(registration.pluginId);\n if (!points) {\n points = [];\n extensionPointsByPlugin.set(registration.pluginId, points);\n }\n for (const { id } of testDep) {\n points.push(id);\n extensionPointsToSort.delete(id);\n }\n }\n }\n }\n\n if (extensionPointsToSort.size > 0) {\n const list = Array.from(extensionPointsToSort)\n .map(id => `'${id}'`)\n .join(', ');\n throw new Error(\n `Unable to determine the plugin ID of extension point(s) ${list}. ` +\n 'Tested extension points must be depended on by one or more tested modules.',\n );\n }\n\n const modules = [];\n\n for (const [pluginId, pluginExtensionPointIds] of extensionPointsByPlugin) {\n modules.push(\n createBackendModule({\n pluginId,\n moduleId: 'test-extension-point-registration',\n register(reg) {\n for (const id of pluginExtensionPointIds) {\n const tuple = extensionPointMap.get(id)!;\n reg.registerExtensionPoint(...tuple);\n }\n\n reg.registerInit({ deps: {}, async init() {} });\n },\n }),\n );\n }\n\n return modules;\n}\n\nfunction isPromise<T>(value: unknown | Promise<T>): value is Promise<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\nfunction unwrapFeature(\n feature: BackendFeature | (() => BackendFeature),\n): BackendFeature {\n return typeof feature === 'function' ? feature() : feature;\n}\n\nconst backendInstancesToCleanUp = new Array<Backend>();\n\n/** @public */\nexport async function startTestBackend<TExtensionPoints extends any[]>(\n options: TestBackendOptions<TExtensionPoints>,\n): Promise<TestBackend> {\n const { extensionPoints, ...otherOptions } = options;\n\n // Unpack input into awaited plain BackendFeatures\n const features: BackendFeature[] = await Promise.all(\n options.features?.map(async val => {\n if (isPromise(val)) {\n const { default: feature } = await val;\n return unwrapFeature(feature);\n }\n return unwrapFeature(val);\n }) ?? [],\n );\n\n let server: ExtendedHttpServer;\n\n const rootHttpRouterFactory = createServiceFactory({\n service: coreServices.rootHttpRouter,\n deps: {\n config: coreServices.rootConfig,\n lifecycle: coreServices.rootLifecycle,\n rootLogger: coreServices.rootLogger,\n health: coreServices.rootHealth,\n },\n async factory({ config, lifecycle, rootLogger, health }) {\n const router = DefaultRootHttpRouter.create();\n const logger = rootLogger.child({ service: 'rootHttpRouter' });\n\n const app = express();\n\n const middleware = MiddlewareFactory.create({ config, logger });\n const healthRouter = createHealthRouter({ health });\n\n app.use(healthRouter);\n app.use(router.handler());\n app.use(middleware.notFound());\n app.use(middleware.error());\n\n server = await createHttpServer(\n app,\n { listen: { host: '', port: 0 } },\n { logger },\n );\n\n lifecycle.addShutdownHook(() => server.stop(), { logger });\n\n await server.start();\n\n return router;\n },\n });\n\n const discoveryFactory = createServiceFactory({\n service: coreServices.discovery,\n deps: {\n rootHttpRouter: coreServices.rootHttpRouter,\n },\n async factory() {\n if (!server) {\n throw new Error('Test server not started yet');\n }\n const port = server.port();\n const discovery = HostDiscovery.fromConfig(\n new ConfigReader({\n backend: { baseUrl: `http://localhost:${port}`, listen: { port } },\n }),\n );\n return discovery;\n },\n });\n\n const backend = createSpecializedBackend({\n ...otherOptions,\n defaultServiceFactories: [\n ...defaultServiceFactories,\n rootHttpRouterFactory,\n discoveryFactory,\n ],\n });\n\n backendInstancesToCleanUp.push(backend);\n\n for (const m of createExtensionPointTestModules(features, extensionPoints)) {\n backend.add(m);\n }\n for (const p of createPluginsForOrphanModules(features)) {\n backend.add(p);\n }\n for (const feature of features) {\n backend.add(feature);\n }\n\n await backend.start();\n\n return Object.assign(backend, {\n get server() {\n if (!server) {\n throw new Error('TestBackend server is not available');\n }\n return server;\n },\n });\n}\n\nlet registered = false;\nfunction registerTestHooks() {\n if (typeof afterAll !== 'function') {\n return;\n }\n if (registered) {\n return;\n }\n registered = true;\n\n afterAll(async () => {\n await Promise.all(\n backendInstancesToCleanUp.map(async backend => {\n try {\n await backend.stop();\n } catch (error) {\n console.error(`Failed to stop backend after tests, ${error}`);\n }\n }),\n );\n backendInstancesToCleanUp.length = 0;\n });\n}\n\nregisterTestHooks();\n\nfunction toInternalBackendFeature(\n feature: BackendFeature,\n): InternalBackendFeature {\n if (feature.$$type !== '@backstage/BackendFeature') {\n throw new Error(`Invalid BackendFeature, bad type '${feature.$$type}'`);\n }\n const internal = feature as InternalBackendFeature;\n if (internal.version !== 'v1') {\n throw new Error(\n `Invalid BackendFeature, bad version '${internal.version}'`,\n );\n }\n return internal;\n}\n\nfunction isInternalBackendRegistrations(\n feature: BackendFeature,\n): feature is InternalBackendRegistrations {\n const internal = toInternalBackendFeature(feature);\n if (internal.featureType === 'registrations') {\n return true;\n }\n // Backwards compatibility for v1 registrations that use duck typing\n return 'getRegistrations' in internal;\n}\n"],"names":["mockServices","createBackendPlugin","createBackendModule","createServiceFactory","coreServices","DefaultRootHttpRouter","express","MiddlewareFactory","createHealthRouter","createHttpServer","discovery","HostDiscovery","ConfigReader","createSpecializedBackend"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
|
|
4
|
+
require('../next/wiring/TestBackend.cjs.js');
|
|
5
|
+
require('@backstage/backend-plugin-api');
|
|
6
|
+
require('@backstage/errors');
|
|
7
|
+
var mockServices = require('../next/services/mockServices.cjs.js');
|
|
8
|
+
require('../next/services/mockCredentials.cjs.js');
|
|
9
|
+
|
|
10
|
+
function mockErrorHandler() {
|
|
11
|
+
return rootHttpRouter.MiddlewareFactory.create({
|
|
12
|
+
config: mockServices.mockServices.rootConfig(),
|
|
13
|
+
logger: mockServices.mockServices.rootLogger()
|
|
14
|
+
}).error();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.mockErrorHandler = mockErrorHandler;
|
|
18
|
+
//# sourceMappingURL=errorHandler.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.cjs.js","sources":["../../src/util/errorHandler.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { mockServices } from '../next';\n\n/**\n * A mock for error handler middleware that can be used in router tests.\n * @public\n */\nexport function mockErrorHandler() {\n return MiddlewareFactory.create({\n config: mockServices.rootConfig(),\n logger: mockServices.rootLogger(),\n }).error();\n}\n"],"names":["MiddlewareFactory","mockServices"],"mappings":";;;;;;;;;AAuBO,SAAS,gBAAmB,GAAA;AACjC,EAAA,OAAOA,iCAAkB,MAAO,CAAA;AAAA,IAC9B,MAAA,EAAQC,0BAAa,UAAW,EAAA;AAAA,IAChC,MAAA,EAAQA,0BAAa,UAAW,EAAA;AAAA,GACjC,EAAE,KAAM,EAAA,CAAA;AACX;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getDockerImageForName = (name) => {
|
|
4
|
+
return process.env.BACKSTAGE_TEST_DOCKER_REGISTRY ? `${process.env.BACKSTAGE_TEST_DOCKER_REGISTRY}/${name}` : name;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
exports.getDockerImageForName = getDockerImageForName;
|
|
8
|
+
//# sourceMappingURL=getDockerImageForName.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDockerImageForName.cjs.js","sources":["../../src/util/getDockerImageForName.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const getDockerImageForName = (name: string) => {\n return process.env.BACKSTAGE_TEST_DOCKER_REGISTRY\n ? `${process.env.BACKSTAGE_TEST_DOCKER_REGISTRY}/${name}`\n : name;\n};\n"],"names":[],"mappings":";;AAgBa,MAAA,qBAAA,GAAwB,CAAC,IAAiB,KAAA;AACrD,EAAO,OAAA,OAAA,CAAQ,IAAI,8BACf,GAAA,CAAA,EAAG,QAAQ,GAAI,CAAA,8BAA8B,CAAI,CAAA,EAAA,IAAI,CACrD,CAAA,GAAA,IAAA,CAAA;AACN;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function isDockerDisabledForTests() {
|
|
4
|
+
return Boolean(process.env.BACKSTAGE_TEST_DISABLE_DOCKER) || !Boolean(process.env.CI);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
exports.isDockerDisabledForTests = isDockerDisabledForTests;
|
|
8
|
+
//# sourceMappingURL=isDockerDisabledForTests.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isDockerDisabledForTests.cjs.js","sources":["../../src/util/isDockerDisabledForTests.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function isDockerDisabledForTests() {\n // If we are not running in continuous integration, the default is to skip\n // the (relatively heavy, long running) docker based tests. If you want to\n // still run local tests for all databases, just pass either the CI=1 env\n // parameter to your test runner, or individual connection strings per\n // database or cache.\n return (\n Boolean(process.env.BACKSTAGE_TEST_DISABLE_DOCKER) ||\n !Boolean(process.env.CI)\n );\n}\n"],"names":[],"mappings":";;AAgBO,SAAS,wBAA2B,GAAA;AAMzC,EACE,OAAA,OAAA,CAAQ,QAAQ,GAAI,CAAA,6BAA6B,KACjD,CAAC,OAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAE3B;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-test-utils",
|
|
3
|
-
"version": "1.0.1-next.
|
|
3
|
+
"version": "1.0.1-next.2",
|
|
4
4
|
"description": "Test helpers library for Backstage backends",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library"
|
|
@@ -42,14 +42,14 @@
|
|
|
42
42
|
"test": "backstage-cli package test"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@backstage/backend-app-api": "
|
|
46
|
-
"@backstage/backend-defaults": "
|
|
47
|
-
"@backstage/backend-plugin-api": "
|
|
48
|
-
"@backstage/config": "
|
|
49
|
-
"@backstage/errors": "
|
|
50
|
-
"@backstage/plugin-auth-node": "
|
|
51
|
-
"@backstage/plugin-events-node": "
|
|
52
|
-
"@backstage/types": "
|
|
45
|
+
"@backstage/backend-app-api": "1.0.1-next.1",
|
|
46
|
+
"@backstage/backend-defaults": "0.5.1-next.2",
|
|
47
|
+
"@backstage/backend-plugin-api": "1.0.1-next.1",
|
|
48
|
+
"@backstage/config": "1.2.0",
|
|
49
|
+
"@backstage/errors": "1.2.4",
|
|
50
|
+
"@backstage/plugin-auth-node": "0.5.3-next.1",
|
|
51
|
+
"@backstage/plugin-events-node": "0.4.1-next.1",
|
|
52
|
+
"@backstage/types": "1.1.1",
|
|
53
53
|
"@keyv/memcache": "^1.3.5",
|
|
54
54
|
"@keyv/redis": "^2.5.3",
|
|
55
55
|
"@types/express": "^4.17.6",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@types/keyv": "^4.2.0",
|
|
58
58
|
"@types/qs": "^6.9.6",
|
|
59
59
|
"better-sqlite3": "^11.0.0",
|
|
60
|
-
"cookie": "^0.
|
|
60
|
+
"cookie": "^0.7.0",
|
|
61
61
|
"express": "^4.17.1",
|
|
62
62
|
"fs-extra": "^11.0.0",
|
|
63
63
|
"keyv": "^4.5.2",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"yn": "^4.0.0"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@backstage/cli": "
|
|
75
|
+
"@backstage/cli": "0.28.0-next.2",
|
|
76
76
|
"@types/supertest": "^2.0.8",
|
|
77
77
|
"supertest": "^7.0.0"
|
|
78
78
|
},
|