@backstage/backend-test-utils 1.4.0 → 1.5.0-next.1
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 +36 -0
- package/dist/cache/TestCaches.cjs.js +13 -0
- package/dist/cache/TestCaches.cjs.js.map +1 -1
- package/dist/cache/types.cjs.js +6 -0
- package/dist/cache/types.cjs.js.map +1 -1
- package/dist/cache/valkey.cjs.js +62 -0
- package/dist/cache/valkey.cjs.js.map +1 -0
- package/dist/index.d.ts +19 -4
- package/dist/next/services/MockEventsService.cjs.js +21 -0
- package/dist/next/services/MockEventsService.cjs.js.map +1 -0
- package/dist/next/services/mockServices.cjs.js +8 -3
- package/dist/next/services/mockServices.cjs.js.map +1 -1
- package/package.json +11 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
# @backstage/backend-test-utils
|
|
2
2
|
|
|
3
|
+
## 1.5.0-next.1
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- c6bc67d: Added Valkey support alongside Redis in backend-defaults cache clients, using the new Keyv Valkey package. Also extended backend-test-utils to support Valkey in tests.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies
|
|
12
|
+
- @backstage/backend-defaults@0.10.0-next.1
|
|
13
|
+
- @backstage/backend-app-api@1.2.3-next.1
|
|
14
|
+
- @backstage/plugin-auth-node@0.6.3-next.1
|
|
15
|
+
- @backstage/backend-plugin-api@1.3.1-next.1
|
|
16
|
+
- @backstage/config@1.3.2
|
|
17
|
+
- @backstage/errors@1.2.7
|
|
18
|
+
- @backstage/types@1.2.1
|
|
19
|
+
- @backstage/plugin-events-node@0.4.11-next.1
|
|
20
|
+
|
|
21
|
+
## 1.5.0-next.0
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- b3832d1: Add a functional `mockServices.events()`
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- Updated dependencies
|
|
30
|
+
- @backstage/backend-defaults@0.9.1-next.0
|
|
31
|
+
- @backstage/backend-app-api@1.2.3-next.0
|
|
32
|
+
- @backstage/backend-plugin-api@1.3.1-next.0
|
|
33
|
+
- @backstage/plugin-auth-node@0.6.3-next.0
|
|
34
|
+
- @backstage/plugin-events-node@0.4.11-next.0
|
|
35
|
+
- @backstage/config@1.3.2
|
|
36
|
+
- @backstage/errors@1.2.7
|
|
37
|
+
- @backstage/types@1.2.1
|
|
38
|
+
|
|
3
39
|
## 1.4.0
|
|
4
40
|
|
|
5
41
|
### Minor Changes
|
|
@@ -5,6 +5,7 @@ var isDockerDisabledForTests = require('../util/isDockerDisabledForTests.cjs.js'
|
|
|
5
5
|
var memcache = require('./memcache.cjs.js');
|
|
6
6
|
var redis = require('./redis.cjs.js');
|
|
7
7
|
var types = require('./types.cjs.js');
|
|
8
|
+
var valkey = require('./valkey.cjs.js');
|
|
8
9
|
|
|
9
10
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
10
11
|
|
|
@@ -110,6 +111,8 @@ class TestCaches {
|
|
|
110
111
|
return this.initMemcached(properties);
|
|
111
112
|
case "redis":
|
|
112
113
|
return this.initRedis(properties);
|
|
114
|
+
case "valkey":
|
|
115
|
+
return this.initValkey(properties);
|
|
113
116
|
case "memory":
|
|
114
117
|
return {
|
|
115
118
|
store: "memory",
|
|
@@ -142,6 +145,16 @@ class TestCaches {
|
|
|
142
145
|
}
|
|
143
146
|
return await redis.startRedisContainer(properties.dockerImageName);
|
|
144
147
|
}
|
|
148
|
+
async initValkey(properties) {
|
|
149
|
+
const envVarName = properties.connectionStringEnvironmentVariableName;
|
|
150
|
+
if (envVarName) {
|
|
151
|
+
const connectionString = process.env[envVarName];
|
|
152
|
+
if (connectionString) {
|
|
153
|
+
return valkey.connectToExternalValkey(connectionString);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return await valkey.startValkeyContainer(properties.dockerImageName);
|
|
157
|
+
}
|
|
145
158
|
async shutdown() {
|
|
146
159
|
const instances = [...this.instanceById.values()];
|
|
147
160
|
this.instanceById.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaches.cjs.js","sources":["../../src/cache/TestCaches.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 Keyv from 'keyv';\nimport { isDockerDisabledForTests } from '../util/isDockerDisabledForTests';\nimport { connectToExternalMemcache, startMemcachedContainer } from './memcache';\nimport { connectToExternalRedis, startRedisContainer } from './redis';\nimport { Instance, TestCacheId, TestCacheProperties, allCaches } from './types';\n\n/**\n * Encapsulates the creation of ephemeral test cache instances for use inside\n * unit or integration tests.\n *\n * @public\n */\nexport class TestCaches {\n private readonly instanceById: Map<string, Instance>;\n private readonly supportedIds: TestCacheId[];\n private static defaultIds?: TestCacheId[];\n\n /**\n * Creates an empty `TestCaches` instance, and sets up Jest to clean up all of\n * its acquired resources after all tests finish.\n *\n * You typically want to create just a single instance like this at the top of\n * your test file or `describe` block, and then call `init` many times on that\n * instance inside the individual tests. Spinning up a \"physical\" cache\n * instance takes a considerable amount of time, slowing down tests. But\n * wiping the contents of an instance using `init` is very fast.\n */\n static create(options?: {\n ids?: TestCacheId[];\n disableDocker?: boolean;\n }): TestCaches {\n const ids = options?.ids;\n const disableDocker = options?.disableDocker ?? isDockerDisabledForTests();\n\n let testCacheIds: TestCacheId[];\n if (ids) {\n testCacheIds = ids;\n } else if (TestCaches.defaultIds) {\n testCacheIds = TestCaches.defaultIds;\n } else {\n testCacheIds = Object.keys(allCaches) as TestCacheId[];\n }\n\n const supportedIds = testCacheIds.filter(id => {\n const properties = allCaches[id];\n if (!properties) {\n return false;\n }\n // If the caller has set up the env with an explicit connection string,\n // we'll assume that this target will work\n if (\n properties.connectionStringEnvironmentVariableName &&\n process.env[properties.connectionStringEnvironmentVariableName]\n ) {\n return true;\n }\n // If the cache doesn't require docker at all, there's nothing to worry\n // about\n if (!properties.dockerImageName) {\n return true;\n }\n // If the cache requires docker, but docker is disabled, we will fail.\n if (disableDocker) {\n return false;\n }\n return true;\n });\n\n const caches = new TestCaches(supportedIds);\n\n if (supportedIds.length > 0) {\n afterAll(async () => {\n await caches.shutdown();\n });\n }\n\n return caches;\n }\n\n static setDefaults(options: { ids?: TestCacheId[] }) {\n TestCaches.defaultIds = options.ids;\n }\n\n private constructor(supportedIds: TestCacheId[]) {\n this.instanceById = new Map();\n this.supportedIds = supportedIds;\n }\n\n supports(id: TestCacheId): boolean {\n return this.supportedIds.includes(id);\n }\n\n eachSupportedId(): [TestCacheId][] {\n return this.supportedIds.map(id => [id]);\n }\n\n /**\n * Returns a fresh, empty cache for the given driver.\n *\n * @param id - The ID of the cache to use, e.g. 'REDIS_7'\n * @returns Cache connection properties\n */\n async init(\n id: TestCacheId,\n ): Promise<{ store: string; connection: string; keyv: Keyv }> {\n const properties = allCaches[id];\n if (!properties) {\n const candidates = Object.keys(allCaches).join(', ');\n throw new Error(\n `Unknown test cache ${id}, possible values are ${candidates}`,\n );\n }\n if (!this.supportedIds.includes(id)) {\n const candidates = this.supportedIds.join(', ');\n throw new Error(\n `Unsupported test cache ${id} for this environment, possible values are ${candidates}`,\n );\n }\n\n // Ensure that a testcontainers instance is up for this ID\n let instance: Instance | undefined = this.instanceById.get(id);\n if (!instance) {\n instance = await this.initAny(properties);\n this.instanceById.set(id, instance);\n }\n\n // Ensure that it's cleared of data from previous tests\n await instance.keyv.clear();\n\n return {\n store: instance.store,\n connection: instance.connection,\n keyv: instance.keyv,\n };\n }\n\n private async initAny(properties: TestCacheProperties): Promise<Instance> {\n switch (properties.store) {\n case 'memcache':\n return this.initMemcached(properties);\n case 'redis':\n return this.initRedis(properties);\n case 'memory':\n return {\n store: 'memory',\n connection: 'memory',\n keyv: new Keyv(),\n stop: async () => {},\n };\n default:\n throw new Error(`Unknown cache store '${properties.store}'`);\n }\n }\n\n private async initMemcached(\n properties: TestCacheProperties,\n ): Promise<Instance> {\n // Use the connection string if provided\n const envVarName = properties.connectionStringEnvironmentVariableName;\n if (envVarName) {\n const connectionString = process.env[envVarName];\n if (connectionString) {\n return connectToExternalMemcache(connectionString);\n }\n }\n\n return await startMemcachedContainer(properties.dockerImageName!);\n }\n\n private async initRedis(properties: TestCacheProperties): Promise<Instance> {\n // Use the connection string if provided\n const envVarName = properties.connectionStringEnvironmentVariableName;\n if (envVarName) {\n const connectionString = process.env[envVarName];\n if (connectionString) {\n return connectToExternalRedis(connectionString);\n }\n }\n\n return await startRedisContainer(properties.dockerImageName!);\n }\n\n private async shutdown() {\n const instances = [...this.instanceById.values()];\n this.instanceById.clear();\n await Promise.all(\n instances.map(({ stop }) =>\n stop().catch(error => {\n console.warn(`TestCaches: Failed to stop container`, { error });\n }),\n ),\n );\n }\n}\n"],"names":["isDockerDisabledForTests","allCaches","Keyv","connectToExternalMemcache","startMemcachedContainer","connectToExternalRedis","startRedisContainer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TestCaches.cjs.js","sources":["../../src/cache/TestCaches.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 Keyv from 'keyv';\nimport { isDockerDisabledForTests } from '../util/isDockerDisabledForTests';\nimport { connectToExternalMemcache, startMemcachedContainer } from './memcache';\nimport { connectToExternalRedis, startRedisContainer } from './redis';\nimport { Instance, TestCacheId, TestCacheProperties, allCaches } from './types';\nimport { connectToExternalValkey, startValkeyContainer } from './valkey';\n\n/**\n * Encapsulates the creation of ephemeral test cache instances for use inside\n * unit or integration tests.\n *\n * @public\n */\nexport class TestCaches {\n private readonly instanceById: Map<string, Instance>;\n private readonly supportedIds: TestCacheId[];\n private static defaultIds?: TestCacheId[];\n\n /**\n * Creates an empty `TestCaches` instance, and sets up Jest to clean up all of\n * its acquired resources after all tests finish.\n *\n * You typically want to create just a single instance like this at the top of\n * your test file or `describe` block, and then call `init` many times on that\n * instance inside the individual tests. Spinning up a \"physical\" cache\n * instance takes a considerable amount of time, slowing down tests. But\n * wiping the contents of an instance using `init` is very fast.\n */\n static create(options?: {\n ids?: TestCacheId[];\n disableDocker?: boolean;\n }): TestCaches {\n const ids = options?.ids;\n const disableDocker = options?.disableDocker ?? isDockerDisabledForTests();\n\n let testCacheIds: TestCacheId[];\n if (ids) {\n testCacheIds = ids;\n } else if (TestCaches.defaultIds) {\n testCacheIds = TestCaches.defaultIds;\n } else {\n testCacheIds = Object.keys(allCaches) as TestCacheId[];\n }\n\n const supportedIds = testCacheIds.filter(id => {\n const properties = allCaches[id];\n if (!properties) {\n return false;\n }\n // If the caller has set up the env with an explicit connection string,\n // we'll assume that this target will work\n if (\n properties.connectionStringEnvironmentVariableName &&\n process.env[properties.connectionStringEnvironmentVariableName]\n ) {\n return true;\n }\n // If the cache doesn't require docker at all, there's nothing to worry\n // about\n if (!properties.dockerImageName) {\n return true;\n }\n // If the cache requires docker, but docker is disabled, we will fail.\n if (disableDocker) {\n return false;\n }\n return true;\n });\n\n const caches = new TestCaches(supportedIds);\n\n if (supportedIds.length > 0) {\n afterAll(async () => {\n await caches.shutdown();\n });\n }\n\n return caches;\n }\n\n static setDefaults(options: { ids?: TestCacheId[] }) {\n TestCaches.defaultIds = options.ids;\n }\n\n private constructor(supportedIds: TestCacheId[]) {\n this.instanceById = new Map();\n this.supportedIds = supportedIds;\n }\n\n supports(id: TestCacheId): boolean {\n return this.supportedIds.includes(id);\n }\n\n eachSupportedId(): [TestCacheId][] {\n return this.supportedIds.map(id => [id]);\n }\n\n /**\n * Returns a fresh, empty cache for the given driver.\n *\n * @param id - The ID of the cache to use, e.g. 'REDIS_7'\n * @returns Cache connection properties\n */\n async init(\n id: TestCacheId,\n ): Promise<{ store: string; connection: string; keyv: Keyv }> {\n const properties = allCaches[id];\n if (!properties) {\n const candidates = Object.keys(allCaches).join(', ');\n throw new Error(\n `Unknown test cache ${id}, possible values are ${candidates}`,\n );\n }\n if (!this.supportedIds.includes(id)) {\n const candidates = this.supportedIds.join(', ');\n throw new Error(\n `Unsupported test cache ${id} for this environment, possible values are ${candidates}`,\n );\n }\n\n // Ensure that a testcontainers instance is up for this ID\n let instance: Instance | undefined = this.instanceById.get(id);\n if (!instance) {\n instance = await this.initAny(properties);\n this.instanceById.set(id, instance);\n }\n\n // Ensure that it's cleared of data from previous tests\n await instance.keyv.clear();\n\n return {\n store: instance.store,\n connection: instance.connection,\n keyv: instance.keyv,\n };\n }\n\n private async initAny(properties: TestCacheProperties): Promise<Instance> {\n switch (properties.store) {\n case 'memcache':\n return this.initMemcached(properties);\n case 'redis':\n return this.initRedis(properties);\n case 'valkey':\n return this.initValkey(properties);\n case 'memory':\n return {\n store: 'memory',\n connection: 'memory',\n keyv: new Keyv(),\n stop: async () => {},\n };\n default:\n throw new Error(`Unknown cache store '${properties.store}'`);\n }\n }\n\n private async initMemcached(\n properties: TestCacheProperties,\n ): Promise<Instance> {\n // Use the connection string if provided\n const envVarName = properties.connectionStringEnvironmentVariableName;\n if (envVarName) {\n const connectionString = process.env[envVarName];\n if (connectionString) {\n return connectToExternalMemcache(connectionString);\n }\n }\n\n return await startMemcachedContainer(properties.dockerImageName!);\n }\n\n private async initRedis(properties: TestCacheProperties): Promise<Instance> {\n // Use the connection string if provided\n const envVarName = properties.connectionStringEnvironmentVariableName;\n if (envVarName) {\n const connectionString = process.env[envVarName];\n if (connectionString) {\n return connectToExternalRedis(connectionString);\n }\n }\n\n return await startRedisContainer(properties.dockerImageName!);\n }\n\n private async initValkey(properties: TestCacheProperties): Promise<Instance> {\n // Use the connection string if provided\n const envVarName = properties.connectionStringEnvironmentVariableName;\n if (envVarName) {\n const connectionString = process.env[envVarName];\n if (connectionString) {\n return connectToExternalValkey(connectionString);\n }\n }\n\n return await startValkeyContainer(properties.dockerImageName!);\n }\n\n private async shutdown() {\n const instances = [...this.instanceById.values()];\n this.instanceById.clear();\n await Promise.all(\n instances.map(({ stop }) =>\n stop().catch(error => {\n console.warn(`TestCaches: Failed to stop container`, { error });\n }),\n ),\n );\n }\n}\n"],"names":["isDockerDisabledForTests","allCaches","Keyv","connectToExternalMemcache","startMemcachedContainer","connectToExternalRedis","startRedisContainer","connectToExternalValkey","startValkeyContainer"],"mappings":"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"}
|
package/dist/cache/types.cjs.js
CHANGED
|
@@ -18,6 +18,12 @@ const allCaches = Object.freeze({
|
|
|
18
18
|
MEMORY: {
|
|
19
19
|
name: "In-memory",
|
|
20
20
|
store: "memory"
|
|
21
|
+
},
|
|
22
|
+
VALKEY_8: {
|
|
23
|
+
name: "Valkey 8.x",
|
|
24
|
+
store: "valkey",
|
|
25
|
+
dockerImageName: getDockerImageForName.getDockerImageForName("valkey/valkey:8"),
|
|
26
|
+
connectionStringEnvironmentVariableName: "BACKSTAGE_TEST_CACHE_VALKEY8_CONNECTION_STRING"
|
|
21
27
|
}
|
|
22
28
|
});
|
|
23
29
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs.js","sources":["../../src/cache/types.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 Keyv from 'keyv';\nimport { getDockerImageForName } from '../util/getDockerImageForName';\n\n/**\n * The possible caches to test against.\n *\n * @public\n */\nexport type TestCacheId = 'MEMORY' | 'REDIS_7' | 'MEMCACHED_1';\n\nexport type TestCacheProperties = {\n name: string;\n store: string;\n dockerImageName?: string;\n connectionStringEnvironmentVariableName?: string;\n};\n\nexport type Instance = {\n store: string;\n connection: string;\n keyv: Keyv;\n stop: () => Promise<void>;\n};\n\nexport const allCaches: Record<TestCacheId, TestCacheProperties> =\n Object.freeze({\n REDIS_7: {\n name: 'Redis 7.x',\n store: 'redis',\n dockerImageName: getDockerImageForName('redis:7'),\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_CACHE_REDIS7_CONNECTION_STRING',\n },\n MEMCACHED_1: {\n name: 'Memcached 1.x',\n store: 'memcache',\n dockerImageName: getDockerImageForName('memcached:1'),\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_CACHE_MEMCACHED1_CONNECTION_STRING',\n },\n MEMORY: {\n name: 'In-memory',\n store: 'memory',\n },\n });\n"],"names":["getDockerImageForName"],"mappings":";;;;AAwCa,MAAA,SAAA,GACX,OAAO,MAAO,CAAA;AAAA,EACZ,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,WAAA;AAAA,IACN,KAAO,EAAA,OAAA;AAAA,IACP,eAAA,EAAiBA,4CAAsB,SAAS,CAAA;AAAA,IAChD,uCACE,EAAA;AAAA,GACJ;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,eAAA;AAAA,IACN,KAAO,EAAA,UAAA;AAAA,IACP,eAAA,EAAiBA,4CAAsB,aAAa,CAAA;AAAA,IACpD,uCACE,EAAA;AAAA,GACJ;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,WAAA;AAAA,IACN,KAAO,EAAA;AAAA;
|
|
1
|
+
{"version":3,"file":"types.cjs.js","sources":["../../src/cache/types.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 Keyv from 'keyv';\nimport { getDockerImageForName } from '../util/getDockerImageForName';\n\n/**\n * The possible caches to test against.\n *\n * @public\n */\nexport type TestCacheId = 'MEMORY' | 'REDIS_7' | 'VALKEY_8' | 'MEMCACHED_1';\n\nexport type TestCacheProperties = {\n name: string;\n store: string;\n dockerImageName?: string;\n connectionStringEnvironmentVariableName?: string;\n};\n\nexport type Instance = {\n store: string;\n connection: string;\n keyv: Keyv;\n stop: () => Promise<void>;\n};\n\nexport const allCaches: Record<TestCacheId, TestCacheProperties> =\n Object.freeze({\n REDIS_7: {\n name: 'Redis 7.x',\n store: 'redis',\n dockerImageName: getDockerImageForName('redis:7'),\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_CACHE_REDIS7_CONNECTION_STRING',\n },\n MEMCACHED_1: {\n name: 'Memcached 1.x',\n store: 'memcache',\n dockerImageName: getDockerImageForName('memcached:1'),\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_CACHE_MEMCACHED1_CONNECTION_STRING',\n },\n MEMORY: {\n name: 'In-memory',\n store: 'memory',\n },\n VALKEY_8: {\n name: 'Valkey 8.x',\n store: 'valkey',\n dockerImageName: getDockerImageForName('valkey/valkey:8'),\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_CACHE_VALKEY8_CONNECTION_STRING',\n },\n });\n"],"names":["getDockerImageForName"],"mappings":";;;;AAwCa,MAAA,SAAA,GACX,OAAO,MAAO,CAAA;AAAA,EACZ,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,WAAA;AAAA,IACN,KAAO,EAAA,OAAA;AAAA,IACP,eAAA,EAAiBA,4CAAsB,SAAS,CAAA;AAAA,IAChD,uCACE,EAAA;AAAA,GACJ;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,eAAA;AAAA,IACN,KAAO,EAAA,UAAA;AAAA,IACP,eAAA,EAAiBA,4CAAsB,aAAa,CAAA;AAAA,IACpD,uCACE,EAAA;AAAA,GACJ;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,WAAA;AAAA,IACN,KAAO,EAAA;AAAA,GACT;AAAA,EACA,QAAU,EAAA;AAAA,IACR,IAAM,EAAA,YAAA;AAAA,IACN,KAAO,EAAA,QAAA;AAAA,IACP,eAAA,EAAiBA,4CAAsB,iBAAiB,CAAA;AAAA,IACxD,uCACE,EAAA;AAAA;AAEN,CAAC;;;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Keyv = require('keyv');
|
|
4
|
+
var KeyvValkey = require('@keyv/valkey');
|
|
5
|
+
var uuid = require('uuid');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var Keyv__default = /*#__PURE__*/_interopDefaultCompat(Keyv);
|
|
10
|
+
var KeyvValkey__default = /*#__PURE__*/_interopDefaultCompat(KeyvValkey);
|
|
11
|
+
|
|
12
|
+
async function attemptValkeyConnection(connection) {
|
|
13
|
+
const startTime = Date.now();
|
|
14
|
+
for (; ; ) {
|
|
15
|
+
try {
|
|
16
|
+
const store = new KeyvValkey__default.default(connection);
|
|
17
|
+
const keyv = new Keyv__default.default({ store });
|
|
18
|
+
const value = uuid.v4();
|
|
19
|
+
await keyv.set("test", value);
|
|
20
|
+
if (await keyv.get("test") === value) {
|
|
21
|
+
return keyv;
|
|
22
|
+
}
|
|
23
|
+
} catch (e) {
|
|
24
|
+
if (Date.now() - startTime > 3e4) {
|
|
25
|
+
throw new Error(
|
|
26
|
+
`Timed out waiting for valkey to be ready for connections, ${e}`
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function connectToExternalValkey(connection) {
|
|
34
|
+
const keyv = await attemptValkeyConnection(connection);
|
|
35
|
+
return {
|
|
36
|
+
store: "valkey",
|
|
37
|
+
connection,
|
|
38
|
+
keyv,
|
|
39
|
+
stop: async () => await keyv.disconnect()
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async function startValkeyContainer(image) {
|
|
43
|
+
const { GenericContainer } = require("testcontainers");
|
|
44
|
+
const container = await new GenericContainer(image).withExposedPorts(6379).start();
|
|
45
|
+
const host = container.getHost();
|
|
46
|
+
const port = container.getMappedPort(6379);
|
|
47
|
+
const connection = `redis://${host}:${port}`;
|
|
48
|
+
const keyv = await attemptValkeyConnection(connection);
|
|
49
|
+
return {
|
|
50
|
+
store: "valkey",
|
|
51
|
+
connection,
|
|
52
|
+
keyv,
|
|
53
|
+
stop: async () => {
|
|
54
|
+
await keyv.disconnect();
|
|
55
|
+
await container.stop({ timeout: 1e4 });
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
exports.connectToExternalValkey = connectToExternalValkey;
|
|
61
|
+
exports.startValkeyContainer = startValkeyContainer;
|
|
62
|
+
//# sourceMappingURL=valkey.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valkey.cjs.js","sources":["../../src/cache/valkey.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 Keyv from 'keyv';\nimport KeyvValkey from '@keyv/valkey';\nimport { v4 as uuid } from 'uuid';\nimport { Instance } from './types';\n\nasync function attemptValkeyConnection(connection: string): Promise<Keyv> {\n const startTime = Date.now();\n\n for (;;) {\n try {\n const store = new KeyvValkey(connection);\n const keyv = new Keyv({ store });\n const value = uuid();\n await keyv.set('test', value);\n if ((await keyv.get('test')) === value) {\n return keyv;\n }\n } catch (e) {\n if (Date.now() - startTime > 30_000) {\n throw new Error(\n `Timed out waiting for valkey to be ready for connections, ${e}`,\n );\n }\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n}\n\nexport async function connectToExternalValkey(\n connection: string,\n): Promise<Instance> {\n const keyv = await attemptValkeyConnection(connection);\n return {\n store: 'valkey',\n connection,\n keyv,\n stop: async () => await keyv.disconnect(),\n };\n}\n\nexport async function startValkeyContainer(image: string): Promise<Instance> {\n // Lazy-load to avoid side-effect of importing testcontainers\n const { GenericContainer } =\n require('testcontainers') as typeof import('testcontainers');\n\n const container = await new GenericContainer(image)\n .withExposedPorts(6379)\n .start();\n\n const host = container.getHost();\n const port = container.getMappedPort(6379);\n const connection = `redis://${host}:${port}`;\n\n const keyv = await attemptValkeyConnection(connection);\n\n return {\n store: 'valkey',\n connection,\n keyv,\n stop: async () => {\n await keyv.disconnect();\n await container.stop({ timeout: 10_000 });\n },\n };\n}\n"],"names":["KeyvValkey","Keyv","uuid"],"mappings":";;;;;;;;;;;AAqBA,eAAe,wBAAwB,UAAmC,EAAA;AACxE,EAAM,MAAA,SAAA,GAAY,KAAK,GAAI,EAAA;AAE3B,EAAS,WAAA;AACP,IAAI,IAAA;AACF,MAAM,MAAA,KAAA,GAAQ,IAAIA,2BAAA,CAAW,UAAU,CAAA;AACvC,MAAA,MAAM,IAAO,GAAA,IAAIC,qBAAK,CAAA,EAAE,OAAO,CAAA;AAC/B,MAAA,MAAM,QAAQC,OAAK,EAAA;AACnB,MAAM,MAAA,IAAA,CAAK,GAAI,CAAA,MAAA,EAAQ,KAAK,CAAA;AAC5B,MAAA,IAAK,MAAM,IAAA,CAAK,GAAI,CAAA,MAAM,MAAO,KAAO,EAAA;AACtC,QAAO,OAAA,IAAA;AAAA;AACT,aACO,CAAG,EAAA;AACV,MAAA,IAAI,IAAK,CAAA,GAAA,EAAQ,GAAA,SAAA,GAAY,GAAQ,EAAA;AACnC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,6DAA6D,CAAC,CAAA;AAAA,SAChE;AAAA;AACF;AAGF,IAAA,MAAM,IAAI,OAAQ,CAAA,CAAA,OAAA,KAAW,UAAW,CAAA,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA;AAEzD;AAEA,eAAsB,wBACpB,UACmB,EAAA;AACnB,EAAM,MAAA,IAAA,GAAO,MAAM,uBAAA,CAAwB,UAAU,CAAA;AACrD,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,QAAA;AAAA,IACP,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAM,EAAA,YAAY,MAAM,IAAA,CAAK,UAAW;AAAA,GAC1C;AACF;AAEA,eAAsB,qBAAqB,KAAkC,EAAA;AAE3E,EAAA,MAAM,EAAE,gBAAA,EACN,GAAA,OAAA,CAAQ,gBAAgB,CAAA;AAE1B,EAAM,MAAA,SAAA,GAAY,MAAM,IAAI,gBAAA,CAAiB,KAAK,CAC/C,CAAA,gBAAA,CAAiB,IAAI,CAAA,CACrB,KAAM,EAAA;AAET,EAAM,MAAA,IAAA,GAAO,UAAU,OAAQ,EAAA;AAC/B,EAAM,MAAA,IAAA,GAAO,SAAU,CAAA,aAAA,CAAc,IAAI,CAAA;AACzC,EAAA,MAAM,UAAa,GAAA,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAE1C,EAAM,MAAA,IAAA,GAAO,MAAM,uBAAA,CAAwB,UAAU,CAAA;AAErD,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,QAAA;AAAA,IACP,UAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,YAAY;AAChB,MAAA,MAAM,KAAK,UAAW,EAAA;AACtB,MAAA,MAAM,SAAU,CAAA,IAAA,CAAK,EAAE,OAAA,EAAS,KAAQ,CAAA;AAAA;AAC1C,GACF;AACF;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
|
|
|
4
4
|
import { ServiceFactory, ServiceRef, ExtensionPoint, BackendFeature, RootConfigService, LoggerService, AuthService, DiscoveryService, BackstageCredentials, HttpAuthService, BackstageUserInfo, UserInfoService, DatabaseService, BackstageNonePrincipal, BackstageUserPrincipal, BackstagePrincipalAccessRestrictions, BackstageServicePrincipal } from '@backstage/backend-plugin-api';
|
|
5
5
|
import { Backend } from '@backstage/backend-app-api';
|
|
6
6
|
import { ExtendedHttpServer } from '@backstage/backend-defaults/rootHttpRouter';
|
|
7
|
-
import
|
|
7
|
+
import { EventsService } from '@backstage/plugin-events-node';
|
|
8
8
|
import { JsonObject } from '@backstage/types';
|
|
9
9
|
import * as express from 'express';
|
|
10
10
|
import * as qs from 'qs';
|
|
@@ -15,7 +15,7 @@ import * as express_serve_static_core from 'express-serve-static-core';
|
|
|
15
15
|
*
|
|
16
16
|
* @public
|
|
17
17
|
*/
|
|
18
|
-
type TestCacheId = 'MEMORY' | 'REDIS_7' | 'MEMCACHED_1';
|
|
18
|
+
type TestCacheId = 'MEMORY' | 'REDIS_7' | 'VALKEY_8' | 'MEMCACHED_1';
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Encapsulates the creation of ephemeral test cache instances for use inside
|
|
@@ -61,6 +61,7 @@ declare class TestCaches {
|
|
|
61
61
|
private initAny;
|
|
62
62
|
private initMemcached;
|
|
63
63
|
private initRedis;
|
|
64
|
+
private initValkey;
|
|
64
65
|
private shutdown;
|
|
65
66
|
}
|
|
66
67
|
|
|
@@ -601,9 +602,23 @@ declare namespace mockServices {
|
|
|
601
602
|
const factory: () => ServiceFactory<_backstage_backend_plugin_api.UrlReaderService, "plugin", "singleton">;
|
|
602
603
|
const mock: (partialImpl?: Partial<_backstage_backend_plugin_api.UrlReaderService> | undefined) => ServiceMock<_backstage_backend_plugin_api.UrlReaderService>;
|
|
603
604
|
}
|
|
605
|
+
/**
|
|
606
|
+
* Creates a functional mock implementation of the
|
|
607
|
+
* {@link @backstage/backend-events-node#eventsServiceRef}.
|
|
608
|
+
*/
|
|
609
|
+
function events(): EventsService;
|
|
604
610
|
namespace events {
|
|
605
|
-
|
|
606
|
-
|
|
611
|
+
/**
|
|
612
|
+
* Creates a functional mock factory for the
|
|
613
|
+
* {@link @backstage/backend-events-node#eventsServiceRef}.
|
|
614
|
+
*/
|
|
615
|
+
const factory: () => ServiceFactory<EventsService, "plugin", "singleton" | "multiton">;
|
|
616
|
+
/**
|
|
617
|
+
* Creates a mock of the
|
|
618
|
+
* {@link @backstage/backend-events-node#eventsServiceRef}, optionally
|
|
619
|
+
* with some given method implementations.
|
|
620
|
+
*/
|
|
621
|
+
const mock: (partialImpl?: Partial<EventsService> | undefined) => ServiceMock<EventsService>;
|
|
607
622
|
}
|
|
608
623
|
}
|
|
609
624
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class MockEventsService {
|
|
4
|
+
#subscribers;
|
|
5
|
+
constructor() {
|
|
6
|
+
this.#subscribers = [];
|
|
7
|
+
}
|
|
8
|
+
async publish(params) {
|
|
9
|
+
for (const subscriber of this.#subscribers) {
|
|
10
|
+
if (subscriber.topics.includes(params.topic)) {
|
|
11
|
+
await subscriber.onEvent(params);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async subscribe(options) {
|
|
16
|
+
this.#subscribers.push(options);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
exports.MockEventsService = MockEventsService;
|
|
21
|
+
//# sourceMappingURL=MockEventsService.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockEventsService.cjs.js","sources":["../../../src/next/services/MockEventsService.ts"],"sourcesContent":["/*\n * Copyright 2025 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 {\n EventParams,\n EventsService,\n EventsServiceSubscribeOptions,\n} from '@backstage/plugin-events-node';\n\nexport class MockEventsService implements EventsService {\n #subscribers: EventsServiceSubscribeOptions[];\n\n constructor() {\n this.#subscribers = [];\n }\n\n async publish(params: EventParams): Promise<void> {\n for (const subscriber of this.#subscribers) {\n if (subscriber.topics.includes(params.topic)) {\n await subscriber.onEvent(params);\n }\n }\n }\n\n async subscribe(options: EventsServiceSubscribeOptions): Promise<void> {\n this.#subscribers.push(options);\n }\n}\n"],"names":[],"mappings":";;AAsBO,MAAM,iBAA2C,CAAA;AAAA,EACtD,YAAA;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,IAAA,CAAK,eAAe,EAAC;AAAA;AACvB,EAEA,MAAM,QAAQ,MAAoC,EAAA;AAChD,IAAW,KAAA,MAAA,UAAA,IAAc,KAAK,YAAc,EAAA;AAC1C,MAAA,IAAI,UAAW,CAAA,MAAA,CAAO,QAAS,CAAA,MAAA,CAAO,KAAK,CAAG,EAAA;AAC5C,QAAM,MAAA,UAAA,CAAW,QAAQ,MAAM,CAAA;AAAA;AACjC;AACF;AACF,EAEA,MAAM,UAAU,OAAuD,EAAA;AACrE,IAAK,IAAA,CAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA;AAElC;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var auditor = require('@backstage/backend-defaults/auditor');
|
|
3
4
|
var cache = require('@backstage/backend-defaults/cache');
|
|
4
5
|
var database = require('@backstage/backend-defaults/database');
|
|
5
6
|
var discovery = require('@backstage/backend-defaults/discovery');
|
|
@@ -21,7 +22,7 @@ var MockHttpAuthService = require('./MockHttpAuthService.cjs.js');
|
|
|
21
22
|
var MockRootLoggerService = require('./MockRootLoggerService.cjs.js');
|
|
22
23
|
var MockUserInfoService = require('./MockUserInfoService.cjs.js');
|
|
23
24
|
var mockCredentials = require('./mockCredentials.cjs.js');
|
|
24
|
-
var
|
|
25
|
+
var MockEventsService = require('./MockEventsService.cjs.js');
|
|
25
26
|
|
|
26
27
|
function createLoggerMock() {
|
|
27
28
|
return {
|
|
@@ -321,12 +322,16 @@ exports.mockServices = void 0;
|
|
|
321
322
|
search: jest.fn()
|
|
322
323
|
}));
|
|
323
324
|
})(mockServices2.urlReader || (mockServices2.urlReader = {}));
|
|
325
|
+
function events() {
|
|
326
|
+
return new MockEventsService.MockEventsService();
|
|
327
|
+
}
|
|
328
|
+
mockServices2.events = events;
|
|
324
329
|
((events2) => {
|
|
325
|
-
events2.factory = (
|
|
330
|
+
events2.factory = simpleFactoryWithOptions(pluginEventsNode.eventsServiceRef, events2);
|
|
326
331
|
events2.mock = simpleMock(pluginEventsNode.eventsServiceRef, () => ({
|
|
327
332
|
publish: jest.fn(),
|
|
328
333
|
subscribe: jest.fn()
|
|
329
334
|
}));
|
|
330
|
-
})(mockServices2.events || (mockServices2.events = {}));
|
|
335
|
+
})(events = mockServices2.events || (mockServices2.events = {}));
|
|
331
336
|
})(exports.mockServices || (exports.mockServices = {}));
|
|
332
337
|
//# sourceMappingURL=mockServices.cjs.js.map
|
|
@@ -1 +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 { HostDiscovery } 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 { permissionsRegistryServiceFactory } from '@backstage/backend-defaults/permissionsRegistry';\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 DatabaseService,\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 { Knex } from 'knex';\nimport { MockAuthService } from './MockAuthService';\nimport { MockHttpAuthService } from './MockHttpAuthService';\nimport { MockRootLoggerService } from './MockRootLoggerService';\nimport { MockUserInfoService } from './MockUserInfoService';\nimport { mockCredentials } from './mockCredentials';\nimport { auditorServiceFactory } from '@backstage/backend-defaults/auditor';\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 * Mock implementations of the core services, to be used in tests.\n *\n * @public\n * @remarks\n *\n * There are some variations among the services depending on what needs tests\n * might have, but overall there are three main usage patterns:\n *\n * 1. Creating an actual fake service instance, often with a simplified version\n * of functionality, by calling the mock service itself as a function.\n *\n * ```ts\n * // The function often accepts parameters that control its behavior\n * const foo = mockServices.foo();\n * ```\n *\n * 2. Creating a mock service, where all methods are replaced with jest mocks, by\n * calling the service's `mock` function.\n *\n * ```ts\n * // You can optionally supply a subset of its methods to implement\n * const foo = mockServices.foo.mock({\n * someMethod: () => 'mocked result',\n * });\n * // After exercising your test, you can make assertions on the mock:\n * expect(foo.someMethod).toHaveBeenCalledTimes(2);\n * expect(foo.otherMethod).toHaveBeenCalledWith(testData);\n * ```\n *\n * 3. Creating a service factory that behaves similarly to the mock as per above.\n *\n * ```ts\n * await startTestBackend({\n * features: [\n * mockServices.foo.factory({\n * someMethod: () => 'mocked result',\n * })\n * ],\n * });\n * ```\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 namespace auditor {\n export const factory = () => auditorServiceFactory;\n\n export const mock = simpleMock(coreServices.auditor, () => ({\n createEvent: jest.fn(async _ => {\n return {\n success: jest.fn(),\n fail: jest.fn(),\n };\n }),\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 = () =>\n createServiceFactory({\n service: coreServices.discovery,\n deps: {},\n factory: () => discovery(),\n });\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 /**\n * Creates a mock implementation of the\n * {@link @backstage/backend-plugin-api#coreServices.database}. Just returns\n * the given `knex` instance, which is useful in combination with the\n * {@link TestDatabases} facility.\n */\n export function database(options: {\n knex: Knex;\n migrations?: { skip?: boolean };\n }): DatabaseService {\n return {\n getClient: async () => options.knex,\n migrations: options.migrations,\n };\n }\n export namespace database {\n /**\n * Creates a mock factory for the\n * {@link @backstage/backend-plugin-api#coreServices.database}. Just returns\n * the given `knex` instance if you supply one, which is useful in\n * combination with the {@link TestDatabases} facility. Otherwise, it\n * returns the regular default database factory which reads config settings.\n */\n export const factory = (options?: {\n knex: Knex;\n migrations?: { skip?: boolean };\n }) =>\n options\n ? createServiceFactory({\n service: coreServices.database,\n deps: {},\n factory: () => database(options),\n })\n : databaseServiceFactory;\n /**\n * Creates a mock of the\n * {@link @backstage/backend-plugin-api#coreServices.database}, optionally\n * with some given method implementations.\n */\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 permissionsRegistry {\n export const factory = () => permissionsRegistryServiceFactory;\n export const mock = simpleMock(coreServices.permissionsRegistry, () => ({\n addPermissionRules: jest.fn(),\n addPermissions: jest.fn(),\n addResourceType: jest.fn(),\n getPermissionRuleset: 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 addBeforeShutdownHook: 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","auditor","auditorServiceFactory","MockAuthService","auth","discovery","HostDiscovery","MockHttpAuthService","mockCredentials","httpAuth","MockUserInfoService","userInfo","cache","cacheServiceFactory","database","databaseServiceFactory","rootHealth","rootHealthServiceFactory","httpRouter","httpRouterServiceFactory","rootHttpRouter","rootHttpRouterServiceFactory","lifecycle","lifecycleServiceFactory","logger","loggerServiceFactory","permissions","permissionsServiceFactory","permissionsRegistry","permissionsRegistryServiceFactory","rootLifecycle","rootLifecycleServiceFactory","scheduler","schedulerServiceFactory","urlReader","urlReaderServiceFactory","events","eventsServiceFactory","eventsServiceRef"],"mappings":"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"}
|
|
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 { auditorServiceFactory } from '@backstage/backend-defaults/auditor';\nimport { cacheServiceFactory } from '@backstage/backend-defaults/cache';\nimport { databaseServiceFactory } from '@backstage/backend-defaults/database';\nimport { HostDiscovery } 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 { permissionsRegistryServiceFactory } from '@backstage/backend-defaults/permissionsRegistry';\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 DatabaseService,\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 { EventsService, eventsServiceRef } from '@backstage/plugin-events-node';\nimport { JsonObject } from '@backstage/types';\nimport { Knex } from 'knex';\nimport { MockAuthService } from './MockAuthService';\nimport { MockHttpAuthService } from './MockHttpAuthService';\nimport { MockRootLoggerService } from './MockRootLoggerService';\nimport { MockUserInfoService } from './MockUserInfoService';\nimport { mockCredentials } from './mockCredentials';\nimport { MockEventsService } from './MockEventsService';\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 * Mock implementations of the core services, to be used in tests.\n *\n * @public\n * @remarks\n *\n * There are some variations among the services depending on what needs tests\n * might have, but overall there are three main usage patterns:\n *\n * 1. Creating an actual fake service instance, often with a simplified version\n * of functionality, by calling the mock service itself as a function.\n *\n * ```ts\n * // The function often accepts parameters that control its behavior\n * const foo = mockServices.foo();\n * ```\n *\n * 2. Creating a mock service, where all methods are replaced with jest mocks, by\n * calling the service's `mock` function.\n *\n * ```ts\n * // You can optionally supply a subset of its methods to implement\n * const foo = mockServices.foo.mock({\n * someMethod: () => 'mocked result',\n * });\n * // After exercising your test, you can make assertions on the mock:\n * expect(foo.someMethod).toHaveBeenCalledTimes(2);\n * expect(foo.otherMethod).toHaveBeenCalledWith(testData);\n * ```\n *\n * 3. Creating a service factory that behaves similarly to the mock as per above.\n *\n * ```ts\n * await startTestBackend({\n * features: [\n * mockServices.foo.factory({\n * someMethod: () => 'mocked result',\n * })\n * ],\n * });\n * ```\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 namespace auditor {\n export const factory = () => auditorServiceFactory;\n\n export const mock = simpleMock(coreServices.auditor, () => ({\n createEvent: jest.fn(async _ => {\n return {\n success: jest.fn(),\n fail: jest.fn(),\n };\n }),\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 = () =>\n createServiceFactory({\n service: coreServices.discovery,\n deps: {},\n factory: () => discovery(),\n });\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 /**\n * Creates a mock implementation of the\n * {@link @backstage/backend-plugin-api#coreServices.database}. Just returns\n * the given `knex` instance, which is useful in combination with the\n * {@link TestDatabases} facility.\n */\n export function database(options: {\n knex: Knex;\n migrations?: { skip?: boolean };\n }): DatabaseService {\n return {\n getClient: async () => options.knex,\n migrations: options.migrations,\n };\n }\n export namespace database {\n /**\n * Creates a mock factory for the\n * {@link @backstage/backend-plugin-api#coreServices.database}. Just returns\n * the given `knex` instance if you supply one, which is useful in\n * combination with the {@link TestDatabases} facility. Otherwise, it\n * returns the regular default database factory which reads config settings.\n */\n export const factory = (options?: {\n knex: Knex;\n migrations?: { skip?: boolean };\n }) =>\n options\n ? createServiceFactory({\n service: coreServices.database,\n deps: {},\n factory: () => database(options),\n })\n : databaseServiceFactory;\n /**\n * Creates a mock of the\n * {@link @backstage/backend-plugin-api#coreServices.database}, optionally\n * with some given method implementations.\n */\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 permissionsRegistry {\n export const factory = () => permissionsRegistryServiceFactory;\n export const mock = simpleMock(coreServices.permissionsRegistry, () => ({\n addPermissionRules: jest.fn(),\n addPermissions: jest.fn(),\n addResourceType: jest.fn(),\n getPermissionRuleset: 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 addBeforeShutdownHook: 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 /**\n * Creates a functional mock implementation of the\n * {@link @backstage/backend-events-node#eventsServiceRef}.\n */\n export function events(): EventsService {\n return new MockEventsService();\n }\n export namespace events {\n /**\n * Creates a functional mock factory for the\n * {@link @backstage/backend-events-node#eventsServiceRef}.\n */\n export const factory = simpleFactoryWithOptions(eventsServiceRef, events);\n /**\n * Creates a mock of the\n * {@link @backstage/backend-events-node#eventsServiceRef}, optionally\n * with some given method implementations.\n */\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","auditor","auditorServiceFactory","MockAuthService","auth","discovery","HostDiscovery","MockHttpAuthService","mockCredentials","httpAuth","MockUserInfoService","userInfo","cache","cacheServiceFactory","database","databaseServiceFactory","rootHealth","rootHealthServiceFactory","httpRouter","httpRouterServiceFactory","rootHttpRouter","rootHttpRouterServiceFactory","lifecycle","lifecycleServiceFactory","logger","loggerServiceFactory","permissions","permissionsServiceFactory","permissionsRegistry","permissionsRegistryServiceFactory","rootLifecycle","rootLifecycleServiceFactory","scheduler","schedulerServiceFactory","urlReader","urlReaderServiceFactory","MockEventsService","events","eventsServiceRef"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-test-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0-next.1",
|
|
4
4
|
"description": "Test helpers library for Backstage backends",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library"
|
|
@@ -49,16 +49,17 @@
|
|
|
49
49
|
"test": "backstage-cli package test"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@backstage/backend-app-api": "
|
|
53
|
-
"@backstage/backend-defaults": "
|
|
54
|
-
"@backstage/backend-plugin-api": "
|
|
55
|
-
"@backstage/config": "
|
|
56
|
-
"@backstage/errors": "
|
|
57
|
-
"@backstage/plugin-auth-node": "
|
|
58
|
-
"@backstage/plugin-events-node": "
|
|
59
|
-
"@backstage/types": "
|
|
52
|
+
"@backstage/backend-app-api": "1.2.3-next.1",
|
|
53
|
+
"@backstage/backend-defaults": "0.10.0-next.1",
|
|
54
|
+
"@backstage/backend-plugin-api": "1.3.1-next.1",
|
|
55
|
+
"@backstage/config": "1.3.2",
|
|
56
|
+
"@backstage/errors": "1.2.7",
|
|
57
|
+
"@backstage/plugin-auth-node": "0.6.3-next.1",
|
|
58
|
+
"@backstage/plugin-events-node": "0.4.11-next.1",
|
|
59
|
+
"@backstage/types": "1.2.1",
|
|
60
60
|
"@keyv/memcache": "^2.0.1",
|
|
61
61
|
"@keyv/redis": "^4.0.1",
|
|
62
|
+
"@keyv/valkey": "^1.0.1",
|
|
62
63
|
"@types/express": "^4.17.6",
|
|
63
64
|
"@types/express-serve-static-core": "^4.17.5",
|
|
64
65
|
"@types/keyv": "^4.2.0",
|
|
@@ -78,7 +79,7 @@
|
|
|
78
79
|
"yn": "^4.0.0"
|
|
79
80
|
},
|
|
80
81
|
"devDependencies": {
|
|
81
|
-
"@backstage/cli": "
|
|
82
|
+
"@backstage/cli": "0.32.1-next.1",
|
|
82
83
|
"@types/jest": "*",
|
|
83
84
|
"@types/supertest": "^2.0.8",
|
|
84
85
|
"supertest": "^7.0.0"
|