@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,294 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var cache = require('@backstage/backend-defaults/cache');
|
|
4
|
+
var database = require('@backstage/backend-defaults/database');
|
|
5
|
+
var discovery = require('@backstage/backend-defaults/discovery');
|
|
6
|
+
var httpRouter = require('@backstage/backend-defaults/httpRouter');
|
|
7
|
+
var lifecycle = require('@backstage/backend-defaults/lifecycle');
|
|
8
|
+
var logger = require('@backstage/backend-defaults/logger');
|
|
9
|
+
var permissions = require('@backstage/backend-defaults/permissions');
|
|
10
|
+
var rootHealth = require('@backstage/backend-defaults/rootHealth');
|
|
11
|
+
var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
|
|
12
|
+
var rootLifecycle = require('@backstage/backend-defaults/rootLifecycle');
|
|
13
|
+
var scheduler = require('@backstage/backend-defaults/scheduler');
|
|
14
|
+
var urlReader = require('@backstage/backend-defaults/urlReader');
|
|
15
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
16
|
+
var config = require('@backstage/config');
|
|
17
|
+
var pluginEventsNode = require('@backstage/plugin-events-node');
|
|
18
|
+
var MockAuthService = require('./MockAuthService.cjs.js');
|
|
19
|
+
var MockHttpAuthService = require('./MockHttpAuthService.cjs.js');
|
|
20
|
+
var MockRootLoggerService = require('./MockRootLoggerService.cjs.js');
|
|
21
|
+
var MockUserInfoService = require('./MockUserInfoService.cjs.js');
|
|
22
|
+
var mockCredentials = require('./mockCredentials.cjs.js');
|
|
23
|
+
|
|
24
|
+
function createLoggerMock() {
|
|
25
|
+
return {
|
|
26
|
+
child: jest.fn().mockImplementation(createLoggerMock),
|
|
27
|
+
debug: jest.fn(),
|
|
28
|
+
error: jest.fn(),
|
|
29
|
+
info: jest.fn(),
|
|
30
|
+
warn: jest.fn()
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function simpleFactoryWithOptions(ref, factory) {
|
|
34
|
+
const factoryWithOptions = (...options) => backendPluginApi.createServiceFactory({
|
|
35
|
+
service: ref,
|
|
36
|
+
deps: {},
|
|
37
|
+
async factory() {
|
|
38
|
+
return factory(...options);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return Object.assign(
|
|
42
|
+
factoryWithOptions,
|
|
43
|
+
factoryWithOptions(...[void 0])
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
function simpleMock(ref, mockFactory) {
|
|
47
|
+
return (partialImpl) => {
|
|
48
|
+
const mock = mockFactory();
|
|
49
|
+
if (partialImpl) {
|
|
50
|
+
for (const [key, impl] of Object.entries(partialImpl)) {
|
|
51
|
+
if (typeof impl === "function") {
|
|
52
|
+
mock[key].mockImplementation(impl);
|
|
53
|
+
} else {
|
|
54
|
+
mock[key] = impl;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return Object.assign(mock, {
|
|
59
|
+
factory: backendPluginApi.createServiceFactory({
|
|
60
|
+
service: ref,
|
|
61
|
+
deps: {},
|
|
62
|
+
factory: () => mock
|
|
63
|
+
})
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
exports.mockServices = void 0;
|
|
68
|
+
((mockServices2) => {
|
|
69
|
+
function rootConfig(options) {
|
|
70
|
+
return new config.ConfigReader(options?.data, "mock-config");
|
|
71
|
+
}
|
|
72
|
+
mockServices2.rootConfig = rootConfig;
|
|
73
|
+
((rootConfig2) => {
|
|
74
|
+
rootConfig2.factory = simpleFactoryWithOptions(
|
|
75
|
+
backendPluginApi.coreServices.rootConfig,
|
|
76
|
+
rootConfig2
|
|
77
|
+
);
|
|
78
|
+
rootConfig2.mock = simpleMock(backendPluginApi.coreServices.rootConfig, () => ({
|
|
79
|
+
get: jest.fn(),
|
|
80
|
+
getBoolean: jest.fn(),
|
|
81
|
+
getConfig: jest.fn(),
|
|
82
|
+
getConfigArray: jest.fn(),
|
|
83
|
+
getNumber: jest.fn(),
|
|
84
|
+
getOptional: jest.fn(),
|
|
85
|
+
getOptionalBoolean: jest.fn(),
|
|
86
|
+
getOptionalConfig: jest.fn(),
|
|
87
|
+
getOptionalConfigArray: jest.fn(),
|
|
88
|
+
getOptionalNumber: jest.fn(),
|
|
89
|
+
getOptionalString: jest.fn(),
|
|
90
|
+
getOptionalStringArray: jest.fn(),
|
|
91
|
+
getString: jest.fn(),
|
|
92
|
+
getStringArray: jest.fn(),
|
|
93
|
+
has: jest.fn(),
|
|
94
|
+
keys: jest.fn()
|
|
95
|
+
}));
|
|
96
|
+
})(rootConfig = mockServices2.rootConfig || (mockServices2.rootConfig = {}));
|
|
97
|
+
function rootLogger(options) {
|
|
98
|
+
return MockRootLoggerService.MockRootLoggerService.create(options);
|
|
99
|
+
}
|
|
100
|
+
mockServices2.rootLogger = rootLogger;
|
|
101
|
+
((rootLogger2) => {
|
|
102
|
+
rootLogger2.factory = simpleFactoryWithOptions(
|
|
103
|
+
backendPluginApi.coreServices.rootLogger,
|
|
104
|
+
rootLogger2
|
|
105
|
+
);
|
|
106
|
+
rootLogger2.mock = simpleMock(backendPluginApi.coreServices.rootLogger, () => ({
|
|
107
|
+
child: jest.fn(),
|
|
108
|
+
debug: jest.fn(),
|
|
109
|
+
error: jest.fn(),
|
|
110
|
+
info: jest.fn(),
|
|
111
|
+
warn: jest.fn()
|
|
112
|
+
}));
|
|
113
|
+
})(rootLogger = mockServices2.rootLogger || (mockServices2.rootLogger = {}));
|
|
114
|
+
function auth(options) {
|
|
115
|
+
return new MockAuthService.MockAuthService({
|
|
116
|
+
pluginId: options?.pluginId ?? "test",
|
|
117
|
+
disableDefaultAuthPolicy: Boolean(options?.disableDefaultAuthPolicy)
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
mockServices2.auth = auth;
|
|
121
|
+
((auth2) => {
|
|
122
|
+
auth2.factory = () => backendPluginApi.createServiceFactory({
|
|
123
|
+
service: backendPluginApi.coreServices.auth,
|
|
124
|
+
deps: {
|
|
125
|
+
plugin: backendPluginApi.coreServices.pluginMetadata,
|
|
126
|
+
config: backendPluginApi.coreServices.rootConfig
|
|
127
|
+
},
|
|
128
|
+
factory({ plugin, config }) {
|
|
129
|
+
const disableDefaultAuthPolicy = Boolean(
|
|
130
|
+
config.getOptionalBoolean(
|
|
131
|
+
"backend.auth.dangerouslyDisableDefaultAuthPolicy"
|
|
132
|
+
)
|
|
133
|
+
);
|
|
134
|
+
return new MockAuthService.MockAuthService({
|
|
135
|
+
pluginId: plugin.getId(),
|
|
136
|
+
disableDefaultAuthPolicy
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
auth2.mock = simpleMock(backendPluginApi.coreServices.auth, () => ({
|
|
141
|
+
authenticate: jest.fn(),
|
|
142
|
+
getNoneCredentials: jest.fn(),
|
|
143
|
+
getOwnServiceCredentials: jest.fn(),
|
|
144
|
+
isPrincipal: jest.fn(),
|
|
145
|
+
getPluginRequestToken: jest.fn(),
|
|
146
|
+
getLimitedUserToken: jest.fn(),
|
|
147
|
+
listPublicServiceKeys: jest.fn()
|
|
148
|
+
}));
|
|
149
|
+
})(auth = mockServices2.auth || (mockServices2.auth = {}));
|
|
150
|
+
function discovery$1() {
|
|
151
|
+
return discovery.HostDiscovery.fromConfig(
|
|
152
|
+
new config.ConfigReader({
|
|
153
|
+
backend: {
|
|
154
|
+
// Invalid port to make sure that requests are always mocked
|
|
155
|
+
baseUrl: "http://localhost:0",
|
|
156
|
+
listen: { port: 0 }
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
mockServices2.discovery = discovery$1;
|
|
162
|
+
((discovery2) => {
|
|
163
|
+
discovery2.factory = () => discovery.discoveryServiceFactory;
|
|
164
|
+
discovery2.mock = simpleMock(backendPluginApi.coreServices.discovery, () => ({
|
|
165
|
+
getBaseUrl: jest.fn(),
|
|
166
|
+
getExternalBaseUrl: jest.fn()
|
|
167
|
+
}));
|
|
168
|
+
})(discovery$1 = mockServices2.discovery || (mockServices2.discovery = {}));
|
|
169
|
+
function httpAuth(options) {
|
|
170
|
+
return new MockHttpAuthService.MockHttpAuthService(
|
|
171
|
+
options?.pluginId ?? "test",
|
|
172
|
+
options?.defaultCredentials ?? mockCredentials.mockCredentials.user()
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
mockServices2.httpAuth = httpAuth;
|
|
176
|
+
((httpAuth2) => {
|
|
177
|
+
httpAuth2.factory = (options) => backendPluginApi.createServiceFactory({
|
|
178
|
+
service: backendPluginApi.coreServices.httpAuth,
|
|
179
|
+
deps: { plugin: backendPluginApi.coreServices.pluginMetadata },
|
|
180
|
+
factory: ({ plugin }) => new MockHttpAuthService.MockHttpAuthService(
|
|
181
|
+
plugin.getId(),
|
|
182
|
+
options?.defaultCredentials ?? mockCredentials.mockCredentials.user()
|
|
183
|
+
)
|
|
184
|
+
});
|
|
185
|
+
httpAuth2.mock = simpleMock(backendPluginApi.coreServices.httpAuth, () => ({
|
|
186
|
+
credentials: jest.fn(),
|
|
187
|
+
issueUserCookie: jest.fn()
|
|
188
|
+
}));
|
|
189
|
+
})(httpAuth = mockServices2.httpAuth || (mockServices2.httpAuth = {}));
|
|
190
|
+
function userInfo(customInfo) {
|
|
191
|
+
return new MockUserInfoService.MockUserInfoService(customInfo);
|
|
192
|
+
}
|
|
193
|
+
mockServices2.userInfo = userInfo;
|
|
194
|
+
((userInfo2) => {
|
|
195
|
+
userInfo2.factory = () => backendPluginApi.createServiceFactory({
|
|
196
|
+
service: backendPluginApi.coreServices.userInfo,
|
|
197
|
+
deps: {},
|
|
198
|
+
factory() {
|
|
199
|
+
return new MockUserInfoService.MockUserInfoService();
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
userInfo2.mock = simpleMock(backendPluginApi.coreServices.userInfo, () => ({
|
|
203
|
+
getUserInfo: jest.fn()
|
|
204
|
+
}));
|
|
205
|
+
})(userInfo = mockServices2.userInfo || (mockServices2.userInfo = {}));
|
|
206
|
+
((cache2) => {
|
|
207
|
+
cache2.factory = () => cache.cacheServiceFactory;
|
|
208
|
+
cache2.mock = simpleMock(backendPluginApi.coreServices.cache, () => ({
|
|
209
|
+
delete: jest.fn(),
|
|
210
|
+
get: jest.fn(),
|
|
211
|
+
set: jest.fn(),
|
|
212
|
+
withOptions: jest.fn()
|
|
213
|
+
}));
|
|
214
|
+
})(mockServices2.cache || (mockServices2.cache = {}));
|
|
215
|
+
((database2) => {
|
|
216
|
+
database2.factory = () => database.databaseServiceFactory;
|
|
217
|
+
database2.mock = simpleMock(backendPluginApi.coreServices.database, () => ({
|
|
218
|
+
getClient: jest.fn()
|
|
219
|
+
}));
|
|
220
|
+
})(mockServices2.database || (mockServices2.database = {}));
|
|
221
|
+
((rootHealth2) => {
|
|
222
|
+
rootHealth2.factory = () => rootHealth.rootHealthServiceFactory;
|
|
223
|
+
rootHealth2.mock = simpleMock(backendPluginApi.coreServices.rootHealth, () => ({
|
|
224
|
+
getLiveness: jest.fn(),
|
|
225
|
+
getReadiness: jest.fn()
|
|
226
|
+
}));
|
|
227
|
+
})(mockServices2.rootHealth || (mockServices2.rootHealth = {}));
|
|
228
|
+
((httpRouter2) => {
|
|
229
|
+
httpRouter2.factory = () => httpRouter.httpRouterServiceFactory;
|
|
230
|
+
httpRouter2.mock = simpleMock(backendPluginApi.coreServices.httpRouter, () => ({
|
|
231
|
+
use: jest.fn(),
|
|
232
|
+
addAuthPolicy: jest.fn()
|
|
233
|
+
}));
|
|
234
|
+
})(mockServices2.httpRouter || (mockServices2.httpRouter = {}));
|
|
235
|
+
((rootHttpRouter2) => {
|
|
236
|
+
rootHttpRouter2.factory = () => rootHttpRouter.rootHttpRouterServiceFactory();
|
|
237
|
+
rootHttpRouter2.mock = simpleMock(backendPluginApi.coreServices.rootHttpRouter, () => ({
|
|
238
|
+
use: jest.fn()
|
|
239
|
+
}));
|
|
240
|
+
})(mockServices2.rootHttpRouter || (mockServices2.rootHttpRouter = {}));
|
|
241
|
+
((lifecycle2) => {
|
|
242
|
+
lifecycle2.factory = () => lifecycle.lifecycleServiceFactory;
|
|
243
|
+
lifecycle2.mock = simpleMock(backendPluginApi.coreServices.lifecycle, () => ({
|
|
244
|
+
addShutdownHook: jest.fn(),
|
|
245
|
+
addStartupHook: jest.fn()
|
|
246
|
+
}));
|
|
247
|
+
})(mockServices2.lifecycle || (mockServices2.lifecycle = {}));
|
|
248
|
+
((logger2) => {
|
|
249
|
+
logger2.factory = () => logger.loggerServiceFactory;
|
|
250
|
+
logger2.mock = simpleMock(
|
|
251
|
+
backendPluginApi.coreServices.logger,
|
|
252
|
+
() => createLoggerMock()
|
|
253
|
+
);
|
|
254
|
+
})(mockServices2.logger || (mockServices2.logger = {}));
|
|
255
|
+
((permissions2) => {
|
|
256
|
+
permissions2.factory = () => permissions.permissionsServiceFactory;
|
|
257
|
+
permissions2.mock = simpleMock(backendPluginApi.coreServices.permissions, () => ({
|
|
258
|
+
authorize: jest.fn(),
|
|
259
|
+
authorizeConditional: jest.fn()
|
|
260
|
+
}));
|
|
261
|
+
})(mockServices2.permissions || (mockServices2.permissions = {}));
|
|
262
|
+
((rootLifecycle2) => {
|
|
263
|
+
rootLifecycle2.factory = () => rootLifecycle.rootLifecycleServiceFactory;
|
|
264
|
+
rootLifecycle2.mock = simpleMock(backendPluginApi.coreServices.rootLifecycle, () => ({
|
|
265
|
+
addShutdownHook: jest.fn(),
|
|
266
|
+
addStartupHook: jest.fn()
|
|
267
|
+
}));
|
|
268
|
+
})(mockServices2.rootLifecycle || (mockServices2.rootLifecycle = {}));
|
|
269
|
+
((scheduler2) => {
|
|
270
|
+
scheduler2.factory = () => scheduler.schedulerServiceFactory;
|
|
271
|
+
scheduler2.mock = simpleMock(backendPluginApi.coreServices.scheduler, () => ({
|
|
272
|
+
createScheduledTaskRunner: jest.fn(),
|
|
273
|
+
getScheduledTasks: jest.fn(),
|
|
274
|
+
scheduleTask: jest.fn(),
|
|
275
|
+
triggerTask: jest.fn()
|
|
276
|
+
}));
|
|
277
|
+
})(mockServices2.scheduler || (mockServices2.scheduler = {}));
|
|
278
|
+
((urlReader2) => {
|
|
279
|
+
urlReader2.factory = () => urlReader.urlReaderServiceFactory;
|
|
280
|
+
urlReader2.mock = simpleMock(backendPluginApi.coreServices.urlReader, () => ({
|
|
281
|
+
readTree: jest.fn(),
|
|
282
|
+
readUrl: jest.fn(),
|
|
283
|
+
search: jest.fn()
|
|
284
|
+
}));
|
|
285
|
+
})(mockServices2.urlReader || (mockServices2.urlReader = {}));
|
|
286
|
+
((events2) => {
|
|
287
|
+
events2.factory = () => pluginEventsNode.eventsServiceFactory;
|
|
288
|
+
events2.mock = simpleMock(pluginEventsNode.eventsServiceRef, () => ({
|
|
289
|
+
publish: jest.fn(),
|
|
290
|
+
subscribe: jest.fn()
|
|
291
|
+
}));
|
|
292
|
+
})(mockServices2.events || (mockServices2.events = {}));
|
|
293
|
+
})(exports.mockServices || (exports.mockServices = {}));
|
|
294
|
+
//# sourceMappingURL=mockServices.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockServices.cjs.js","sources":["../../../src/next/services/mockServices.ts"],"sourcesContent":["/*\n * Copyright 2023 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 { cacheServiceFactory } from '@backstage/backend-defaults/cache';\nimport { databaseServiceFactory } from '@backstage/backend-defaults/database';\nimport {\n HostDiscovery,\n discoveryServiceFactory,\n} from '@backstage/backend-defaults/discovery';\nimport { httpRouterServiceFactory } from '@backstage/backend-defaults/httpRouter';\nimport { lifecycleServiceFactory } from '@backstage/backend-defaults/lifecycle';\nimport { loggerServiceFactory } from '@backstage/backend-defaults/logger';\nimport { permissionsServiceFactory } from '@backstage/backend-defaults/permissions';\nimport { rootHealthServiceFactory } from '@backstage/backend-defaults/rootHealth';\nimport { rootHttpRouterServiceFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { rootLifecycleServiceFactory } from '@backstage/backend-defaults/rootLifecycle';\nimport { schedulerServiceFactory } from '@backstage/backend-defaults/scheduler';\nimport { urlReaderServiceFactory } from '@backstage/backend-defaults/urlReader';\nimport {\n AuthService,\n BackstageCredentials,\n BackstageUserInfo,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n RootConfigService,\n ServiceFactory,\n ServiceRef,\n UserInfoService,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ConfigReader } from '@backstage/config';\nimport {\n eventsServiceFactory,\n eventsServiceRef,\n} from '@backstage/plugin-events-node';\nimport { JsonObject } from '@backstage/types';\nimport { MockAuthService } from './MockAuthService';\nimport { MockHttpAuthService } from './MockHttpAuthService';\nimport { MockRootLoggerService } from './MockRootLoggerService';\nimport { MockUserInfoService } from './MockUserInfoService';\nimport { mockCredentials } from './mockCredentials';\n\n/** @internal */\nfunction createLoggerMock() {\n return {\n child: jest.fn().mockImplementation(createLoggerMock),\n debug: jest.fn(),\n error: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n };\n}\n\n/** @internal */\nfunction simpleFactoryWithOptions<\n TService,\n TScope extends 'root' | 'plugin',\n TOptions extends [options?: object] = [],\n>(\n ref: ServiceRef<TService, TScope>,\n factory: (...options: TOptions) => TService,\n): (...options: TOptions) => ServiceFactory<TService, TScope> {\n const factoryWithOptions = (...options: TOptions) =>\n createServiceFactory({\n service: ref as ServiceRef<TService, any>,\n deps: {},\n async factory() {\n return factory(...options);\n },\n });\n return Object.assign(\n factoryWithOptions,\n factoryWithOptions(...([undefined] as unknown as TOptions)),\n ) as ServiceFactory<TService, TScope> &\n ((...options: TOptions) => ServiceFactory<TService, TScope>);\n}\n\n/** @public */\nexport type ServiceMock<TService> = {\n factory: ServiceFactory<TService>;\n} & {\n [Key in keyof TService]: TService[Key] extends (\n ...args: infer Args\n ) => infer Return\n ? TService[Key] & jest.MockInstance<Return, Args>\n : TService[Key];\n};\n\n/** @internal */\nfunction simpleMock<TService>(\n ref: ServiceRef<TService, any>,\n mockFactory: () => jest.Mocked<TService>,\n): (partialImpl?: Partial<TService>) => ServiceMock<TService> {\n return partialImpl => {\n const mock = mockFactory();\n if (partialImpl) {\n for (const [key, impl] of Object.entries(partialImpl)) {\n if (typeof impl === 'function') {\n (mock as any)[key].mockImplementation(impl);\n } else {\n (mock as any)[key] = impl;\n }\n }\n }\n return Object.assign(mock, {\n factory: createServiceFactory({\n service: ref,\n deps: {},\n factory: () => mock,\n }),\n }) as ServiceMock<TService>;\n };\n}\n\n/**\n * @public\n */\nexport namespace mockServices {\n export function rootConfig(options?: rootConfig.Options): RootConfigService {\n return new ConfigReader(options?.data, 'mock-config');\n }\n export namespace rootConfig {\n export type Options = { data?: JsonObject };\n\n export const factory = simpleFactoryWithOptions(\n coreServices.rootConfig,\n rootConfig,\n );\n export const mock = simpleMock(coreServices.rootConfig, () => ({\n get: jest.fn(),\n getBoolean: jest.fn(),\n getConfig: jest.fn(),\n getConfigArray: jest.fn(),\n getNumber: jest.fn(),\n getOptional: jest.fn(),\n getOptionalBoolean: jest.fn(),\n getOptionalConfig: jest.fn(),\n getOptionalConfigArray: jest.fn(),\n getOptionalNumber: jest.fn(),\n getOptionalString: jest.fn(),\n getOptionalStringArray: jest.fn(),\n getString: jest.fn(),\n getStringArray: jest.fn(),\n has: jest.fn(),\n keys: jest.fn(),\n }));\n }\n\n export function rootLogger(options?: rootLogger.Options): LoggerService {\n return MockRootLoggerService.create(options);\n }\n export namespace rootLogger {\n export type Options = {\n level?: 'none' | 'error' | 'warn' | 'info' | 'debug';\n };\n\n export const factory = simpleFactoryWithOptions(\n coreServices.rootLogger,\n rootLogger,\n );\n export const mock = simpleMock(coreServices.rootLogger, () => ({\n child: jest.fn(),\n debug: jest.fn(),\n error: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n }));\n }\n\n export function auth(options?: {\n pluginId?: string;\n disableDefaultAuthPolicy?: boolean;\n }): AuthService {\n return new MockAuthService({\n pluginId: options?.pluginId ?? 'test',\n disableDefaultAuthPolicy: Boolean(options?.disableDefaultAuthPolicy),\n });\n }\n export namespace auth {\n export const factory = () =>\n createServiceFactory({\n service: coreServices.auth,\n deps: {\n plugin: coreServices.pluginMetadata,\n config: coreServices.rootConfig,\n },\n factory({ plugin, config }) {\n const disableDefaultAuthPolicy = Boolean(\n config.getOptionalBoolean(\n 'backend.auth.dangerouslyDisableDefaultAuthPolicy',\n ),\n );\n return new MockAuthService({\n pluginId: plugin.getId(),\n disableDefaultAuthPolicy,\n });\n },\n });\n export const mock = simpleMock(coreServices.auth, () => ({\n authenticate: jest.fn(),\n getNoneCredentials: jest.fn(),\n getOwnServiceCredentials: jest.fn(),\n isPrincipal: jest.fn() as any,\n getPluginRequestToken: jest.fn(),\n getLimitedUserToken: jest.fn(),\n listPublicServiceKeys: jest.fn(),\n }));\n }\n\n export function discovery(): DiscoveryService {\n return HostDiscovery.fromConfig(\n new ConfigReader({\n backend: {\n // Invalid port to make sure that requests are always mocked\n baseUrl: 'http://localhost:0',\n listen: { port: 0 },\n },\n }),\n );\n }\n export namespace discovery {\n export const factory = () => discoveryServiceFactory;\n export const mock = simpleMock(coreServices.discovery, () => ({\n getBaseUrl: jest.fn(),\n getExternalBaseUrl: jest.fn(),\n }));\n }\n\n /**\n * Creates a mock implementation of the `HttpAuthService`.\n *\n * By default all requests without credentials are treated as requests from\n * the default mock user principal. This behavior can be configured with the\n * `defaultCredentials` option.\n */\n export function httpAuth(options?: {\n pluginId?: string;\n /**\n * The default credentials to use if there are no credentials present in the\n * incoming request.\n *\n * By default all requests without credentials are treated as authenticated\n * as the default mock user as returned from `mockCredentials.user()`.\n */\n defaultCredentials?: BackstageCredentials;\n }): HttpAuthService {\n return new MockHttpAuthService(\n options?.pluginId ?? 'test',\n options?.defaultCredentials ?? mockCredentials.user(),\n );\n }\n export namespace httpAuth {\n /**\n * Creates a mock service factory for the `HttpAuthService`.\n *\n * By default all requests without credentials are treated as requests from\n * the default mock user principal. This behavior can be configured with the\n * `defaultCredentials` option.\n */\n export const factory = (options?: {\n defaultCredentials?: BackstageCredentials;\n }) =>\n createServiceFactory({\n service: coreServices.httpAuth,\n deps: { plugin: coreServices.pluginMetadata },\n factory: ({ plugin }) =>\n new MockHttpAuthService(\n plugin.getId(),\n options?.defaultCredentials ?? mockCredentials.user(),\n ),\n });\n export const mock = simpleMock(coreServices.httpAuth, () => ({\n credentials: jest.fn(),\n issueUserCookie: jest.fn(),\n }));\n }\n\n /**\n * Creates a mock implementation of the `UserInfoService`.\n *\n * By default it extracts the user's entity ref from a user principal and\n * returns that as the only ownership entity ref, but this can be overridden\n * by passing in a custom set of user info.\n */\n export function userInfo(\n customInfo?: Partial<BackstageUserInfo>,\n ): UserInfoService {\n return new MockUserInfoService(customInfo);\n }\n export namespace userInfo {\n /**\n * Creates a mock service factory for the `UserInfoService`.\n *\n * By default it extracts the user's entity ref from a user principal and\n * returns that as the only ownership entity ref.\n */\n export const factory = () =>\n createServiceFactory({\n service: coreServices.userInfo,\n deps: {},\n factory() {\n return new MockUserInfoService();\n },\n });\n export const mock = simpleMock(coreServices.userInfo, () => ({\n getUserInfo: jest.fn(),\n }));\n }\n\n // TODO(Rugvip): Not all core services have implementations available here yet.\n // some may need a bit more refactoring for it to be simpler to\n // re-implement functioning mock versions here.\n export namespace cache {\n export const factory = () => cacheServiceFactory;\n export const mock = simpleMock(coreServices.cache, () => ({\n delete: jest.fn(),\n get: jest.fn(),\n set: jest.fn(),\n withOptions: jest.fn(),\n }));\n }\n\n export namespace database {\n export const factory = () => databaseServiceFactory;\n export const mock = simpleMock(coreServices.database, () => ({\n getClient: jest.fn(),\n }));\n }\n\n export namespace rootHealth {\n export const factory = () => rootHealthServiceFactory;\n export const mock = simpleMock(coreServices.rootHealth, () => ({\n getLiveness: jest.fn(),\n getReadiness: jest.fn(),\n }));\n }\n\n export namespace httpRouter {\n export const factory = () => httpRouterServiceFactory;\n export const mock = simpleMock(coreServices.httpRouter, () => ({\n use: jest.fn(),\n addAuthPolicy: jest.fn(),\n }));\n }\n\n export namespace rootHttpRouter {\n export const factory = () => rootHttpRouterServiceFactory();\n export const mock = simpleMock(coreServices.rootHttpRouter, () => ({\n use: jest.fn(),\n }));\n }\n\n export namespace lifecycle {\n export const factory = () => lifecycleServiceFactory;\n export const mock = simpleMock(coreServices.lifecycle, () => ({\n addShutdownHook: jest.fn(),\n addStartupHook: jest.fn(),\n }));\n }\n\n export namespace logger {\n export const factory = () => loggerServiceFactory;\n export const mock = simpleMock(coreServices.logger, () =>\n createLoggerMock(),\n );\n }\n\n export namespace permissions {\n export const factory = () => permissionsServiceFactory;\n export const mock = simpleMock(coreServices.permissions, () => ({\n authorize: jest.fn(),\n authorizeConditional: jest.fn(),\n }));\n }\n\n export namespace rootLifecycle {\n export const factory = () => rootLifecycleServiceFactory;\n export const mock = simpleMock(coreServices.rootLifecycle, () => ({\n addShutdownHook: jest.fn(),\n addStartupHook: jest.fn(),\n }));\n }\n\n export namespace scheduler {\n export const factory = () => schedulerServiceFactory;\n export const mock = simpleMock(coreServices.scheduler, () => ({\n createScheduledTaskRunner: jest.fn(),\n getScheduledTasks: jest.fn(),\n scheduleTask: jest.fn(),\n triggerTask: jest.fn(),\n }));\n }\n\n export namespace urlReader {\n export const factory = () => urlReaderServiceFactory;\n export const mock = simpleMock(coreServices.urlReader, () => ({\n readTree: jest.fn(),\n readUrl: jest.fn(),\n search: jest.fn(),\n }));\n }\n\n export namespace events {\n export const factory = () => eventsServiceFactory;\n export const mock = simpleMock(eventsServiceRef, () => ({\n publish: jest.fn(),\n subscribe: jest.fn(),\n }));\n }\n}\n"],"names":["createServiceFactory","mockServices","ConfigReader","rootConfig","coreServices","MockRootLoggerService","rootLogger","MockAuthService","auth","discovery","HostDiscovery","discoveryServiceFactory","MockHttpAuthService","mockCredentials","httpAuth","MockUserInfoService","userInfo","cache","cacheServiceFactory","database","databaseServiceFactory","rootHealth","rootHealthServiceFactory","httpRouter","httpRouterServiceFactory","rootHttpRouter","rootHttpRouterServiceFactory","lifecycle","lifecycleServiceFactory","logger","loggerServiceFactory","permissions","permissionsServiceFactory","rootLifecycle","rootLifecycleServiceFactory","scheduler","schedulerServiceFactory","urlReader","urlReaderServiceFactory","events","eventsServiceFactory","eventsServiceRef"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0DA,SAAS,gBAAmB,GAAA;AAC1B,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,IAAA,CAAK,EAAG,EAAA,CAAE,mBAAmB,gBAAgB,CAAA;AAAA,IACpD,KAAA,EAAO,KAAK,EAAG,EAAA;AAAA,IACf,KAAA,EAAO,KAAK,EAAG,EAAA;AAAA,IACf,IAAA,EAAM,KAAK,EAAG,EAAA;AAAA,IACd,IAAA,EAAM,KAAK,EAAG,EAAA;AAAA,GAChB,CAAA;AACF,CAAA;AAGA,SAAS,wBAAA,CAKP,KACA,OAC4D,EAAA;AAC5D,EAAM,MAAA,kBAAA,GAAqB,CAAI,GAAA,OAAA,KAC7BA,qCAAqB,CAAA;AAAA,IACnB,OAAS,EAAA,GAAA;AAAA,IACT,MAAM,EAAC;AAAA,IACP,MAAM,OAAU,GAAA;AACd,MAAO,OAAA,OAAA,CAAQ,GAAG,OAAO,CAAA,CAAA;AAAA,KAC3B;AAAA,GACD,CAAA,CAAA;AACH,EAAA,OAAO,MAAO,CAAA,MAAA;AAAA,IACZ,kBAAA;AAAA,IACA,kBAAmB,CAAA,GAAI,CAAC,KAAA,CAAS,CAAyB,CAAA;AAAA,GAC5D,CAAA;AAEF,CAAA;AAcA,SAAS,UAAA,CACP,KACA,WAC4D,EAAA;AAC5D,EAAA,OAAO,CAAe,WAAA,KAAA;AACpB,IAAA,MAAM,OAAO,WAAY,EAAA,CAAA;AACzB,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,KAAA,MAAW,CAAC,GAAK,EAAA,IAAI,KAAK,MAAO,CAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACrD,QAAI,IAAA,OAAO,SAAS,UAAY,EAAA;AAC9B,UAAC,IAAa,CAAA,GAAG,CAAE,CAAA,kBAAA,CAAmB,IAAI,CAAA,CAAA;AAAA,SACrC,MAAA;AACL,UAAC,IAAA,CAAa,GAAG,CAAI,GAAA,IAAA,CAAA;AAAA,SACvB;AAAA,OACF;AAAA,KACF;AACA,IAAO,OAAA,MAAA,CAAO,OAAO,IAAM,EAAA;AAAA,MACzB,SAASA,qCAAqB,CAAA;AAAA,QAC5B,OAAS,EAAA,GAAA;AAAA,QACT,MAAM,EAAC;AAAA,QACP,SAAS,MAAM,IAAA;AAAA,OAChB,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AAKiBC,8BAAA;AAAA,CAAV,CAAUA,aAAV,KAAA;AACE,EAAA,SAAS,WAAW,OAAiD,EAAA;AAC1E,IAAA,OAAO,IAAIC,mBAAA,CAAa,OAAS,EAAA,IAAA,EAAM,aAAa,CAAA,CAAA;AAAA,GACtD;AAFO,EAAAD,aAAS,CAAA,UAAA,GAAA,UAAA,CAAA;AAGT,EAAA,CAAA,CAAUE,WAAV,KAAA;AAGE,IAAMA,YAAA,OAAU,GAAA,wBAAA;AAAA,MACrBC,6BAAa,CAAA,UAAA;AAAA,MACbD,WAAAA;AAAA,KACF,CAAA;AACO,IAAMA,WAAA,CAAA,IAAA,GAAO,UAAW,CAAAC,6BAAA,CAAa,YAAY,OAAO;AAAA,MAC7D,GAAA,EAAK,KAAK,EAAG,EAAA;AAAA,MACb,UAAA,EAAY,KAAK,EAAG,EAAA;AAAA,MACpB,SAAA,EAAW,KAAK,EAAG,EAAA;AAAA,MACnB,cAAA,EAAgB,KAAK,EAAG,EAAA;AAAA,MACxB,SAAA,EAAW,KAAK,EAAG,EAAA;AAAA,MACnB,WAAA,EAAa,KAAK,EAAG,EAAA;AAAA,MACrB,kBAAA,EAAoB,KAAK,EAAG,EAAA;AAAA,MAC5B,iBAAA,EAAmB,KAAK,EAAG,EAAA;AAAA,MAC3B,sBAAA,EAAwB,KAAK,EAAG,EAAA;AAAA,MAChC,iBAAA,EAAmB,KAAK,EAAG,EAAA;AAAA,MAC3B,iBAAA,EAAmB,KAAK,EAAG,EAAA;AAAA,MAC3B,sBAAA,EAAwB,KAAK,EAAG,EAAA;AAAA,MAChC,SAAA,EAAW,KAAK,EAAG,EAAA;AAAA,MACnB,cAAA,EAAgB,KAAK,EAAG,EAAA;AAAA,MACxB,GAAA,EAAK,KAAK,EAAG,EAAA;AAAA,MACb,IAAA,EAAM,KAAK,EAAG,EAAA;AAAA,KACd,CAAA,CAAA,CAAA;AAAA,GAxBa,EAAA,UAAA,GAAAH,aAAA,CAAA,UAAA,KAAAA,aAAA,CAAA,UAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AA2BV,EAAA,SAAS,WAAW,OAA6C,EAAA;AACtE,IAAO,OAAAI,2CAAA,CAAsB,OAAO,OAAO,CAAA,CAAA;AAAA,GAC7C;AAFO,EAAAJ,aAAS,CAAA,UAAA,GAAA,UAAA,CAAA;AAGT,EAAA,CAAA,CAAUK,WAAV,KAAA;AAKE,IAAMA,YAAA,OAAU,GAAA,wBAAA;AAAA,MACrBF,6BAAa,CAAA,UAAA;AAAA,MACbE,WAAAA;AAAA,KACF,CAAA;AACO,IAAMA,WAAA,CAAA,IAAA,GAAO,UAAW,CAAAF,6BAAA,CAAa,YAAY,OAAO;AAAA,MAC7D,KAAA,EAAO,KAAK,EAAG,EAAA;AAAA,MACf,KAAA,EAAO,KAAK,EAAG,EAAA;AAAA,MACf,KAAA,EAAO,KAAK,EAAG,EAAA;AAAA,MACf,IAAA,EAAM,KAAK,EAAG,EAAA;AAAA,MACd,IAAA,EAAM,KAAK,EAAG,EAAA;AAAA,KACd,CAAA,CAAA,CAAA;AAAA,GAfa,EAAA,UAAA,GAAAH,aAAA,CAAA,UAAA,KAAAA,aAAA,CAAA,UAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAkBV,EAAA,SAAS,KAAK,OAGL,EAAA;AACd,IAAA,OAAO,IAAIM,+BAAgB,CAAA;AAAA,MACzB,QAAA,EAAU,SAAS,QAAY,IAAA,MAAA;AAAA,MAC/B,wBAAA,EAA0B,OAAQ,CAAA,OAAA,EAAS,wBAAwB,CAAA;AAAA,KACpE,CAAA,CAAA;AAAA,GACH;AARO,EAAAN,aAAS,CAAA,IAAA,GAAA,IAAA,CAAA;AAST,EAAA,CAAA,CAAUO,KAAV,KAAA;AACE,IAAMA,KAAAA,CAAA,OAAU,GAAA,MACrBR,qCAAqB,CAAA;AAAA,MACnB,SAASI,6BAAa,CAAA,IAAA;AAAA,MACtB,IAAM,EAAA;AAAA,QACJ,QAAQA,6BAAa,CAAA,cAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,UAAA;AAAA,OACvB;AAAA,MACA,OAAQ,CAAA,EAAE,MAAQ,EAAA,MAAA,EAAU,EAAA;AAC1B,QAAA,MAAM,wBAA2B,GAAA,OAAA;AAAA,UAC/B,MAAO,CAAA,kBAAA;AAAA,YACL,kDAAA;AAAA,WACF;AAAA,SACF,CAAA;AACA,QAAA,OAAO,IAAIG,+BAAgB,CAAA;AAAA,UACzB,QAAA,EAAU,OAAO,KAAM,EAAA;AAAA,UACvB,wBAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACH;AAAA,KACD,CAAA,CAAA;AACI,IAAMC,KAAA,CAAA,IAAA,GAAO,UAAW,CAAAJ,6BAAA,CAAa,MAAM,OAAO;AAAA,MACvD,YAAA,EAAc,KAAK,EAAG,EAAA;AAAA,MACtB,kBAAA,EAAoB,KAAK,EAAG,EAAA;AAAA,MAC5B,wBAAA,EAA0B,KAAK,EAAG,EAAA;AAAA,MAClC,WAAA,EAAa,KAAK,EAAG,EAAA;AAAA,MACrB,qBAAA,EAAuB,KAAK,EAAG,EAAA;AAAA,MAC/B,mBAAA,EAAqB,KAAK,EAAG,EAAA;AAAA,MAC7B,qBAAA,EAAuB,KAAK,EAAG,EAAA;AAAA,KAC/B,CAAA,CAAA,CAAA;AAAA,GA5Ba,EAAA,IAAA,GAAAH,aAAA,CAAA,IAAA,KAAAA,aAAA,CAAA,IAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AA+BV,EAAA,SAASQ,WAA8B,GAAA;AAC5C,IAAA,OAAOC,uBAAc,CAAA,UAAA;AAAA,MACnB,IAAIR,mBAAa,CAAA;AAAA,QACf,OAAS,EAAA;AAAA;AAAA,UAEP,OAAS,EAAA,oBAAA;AAAA,UACT,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAE,EAAA;AAAA,SACpB;AAAA,OACD,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AAVO,EAAAD,aAAS,CAAA,SAAA,GAAAQ,WAAA,CAAA;AAWT,EAAA,CAAA,CAAUA,UAAV,KAAA;AACE,IAAMA,UAAAA,CAAA,UAAU,MAAME,iCAAA,CAAA;AACtB,IAAMF,UAAA,CAAA,IAAA,GAAO,UAAW,CAAAL,6BAAA,CAAa,WAAW,OAAO;AAAA,MAC5D,UAAA,EAAY,KAAK,EAAG,EAAA;AAAA,MACpB,kBAAA,EAAoB,KAAK,EAAG,EAAA;AAAA,KAC5B,CAAA,CAAA,CAAA;AAAA,GALa,EAAAK,WAAA,GAAAR,aAAA,CAAA,SAAA,KAAAA,aAAA,CAAA,SAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAeV,EAAA,SAAS,SAAS,OAUL,EAAA;AAClB,IAAA,OAAO,IAAIW,uCAAA;AAAA,MACT,SAAS,QAAY,IAAA,MAAA;AAAA,MACrB,OAAA,EAAS,kBAAsB,IAAAC,+BAAA,CAAgB,IAAK,EAAA;AAAA,KACtD,CAAA;AAAA,GACF;AAfO,EAAAZ,aAAS,CAAA,QAAA,GAAA,QAAA,CAAA;AAgBT,EAAA,CAAA,CAAUa,SAAV,KAAA;AAQE,IAAMA,SAAA,CAAA,OAAA,GAAU,CAAC,OAAA,KAGtBd,qCAAqB,CAAA;AAAA,MACnB,SAASI,6BAAa,CAAA,QAAA;AAAA,MACtB,IAAM,EAAA,EAAE,MAAQ,EAAAA,6BAAA,CAAa,cAAe,EAAA;AAAA,MAC5C,OAAS,EAAA,CAAC,EAAE,MAAA,OACV,IAAIQ,uCAAA;AAAA,QACF,OAAO,KAAM,EAAA;AAAA,QACb,OAAA,EAAS,kBAAsB,IAAAC,+BAAA,CAAgB,IAAK,EAAA;AAAA,OACtD;AAAA,KACH,CAAA,CAAA;AACI,IAAMC,SAAA,CAAA,IAAA,GAAO,UAAW,CAAAV,6BAAA,CAAa,UAAU,OAAO;AAAA,MAC3D,WAAA,EAAa,KAAK,EAAG,EAAA;AAAA,MACrB,eAAA,EAAiB,KAAK,EAAG,EAAA;AAAA,KACzB,CAAA,CAAA,CAAA;AAAA,GAvBa,EAAA,QAAA,GAAAH,aAAA,CAAA,QAAA,KAAAA,aAAA,CAAA,QAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAiCV,EAAA,SAAS,SACd,UACiB,EAAA;AACjB,IAAO,OAAA,IAAIc,wCAAoB,UAAU,CAAA,CAAA;AAAA,GAC3C;AAJO,EAAAd,aAAS,CAAA,QAAA,GAAA,QAAA,CAAA;AAKT,EAAA,CAAA,CAAUe,SAAV,KAAA;AAOE,IAAMA,SAAAA,CAAA,OAAU,GAAA,MACrBhB,qCAAqB,CAAA;AAAA,MACnB,SAASI,6BAAa,CAAA,QAAA;AAAA,MACtB,MAAM,EAAC;AAAA,MACP,OAAU,GAAA;AACR,QAAA,OAAO,IAAIW,uCAAoB,EAAA,CAAA;AAAA,OACjC;AAAA,KACD,CAAA,CAAA;AACI,IAAMC,SAAA,CAAA,IAAA,GAAO,UAAW,CAAAZ,6BAAA,CAAa,UAAU,OAAO;AAAA,MAC3D,WAAA,EAAa,KAAK,EAAG,EAAA;AAAA,KACrB,CAAA,CAAA,CAAA;AAAA,GAjBa,EAAA,QAAA,GAAAH,aAAA,CAAA,QAAA,KAAAA,aAAA,CAAA,QAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAuBV,EAAA,CAAA,CAAUgB,MAAV,KAAA;AACE,IAAMA,MAAAA,CAAA,UAAU,MAAMC,yBAAA,CAAA;AACtB,IAAMD,MAAA,CAAA,IAAA,GAAO,UAAW,CAAAb,6BAAA,CAAa,OAAO,OAAO;AAAA,MACxD,MAAA,EAAQ,KAAK,EAAG,EAAA;AAAA,MAChB,GAAA,EAAK,KAAK,EAAG,EAAA;AAAA,MACb,GAAA,EAAK,KAAK,EAAG,EAAA;AAAA,MACb,WAAA,EAAa,KAAK,EAAG,EAAA;AAAA,KACrB,CAAA,CAAA,CAAA;AAAA,GAPa,EAAAH,aAAA,CAAA,KAAA,KAAAA,aAAA,CAAA,KAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAUV,EAAA,CAAA,CAAUkB,SAAV,KAAA;AACE,IAAMA,SAAAA,CAAA,UAAU,MAAMC,+BAAA,CAAA;AACtB,IAAMD,SAAA,CAAA,IAAA,GAAO,UAAW,CAAAf,6BAAA,CAAa,UAAU,OAAO;AAAA,MAC3D,SAAA,EAAW,KAAK,EAAG,EAAA;AAAA,KACnB,CAAA,CAAA,CAAA;AAAA,GAJa,EAAAH,aAAA,CAAA,QAAA,KAAAA,aAAA,CAAA,QAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAOV,EAAA,CAAA,CAAUoB,WAAV,KAAA;AACE,IAAMA,WAAAA,CAAA,UAAU,MAAMC,mCAAA,CAAA;AACtB,IAAMD,WAAA,CAAA,IAAA,GAAO,UAAW,CAAAjB,6BAAA,CAAa,YAAY,OAAO;AAAA,MAC7D,WAAA,EAAa,KAAK,EAAG,EAAA;AAAA,MACrB,YAAA,EAAc,KAAK,EAAG,EAAA;AAAA,KACtB,CAAA,CAAA,CAAA;AAAA,GALa,EAAAH,aAAA,CAAA,UAAA,KAAAA,aAAA,CAAA,UAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAQV,EAAA,CAAA,CAAUsB,WAAV,KAAA;AACE,IAAMA,WAAAA,CAAA,UAAU,MAAMC,mCAAA,CAAA;AACtB,IAAMD,WAAA,CAAA,IAAA,GAAO,UAAW,CAAAnB,6BAAA,CAAa,YAAY,OAAO;AAAA,MAC7D,GAAA,EAAK,KAAK,EAAG,EAAA;AAAA,MACb,aAAA,EAAe,KAAK,EAAG,EAAA;AAAA,KACvB,CAAA,CAAA,CAAA;AAAA,GALa,EAAAH,aAAA,CAAA,UAAA,KAAAA,aAAA,CAAA,UAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAQV,EAAA,CAAA,CAAUwB,eAAV,KAAA;AACE,IAAMA,eAAAA,CAAA,OAAU,GAAA,MAAMC,2CAA6B,EAAA,CAAA;AACnD,IAAMD,eAAA,CAAA,IAAA,GAAO,UAAW,CAAArB,6BAAA,CAAa,gBAAgB,OAAO;AAAA,MACjE,GAAA,EAAK,KAAK,EAAG,EAAA;AAAA,KACb,CAAA,CAAA,CAAA;AAAA,GAJa,EAAAH,aAAA,CAAA,cAAA,KAAAA,aAAA,CAAA,cAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAOV,EAAA,CAAA,CAAU0B,UAAV,KAAA;AACE,IAAMA,UAAAA,CAAA,UAAU,MAAMC,iCAAA,CAAA;AACtB,IAAMD,UAAA,CAAA,IAAA,GAAO,UAAW,CAAAvB,6BAAA,CAAa,WAAW,OAAO;AAAA,MAC5D,eAAA,EAAiB,KAAK,EAAG,EAAA;AAAA,MACzB,cAAA,EAAgB,KAAK,EAAG,EAAA;AAAA,KACxB,CAAA,CAAA,CAAA;AAAA,GALa,EAAAH,aAAA,CAAA,SAAA,KAAAA,aAAA,CAAA,SAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAQV,EAAA,CAAA,CAAU4B,OAAV,KAAA;AACE,IAAMA,OAAAA,CAAA,UAAU,MAAMC,2BAAA,CAAA;AACtB,IAAMD,QAAA,IAAO,GAAA,UAAA;AAAA,MAAWzB,6BAAa,CAAA,MAAA;AAAA,MAAQ,MAClD,gBAAiB,EAAA;AAAA,KACnB,CAAA;AAAA,GAJe,EAAAH,aAAA,CAAA,MAAA,KAAAA,aAAA,CAAA,MAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAOV,EAAA,CAAA,CAAU8B,YAAV,KAAA;AACE,IAAMA,YAAAA,CAAA,UAAU,MAAMC,qCAAA,CAAA;AACtB,IAAMD,YAAA,CAAA,IAAA,GAAO,UAAW,CAAA3B,6BAAA,CAAa,aAAa,OAAO;AAAA,MAC9D,SAAA,EAAW,KAAK,EAAG,EAAA;AAAA,MACnB,oBAAA,EAAsB,KAAK,EAAG,EAAA;AAAA,KAC9B,CAAA,CAAA,CAAA;AAAA,GALa,EAAAH,aAAA,CAAA,WAAA,KAAAA,aAAA,CAAA,WAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAQV,EAAA,CAAA,CAAUgC,cAAV,KAAA;AACE,IAAMA,cAAAA,CAAA,UAAU,MAAMC,yCAAA,CAAA;AACtB,IAAMD,cAAA,CAAA,IAAA,GAAO,UAAW,CAAA7B,6BAAA,CAAa,eAAe,OAAO;AAAA,MAChE,eAAA,EAAiB,KAAK,EAAG,EAAA;AAAA,MACzB,cAAA,EAAgB,KAAK,EAAG,EAAA;AAAA,KACxB,CAAA,CAAA,CAAA;AAAA,GALa,EAAAH,aAAA,CAAA,aAAA,KAAAA,aAAA,CAAA,aAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAQV,EAAA,CAAA,CAAUkC,UAAV,KAAA;AACE,IAAMA,UAAAA,CAAA,UAAU,MAAMC,iCAAA,CAAA;AACtB,IAAMD,UAAA,CAAA,IAAA,GAAO,UAAW,CAAA/B,6BAAA,CAAa,WAAW,OAAO;AAAA,MAC5D,yBAAA,EAA2B,KAAK,EAAG,EAAA;AAAA,MACnC,iBAAA,EAAmB,KAAK,EAAG,EAAA;AAAA,MAC3B,YAAA,EAAc,KAAK,EAAG,EAAA;AAAA,MACtB,WAAA,EAAa,KAAK,EAAG,EAAA;AAAA,KACrB,CAAA,CAAA,CAAA;AAAA,GAPa,EAAAH,aAAA,CAAA,SAAA,KAAAA,aAAA,CAAA,SAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAUV,EAAA,CAAA,CAAUoC,UAAV,KAAA;AACE,IAAMA,UAAAA,CAAA,UAAU,MAAMC,iCAAA,CAAA;AACtB,IAAMD,UAAA,CAAA,IAAA,GAAO,UAAW,CAAAjC,6BAAA,CAAa,WAAW,OAAO;AAAA,MAC5D,QAAA,EAAU,KAAK,EAAG,EAAA;AAAA,MAClB,OAAA,EAAS,KAAK,EAAG,EAAA;AAAA,MACjB,MAAA,EAAQ,KAAK,EAAG,EAAA;AAAA,KAChB,CAAA,CAAA,CAAA;AAAA,GANa,EAAAH,aAAA,CAAA,SAAA,KAAAA,aAAA,CAAA,SAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AASV,EAAA,CAAA,CAAUsC,OAAV,KAAA;AACE,IAAMA,OAAAA,CAAA,UAAU,MAAMC,qCAAA,CAAA;AACtB,IAAMD,OAAA,CAAA,IAAA,GAAO,UAAW,CAAAE,iCAAA,EAAkB,OAAO;AAAA,MACtD,OAAA,EAAS,KAAK,EAAG,EAAA;AAAA,MACjB,SAAA,EAAW,KAAK,EAAG,EAAA;AAAA,KACnB,CAAA,CAAA,CAAA;AAAA,GALa,EAAAxC,aAAA,CAAA,MAAA,KAAAA,aAAA,CAAA,MAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AAAA,CA7RF,EAAAA,oBAAA,KAAAA,oBAAA,GAAA,EAAA,CAAA,CAAA;;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var TestBackend = require('./TestBackend.cjs.js');
|
|
4
|
+
var ServiceRegistry = require('../../backend-app-api/src/wiring/ServiceRegistry.cjs.js');
|
|
5
|
+
|
|
6
|
+
class ServiceFactoryTester {
|
|
7
|
+
#subject;
|
|
8
|
+
#registry;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new {@link ServiceFactoryTester} used to test the provided subject.
|
|
11
|
+
*
|
|
12
|
+
* @param subject - The service factory to test.
|
|
13
|
+
* @param options - Additional options
|
|
14
|
+
* @returns A new tester instance for the provided subject.
|
|
15
|
+
*/
|
|
16
|
+
static from(subject, options) {
|
|
17
|
+
const registry = ServiceRegistry.ServiceRegistry.create([
|
|
18
|
+
...TestBackend.defaultServiceFactories,
|
|
19
|
+
...options?.dependencies ?? [],
|
|
20
|
+
subject
|
|
21
|
+
]);
|
|
22
|
+
return new ServiceFactoryTester(subject.service, registry);
|
|
23
|
+
}
|
|
24
|
+
constructor(subject, registry) {
|
|
25
|
+
this.#subject = subject;
|
|
26
|
+
this.#registry = registry;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns the service instance for the subject.
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
*
|
|
33
|
+
* If the subject is a plugin scoped service factory a plugin ID
|
|
34
|
+
* can be provided to instantiate the service for a specific plugin.
|
|
35
|
+
*
|
|
36
|
+
* By default the plugin ID 'test' is used.
|
|
37
|
+
*/
|
|
38
|
+
async getSubject(...args) {
|
|
39
|
+
const [pluginId] = args;
|
|
40
|
+
const instance = this.#registry.get(this.#subject, pluginId ?? "test");
|
|
41
|
+
return instance;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Return the service instance for any of the provided dependencies or built-in services.
|
|
45
|
+
*
|
|
46
|
+
* @remarks
|
|
47
|
+
*
|
|
48
|
+
* A plugin ID can optionally be provided for plugin scoped services, otherwise the plugin ID 'test' is used.
|
|
49
|
+
*/
|
|
50
|
+
async getService(service, ...args) {
|
|
51
|
+
const [pluginId] = args;
|
|
52
|
+
const instance = await this.#registry.get(service, pluginId ?? "test");
|
|
53
|
+
if (instance === void 0) {
|
|
54
|
+
throw new Error(`Service '${service.id}' not found`);
|
|
55
|
+
}
|
|
56
|
+
return instance;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
exports.ServiceFactoryTester = ServiceFactoryTester;
|
|
61
|
+
//# sourceMappingURL=ServiceFactoryTester.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceFactoryTester.cjs.js","sources":["../../../src/next/wiring/ServiceFactoryTester.ts"],"sourcesContent":["/*\n * Copyright 2023 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 { ServiceFactory, ServiceRef } from '@backstage/backend-plugin-api';\nimport { defaultServiceFactories } from './TestBackend';\n// Direct internal import to avoid duplication.\n// This is a relative import in order to make sure that the implementation is duplicated\n// rather than leading to an import from @backstage/backend-app-api.\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { ServiceRegistry } from '../../../../backend-app-api/src/wiring/ServiceRegistry';\n\n/**\n * Options for {@link ServiceFactoryTester}.\n * @public\n */\nexport interface ServiceFactoryTesterOptions {\n /**\n * Additional service factories to make available as dependencies.\n *\n * @remarks\n *\n * If a service factory is provided for a service that already has a default\n * implementation, the provided factory will override the default.\n */\n dependencies?: Array<ServiceFactory>;\n}\n\n/**\n * A utility to help test service factories in isolation.\n *\n * @public\n */\nexport class ServiceFactoryTester<\n TService,\n TScope extends 'root' | 'plugin',\n TInstances extends 'singleton' | 'multiton' = 'singleton',\n> {\n readonly #subject: ServiceRef<TService, TScope, TInstances>;\n readonly #registry: ServiceRegistry;\n\n /**\n * Creates a new {@link ServiceFactoryTester} used to test the provided subject.\n *\n * @param subject - The service factory to test.\n * @param options - Additional options\n * @returns A new tester instance for the provided subject.\n */\n static from<\n TService,\n TScope extends 'root' | 'plugin',\n TInstances extends 'singleton' | 'multiton' = 'singleton',\n >(\n subject: ServiceFactory<TService, TScope, TInstances>,\n options?: ServiceFactoryTesterOptions,\n ): ServiceFactoryTester<TService, TScope, TInstances> {\n const registry = ServiceRegistry.create([\n ...defaultServiceFactories,\n ...(options?.dependencies ?? []),\n subject,\n ]);\n return new ServiceFactoryTester(subject.service, registry);\n }\n\n private constructor(\n subject: ServiceRef<TService, TScope, TInstances>,\n registry: ServiceRegistry,\n ) {\n this.#subject = subject;\n this.#registry = registry;\n }\n\n /**\n * Returns the service instance for the subject.\n *\n * @remarks\n *\n * If the subject is a plugin scoped service factory a plugin ID\n * can be provided to instantiate the service for a specific plugin.\n *\n * By default the plugin ID 'test' is used.\n */\n async getSubject(\n ...args: 'root' extends TScope ? [] : [pluginId?: string]\n ): Promise<TInstances extends 'multiton' ? TService[] : TService> {\n const [pluginId] = args;\n const instance = this.#registry.get(this.#subject, pluginId ?? 'test')!;\n return instance;\n }\n\n /**\n * Return the service instance for any of the provided dependencies or built-in services.\n *\n * @remarks\n *\n * A plugin ID can optionally be provided for plugin scoped services, otherwise the plugin ID 'test' is used.\n */\n async getService<\n TGetService,\n TGetScope extends 'root' | 'plugin',\n TGetInstances extends 'singleton' | 'multiton' = 'singleton',\n >(\n service: ServiceRef<TGetService, TGetScope, TGetInstances>,\n ...args: 'root' extends TGetScope ? [] : [pluginId?: string]\n ): Promise<TGetInstances extends 'multiton' ? TGetService[] : TGetService> {\n const [pluginId] = args;\n const instance = await this.#registry.get(service, pluginId ?? 'test');\n if (instance === undefined) {\n throw new Error(`Service '${service.id}' not found`);\n }\n return instance;\n }\n}\n"],"names":["ServiceRegistry","defaultServiceFactories"],"mappings":";;;;;AA6CO,MAAM,oBAIX,CAAA;AAAA,EACS,QAAA,CAAA;AAAA,EACA,SAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST,OAAO,IAKL,CAAA,OAAA,EACA,OACoD,EAAA;AACpD,IAAM,MAAA,QAAA,GAAWA,gCAAgB,MAAO,CAAA;AAAA,MACtC,GAAGC,mCAAA;AAAA,MACH,GAAI,OAAS,EAAA,YAAA,IAAgB,EAAC;AAAA,MAC9B,OAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAA,OAAO,IAAI,oBAAA,CAAqB,OAAQ,CAAA,OAAA,EAAS,QAAQ,CAAA,CAAA;AAAA,GAC3D;AAAA,EAEQ,WAAA,CACN,SACA,QACA,EAAA;AACA,IAAA,IAAA,CAAK,QAAW,GAAA,OAAA,CAAA;AAChB,IAAA,IAAA,CAAK,SAAY,GAAA,QAAA,CAAA;AAAA,GACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cACD,IAC6D,EAAA;AAChE,IAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA,CAAA;AACnB,IAAA,MAAM,WAAW,IAAK,CAAA,SAAA,CAAU,IAAI,IAAK,CAAA,QAAA,EAAU,YAAY,MAAM,CAAA,CAAA;AACrE,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAKJ,CAAA,OAAA,EAAA,GACG,IACsE,EAAA;AACzE,IAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA,CAAA;AACnB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAU,GAAI,CAAA,OAAA,EAAS,YAAY,MAAM,CAAA,CAAA;AACrE,IAAA,IAAI,aAAa,KAAW,CAAA,EAAA;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAY,SAAA,EAAA,OAAA,CAAQ,EAAE,CAAa,WAAA,CAAA,CAAA,CAAA;AAAA,KACrD;AACA,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AACF;;;;"}
|