@backstage/backend-test-utils 1.10.5-next.0 → 1.11.0

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 CHANGED
@@ -1,5 +1,41 @@
1
1
  # @backstage/backend-test-utils
2
2
 
3
+ ## 1.11.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 42abfb1: Added `createServiceMock`, a public utility for creating `ServiceMock` instances for custom service refs. This allows plugin authors to define mock creators for their own services following the same pattern as the built-in `mockServices` mocks.
8
+
9
+ ### Patch Changes
10
+
11
+ - f1d29b4: Updated `startTestBackend` to support factory-based extension points (v1.1 format) in addition to the existing direct implementation format.
12
+ - 7455dae: Use node prefix on native imports
13
+ - 68eb322: Added `@types/jest` as an optional peer dependency, since jest types are exposed in the public API surface.
14
+ - 69d880e: Bump to latest zod to ensure it has the latest features
15
+ - Updated dependencies
16
+ - @backstage/backend-app-api@1.5.0
17
+ - @backstage/backend-plugin-api@1.7.0
18
+ - @backstage/backend-defaults@0.15.2
19
+ - @backstage/plugin-auth-node@0.6.13
20
+ - @backstage/plugin-permission-common@0.9.6
21
+ - @backstage/plugin-events-node@0.4.19
22
+
23
+ ## 1.11.0-next.1
24
+
25
+ ### Minor Changes
26
+
27
+ - 42abfb1: Added `createServiceMock`, a public utility for creating `ServiceMock` instances for custom service refs. This allows plugin authors to define mock creators for their own services following the same pattern as the built-in `mockServices` mocks.
28
+
29
+ ### Patch Changes
30
+
31
+ - 68eb322: Added `@types/jest` as an optional peer dependency, since jest types are exposed in the public API surface.
32
+ - Updated dependencies
33
+ - @backstage/backend-app-api@1.5.0-next.1
34
+ - @backstage/backend-defaults@0.15.2-next.1
35
+ - @backstage/backend-plugin-api@1.7.0-next.1
36
+ - @backstage/plugin-auth-node@0.6.13-next.1
37
+ - @backstage/plugin-events-node@0.4.19-next.0
38
+
3
39
  ## 1.10.4-next.0
4
40
 
5
41
  ### Patch Changes
@@ -2,8 +2,8 @@
2
2
 
3
3
  var mockServices = require('../../services/mockServices.cjs.js');
4
4
  require('../../services/mockCredentials.cjs.js');
5
+ var createServiceMock = require('../../services/createServiceMock.cjs.js');
5
6
  var MockActionsRegistry = require('./MockActionsRegistry.cjs.js');
6
- var simpleMock = require('./simpleMock.cjs.js');
7
7
  var alpha$1 = require('@backstage/backend-plugin-api/alpha');
8
8
  var alpha = require('@backstage/backend-defaults/alpha');
9
9
 
@@ -14,12 +14,9 @@ function actionsRegistryServiceMock(options) {
14
14
  }
15
15
  ((actionsRegistryServiceMock2) => {
16
16
  actionsRegistryServiceMock2.factory = () => alpha.actionsRegistryServiceFactory;
17
- actionsRegistryServiceMock2.mock = simpleMock.simpleMock(
18
- alpha$1.actionsRegistryServiceRef,
19
- () => ({
20
- register: jest.fn()
21
- })
22
- );
17
+ actionsRegistryServiceMock2.mock = createServiceMock.createServiceMock(alpha$1.actionsRegistryServiceRef, () => ({
18
+ register: jest.fn()
19
+ }));
23
20
  })(actionsRegistryServiceMock || (actionsRegistryServiceMock = {}));
24
21
 
25
22
  exports.actionsRegistryServiceMock = actionsRegistryServiceMock;
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsRegistryServiceMock.cjs.js","sources":["../../../src/alpha/services/ActionsRegistryServiceMock.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 */\nimport { mockServices } from '../../services';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { MockActionsRegistry } from './MockActionsRegistry';\nimport { simpleMock } from './simpleMock';\nimport {\n ActionsRegistryService,\n actionsRegistryServiceRef,\n} from '@backstage/backend-plugin-api/alpha';\nimport { actionsRegistryServiceFactory } from '@backstage/backend-defaults/alpha';\n\n/**\n * @alpha\n */\nexport function actionsRegistryServiceMock(options?: {\n logger: LoggerService;\n}): MockActionsRegistry {\n return MockActionsRegistry.create({\n logger: options?.logger ?? mockServices.logger.mock(),\n });\n}\n\n/**\n * @alpha\n */\nexport namespace actionsRegistryServiceMock {\n export const factory = () => actionsRegistryServiceFactory;\n\n export const mock = simpleMock<ActionsRegistryService>(\n actionsRegistryServiceRef,\n () => ({\n register: jest.fn(),\n }),\n );\n}\n"],"names":["MockActionsRegistry","mockServices","actionsRegistryServiceMock","actionsRegistryServiceFactory","simpleMock","actionsRegistryServiceRef"],"mappings":";;;;;;;;;AA4BO,SAAS,2BAA2B,OAAA,EAEnB;AACtB,EAAA,OAAOA,wCAAoB,MAAA,CAAO;AAAA,IAChC,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAUC,yBAAA,CAAa,OAAO,IAAA;AAAK,GACrD,CAAA;AACH;AAAA,CAKO,CAAUC,2BAAAA,KAAV;AACE,EAAMA,2BAAAA,CAAA,UAAU,MAAMC,mCAAA;AAEtB,EAAMD,4BAAA,IAAA,GAAOE,qBAAA;AAAA,IAClBC,iCAAA;AAAA,IACA,OAAO;AAAA,MACL,QAAA,EAAU,KAAK,EAAA;AAAG,KACpB;AAAA,GACF;AAAA,CAAA,EARe,0BAAA,KAAA,0BAAA,GAAA,EAAA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"ActionsRegistryServiceMock.cjs.js","sources":["../../../src/alpha/services/ActionsRegistryServiceMock.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 */\nimport { mockServices } from '../../services';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { MockActionsRegistry } from './MockActionsRegistry';\nimport { createServiceMock } from './alphaCreateServiceMock';\nimport { actionsRegistryServiceRef } from '@backstage/backend-plugin-api/alpha';\nimport { actionsRegistryServiceFactory } from '@backstage/backend-defaults/alpha';\n\n/**\n * @alpha\n */\nexport function actionsRegistryServiceMock(options?: {\n logger: LoggerService;\n}): MockActionsRegistry {\n return MockActionsRegistry.create({\n logger: options?.logger ?? mockServices.logger.mock(),\n });\n}\n\n/**\n * @alpha\n */\nexport namespace actionsRegistryServiceMock {\n export const factory = () => actionsRegistryServiceFactory;\n\n export const mock = createServiceMock(actionsRegistryServiceRef, () => ({\n register: jest.fn(),\n }));\n}\n"],"names":["MockActionsRegistry","mockServices","actionsRegistryServiceMock","actionsRegistryServiceFactory","createServiceMock","actionsRegistryServiceRef"],"mappings":";;;;;;;;;AAyBO,SAAS,2BAA2B,OAAA,EAEnB;AACtB,EAAA,OAAOA,wCAAoB,MAAA,CAAO;AAAA,IAChC,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAUC,yBAAA,CAAa,OAAO,IAAA;AAAK,GACrD,CAAA;AACH;AAAA,CAKO,CAAUC,2BAAAA,KAAV;AACE,EAAMA,2BAAAA,CAAA,UAAU,MAAMC,mCAAA;AAEtB,EAAMD,2BAAAA,CAAA,IAAA,GAAOE,mCAAA,CAAkBC,iCAAA,EAA2B,OAAO;AAAA,IACtE,QAAA,EAAU,KAAK,EAAA;AAAG,GACpB,CAAE,CAAA;AAAA,CAAA,EALa,0BAAA,KAAA,0BAAA,GAAA,EAAA,CAAA,CAAA;;;;"}
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var simpleMock = require('./simpleMock.cjs.js');
3
+ var createServiceMock = require('../../services/createServiceMock.cjs.js');
4
4
  var alpha$1 = require('@backstage/backend-plugin-api/alpha');
5
5
  var alpha = require('@backstage/backend-defaults/alpha');
6
6
 
7
7
  exports.actionsServiceMock = void 0;
8
8
  ((actionsServiceMock2) => {
9
9
  actionsServiceMock2.factory = () => alpha.actionsServiceFactory;
10
- actionsServiceMock2.mock = simpleMock.simpleMock(alpha$1.actionsServiceRef, () => ({
10
+ actionsServiceMock2.mock = createServiceMock.createServiceMock(alpha$1.actionsServiceRef, () => ({
11
11
  invoke: jest.fn(),
12
12
  list: jest.fn()
13
13
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsServiceMock.cjs.js","sources":["../../../src/alpha/services/ActionsServiceMock.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 { simpleMock } from './simpleMock';\nimport {\n ActionsService,\n actionsServiceRef,\n} from '@backstage/backend-plugin-api/alpha';\nimport { actionsServiceFactory } from '@backstage/backend-defaults/alpha';\n\n/**\n * @alpha\n */\nexport namespace actionsServiceMock {\n export const factory = () => actionsServiceFactory;\n\n export const mock = simpleMock<ActionsService>(actionsServiceRef, () => ({\n invoke: jest.fn(),\n list: jest.fn(),\n }));\n}\n"],"names":["actionsServiceMock","actionsServiceFactory","simpleMock","actionsServiceRef"],"mappings":";;;;;;AA0BiBA;AAAA,CAAV,CAAUA,mBAAAA,KAAV;AACE,EAAMA,mBAAAA,CAAA,UAAU,MAAMC,2BAAA;AAEtB,EAAMD,mBAAAA,CAAA,IAAA,GAAOE,qBAAA,CAA2BC,yBAAA,EAAmB,OAAO;AAAA,IACvE,MAAA,EAAQ,KAAK,EAAA,EAAG;AAAA,IAChB,IAAA,EAAM,KAAK,EAAA;AAAG,GAChB,CAAE,CAAA;AAAA,CAAA,EANaH,0BAAA,KAAAA,0BAAA,GAAA,EAAA,CAAA,CAAA;;"}
1
+ {"version":3,"file":"ActionsServiceMock.cjs.js","sources":["../../../src/alpha/services/ActionsServiceMock.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 { createServiceMock } from './alphaCreateServiceMock';\nimport { actionsServiceRef } from '@backstage/backend-plugin-api/alpha';\nimport { actionsServiceFactory } from '@backstage/backend-defaults/alpha';\n\n/**\n * @alpha\n */\nexport namespace actionsServiceMock {\n export const factory = () => actionsServiceFactory;\n\n export const mock = createServiceMock(actionsServiceRef, () => ({\n invoke: jest.fn(),\n list: jest.fn(),\n }));\n}\n"],"names":["actionsServiceMock","actionsServiceFactory","createServiceMock","actionsServiceRef"],"mappings":";;;;;;AAuBiBA;AAAA,CAAV,CAAUA,mBAAAA,KAAV;AACE,EAAMA,mBAAAA,CAAA,UAAU,MAAMC,2BAAA;AAEtB,EAAMD,mBAAAA,CAAA,IAAA,GAAOE,mCAAA,CAAkBC,yBAAA,EAAmB,OAAO;AAAA,IAC9D,MAAA,EAAQ,KAAK,EAAA,EAAG;AAAA,IAChB,IAAA,EAAM,KAAK,EAAA;AAAG,GAChB,CAAE,CAAA;AAAA,CAAA,EANaH,0BAAA,KAAAA,0BAAA,GAAA,EAAA,CAAA,CAAA;;"}
@@ -5,6 +5,7 @@ var zod = require('zod');
5
5
  var zodToJsonSchema = require('zod-to-json-schema');
6
6
  require('../../services/mockServices.cjs.js');
7
7
  var mockCredentials = require('../../services/mockCredentials.cjs.js');
8
+ require('@backstage/backend-plugin-api');
8
9
 
9
10
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
10
11
 
@@ -1 +1 @@
1
- {"version":3,"file":"MockActionsRegistry.cjs.js","sources":["../../../src/alpha/services/MockActionsRegistry.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 */\nimport {\n BackstageCredentials,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport { ForwardedError, InputError, NotFoundError } from '@backstage/errors';\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { z, AnyZodObject } from 'zod';\nimport zodToJsonSchema from 'zod-to-json-schema';\nimport { mockCredentials } from '../../services';\nimport {\n ActionsRegistryActionOptions,\n ActionsRegistryService,\n ActionsService,\n ActionsServiceAction,\n} from '@backstage/backend-plugin-api/alpha';\n\n/**\n * A mock implementation of the ActionsRegistryService and ActionsService that can be used in tests.\n *\n * This is useful for testing actions that are registered with the ActionsRegistryService and ActionsService.\n *\n * The plugin ID is hardcoded to `testing` in the mock implementation.\n *\n * @example\n * ```ts\n * const actionsRegistry = mockServices.actionsRegistry();\n *\n * actionsRegistry.register({\n * name: 'test',\n * title: 'Test',\n * description: 'Test',\n * schema: {\n * input: z.object({ name: z.string() }),\n * output: z.object({ name: z.string() }),\n * },\n * action: async ({ input }) => ({ output: { name: input.name } }),\n * });\n *\n *\n * const result = await actionsRegistry.invoke({\n * id: 'testing:test',\n * input: { name: 'test' },\n * });\n *\n * expect(result).toEqual({ output: { name: 'test' } });\n * ```\n *\n * @alpha\n */\nexport class MockActionsRegistry\n implements ActionsRegistryService, ActionsService\n{\n private readonly logger: LoggerService;\n\n private constructor(logger: LoggerService) {\n this.logger = logger;\n }\n\n static create(opts: { logger: LoggerService }) {\n return new MockActionsRegistry(opts.logger);\n }\n\n readonly actions: Map<string, ActionsRegistryActionOptions<any, any>> =\n new Map();\n\n async list(): Promise<{ actions: ActionsServiceAction[] }> {\n return {\n actions: Array.from(this.actions.entries()).map(([id, action]) => ({\n id,\n name: action.name,\n title: action.title,\n description: action.description,\n attributes: {\n destructive: action.attributes?.destructive ?? true,\n idempotent: action.attributes?.idempotent ?? false,\n readOnly: action.attributes?.readOnly ?? false,\n },\n schema: {\n input: action.schema?.input\n ? zodToJsonSchema(action.schema.input(z))\n : zodToJsonSchema(z.object({})),\n output: action.schema?.output\n ? zodToJsonSchema(action.schema.output(z))\n : zodToJsonSchema(z.object({})),\n } as ActionsServiceAction['schema'],\n })),\n };\n }\n\n async invoke(opts: {\n id: string;\n input?: JsonObject;\n credentials?: BackstageCredentials;\n }): Promise<{ output: JsonValue }> {\n const action = this.actions.get(opts.id);\n\n if (!action) {\n const availableActionIds = Array.from(this.actions.keys()).join(', ');\n throw new NotFoundError(\n `Action \"${opts.id}\" not found, available actions: ${\n availableActionIds ? `\"${availableActionIds}\"` : 'none'\n }`,\n );\n }\n\n const input = action.schema?.input\n ? action.schema.input(z).safeParse(opts.input)\n : ({ success: true, data: undefined } as const);\n\n if (!input.success) {\n throw new InputError(`Invalid input to action \"${opts.id}\"`, input.error);\n }\n\n try {\n const result = await action.action({\n input: input.data,\n credentials: opts.credentials ?? mockCredentials.none(),\n logger: this.logger,\n });\n\n const output = action.schema?.output\n ? action.schema.output(z).safeParse(result?.output)\n : ({ success: true, data: result?.output } as const);\n\n if (!output.success) {\n throw new InputError(\n `Invalid output from action \"${opts.id}\"`,\n output.error,\n );\n }\n\n return { output: output.data };\n } catch (error) {\n throw new ForwardedError(\n `Failed execution of action \"${opts.id}\"`,\n error,\n );\n }\n }\n\n register<\n TInputSchema extends AnyZodObject,\n TOutputSchema extends AnyZodObject,\n >(options: ActionsRegistryActionOptions<TInputSchema, TOutputSchema>): void {\n // hardcode test: prefix similar to how the default actions registry does it\n // and other places around the testing ecosystem:\n // https://github.com/backstage/backstage/blob/a9219496d5c073aaa0b8caf32ece10455cf65e61/packages/backend-test-utils/src/next/services/mockServices.ts#L321\n // https://github.com/backstage/backstage/blob/861f162b4a39117b824669d67a951ed1db142e3d/packages/backend-test-utils/src/next/wiring/ServiceFactoryTester.ts#L99\n const id = `test:${options.name}`;\n\n if (this.actions.has(id)) {\n throw new Error(`Action with id \"${id}\" is already registered`);\n }\n\n this.actions.set(id, options);\n }\n}\n"],"names":["zodToJsonSchema","z","NotFoundError","InputError","mockCredentials","ForwardedError"],"mappings":"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"}
1
+ {"version":3,"file":"MockActionsRegistry.cjs.js","sources":["../../../src/alpha/services/MockActionsRegistry.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 */\nimport {\n BackstageCredentials,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport { ForwardedError, InputError, NotFoundError } from '@backstage/errors';\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { z, AnyZodObject } from 'zod';\nimport zodToJsonSchema from 'zod-to-json-schema';\nimport { mockCredentials } from '../../services';\nimport {\n ActionsRegistryActionOptions,\n ActionsRegistryService,\n ActionsService,\n ActionsServiceAction,\n} from '@backstage/backend-plugin-api/alpha';\n\n/**\n * A mock implementation of the ActionsRegistryService and ActionsService that can be used in tests.\n *\n * This is useful for testing actions that are registered with the ActionsRegistryService and ActionsService.\n *\n * The plugin ID is hardcoded to `testing` in the mock implementation.\n *\n * @example\n * ```ts\n * const actionsRegistry = mockServices.actionsRegistry();\n *\n * actionsRegistry.register({\n * name: 'test',\n * title: 'Test',\n * description: 'Test',\n * schema: {\n * input: z.object({ name: z.string() }),\n * output: z.object({ name: z.string() }),\n * },\n * action: async ({ input }) => ({ output: { name: input.name } }),\n * });\n *\n *\n * const result = await actionsRegistry.invoke({\n * id: 'testing:test',\n * input: { name: 'test' },\n * });\n *\n * expect(result).toEqual({ output: { name: 'test' } });\n * ```\n *\n * @alpha\n */\nexport class MockActionsRegistry\n implements ActionsRegistryService, ActionsService\n{\n private readonly logger: LoggerService;\n\n private constructor(logger: LoggerService) {\n this.logger = logger;\n }\n\n static create(opts: { logger: LoggerService }) {\n return new MockActionsRegistry(opts.logger);\n }\n\n readonly actions: Map<string, ActionsRegistryActionOptions<any, any>> =\n new Map();\n\n async list(): Promise<{ actions: ActionsServiceAction[] }> {\n return {\n actions: Array.from(this.actions.entries()).map(([id, action]) => ({\n id,\n name: action.name,\n title: action.title,\n description: action.description,\n attributes: {\n destructive: action.attributes?.destructive ?? true,\n idempotent: action.attributes?.idempotent ?? false,\n readOnly: action.attributes?.readOnly ?? false,\n },\n schema: {\n input: action.schema?.input\n ? zodToJsonSchema(action.schema.input(z))\n : zodToJsonSchema(z.object({})),\n output: action.schema?.output\n ? zodToJsonSchema(action.schema.output(z))\n : zodToJsonSchema(z.object({})),\n } as ActionsServiceAction['schema'],\n })),\n };\n }\n\n async invoke(opts: {\n id: string;\n input?: JsonObject;\n credentials?: BackstageCredentials;\n }): Promise<{ output: JsonValue }> {\n const action = this.actions.get(opts.id);\n\n if (!action) {\n const availableActionIds = Array.from(this.actions.keys()).join(', ');\n throw new NotFoundError(\n `Action \"${opts.id}\" not found, available actions: ${\n availableActionIds ? `\"${availableActionIds}\"` : 'none'\n }`,\n );\n }\n\n const input = action.schema?.input\n ? action.schema.input(z).safeParse(opts.input)\n : ({ success: true, data: undefined } as const);\n\n if (!input.success) {\n throw new InputError(`Invalid input to action \"${opts.id}\"`, input.error);\n }\n\n try {\n const result = await action.action({\n input: input.data,\n credentials: opts.credentials ?? mockCredentials.none(),\n logger: this.logger,\n });\n\n const output = action.schema?.output\n ? action.schema.output(z).safeParse(result?.output)\n : ({ success: true, data: result?.output } as const);\n\n if (!output.success) {\n throw new InputError(\n `Invalid output from action \"${opts.id}\"`,\n output.error,\n );\n }\n\n return { output: output.data };\n } catch (error) {\n throw new ForwardedError(\n `Failed execution of action \"${opts.id}\"`,\n error,\n );\n }\n }\n\n register<\n TInputSchema extends AnyZodObject,\n TOutputSchema extends AnyZodObject,\n >(options: ActionsRegistryActionOptions<TInputSchema, TOutputSchema>): void {\n // hardcode test: prefix similar to how the default actions registry does it\n // and other places around the testing ecosystem:\n // https://github.com/backstage/backstage/blob/a9219496d5c073aaa0b8caf32ece10455cf65e61/packages/backend-test-utils/src/next/services/mockServices.ts#L321\n // https://github.com/backstage/backstage/blob/861f162b4a39117b824669d67a951ed1db142e3d/packages/backend-test-utils/src/next/wiring/ServiceFactoryTester.ts#L99\n const id = `test:${options.name}`;\n\n if (this.actions.has(id)) {\n throw new Error(`Action with id \"${id}\" is already registered`);\n }\n\n this.actions.set(id, options);\n }\n}\n"],"names":["zodToJsonSchema","z","NotFoundError","InputError","mockCredentials","ForwardedError"],"mappings":"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"}
package/dist/alpha.d.ts CHANGED
@@ -1,15 +1,10 @@
1
+ import { S as ServiceMock } from './types/createServiceMock.d-CeKvILsY.js';
1
2
  import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
- import { ServiceFactory, LoggerService, BackstageCredentials } from '@backstage/backend-plugin-api';
3
+ import { LoggerService, BackstageCredentials } from '@backstage/backend-plugin-api';
4
+ import * as _backstage_backend_plugin_api_alpha from '@backstage/backend-plugin-api/alpha';
5
+ import { ActionsRegistryService, ActionsService, ActionsRegistryActionOptions, ActionsServiceAction } from '@backstage/backend-plugin-api/alpha';
3
6
  import { JsonObject, JsonValue } from '@backstage/types';
4
7
  import { AnyZodObject } from 'zod';
5
- import { ActionsRegistryService, ActionsService, ActionsRegistryActionOptions, ActionsServiceAction } from '@backstage/backend-plugin-api/alpha';
6
-
7
- /** @alpha */
8
- type ServiceMock<TService> = {
9
- factory: ServiceFactory<TService>;
10
- } & {
11
- [Key in keyof TService]: TService[Key] extends (...args: infer Args) => infer Return ? TService[Key] & jest.MockInstance<Return, Args> : TService[Key];
12
- };
13
8
 
14
9
  /**
15
10
  * A mock implementation of the ActionsRegistryService and ActionsService that can be used in tests.
@@ -74,17 +69,16 @@ declare function actionsRegistryServiceMock(options?: {
74
69
  * @alpha
75
70
  */
76
71
  declare namespace actionsRegistryServiceMock {
77
- const factory: () => _backstage_backend_plugin_api.ServiceFactory<ActionsRegistryService, "plugin", "singleton">;
78
- const mock: (partialImpl?: Partial<ActionsRegistryService> | undefined) => ServiceMock<ActionsRegistryService>;
72
+ const factory: () => _backstage_backend_plugin_api.ServiceFactory<_backstage_backend_plugin_api_alpha.ActionsRegistryService, "plugin", "singleton">;
73
+ const mock: (partialImpl?: Partial<_backstage_backend_plugin_api_alpha.ActionsRegistryService> | undefined) => ServiceMock<_backstage_backend_plugin_api_alpha.ActionsRegistryService>;
79
74
  }
80
75
 
81
76
  /**
82
77
  * @alpha
83
78
  */
84
79
  declare namespace actionsServiceMock {
85
- const factory: () => _backstage_backend_plugin_api.ServiceFactory<ActionsService, "plugin", "singleton">;
86
- const mock: (partialImpl?: Partial<ActionsService> | undefined) => ServiceMock<ActionsService>;
80
+ const factory: () => _backstage_backend_plugin_api.ServiceFactory<_backstage_backend_plugin_api_alpha.ActionsService, "plugin", "singleton">;
81
+ const mock: (partialImpl?: Partial<_backstage_backend_plugin_api_alpha.ActionsService> | undefined) => ServiceMock<_backstage_backend_plugin_api_alpha.ActionsService>;
87
82
  }
88
83
 
89
- export { MockActionsRegistry, actionsRegistryServiceMock, actionsServiceMock };
90
- export type { ServiceMock };
84
+ export { MockActionsRegistry, ServiceMock, actionsRegistryServiceMock, actionsServiceMock };
package/dist/index.cjs.js CHANGED
@@ -6,6 +6,7 @@ var registerMswTestHooks = require('./msw/registerMswTestHooks.cjs.js');
6
6
  var MockDirectory = require('./filesystem/MockDirectory.cjs.js');
7
7
  var mockServices = require('./services/mockServices.cjs.js');
8
8
  var mockCredentials = require('./services/mockCredentials.cjs.js');
9
+ var createServiceMock = require('./services/createServiceMock.cjs.js');
9
10
  var ServiceFactoryTester = require('./wiring/ServiceFactoryTester.cjs.js');
10
11
  var TestBackend = require('./wiring/TestBackend.cjs.js');
11
12
  var errorHandler = require('./util/errorHandler.cjs.js');
@@ -24,6 +25,7 @@ Object.defineProperty(exports, "mockCredentials", {
24
25
  enumerable: true,
25
26
  get: function () { return mockCredentials.mockCredentials; }
26
27
  });
28
+ exports.createServiceMock = createServiceMock.createServiceMock;
27
29
  exports.ServiceFactoryTester = ServiceFactoryTester.ServiceFactoryTester;
28
30
  exports.startTestBackend = TestBackend.startTestBackend;
29
31
  exports.mockErrorHandler = errorHandler.mockErrorHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import Keyv from 'keyv';
2
2
  import { Knex } from 'knex';
3
3
  import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
4
- import { ServiceFactory, RootConfigService, RootLoggerService, AuthService, DiscoveryService, BackstageCredentials, HttpAuthService, BackstageUserInfo, UserInfoService, DatabaseService, PermissionsService, SchedulerService, RootInstanceMetadataService, BackstageNonePrincipal, BackstageUserPrincipal, BackstagePrincipalAccessRestrictions, BackstageServicePrincipal, ServiceRef, ExtensionPoint, BackendFeature } from '@backstage/backend-plugin-api';
4
+ import { RootConfigService, ServiceFactory, RootLoggerService, AuthService, DiscoveryService, BackstageCredentials, HttpAuthService, BackstageUserInfo, UserInfoService, DatabaseService, PermissionsService, SchedulerService, RootInstanceMetadataService, BackstageNonePrincipal, BackstageUserPrincipal, BackstagePrincipalAccessRestrictions, BackstageServicePrincipal, ServiceRef, ExtensionPoint, BackendFeature } from '@backstage/backend-plugin-api';
5
+ import { S as ServiceMock } from './types/createServiceMock.d-CeKvILsY.js';
6
+ export { c as createServiceMock } from './types/createServiceMock.d-CeKvILsY.js';
5
7
  import { EventsService } from '@backstage/plugin-events-node';
6
8
  import { AuthorizeResult } from '@backstage/plugin-permission-common';
7
9
  import { JsonObject } from '@backstage/types';
@@ -316,13 +318,6 @@ interface CreateMockDirectoryOptions {
316
318
  */
317
319
  declare function createMockDirectory(options?: CreateMockDirectoryOptions): MockDirectory;
318
320
 
319
- /** @public */
320
- type ServiceMock<TService> = {
321
- factory: ServiceFactory<TService>;
322
- } & {
323
- [Key in keyof TService]: TService[Key] extends (...args: infer Args) => infer Return ? TService[Key] & jest.MockInstance<Return, Args> : TService[Key];
324
- };
325
-
326
321
  /**
327
322
  * Mock implementations of the core services, to be used in tests.
328
323
  *
@@ -785,5 +780,5 @@ declare function startTestBackend<TExtensionPoints extends any[]>(options: TestB
785
780
  */
786
781
  declare function mockErrorHandler(_options?: {}, ..._args: never[]): express.ErrorRequestHandler<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>;
787
782
 
788
- export { ServiceFactoryTester, TestCaches, TestDatabases, createMockDirectory, mockCredentials, mockErrorHandler, mockServices, registerMswTestHooks, startTestBackend };
789
- export type { CreateMockDirectoryOptions, MockDirectory, MockDirectoryContent, MockDirectoryContentCallback, MockDirectoryContentCallbackContext, MockDirectoryContentOptions, ServiceFactoryTesterOptions, ServiceMock, TestBackend, TestBackendOptions, TestCacheId, TestDatabaseId };
783
+ export { ServiceFactoryTester, ServiceMock, TestCaches, TestDatabases, createMockDirectory, mockCredentials, mockErrorHandler, mockServices, registerMswTestHooks, startTestBackend };
784
+ export type { CreateMockDirectoryOptions, MockDirectory, MockDirectoryContent, MockDirectoryContentCallback, MockDirectoryContentCallbackContext, MockDirectoryContentOptions, ServiceFactoryTesterOptions, TestBackend, TestBackendOptions, TestCacheId, TestDatabaseId };
@@ -2,7 +2,7 @@
2
2
 
3
3
  var backendPluginApi = require('@backstage/backend-plugin-api');
4
4
 
5
- function simpleMock(ref, mockFactory) {
5
+ function createServiceMock(ref, mockFactory) {
6
6
  return (partialImpl) => {
7
7
  const mock = mockFactory();
8
8
  if (partialImpl) {
@@ -24,5 +24,5 @@ function simpleMock(ref, mockFactory) {
24
24
  };
25
25
  }
26
26
 
27
- exports.simpleMock = simpleMock;
28
- //# sourceMappingURL=simpleMock.cjs.js.map
27
+ exports.createServiceMock = createServiceMock;
28
+ //# sourceMappingURL=createServiceMock.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createServiceMock.cjs.js","sources":["../../src/services/createServiceMock.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 */\nimport {\n createServiceFactory,\n ServiceFactory,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\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/**\n * Creates a standardized Backstage service mock factory function for producing\n * mock service instances.\n *\n * @remarks\n *\n * Each method in the mock factory is a `jest.fn()`, and you can optionally pass\n * partial implementations when calling the returned function. No type\n * parameters should be provided to this function, they will be inferred from\n * the provided service reference.\n *\n * The returned mock has a `.factory` property that can be passed directly to\n * `startTestBackend` or other test utilities.\n *\n * @example\n * ```ts\n * import { createServiceMock } from '@backstage/backend-test-utils';\n *\n * const myServiceMock = createServiceMock(myServiceRef, () => ({\n * doStuff: jest.fn(),\n * doOtherStuff: jest.fn(),\n * }));\n *\n * // Create a mock with default behavior:\n * const mock = myServiceMock();\n *\n * // Or with a partial implementation:\n * const mock = myServiceMock({ doStuff: async () => 'test' });\n * expect(mock.doStuff).toHaveBeenCalledTimes(1);\n *\n * // It also has a `.factory` property for use with startTestBackend:\n * await startTestBackend({ features: [mock.factory] });\n * ```\n *\n * @public\n */\nexport function createServiceMock<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"],"names":["createServiceFactory"],"mappings":";;;;AAoEO,SAAS,iBAAA,CACd,KACA,WAAA,EAC4D;AAC5D,EAAA,OAAO,CAAA,WAAA,KAAe;AACpB,IAAA,MAAM,OAAO,WAAA,EAAY;AACzB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrD,QAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,UAAC,IAAA,CAAa,GAAG,CAAA,CAAE,kBAAA,CAAmB,IAAI,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAC,IAAA,CAAa,GAAG,CAAA,GAAI,IAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,OAAO,IAAA,EAAM;AAAA,MACzB,SAASA,qCAAA,CAAqB;AAAA,QAC5B,OAAA,EAAS,GAAA;AAAA,QACT,MAAM,EAAC;AAAA,QACP,SAAS,MAAM;AAAA,OAChB;AAAA,KACF,CAAA;AAAA,EACH,CAAA;AACF;;;;"}
@@ -23,7 +23,7 @@ var MockUserInfoService = require('./MockUserInfoService.cjs.js');
23
23
  var mockCredentials = require('./mockCredentials.cjs.js');
24
24
  var MockEventsService = require('./MockEventsService.cjs.js');
25
25
  var MockPermissionsService = require('./MockPermissionsService.cjs.js');
26
- var simpleMock = require('./simpleMock.cjs.js');
26
+ var createServiceMock = require('./createServiceMock.cjs.js');
27
27
  var MockSchedulerService = require('./MockSchedulerService.cjs.js');
28
28
  var ObservableConfigProxy = require('../config-loader/src/sources/ObservableConfigProxy.cjs.js');
29
29
 
@@ -66,7 +66,7 @@ exports.mockServices = void 0;
66
66
  backendPluginApi.coreServices.rootConfig,
67
67
  rootConfig2
68
68
  );
69
- rootConfig2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.rootConfig, () => ({
69
+ rootConfig2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.rootConfig, () => ({
70
70
  get: jest.fn(),
71
71
  getBoolean: jest.fn(),
72
72
  getConfig: jest.fn(),
@@ -94,7 +94,7 @@ exports.mockServices = void 0;
94
94
  backendPluginApi.coreServices.rootLogger,
95
95
  rootLogger2
96
96
  );
97
- rootLogger2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.rootLogger, () => ({
97
+ rootLogger2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.rootLogger, () => ({
98
98
  child: jest.fn(),
99
99
  debug: jest.fn(),
100
100
  error: jest.fn(),
@@ -104,7 +104,7 @@ exports.mockServices = void 0;
104
104
  })(rootLogger = mockServices2.rootLogger || (mockServices2.rootLogger = {}));
105
105
  ((auditor2) => {
106
106
  auditor2.factory = () => auditor.auditorServiceFactory;
107
- auditor2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.auditor, () => ({
107
+ auditor2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.auditor, () => ({
108
108
  createEvent: jest.fn(async (_) => {
109
109
  return {
110
110
  success: jest.fn(),
@@ -139,7 +139,7 @@ exports.mockServices = void 0;
139
139
  });
140
140
  }
141
141
  });
142
- auth2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.auth, () => ({
142
+ auth2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.auth, () => ({
143
143
  authenticate: jest.fn(),
144
144
  getNoneCredentials: jest.fn(),
145
145
  getOwnServiceCredentials: jest.fn(),
@@ -167,7 +167,7 @@ exports.mockServices = void 0;
167
167
  deps: {},
168
168
  factory: () => discovery2()
169
169
  });
170
- discovery2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.discovery, () => ({
170
+ discovery2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.discovery, () => ({
171
171
  getBaseUrl: jest.fn(),
172
172
  getExternalBaseUrl: jest.fn()
173
173
  }));
@@ -188,7 +188,7 @@ exports.mockServices = void 0;
188
188
  options?.defaultCredentials ?? mockCredentials.mockCredentials.user()
189
189
  )
190
190
  });
191
- httpAuth2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.httpAuth, () => ({
191
+ httpAuth2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.httpAuth, () => ({
192
192
  credentials: jest.fn(),
193
193
  issueUserCookie: jest.fn()
194
194
  }));
@@ -205,13 +205,13 @@ exports.mockServices = void 0;
205
205
  return new MockUserInfoService.MockUserInfoService();
206
206
  }
207
207
  });
208
- userInfo2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.userInfo, () => ({
208
+ userInfo2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.userInfo, () => ({
209
209
  getUserInfo: jest.fn()
210
210
  }));
211
211
  })(userInfo = mockServices2.userInfo || (mockServices2.userInfo = {}));
212
212
  ((cache2) => {
213
213
  cache2.factory = () => cache.cacheServiceFactory;
214
- cache2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.cache, () => ({
214
+ cache2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.cache, () => ({
215
215
  delete: jest.fn(),
216
216
  get: jest.fn(),
217
217
  set: jest.fn(),
@@ -231,40 +231,40 @@ exports.mockServices = void 0;
231
231
  deps: {},
232
232
  factory: () => database2(options)
233
233
  }) : database.databaseServiceFactory;
234
- database2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.database, () => ({
234
+ database2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.database, () => ({
235
235
  getClient: jest.fn()
236
236
  }));
237
237
  })(database$1 = mockServices2.database || (mockServices2.database = {}));
238
238
  ((rootHealth2) => {
239
239
  rootHealth2.factory = () => rootHealth.rootHealthServiceFactory;
240
- rootHealth2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.rootHealth, () => ({
240
+ rootHealth2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.rootHealth, () => ({
241
241
  getLiveness: jest.fn(),
242
242
  getReadiness: jest.fn()
243
243
  }));
244
244
  })(mockServices2.rootHealth || (mockServices2.rootHealth = {}));
245
245
  ((httpRouter2) => {
246
246
  httpRouter2.factory = () => httpRouter.httpRouterServiceFactory;
247
- httpRouter2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.httpRouter, () => ({
247
+ httpRouter2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.httpRouter, () => ({
248
248
  use: jest.fn(),
249
249
  addAuthPolicy: jest.fn()
250
250
  }));
251
251
  })(mockServices2.httpRouter || (mockServices2.httpRouter = {}));
252
252
  ((rootHttpRouter2) => {
253
253
  rootHttpRouter2.factory = () => rootHttpRouter.rootHttpRouterServiceFactory();
254
- rootHttpRouter2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.rootHttpRouter, () => ({
254
+ rootHttpRouter2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.rootHttpRouter, () => ({
255
255
  use: jest.fn()
256
256
  }));
257
257
  })(mockServices2.rootHttpRouter || (mockServices2.rootHttpRouter = {}));
258
258
  ((lifecycle2) => {
259
259
  lifecycle2.factory = () => lifecycle.lifecycleServiceFactory;
260
- lifecycle2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.lifecycle, () => ({
260
+ lifecycle2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.lifecycle, () => ({
261
261
  addShutdownHook: jest.fn(),
262
262
  addStartupHook: jest.fn()
263
263
  }));
264
264
  })(mockServices2.lifecycle || (mockServices2.lifecycle = {}));
265
265
  ((logger2) => {
266
266
  logger2.factory = () => logger.loggerServiceFactory;
267
- logger2.mock = simpleMock.simpleMock(
267
+ logger2.mock = createServiceMock.createServiceMock(
268
268
  backendPluginApi.coreServices.logger,
269
269
  () => createLoggerMock()
270
270
  );
@@ -279,23 +279,26 @@ exports.mockServices = void 0;
279
279
  deps: {},
280
280
  factory: () => new MockPermissionsService.MockPermissionsService(options)
281
281
  }) : permissions.permissionsServiceFactory;
282
- permissions2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.permissions, () => ({
282
+ permissions2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.permissions, () => ({
283
283
  authorize: jest.fn(),
284
284
  authorizeConditional: jest.fn()
285
285
  }));
286
286
  })(permissions$1 = mockServices2.permissions || (mockServices2.permissions = {}));
287
287
  ((permissionsRegistry2) => {
288
288
  permissionsRegistry2.factory = () => permissionsRegistry.permissionsRegistryServiceFactory;
289
- permissionsRegistry2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.permissionsRegistry, () => ({
290
- addPermissionRules: jest.fn(),
291
- addPermissions: jest.fn(),
292
- addResourceType: jest.fn(),
293
- getPermissionRuleset: jest.fn()
294
- }));
289
+ permissionsRegistry2.mock = createServiceMock.createServiceMock(
290
+ backendPluginApi.coreServices.permissionsRegistry,
291
+ () => ({
292
+ addPermissionRules: jest.fn(),
293
+ addPermissions: jest.fn(),
294
+ addResourceType: jest.fn(),
295
+ getPermissionRuleset: jest.fn()
296
+ })
297
+ );
295
298
  })(mockServices2.permissionsRegistry || (mockServices2.permissionsRegistry = {}));
296
299
  ((rootLifecycle2) => {
297
300
  rootLifecycle2.factory = () => rootLifecycle.rootLifecycleServiceFactory;
298
- rootLifecycle2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.rootLifecycle, () => ({
301
+ rootLifecycle2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.rootLifecycle, () => ({
299
302
  addShutdownHook: jest.fn(),
300
303
  addBeforeShutdownHook: jest.fn(),
301
304
  addStartupHook: jest.fn()
@@ -307,7 +310,7 @@ exports.mockServices = void 0;
307
310
  mockServices2.scheduler = scheduler;
308
311
  ((scheduler2) => {
309
312
  scheduler2.factory = (options) => new MockSchedulerService.MockSchedulerService().factory(options);
310
- scheduler2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.scheduler, () => ({
313
+ scheduler2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.scheduler, () => ({
311
314
  createScheduledTaskRunner: jest.fn(),
312
315
  getScheduledTasks: jest.fn(),
313
316
  scheduleTask: jest.fn(),
@@ -316,7 +319,7 @@ exports.mockServices = void 0;
316
319
  })(scheduler = mockServices2.scheduler || (mockServices2.scheduler = {}));
317
320
  ((urlReader2) => {
318
321
  urlReader2.factory = () => urlReader.urlReaderServiceFactory;
319
- urlReader2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.urlReader, () => ({
322
+ urlReader2.mock = createServiceMock.createServiceMock(backendPluginApi.coreServices.urlReader, () => ({
320
323
  readTree: jest.fn(),
321
324
  readUrl: jest.fn(),
322
325
  search: jest.fn()
@@ -328,7 +331,7 @@ exports.mockServices = void 0;
328
331
  mockServices2.events = events;
329
332
  ((events2) => {
330
333
  events2.factory = simpleFactoryWithOptions(pluginEventsNode.eventsServiceRef, events2);
331
- events2.mock = simpleMock.simpleMock(pluginEventsNode.eventsServiceRef, () => ({
334
+ events2.mock = createServiceMock.createServiceMock(pluginEventsNode.eventsServiceRef, () => ({
332
335
  publish: jest.fn(),
333
336
  subscribe: jest.fn()
334
337
  }));
@@ -340,9 +343,12 @@ exports.mockServices = void 0;
340
343
  }
341
344
  mockServices2.rootInstanceMetadata = rootInstanceMetadata;
342
345
  ((rootInstanceMetadata2) => {
343
- rootInstanceMetadata2.mock = simpleMock.simpleMock(backendPluginApi.coreServices.rootInstanceMetadata, () => ({
344
- getInstalledPlugins: jest.fn()
345
- }));
346
+ rootInstanceMetadata2.mock = createServiceMock.createServiceMock(
347
+ backendPluginApi.coreServices.rootInstanceMetadata,
348
+ () => ({
349
+ getInstalledPlugins: jest.fn()
350
+ })
351
+ );
346
352
  rootInstanceMetadata2.factory = simpleFactoryWithOptions(
347
353
  backendPluginApi.coreServices.rootInstanceMetadata,
348
354
  rootInstanceMetadata2
@@ -1 +1 @@
1
- {"version":3,"file":"mockServices.cjs.js","sources":["../../src/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 { urlReaderServiceFactory } from '@backstage/backend-defaults/urlReader';\nimport {\n AuthService,\n BackstageCredentials,\n BackstageUserInfo,\n DatabaseService,\n DiscoveryService,\n HttpAuthService,\n RootInstanceMetadataService,\n PermissionsService,\n RootConfigService,\n SchedulerService,\n ServiceFactory,\n ServiceRef,\n UserInfoService,\n coreServices,\n createServiceFactory,\n RootLoggerService,\n} from '@backstage/backend-plugin-api';\nimport { ConfigReader } from '@backstage/config';\nimport { EventsService, eventsServiceRef } from '@backstage/plugin-events-node';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\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';\nimport { MockPermissionsService } from './MockPermissionsService';\nimport { simpleMock } from './simpleMock';\nimport { MockSchedulerService } from './MockSchedulerService';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { ObservableConfigProxy } from '../../../config-loader/src/sources/ObservableConfigProxy';\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 TInstances extends 'singleton' | 'multiton',\n TOptions extends [options?: object] = [],\n>(\n ref: ServiceRef<TService, TScope, TInstances>,\n factory: (...options: TOptions) => TService,\n): (...options: TOptions) => ServiceFactory<TService, TScope, TInstances> {\n const factoryWithOptions = (...options: TOptions) =>\n createServiceFactory({\n service: ref as ServiceRef<TService, any, 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, TInstances> &\n ((...options: TOptions) => ServiceFactory<TService, TScope, TInstances>);\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(\n options?: rootConfig.Options,\n ): RootConfigService & { update(options: { data: JsonObject }): void } {\n const config = ObservableConfigProxy.create(new AbortController());\n config.setConfig(new ConfigReader(options?.data ?? {}, 'mock-config'));\n return Object.assign(config, {\n update({ data }: { data: JsonObject }): void {\n config.setConfig(new ConfigReader(data, 'mock-config'));\n },\n });\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): RootLoggerService {\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 /**\n * Creates a functional mock implementation of the\n * {@link @backstage/backend-plugin-api#PermissionsService}.\n */\n export function permissions(options?: {\n result: AuthorizeResult.ALLOW | AuthorizeResult.DENY;\n }): PermissionsService {\n return new MockPermissionsService(options);\n }\n export namespace permissions {\n /**\n * Creates a mock factory for the\n * {@link @backstage/backend-plugin-api#coreServices.permissions}. Just\n * returns the given `result` if you supply one. Otherwise, it returns the\n * regular default permissions factory.\n */\n export const factory = (options?: {\n result: AuthorizeResult.ALLOW | AuthorizeResult.DENY;\n }) =>\n options?.result\n ? createServiceFactory({\n service: coreServices.permissions,\n deps: {},\n factory: () => new MockPermissionsService(options),\n })\n : permissionsServiceFactory;\n /**\n * Creates a mock of the\n * {@link @backstage/backend-plugin-api#coreServices.permissions},\n * optionally with some given method implementations.\n */\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 function scheduler(): SchedulerService {\n return new MockSchedulerService();\n }\n export namespace scheduler {\n export const factory = (options?: {\n skipTaskRunOnStartup?: boolean;\n includeManualTasksOnStartup?: boolean;\n includeInitialDelayedTasksOnStartup?: boolean;\n }) => new MockSchedulerService().factory(options);\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 export function rootInstanceMetadata(): RootInstanceMetadataService {\n return {\n getInstalledPlugins: () => Promise.resolve([]),\n };\n }\n export namespace rootInstanceMetadata {\n export const mock = simpleMock(coreServices.rootInstanceMetadata, () => ({\n getInstalledPlugins: jest.fn(),\n }));\n export const factory = simpleFactoryWithOptions(\n coreServices.rootInstanceMetadata,\n rootInstanceMetadata,\n );\n }\n}\n"],"names":["createServiceFactory","mockServices","config","ObservableConfigProxy","ConfigReader","rootConfig","coreServices","simpleMock","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","MockPermissionsService","permissionsServiceFactory","permissionsRegistry","permissionsRegistryServiceFactory","rootLifecycle","rootLifecycleServiceFactory","MockSchedulerService","scheduler","urlReader","urlReaderServiceFactory","MockEventsService","events","eventsServiceRef","rootInstanceMetadata"],"mappings":"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"}
1
+ {"version":3,"file":"mockServices.cjs.js","sources":["../../src/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 { urlReaderServiceFactory } from '@backstage/backend-defaults/urlReader';\nimport {\n AuthService,\n BackstageCredentials,\n BackstageUserInfo,\n DatabaseService,\n DiscoveryService,\n HttpAuthService,\n RootInstanceMetadataService,\n PermissionsService,\n RootConfigService,\n SchedulerService,\n ServiceFactory,\n ServiceRef,\n UserInfoService,\n coreServices,\n createServiceFactory,\n RootLoggerService,\n} from '@backstage/backend-plugin-api';\nimport { ConfigReader } from '@backstage/config';\nimport { EventsService, eventsServiceRef } from '@backstage/plugin-events-node';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\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';\nimport { MockPermissionsService } from './MockPermissionsService';\nimport { createServiceMock } from './createServiceMock';\nimport { MockSchedulerService } from './MockSchedulerService';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { ObservableConfigProxy } from '../../../config-loader/src/sources/ObservableConfigProxy';\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 TInstances extends 'singleton' | 'multiton',\n TOptions extends [options?: object] = [],\n>(\n ref: ServiceRef<TService, TScope, TInstances>,\n factory: (...options: TOptions) => TService,\n): (...options: TOptions) => ServiceFactory<TService, TScope, TInstances> {\n const factoryWithOptions = (...options: TOptions) =>\n createServiceFactory({\n service: ref as ServiceRef<TService, any, 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, TInstances> &\n ((...options: TOptions) => ServiceFactory<TService, TScope, TInstances>);\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(\n options?: rootConfig.Options,\n ): RootConfigService & { update(options: { data: JsonObject }): void } {\n const config = ObservableConfigProxy.create(new AbortController());\n config.setConfig(new ConfigReader(options?.data ?? {}, 'mock-config'));\n return Object.assign(config, {\n update({ data }: { data: JsonObject }): void {\n config.setConfig(new ConfigReader(data, 'mock-config'));\n },\n });\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 = createServiceMock(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): RootLoggerService {\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 = createServiceMock(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 = createServiceMock(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 = createServiceMock(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 = createServiceMock(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 = createServiceMock(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 = createServiceMock(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 = createServiceMock(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 = createServiceMock(coreServices.database, () => ({\n getClient: jest.fn(),\n }));\n }\n\n export namespace rootHealth {\n export const factory = () => rootHealthServiceFactory;\n export const mock = createServiceMock(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 = createServiceMock(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 = createServiceMock(coreServices.rootHttpRouter, () => ({\n use: jest.fn(),\n }));\n }\n\n export namespace lifecycle {\n export const factory = () => lifecycleServiceFactory;\n export const mock = createServiceMock(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 = createServiceMock(coreServices.logger, () =>\n createLoggerMock(),\n );\n }\n\n /**\n * Creates a functional mock implementation of the\n * {@link @backstage/backend-plugin-api#PermissionsService}.\n */\n export function permissions(options?: {\n result: AuthorizeResult.ALLOW | AuthorizeResult.DENY;\n }): PermissionsService {\n return new MockPermissionsService(options);\n }\n export namespace permissions {\n /**\n * Creates a mock factory for the\n * {@link @backstage/backend-plugin-api#coreServices.permissions}. Just\n * returns the given `result` if you supply one. Otherwise, it returns the\n * regular default permissions factory.\n */\n export const factory = (options?: {\n result: AuthorizeResult.ALLOW | AuthorizeResult.DENY;\n }) =>\n options?.result\n ? createServiceFactory({\n service: coreServices.permissions,\n deps: {},\n factory: () => new MockPermissionsService(options),\n })\n : permissionsServiceFactory;\n /**\n * Creates a mock of the\n * {@link @backstage/backend-plugin-api#coreServices.permissions},\n * optionally with some given method implementations.\n */\n export const mock = createServiceMock(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 = createServiceMock(\n coreServices.permissionsRegistry,\n () => ({\n addPermissionRules: jest.fn(),\n addPermissions: jest.fn(),\n addResourceType: jest.fn(),\n getPermissionRuleset: jest.fn(),\n }),\n );\n }\n\n export namespace rootLifecycle {\n export const factory = () => rootLifecycleServiceFactory;\n export const mock = createServiceMock(coreServices.rootLifecycle, () => ({\n addShutdownHook: jest.fn(),\n addBeforeShutdownHook: jest.fn(),\n addStartupHook: jest.fn(),\n }));\n }\n\n export function scheduler(): SchedulerService {\n return new MockSchedulerService();\n }\n export namespace scheduler {\n export const factory = (options?: {\n skipTaskRunOnStartup?: boolean;\n includeManualTasksOnStartup?: boolean;\n includeInitialDelayedTasksOnStartup?: boolean;\n }) => new MockSchedulerService().factory(options);\n export const mock = createServiceMock(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 = createServiceMock(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 = createServiceMock(eventsServiceRef, () => ({\n publish: jest.fn(),\n subscribe: jest.fn(),\n }));\n }\n\n export function rootInstanceMetadata(): RootInstanceMetadataService {\n return {\n getInstalledPlugins: () => Promise.resolve([]),\n };\n }\n export namespace rootInstanceMetadata {\n export const mock = createServiceMock(\n coreServices.rootInstanceMetadata,\n () => ({\n getInstalledPlugins: jest.fn(),\n }),\n );\n export const factory = simpleFactoryWithOptions(\n coreServices.rootInstanceMetadata,\n rootInstanceMetadata,\n );\n }\n}\n"],"names":["createServiceFactory","mockServices","config","ObservableConfigProxy","ConfigReader","rootConfig","coreServices","createServiceMock","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","MockPermissionsService","permissionsServiceFactory","permissionsRegistry","permissionsRegistryServiceFactory","rootLifecycle","rootLifecycleServiceFactory","MockSchedulerService","scheduler","urlReader","urlReaderServiceFactory","MockEventsService","events","eventsServiceRef","rootInstanceMetadata"],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { ServiceFactory, ServiceRef } from '@backstage/backend-plugin-api';
2
+
3
+ /** @public */
4
+ type ServiceMock<TService> = {
5
+ factory: ServiceFactory<TService>;
6
+ } & {
7
+ [Key in keyof TService]: TService[Key] extends (...args: infer Args) => infer Return ? TService[Key] & jest.MockInstance<Return, Args> : TService[Key];
8
+ };
9
+ /**
10
+ * Creates a standardized Backstage service mock factory function for producing
11
+ * mock service instances.
12
+ *
13
+ * @remarks
14
+ *
15
+ * Each method in the mock factory is a `jest.fn()`, and you can optionally pass
16
+ * partial implementations when calling the returned function. No type
17
+ * parameters should be provided to this function, they will be inferred from
18
+ * the provided service reference.
19
+ *
20
+ * The returned mock has a `.factory` property that can be passed directly to
21
+ * `startTestBackend` or other test utilities.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { createServiceMock } from '@backstage/backend-test-utils';
26
+ *
27
+ * const myServiceMock = createServiceMock(myServiceRef, () => ({
28
+ * doStuff: jest.fn(),
29
+ * doOtherStuff: jest.fn(),
30
+ * }));
31
+ *
32
+ * // Create a mock with default behavior:
33
+ * const mock = myServiceMock();
34
+ *
35
+ * // Or with a partial implementation:
36
+ * const mock = myServiceMock({ doStuff: async () => 'test' });
37
+ * expect(mock.doStuff).toHaveBeenCalledTimes(1);
38
+ *
39
+ * // It also has a `.factory` property for use with startTestBackend:
40
+ * await startTestBackend({ features: [mock.factory] });
41
+ * ```
42
+ *
43
+ * @public
44
+ */
45
+ declare function createServiceMock<TService>(ref: ServiceRef<TService, any>, mockFactory: () => jest.Mocked<TService>): (partialImpl?: Partial<TService>) => ServiceMock<TService>;
46
+
47
+ export { createServiceMock as c };
48
+ export type { ServiceMock as S };
@@ -3,6 +3,7 @@
3
3
  var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
4
4
  var mockServices = require('../services/mockServices.cjs.js');
5
5
  require('../services/mockCredentials.cjs.js');
6
+ require('@backstage/backend-plugin-api');
6
7
 
7
8
  function mockErrorHandler(_options, ..._args) {
8
9
  return rootHttpRouter.MiddlewareFactory.create({
@@ -1 +1 @@
1
- {"version":3,"file":"errorHandler.cjs.js","sources":["../../src/util/errorHandler.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { mockServices } from '../services';\n\n/**\n * A mock for error handler middleware that can be used in router tests.\n * @public\n *\n * @example\n * ```ts\n * const app = express();\n * app.use(mockErrorHandler());\n * ```\n */\nexport function mockErrorHandler(_options?: {}, ..._args: never[]) {\n return MiddlewareFactory.create({\n config: mockServices.rootConfig(),\n logger: mockServices.rootLogger(),\n }).error();\n}\n"],"names":["MiddlewareFactory","mockServices"],"mappings":";;;;;;AA6BO,SAAS,gBAAA,CAAiB,aAAkB,KAAA,EAAgB;AACjE,EAAA,OAAOA,iCAAkB,MAAA,CAAO;AAAA,IAC9B,MAAA,EAAQC,0BAAa,UAAA,EAAW;AAAA,IAChC,MAAA,EAAQA,0BAAa,UAAA;AAAW,GACjC,EAAE,KAAA,EAAM;AACX;;;;"}
1
+ {"version":3,"file":"errorHandler.cjs.js","sources":["../../src/util/errorHandler.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { mockServices } from '../services';\n\n/**\n * A mock for error handler middleware that can be used in router tests.\n * @public\n *\n * @example\n * ```ts\n * const app = express();\n * app.use(mockErrorHandler());\n * ```\n */\nexport function mockErrorHandler(_options?: {}, ..._args: never[]) {\n return MiddlewareFactory.create({\n config: mockServices.rootConfig(),\n logger: mockServices.rootLogger(),\n }).error();\n}\n"],"names":["MiddlewareFactory","mockServices"],"mappings":";;;;;;;AA6BO,SAAS,gBAAA,CAAiB,aAAkB,KAAA,EAAgB;AACjE,EAAA,OAAOA,iCAAkB,MAAA,CAAO;AAAA,IAC9B,MAAA,EAAQC,0BAAa,UAAA,EAAW;AAAA,IAChC,MAAA,EAAQA,0BAAa,UAAA;AAAW,GACjC,EAAE,KAAA,EAAM;AACX;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/backend-test-utils",
3
- "version": "1.10.5-next.0",
3
+ "version": "1.11.0",
4
4
  "description": "Test helpers library for Backstage backends",
5
5
  "backstage": {
6
6
  "role": "node-library"
@@ -57,15 +57,15 @@
57
57
  "test": "backstage-cli package test"
58
58
  },
59
59
  "dependencies": {
60
- "@backstage/backend-app-api": "1.5.0-next.0",
61
- "@backstage/backend-defaults": "0.15.2-next.1",
62
- "@backstage/backend-plugin-api": "1.7.0-next.1",
63
- "@backstage/config": "1.3.6",
64
- "@backstage/errors": "1.2.7",
65
- "@backstage/plugin-auth-node": "0.6.13-next.0",
66
- "@backstage/plugin-events-node": "0.4.19-next.0",
67
- "@backstage/plugin-permission-common": "0.9.6-next.0",
68
- "@backstage/types": "1.2.2",
60
+ "@backstage/backend-app-api": "^1.5.0",
61
+ "@backstage/backend-defaults": "^0.15.2",
62
+ "@backstage/backend-plugin-api": "^1.7.0",
63
+ "@backstage/config": "^1.3.6",
64
+ "@backstage/errors": "^1.2.7",
65
+ "@backstage/plugin-auth-node": "^0.6.13",
66
+ "@backstage/plugin-events-node": "^0.4.19",
67
+ "@backstage/plugin-permission-common": "^0.9.6",
68
+ "@backstage/types": "^1.2.2",
69
69
  "@keyv/memcache": "^2.0.1",
70
70
  "@keyv/redis": "^4.0.1",
71
71
  "@keyv/valkey": "^1.0.1",
@@ -91,10 +91,18 @@
91
91
  "zod-to-json-schema": "^3.25.1"
92
92
  },
93
93
  "devDependencies": {
94
- "@backstage/cli": "0.35.4-next.1",
94
+ "@backstage/cli": "^0.35.4",
95
95
  "@types/jest": "*",
96
96
  "@types/lodash": "^4.14.151",
97
97
  "@types/supertest": "^2.0.8",
98
98
  "supertest": "^7.0.0"
99
+ },
100
+ "peerDependencies": {
101
+ "@types/jest": "*"
102
+ },
103
+ "peerDependenciesMeta": {
104
+ "@types/jest": {
105
+ "optional": true
106
+ }
99
107
  }
100
108
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"simpleMock.cjs.js","sources":["../../../src/alpha/services/simpleMock.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 */\nimport {\n createServiceFactory,\n ServiceFactory,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\n\n/** @alpha */\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 */\nexport function 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"],"names":["createServiceFactory"],"mappings":";;;;AAiCO,SAAS,UAAA,CACd,KACA,WAAA,EAC4D;AAC5D,EAAA,OAAO,CAAA,WAAA,KAAe;AACpB,IAAA,MAAM,OAAO,WAAA,EAAY;AACzB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrD,QAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,UAAC,IAAA,CAAa,GAAG,CAAA,CAAE,kBAAA,CAAmB,IAAI,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAC,IAAA,CAAa,GAAG,CAAA,GAAI,IAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,OAAO,IAAA,EAAM;AAAA,MACzB,SAASA,qCAAA,CAAqB;AAAA,QAC5B,OAAA,EAAS,GAAA;AAAA,QACT,MAAM,EAAC;AAAA,QACP,SAAS,MAAM;AAAA,OAChB;AAAA,KACF,CAAA;AAAA,EACH,CAAA;AACF;;;;"}
@@ -1,28 +0,0 @@
1
- 'use strict';
2
-
3
- var backendPluginApi = require('@backstage/backend-plugin-api');
4
-
5
- function simpleMock(ref, mockFactory) {
6
- return (partialImpl) => {
7
- const mock = mockFactory();
8
- if (partialImpl) {
9
- for (const [key, impl] of Object.entries(partialImpl)) {
10
- if (typeof impl === "function") {
11
- mock[key].mockImplementation(impl);
12
- } else {
13
- mock[key] = impl;
14
- }
15
- }
16
- }
17
- return Object.assign(mock, {
18
- factory: backendPluginApi.createServiceFactory({
19
- service: ref,
20
- deps: {},
21
- factory: () => mock
22
- })
23
- });
24
- };
25
- }
26
-
27
- exports.simpleMock = simpleMock;
28
- //# sourceMappingURL=simpleMock.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"simpleMock.cjs.js","sources":["../../src/services/simpleMock.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 */\nimport {\n createServiceFactory,\n ServiceFactory,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\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 */\nexport function 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"],"names":["createServiceFactory"],"mappings":";;;;AAiCO,SAAS,UAAA,CACd,KACA,WAAA,EAC4D;AAC5D,EAAA,OAAO,CAAA,WAAA,KAAe;AACpB,IAAA,MAAM,OAAO,WAAA,EAAY;AACzB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrD,QAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,UAAC,IAAA,CAAa,GAAG,CAAA,CAAE,kBAAA,CAAmB,IAAI,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAC,IAAA,CAAa,GAAG,CAAA,GAAI,IAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,OAAO,IAAA,EAAM;AAAA,MACzB,SAASA,qCAAA,CAAqB;AAAA,QAC5B,OAAA,EAAS,GAAA;AAAA,QACT,MAAM,EAAC;AAAA,QACP,SAAS,MAAM;AAAA,OAChB;AAAA,KACF,CAAA;AAAA,EACH,CAAA;AACF;;;;"}