@backstage/backend-test-utils 1.11.1-next.1 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # @backstage/backend-test-utils
2
2
 
3
+ ## 1.11.1
4
+
5
+ ### Patch Changes
6
+
7
+ - dee4283: Added `pluginId` field to `ActionsServiceAction` type, populated from the registering plugin's metadata.
8
+ - 164711a: Added `cancelTask` to `MockSchedulerService` and mock scheduler service factory.
9
+ - 62f0a53: Fixed error forwarding in the actions registry so that known errors like `InputError` and `NotFoundError` thrown by actions preserve their original status codes and messages instead of being wrapped in `ForwardedError` and coerced to 500.
10
+ - a49a40d: Updated dependency `zod` to `^3.25.76 || ^4.0.0` & migrated to `/v3` or `/v4` imports.
11
+ - 1ee5b28: Adds a new metrics service mock to be leveraged in tests
12
+ - Updated dependencies
13
+ - @backstage/backend-plugin-api@1.8.0
14
+ - @backstage/backend-defaults@0.16.0
15
+ - @backstage/plugin-permission-common@0.9.7
16
+ - @backstage/plugin-auth-node@0.6.14
17
+ - @backstage/backend-app-api@1.6.0
18
+ - @backstage/plugin-events-node@0.4.20
19
+
20
+ ## 1.11.1-next.2
21
+
22
+ ### Patch Changes
23
+
24
+ - 164711a: Added `cancelTask` to `MockSchedulerService` and mock scheduler service factory.
25
+ - Updated dependencies
26
+ - @backstage/backend-plugin-api@1.8.0-next.1
27
+ - @backstage/backend-defaults@0.16.0-next.2
28
+ - @backstage/backend-app-api@1.6.0-next.1
29
+ - @backstage/plugin-auth-node@0.6.14-next.2
30
+ - @backstage/plugin-events-node@0.4.20-next.1
31
+
3
32
  ## 1.11.1-next.1
4
33
 
5
34
  ### Patch Changes
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var errors = require('@backstage/errors');
4
- var zod = require('zod');
4
+ var v3 = require('zod/v3');
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');
@@ -24,6 +24,7 @@ class MockActionsRegistry {
24
24
  return {
25
25
  actions: Array.from(this.actions.entries()).map(([id, action]) => ({
26
26
  id,
27
+ pluginId: "test",
27
28
  name: action.name,
28
29
  title: action.title,
29
30
  description: action.description,
@@ -33,8 +34,8 @@ class MockActionsRegistry {
33
34
  readOnly: action.attributes?.readOnly ?? false
34
35
  },
35
36
  schema: {
36
- input: action.schema?.input ? zodToJsonSchema__default.default(action.schema.input(zod.z)) : zodToJsonSchema__default.default(zod.z.object({})),
37
- output: action.schema?.output ? zodToJsonSchema__default.default(action.schema.output(zod.z)) : zodToJsonSchema__default.default(zod.z.object({}))
37
+ input: action.schema?.input ? zodToJsonSchema__default.default(action.schema.input(v3.z)) : zodToJsonSchema__default.default(v3.z.object({})),
38
+ output: action.schema?.output ? zodToJsonSchema__default.default(action.schema.output(v3.z)) : zodToJsonSchema__default.default(v3.z.object({}))
38
39
  }
39
40
  }))
40
41
  };
@@ -47,7 +48,7 @@ class MockActionsRegistry {
47
48
  `Action "${opts.id}" not found, available actions: ${availableActionIds ? `"${availableActionIds}"` : "none"}`
48
49
  );
49
50
  }
50
- const input = action.schema?.input ? action.schema.input(zod.z).safeParse(opts.input) : { success: true, data: void 0 };
51
+ const input = action.schema?.input ? action.schema.input(v3.z).safeParse(opts.input) : { success: true, data: void 0 };
51
52
  if (!input.success) {
52
53
  throw new errors.InputError(`Invalid input to action "${opts.id}"`, input.error);
53
54
  }
@@ -56,7 +57,7 @@ class MockActionsRegistry {
56
57
  credentials: opts.credentials ?? mockCredentials.mockCredentials.none(),
57
58
  logger: this.logger
58
59
  });
59
- const output = action.schema?.output ? action.schema.output(zod.z).safeParse(result?.output) : { success: true, data: result?.output };
60
+ const output = action.schema?.output ? action.schema.output(v3.z).safeParse(result?.output) : { success: true, data: result?.output };
60
61
  if (!output.success) {
61
62
  throw new errors.InputError(
62
63
  `Invalid output from action "${opts.id}"`,
@@ -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 { 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 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 }\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"],"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 { InputError, NotFoundError } from '@backstage/errors';\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { z, AnyZodObject } from 'zod/v3';\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 pluginId: 'test',\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 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 }\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"],"mappings":"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"}
package/dist/alpha.d.ts CHANGED
@@ -4,7 +4,7 @@ import { LoggerService, BackstageCredentials } from '@backstage/backend-plugin-a
4
4
  import * as _backstage_backend_plugin_api_alpha from '@backstage/backend-plugin-api/alpha';
5
5
  import { ActionsRegistryService, ActionsService, ActionsRegistryActionOptions, ActionsServiceAction, MetricsService } from '@backstage/backend-plugin-api/alpha';
6
6
  import { JsonObject, JsonValue } from '@backstage/types';
7
- import { AnyZodObject } from 'zod';
7
+ import { AnyZodObject } from 'zod/v3';
8
8
 
9
9
  /**
10
10
  * A mock implementation of the ActionsRegistryService and ActionsService that can be used in tests.
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var errors = require('@backstage/errors');
4
5
  var types = require('@backstage/types');
5
6
 
6
7
  class MockSchedulerService {
@@ -51,10 +52,21 @@ class MockSchedulerService {
51
52
  abortControllers: new AbortController()
52
53
  });
53
54
  }
55
+ async cancelTask(id) {
56
+ const task = this.#tasks.get(id);
57
+ if (!task) {
58
+ throw new errors.NotFoundError(`Task ${id} not found`);
59
+ }
60
+ if (!this.#runningTasks.has(id)) {
61
+ throw new errors.ConflictError(`Task ${id} is not running`);
62
+ }
63
+ task.abortControllers.abort();
64
+ task.abortControllers = new AbortController();
65
+ }
54
66
  async triggerTask(id) {
55
67
  const task = this.#tasks.get(id);
56
68
  if (!task) {
57
- throw new Error(`Task ${id} not found`);
69
+ throw new errors.NotFoundError(`Task ${id} not found`);
58
70
  }
59
71
  if (this.#runningTasks.has(id)) {
60
72
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"MockSchedulerService.cjs.js","sources":["../../src/services/MockSchedulerService.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n SchedulerService,\n SchedulerServiceTaskDescriptor,\n SchedulerServiceTaskInvocationDefinition,\n SchedulerServiceTaskRunner,\n SchedulerServiceTaskScheduleDefinition,\n} from '@backstage/backend-plugin-api';\nimport { createDeferred, DeferredPromise } from '@backstage/types';\n\nexport class MockSchedulerService implements SchedulerService {\n readonly #tasks = new Map<\n string,\n SchedulerServiceTaskInvocationDefinition &\n SchedulerServiceTaskScheduleDefinition & {\n descriptor: SchedulerServiceTaskDescriptor;\n abortControllers: AbortController;\n }\n >();\n readonly #runningTasks = new Set<string>();\n readonly #deferredTaskCompletions = new Map<string, DeferredPromise<void>>();\n\n /**\n * Creates a service factory for this mock scheduler instance, which can be installed in a test backend\n */\n factory(options?: {\n skipTaskRunOnStartup?: boolean;\n includeManualTasksOnStartup?: boolean;\n includeInitialDelayedTasksOnStartup?: boolean;\n }) {\n return createServiceFactory({\n service: coreServices.scheduler,\n deps: { lifecycle: coreServices.lifecycle },\n factory: async ({ lifecycle }) => {\n if (!options?.skipTaskRunOnStartup) {\n lifecycle.addStartupHook(async () => {\n await this.#triggerAllTasks({\n includeManualTasks: options?.includeManualTasksOnStartup,\n includeInitialDelayedTasks:\n options?.includeInitialDelayedTasksOnStartup,\n });\n });\n }\n lifecycle.addShutdownHook(async () => {\n await this.#shutdownAllTasks();\n });\n return this;\n },\n });\n }\n\n createScheduledTaskRunner(\n schedule: SchedulerServiceTaskScheduleDefinition,\n ): SchedulerServiceTaskRunner {\n return {\n run: async task => {\n await this.scheduleTask({ ...task, ...schedule });\n },\n };\n }\n\n async getScheduledTasks(): Promise<SchedulerServiceTaskDescriptor[]> {\n return Array.from(this.#tasks.values()).map(({ descriptor }) => descriptor);\n }\n\n async scheduleTask(\n task: SchedulerServiceTaskScheduleDefinition &\n SchedulerServiceTaskInvocationDefinition,\n ): Promise<void> {\n this.#tasks.set(task.id, {\n ...task,\n descriptor: {\n id: task.id,\n scope: task.scope ?? 'global',\n settings: { version: 1 },\n },\n abortControllers: new AbortController(),\n });\n }\n\n async triggerTask(id: string): Promise<void> {\n const task = this.#tasks.get(id);\n if (!task) {\n throw new Error(`Task ${id} not found`);\n }\n if (this.#runningTasks.has(id)) {\n return;\n }\n this.#runningTasks.add(id);\n try {\n await task.fn(task.abortControllers.signal);\n this.#deferredTaskCompletions.get(id)?.resolve();\n } catch (error) {\n this.#deferredTaskCompletions.get(id)?.reject(error);\n } finally {\n this.#deferredTaskCompletions.delete(id);\n this.#runningTasks.delete(id);\n }\n }\n\n /**\n * Trigger all tasks that match the given options, and wait for them to complete.\n *\n * @param options - The options to filter the tasks to trigger\n */\n async #triggerAllTasks(options?: {\n scope?: 'all' | 'global' | 'local';\n includeInitialDelayedTasks?: boolean;\n includeManualTasks?: boolean;\n }): Promise<void> {\n const {\n scope = 'all',\n includeManualTasks = false,\n includeInitialDelayedTasks = false,\n } = options ?? {};\n\n const selectedTaskIds = new Array<string>();\n for (const task of this.#tasks.values()) {\n if (task.initialDelay && !includeInitialDelayedTasks) {\n continue;\n }\n if (\n 'trigger' in task.frequency &&\n task.frequency.trigger === 'manual' &&\n !includeManualTasks\n ) {\n continue;\n }\n if (scope === 'all' || scope === task.scope) {\n selectedTaskIds.push(task.id);\n }\n }\n\n await Promise.all(selectedTaskIds.map(id => this.triggerTask(id)));\n }\n\n async #shutdownAllTasks() {\n for (const task of this.#tasks.values()) {\n task.abortControllers.abort();\n }\n }\n\n /**\n * Wait for the task with the given ID to complete.\n *\n * If the task has not yet been scheduled or started, this will wait for it to be scheduled, started, and completed\n *\n * @param id - The task ID to wait for\n * @returns A promise that resolves when the task is completed\n */\n async waitForTask(id: string): Promise<void> {\n const existing = this.#deferredTaskCompletions.get(id);\n if (existing) {\n return existing;\n }\n const deferred = createDeferred<void>();\n this.#deferredTaskCompletions.set(id, deferred);\n return deferred;\n }\n}\n"],"names":["createServiceFactory","coreServices","createDeferred"],"mappings":"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"}
1
+ {"version":3,"file":"MockSchedulerService.cjs.js","sources":["../../src/services/MockSchedulerService.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n SchedulerService,\n SchedulerServiceTaskDescriptor,\n SchedulerServiceTaskInvocationDefinition,\n SchedulerServiceTaskRunner,\n SchedulerServiceTaskScheduleDefinition,\n} from '@backstage/backend-plugin-api';\nimport { ConflictError, NotFoundError } from '@backstage/errors';\nimport { createDeferred, DeferredPromise } from '@backstage/types';\n\nexport class MockSchedulerService implements SchedulerService {\n readonly #tasks = new Map<\n string,\n SchedulerServiceTaskInvocationDefinition &\n SchedulerServiceTaskScheduleDefinition & {\n descriptor: SchedulerServiceTaskDescriptor;\n abortControllers: AbortController;\n }\n >();\n readonly #runningTasks = new Set<string>();\n readonly #deferredTaskCompletions = new Map<string, DeferredPromise<void>>();\n\n /**\n * Creates a service factory for this mock scheduler instance, which can be installed in a test backend\n */\n factory(options?: {\n skipTaskRunOnStartup?: boolean;\n includeManualTasksOnStartup?: boolean;\n includeInitialDelayedTasksOnStartup?: boolean;\n }) {\n return createServiceFactory({\n service: coreServices.scheduler,\n deps: { lifecycle: coreServices.lifecycle },\n factory: async ({ lifecycle }) => {\n if (!options?.skipTaskRunOnStartup) {\n lifecycle.addStartupHook(async () => {\n await this.#triggerAllTasks({\n includeManualTasks: options?.includeManualTasksOnStartup,\n includeInitialDelayedTasks:\n options?.includeInitialDelayedTasksOnStartup,\n });\n });\n }\n lifecycle.addShutdownHook(async () => {\n await this.#shutdownAllTasks();\n });\n return this;\n },\n });\n }\n\n createScheduledTaskRunner(\n schedule: SchedulerServiceTaskScheduleDefinition,\n ): SchedulerServiceTaskRunner {\n return {\n run: async task => {\n await this.scheduleTask({ ...task, ...schedule });\n },\n };\n }\n\n async getScheduledTasks(): Promise<SchedulerServiceTaskDescriptor[]> {\n return Array.from(this.#tasks.values()).map(({ descriptor }) => descriptor);\n }\n\n async scheduleTask(\n task: SchedulerServiceTaskScheduleDefinition &\n SchedulerServiceTaskInvocationDefinition,\n ): Promise<void> {\n this.#tasks.set(task.id, {\n ...task,\n descriptor: {\n id: task.id,\n scope: task.scope ?? 'global',\n settings: { version: 1 },\n },\n abortControllers: new AbortController(),\n });\n }\n\n async cancelTask(id: string): Promise<void> {\n const task = this.#tasks.get(id);\n if (!task) {\n throw new NotFoundError(`Task ${id} not found`);\n }\n if (!this.#runningTasks.has(id)) {\n throw new ConflictError(`Task ${id} is not running`);\n }\n task.abortControllers.abort();\n task.abortControllers = new AbortController();\n }\n\n async triggerTask(id: string): Promise<void> {\n const task = this.#tasks.get(id);\n if (!task) {\n throw new NotFoundError(`Task ${id} not found`);\n }\n if (this.#runningTasks.has(id)) {\n return;\n }\n this.#runningTasks.add(id);\n try {\n await task.fn(task.abortControllers.signal);\n this.#deferredTaskCompletions.get(id)?.resolve();\n } catch (error) {\n this.#deferredTaskCompletions.get(id)?.reject(error);\n } finally {\n this.#deferredTaskCompletions.delete(id);\n this.#runningTasks.delete(id);\n }\n }\n\n /**\n * Trigger all tasks that match the given options, and wait for them to complete.\n *\n * @param options - The options to filter the tasks to trigger\n */\n async #triggerAllTasks(options?: {\n scope?: 'all' | 'global' | 'local';\n includeInitialDelayedTasks?: boolean;\n includeManualTasks?: boolean;\n }): Promise<void> {\n const {\n scope = 'all',\n includeManualTasks = false,\n includeInitialDelayedTasks = false,\n } = options ?? {};\n\n const selectedTaskIds = new Array<string>();\n for (const task of this.#tasks.values()) {\n if (task.initialDelay && !includeInitialDelayedTasks) {\n continue;\n }\n if (\n 'trigger' in task.frequency &&\n task.frequency.trigger === 'manual' &&\n !includeManualTasks\n ) {\n continue;\n }\n if (scope === 'all' || scope === task.scope) {\n selectedTaskIds.push(task.id);\n }\n }\n\n await Promise.all(selectedTaskIds.map(id => this.triggerTask(id)));\n }\n\n async #shutdownAllTasks() {\n for (const task of this.#tasks.values()) {\n task.abortControllers.abort();\n }\n }\n\n /**\n * Wait for the task with the given ID to complete.\n *\n * If the task has not yet been scheduled or started, this will wait for it to be scheduled, started, and completed\n *\n * @param id - The task ID to wait for\n * @returns A promise that resolves when the task is completed\n */\n async waitForTask(id: string): Promise<void> {\n const existing = this.#deferredTaskCompletions.get(id);\n if (existing) {\n return existing;\n }\n const deferred = createDeferred<void>();\n this.#deferredTaskCompletions.set(id, deferred);\n return deferred;\n }\n}\n"],"names":["createServiceFactory","coreServices","NotFoundError","ConflictError","createDeferred"],"mappings":"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"}
@@ -314,7 +314,8 @@ exports.mockServices = void 0;
314
314
  createScheduledTaskRunner: jest.fn(),
315
315
  getScheduledTasks: jest.fn(),
316
316
  scheduleTask: jest.fn(),
317
- triggerTask: jest.fn()
317
+ triggerTask: jest.fn(),
318
+ cancelTask: jest.fn()
318
319
  }));
319
320
  })(scheduler = mockServices2.scheduler || (mockServices2.scheduler = {}));
320
321
  ((urlReader2) => {
@@ -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 { 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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"}
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 cancelTask: 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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"}
@@ -10,7 +10,7 @@ var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
10
10
  var discovery = require('@backstage/backend-defaults/discovery');
11
11
  var ActionsRegistryServiceMock = require('../alpha/services/ActionsRegistryServiceMock.cjs.js');
12
12
  require('@backstage/errors');
13
- require('zod');
13
+ require('zod/v3');
14
14
  require('zod-to-json-schema');
15
15
  var ActionsServiceMock = require('../alpha/services/ActionsServiceMock.cjs.js');
16
16
  var MetricsServiceMock = require('../alpha/services/MetricsServiceMock.cjs.js');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/backend-test-utils",
3
- "version": "1.11.1-next.1",
3
+ "version": "1.11.1",
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.1-next.0",
61
- "@backstage/backend-defaults": "0.16.0-next.1",
62
- "@backstage/backend-plugin-api": "1.7.1-next.0",
63
- "@backstage/config": "1.3.6",
64
- "@backstage/errors": "1.2.7",
65
- "@backstage/plugin-auth-node": "0.6.14-next.1",
66
- "@backstage/plugin-events-node": "0.4.20-next.0",
67
- "@backstage/plugin-permission-common": "0.9.6",
68
- "@backstage/types": "1.2.2",
60
+ "@backstage/backend-app-api": "^1.6.0",
61
+ "@backstage/backend-defaults": "^0.16.0",
62
+ "@backstage/backend-plugin-api": "^1.8.0",
63
+ "@backstage/config": "^1.3.6",
64
+ "@backstage/errors": "^1.2.7",
65
+ "@backstage/plugin-auth-node": "^0.6.14",
66
+ "@backstage/plugin-events-node": "^0.4.20",
67
+ "@backstage/plugin-permission-common": "^0.9.7",
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",
@@ -87,11 +87,11 @@
87
87
  "text-extensions": "^2.4.0",
88
88
  "uuid": "^11.0.0",
89
89
  "yn": "^4.0.0",
90
- "zod": "^3.25.76",
90
+ "zod": "^3.25.76 || ^4.0.0",
91
91
  "zod-to-json-schema": "^3.25.1"
92
92
  },
93
93
  "devDependencies": {
94
- "@backstage/cli": "0.36.0-next.1",
94
+ "@backstage/cli": "^0.36.0",
95
95
  "@types/jest": "*",
96
96
  "@types/lodash": "^4.14.151",
97
97
  "@types/supertest": "^2.0.8",