From 8a75a84fc9c3c8d86e6ce3384aac1a8744f89651 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Mon, 16 Jun 2025 16:34:38 +0200 Subject: [PATCH] chore: moving some files around and exporting things as alpha services Signed-off-by: benjdlambert --- packages/backend-test-utils/package.json | 3 +- .../backend-test-utils/report-alpha.api.md | 85 +++++++++++++++++++ packages/backend-test-utils/report.api.md | 59 ------------- .../src/{next => alpha}/index.ts | 1 - .../services/ActionsRegistryServiceMock.ts | 49 +++++++++++ .../src/alpha/services/ActionsServiceMock.ts | 34 ++++++++ .../services/MockActionsRegistry.test.ts | 28 +++--- .../services/MockActionsRegistry.ts | 14 +-- .../src/alpha/services/index.ts | 20 +++++ .../src/alpha/services/simpleMock.ts | 57 +++++++++++++ packages/backend-test-utils/src/index.ts | 3 +- .../services/MockAuthService.test.ts | 0 .../{next => }/services/MockAuthService.ts | 0 .../services/MockEventsService.test.ts | 0 .../{next => }/services/MockEventsService.ts | 0 .../services/MockHttpAuthService.test.ts | 0 .../services/MockHttpAuthService.ts | 0 .../services/MockPermissionsService.test.ts | 0 .../services/MockPermissionsService.ts | 0 .../services/MockRootLoggerService.test.ts | 0 .../services/MockRootLoggerService.ts | 0 .../services/MockUserInfoService.test.ts | 0 .../services/MockUserInfoService.ts | 0 .../src/{next => }/services/index.ts | 4 +- .../services/mockCredentials.test.ts | 0 .../{next => }/services/mockCredentials.ts | 0 .../{next => }/services/mockServices.test.ts | 0 .../src/{next => }/services/mockServices.ts | 63 +------------- .../src/services/simpleMock.ts | 57 +++++++++++++ .../src/util/errorHandler.ts | 2 +- .../wiring/ServiceFactoryTester.test.ts | 0 .../{next => }/wiring/ServiceFactoryTester.ts | 2 +- .../src/{next => }/wiring/TestBackend.test.ts | 0 .../src/{next => }/wiring/TestBackend.ts | 12 ++- .../src/{next => }/wiring/index.ts | 0 35 files changed, 344 insertions(+), 149 deletions(-) create mode 100644 packages/backend-test-utils/report-alpha.api.md rename packages/backend-test-utils/src/{next => alpha}/index.ts (96%) create mode 100644 packages/backend-test-utils/src/alpha/services/ActionsRegistryServiceMock.ts create mode 100644 packages/backend-test-utils/src/alpha/services/ActionsServiceMock.ts rename packages/backend-test-utils/src/{next => alpha}/services/MockActionsRegistry.test.ts (89%) rename packages/backend-test-utils/src/{next => alpha}/services/MockActionsRegistry.ts (97%) create mode 100644 packages/backend-test-utils/src/alpha/services/index.ts create mode 100644 packages/backend-test-utils/src/alpha/services/simpleMock.ts rename packages/backend-test-utils/src/{next => }/services/MockAuthService.test.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockAuthService.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockEventsService.test.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockEventsService.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockHttpAuthService.test.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockHttpAuthService.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockPermissionsService.test.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockPermissionsService.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockRootLoggerService.test.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockRootLoggerService.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockUserInfoService.test.ts (100%) rename packages/backend-test-utils/src/{next => }/services/MockUserInfoService.ts (100%) rename packages/backend-test-utils/src/{next => }/services/index.ts (83%) rename packages/backend-test-utils/src/{next => }/services/mockCredentials.test.ts (100%) rename packages/backend-test-utils/src/{next => }/services/mockCredentials.ts (100%) rename packages/backend-test-utils/src/{next => }/services/mockServices.test.ts (100%) rename packages/backend-test-utils/src/{next => }/services/mockServices.ts (90%) create mode 100644 packages/backend-test-utils/src/services/simpleMock.ts rename packages/backend-test-utils/src/{next => }/wiring/ServiceFactoryTester.test.ts (100%) rename packages/backend-test-utils/src/{next => }/wiring/ServiceFactoryTester.ts (97%) rename packages/backend-test-utils/src/{next => }/wiring/TestBackend.test.ts (100%) rename packages/backend-test-utils/src/{next => }/wiring/TestBackend.ts (97%) rename packages/backend-test-utils/src/{next => }/wiring/index.ts (100%) diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index cc47249a2d..934d2439a9 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -21,7 +21,8 @@ "license": "Apache-2.0", "exports": { ".": "./src/index.ts", - "./package.json": "./package.json" + "./package.json": "./package.json", + "./alpha": "./src/alpha/index.ts" }, "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/backend-test-utils/report-alpha.api.md b/packages/backend-test-utils/report-alpha.api.md new file mode 100644 index 0000000000..ccbf96c0c7 --- /dev/null +++ b/packages/backend-test-utils/report-alpha.api.md @@ -0,0 +1,85 @@ +## API Report File for "@backstage/backend-test-utils" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ActionsRegistryActionOptions } from '@backstage/backend-plugin-api/alpha'; +import { ActionsRegistryService } from '@backstage/backend-plugin-api/alpha'; +import { ActionsService } from '@backstage/backend-plugin-api/alpha'; +import { ActionsServiceAction } from '@backstage/backend-plugin-api/alpha'; +import { AnyZodObject } from 'zod'; +import { BackstageCredentials } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { JsonValue } from '@backstage/types'; +import { LoggerService } from '@backstage/backend-plugin-api'; +import { ServiceFactory } from '@backstage/backend-plugin-api'; + +// @alpha (undocumented) +export function actionsRegistryServiceMock(options?: { + logger: LoggerService; +}): MockActionsRegistry; + +// @alpha (undocumented) +export namespace actionsRegistryServiceMock { + const // (undocumented) + factory: () => ServiceFactory< + ActionsRegistryService, + 'plugin', + 'singleton' + >; + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ServiceMock; +} + +// @alpha (undocumented) +export namespace actionsServiceMock { + const // (undocumented) + factory: () => ServiceFactory; + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ServiceMock; +} + +// @alpha +export class MockActionsRegistry + implements ActionsRegistryService, ActionsService +{ + // (undocumented) + readonly actions: Map>; + // (undocumented) + static create(opts: { logger: LoggerService }): MockActionsRegistry; + // (undocumented) + invoke(opts: { + id: string; + input?: JsonObject; + credentials?: BackstageCredentials; + }): Promise<{ + output: JsonValue; + }>; + // (undocumented) + list(): Promise<{ + actions: ActionsServiceAction[]; + }>; + // (undocumented) + register< + TInputSchema extends AnyZodObject, + TOutputSchema extends AnyZodObject, + >(options: ActionsRegistryActionOptions): void; +} + +// @alpha (undocumented) +export type ServiceMock = { + factory: ServiceFactory; +} & { + [Key in keyof TService]: TService[Key] extends ( + ...args: infer Args + ) => infer Return + ? TService[Key] & jest.MockInstance + : TService[Key]; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/packages/backend-test-utils/report.api.md b/packages/backend-test-utils/report.api.md index a9377e70fe..4853ca57c5 100644 --- a/packages/backend-test-utils/report.api.md +++ b/packages/backend-test-utils/report.api.md @@ -3,11 +3,6 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ActionsRegistryActionOptions } from '@backstage/backend-plugin-api'; -import { ActionsRegistryService } from '@backstage/backend-plugin-api'; -import { ActionsService } from '@backstage/backend-plugin-api'; -import { ActionsServiceAction } from '@backstage/backend-plugin-api'; -import { AnyZodObject } from 'zod'; import { AuditorService } from '@backstage/backend-plugin-api'; import { AuthorizeResult } from '@backstage/plugin-permission-common'; import { AuthService } from '@backstage/backend-plugin-api'; @@ -29,7 +24,6 @@ import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { HttpAuthService } from '@backstage/backend-plugin-api'; import { HttpRouterService } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; -import { JsonValue } from '@backstage/types'; import Keyv from 'keyv'; import { Knex } from 'knex'; import { LifecycleService } from '@backstage/backend-plugin-api'; @@ -60,33 +54,6 @@ export interface CreateMockDirectoryOptions { mockOsTmpDir?: boolean; } -// @public -export class MockActionsRegistry - implements ActionsRegistryService, ActionsService -{ - // (undocumented) - readonly actions: Map>; - // (undocumented) - static create(opts: { logger: LoggerService }): MockActionsRegistry; - // (undocumented) - invoke(opts: { - id: string; - input?: JsonObject; - credentials?: BackstageCredentials; - }): Promise<{ - output: JsonValue; - }>; - // (undocumented) - list(): Promise<{ - actions: ActionsServiceAction[]; - }>; - // (undocumented) - register< - TInputSchema extends AnyZodObject, - TOutputSchema extends AnyZodObject, - >(options: ActionsRegistryActionOptions): void; -} - // @public (undocumented) export namespace mockCredentials { export function limitedUser( @@ -195,32 +162,6 @@ export function mockErrorHandler(): ErrorRequestHandler< // @public export namespace mockServices { - // (undocumented) - export namespace actions { - const // (undocumented) - factory: () => ServiceFactory; - const // (undocumented) - mock: ( - partialImpl?: Partial | undefined, - ) => ServiceMock; - } - // (undocumented) - export function actionsRegistry(options?: { - logger: LoggerService; - }): MockActionsRegistry; - // (undocumented) - export namespace actionsRegistry { - const // (undocumented) - factory: () => ServiceFactory< - ActionsRegistryService, - 'plugin', - 'singleton' - >; - const // (undocumented) - mock: ( - partialImpl?: Partial | undefined, - ) => ServiceMock; - } // (undocumented) export namespace auditor { const // (undocumented) diff --git a/packages/backend-test-utils/src/next/index.ts b/packages/backend-test-utils/src/alpha/index.ts similarity index 96% rename from packages/backend-test-utils/src/next/index.ts rename to packages/backend-test-utils/src/alpha/index.ts index 572fb3a9e7..d891744260 100644 --- a/packages/backend-test-utils/src/next/index.ts +++ b/packages/backend-test-utils/src/alpha/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export * from './wiring'; export * from './services'; diff --git a/packages/backend-test-utils/src/alpha/services/ActionsRegistryServiceMock.ts b/packages/backend-test-utils/src/alpha/services/ActionsRegistryServiceMock.ts new file mode 100644 index 0000000000..faf89b393a --- /dev/null +++ b/packages/backend-test-utils/src/alpha/services/ActionsRegistryServiceMock.ts @@ -0,0 +1,49 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { mockServices } from '../../services'; +import { LoggerService } from '@backstage/backend-plugin-api'; +import { MockActionsRegistry } from './MockActionsRegistry'; +import { simpleMock } from './simpleMock'; +import { + ActionsRegistryService, + actionsRegistryServiceRef, +} from '@backstage/backend-plugin-api/alpha'; +import { actionsRegistryServiceFactory } from '@backstage/backend-defaults/alpha'; + +/** + * @alpha + */ +export function actionsRegistryServiceMock(options?: { + logger: LoggerService; +}): MockActionsRegistry { + return MockActionsRegistry.create({ + logger: options?.logger ?? mockServices.logger.mock(), + }); +} + +/** + * @alpha + */ +export namespace actionsRegistryServiceMock { + export const factory = () => actionsRegistryServiceFactory; + + export const mock = simpleMock( + actionsRegistryServiceRef, + () => ({ + register: jest.fn(), + }), + ); +} diff --git a/packages/backend-test-utils/src/alpha/services/ActionsServiceMock.ts b/packages/backend-test-utils/src/alpha/services/ActionsServiceMock.ts new file mode 100644 index 0000000000..63abff4c37 --- /dev/null +++ b/packages/backend-test-utils/src/alpha/services/ActionsServiceMock.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { simpleMock } from './simpleMock'; +import { + ActionsService, + actionsServiceRef, +} from '@backstage/backend-plugin-api/alpha'; +import { actionsServiceFactory } from '@backstage/backend-defaults/alpha'; + +/** + * @alpha + */ +export namespace actionsServiceMock { + export const factory = () => actionsServiceFactory; + + export const mock = simpleMock(actionsServiceRef, () => ({ + invoke: jest.fn(), + list: jest.fn(), + })); +} diff --git a/packages/backend-test-utils/src/next/services/MockActionsRegistry.test.ts b/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.test.ts similarity index 89% rename from packages/backend-test-utils/src/next/services/MockActionsRegistry.test.ts rename to packages/backend-test-utils/src/alpha/services/MockActionsRegistry.test.ts index e4556cb89e..f604689c63 100644 --- a/packages/backend-test-utils/src/next/services/MockActionsRegistry.test.ts +++ b/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.test.ts @@ -17,15 +17,19 @@ import { coreServices, createBackendPlugin, } from '@backstage/backend-plugin-api'; -import { startTestBackend } from '../wiring'; -import { mockServices } from './mockServices'; -import { mockCredentials } from './mockCredentials'; +import { startTestBackend } from '../../wiring'; +import { actionsRegistryServiceMock } from './ActionsRegistryServiceMock'; +import { mockCredentials } from '../../services'; import { Router } from 'express'; import supertest from 'supertest'; +import { + actionsRegistryServiceRef, + actionsServiceRef, +} from '@backstage/backend-plugin-api/alpha'; describe('MockActionsRegistry', () => { it('should be able to register and invoke actions', async () => { - const registry = mockServices.actionsRegistry(); + const registry = actionsRegistryServiceMock(); registry.register({ name: 'my-demo-action', @@ -53,7 +57,7 @@ describe('MockActionsRegistry', () => { }); it('should throw an error when the input is invalid to the action', async () => { - const registry = mockServices.actionsRegistry(); + const registry = actionsRegistryServiceMock(); registry.register({ name: 'my-demo-action', @@ -72,7 +76,7 @@ describe('MockActionsRegistry', () => { }); it('should throw an error when the action is not found', async () => { - const registry = mockServices.actionsRegistry(); + const registry = actionsRegistryServiceMock(); await expect(registry.invoke({ id: 'test' })).rejects.toThrow( 'Action "test" not found, available actions: none', @@ -80,7 +84,7 @@ describe('MockActionsRegistry', () => { }); it('should throw an error when the action is not found with recommended actions', async () => { - const registry = mockServices.actionsRegistry(); + const registry = actionsRegistryServiceMock(); registry.register({ name: 'my-demo-action', @@ -99,7 +103,7 @@ describe('MockActionsRegistry', () => { }); it('should throw an error when the output is invalid', async () => { - const registry = mockServices.actionsRegistry(); + const registry = actionsRegistryServiceMock(); registry.register({ name: 'my-demo-action', @@ -119,7 +123,7 @@ describe('MockActionsRegistry', () => { }); it('should list the actions correctly', async () => { - const registry = mockServices.actionsRegistry(); + const registry = actionsRegistryServiceMock(); registry.register({ name: 'my-demo-action', @@ -165,13 +169,13 @@ describe('MockActionsRegistry', () => { }); }); - describe('mockServices.actions + mockService.actionsRegistry', () => { + describe('actionsRegistryServiceMock + mockService.actionsRegistry', () => { it('should be able to register and invoke actions', async () => { const pluginWithAction = createBackendPlugin({ pluginId: 'my-plugin', register(reg) { reg.registerInit({ - deps: { actionsRegistry: coreServices.actionsRegistry }, + deps: { actionsRegistry: actionsRegistryServiceRef }, async init({ actionsRegistry }) { actionsRegistry.register({ name: 'test', @@ -196,7 +200,7 @@ describe('MockActionsRegistry', () => { register(reg) { reg.registerInit({ deps: { - actions: coreServices.actions, + actions: actionsServiceRef, router: coreServices.httpRouter, }, async init({ actions, router }) { diff --git a/packages/backend-test-utils/src/next/services/MockActionsRegistry.ts b/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts similarity index 97% rename from packages/backend-test-utils/src/next/services/MockActionsRegistry.ts rename to packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts index 62d940515b..49c80b7a3d 100644 --- a/packages/backend-test-utils/src/next/services/MockActionsRegistry.ts +++ b/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts @@ -14,10 +14,6 @@ * limitations under the License. */ import { - ActionsRegistryActionOptions, - ActionsRegistryService, - ActionsService, - ActionsServiceAction, BackstageCredentials, LoggerService, } from '@backstage/backend-plugin-api'; @@ -25,7 +21,13 @@ import { ForwardedError, InputError, NotFoundError } from '@backstage/errors'; import { JsonObject, JsonValue } from '@backstage/types'; import { z, AnyZodObject } from 'zod'; import zodToJsonSchema from 'zod-to-json-schema'; -import { mockCredentials } from './mockCredentials'; +import { mockCredentials } from '../../services'; +import { + ActionsRegistryActionOptions, + ActionsRegistryService, + ActionsService, + ActionsServiceAction, +} from '@backstage/backend-plugin-api/alpha'; /** * A mock implementation of the ActionsRegistryService and ActionsService that can be used in tests. @@ -58,7 +60,7 @@ import { mockCredentials } from './mockCredentials'; * expect(result).toEqual({ output: { name: 'test' } }); * ``` * - * @public + * @alpha */ export class MockActionsRegistry implements ActionsRegistryService, ActionsService diff --git a/packages/backend-test-utils/src/alpha/services/index.ts b/packages/backend-test-utils/src/alpha/services/index.ts new file mode 100644 index 0000000000..ca9b3f23a0 --- /dev/null +++ b/packages/backend-test-utils/src/alpha/services/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { actionsRegistryServiceMock } from './ActionsRegistryServiceMock'; +export { MockActionsRegistry } from './MockActionsRegistry'; +export { actionsServiceMock } from './ActionsServiceMock'; +export { type ServiceMock } from './simpleMock'; diff --git a/packages/backend-test-utils/src/alpha/services/simpleMock.ts b/packages/backend-test-utils/src/alpha/services/simpleMock.ts new file mode 100644 index 0000000000..d07b143f7a --- /dev/null +++ b/packages/backend-test-utils/src/alpha/services/simpleMock.ts @@ -0,0 +1,57 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + createServiceFactory, + ServiceFactory, + ServiceRef, +} from '@backstage/backend-plugin-api'; + +/** @alpha */ +export type ServiceMock = { + factory: ServiceFactory; +} & { + [Key in keyof TService]: TService[Key] extends ( + ...args: infer Args + ) => infer Return + ? TService[Key] & jest.MockInstance + : TService[Key]; +}; + +/** @internal */ +export function simpleMock( + ref: ServiceRef, + mockFactory: () => jest.Mocked, +): (partialImpl?: Partial) => ServiceMock { + return partialImpl => { + const mock = mockFactory(); + if (partialImpl) { + for (const [key, impl] of Object.entries(partialImpl)) { + if (typeof impl === 'function') { + (mock as any)[key].mockImplementation(impl); + } else { + (mock as any)[key] = impl; + } + } + } + return Object.assign(mock, { + factory: createServiceFactory({ + service: ref, + deps: {}, + factory: () => mock, + }), + }) as ServiceMock; + }; +} diff --git a/packages/backend-test-utils/src/index.ts b/packages/backend-test-utils/src/index.ts index d8e0e2c4a6..7cc4546415 100644 --- a/packages/backend-test-utils/src/index.ts +++ b/packages/backend-test-utils/src/index.ts @@ -24,5 +24,6 @@ export * from './cache'; export * from './database'; export * from './msw'; export * from './filesystem'; -export * from './next'; +export * from './services'; +export * from './wiring'; export { mockErrorHandler } from './util'; diff --git a/packages/backend-test-utils/src/next/services/MockAuthService.test.ts b/packages/backend-test-utils/src/services/MockAuthService.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockAuthService.test.ts rename to packages/backend-test-utils/src/services/MockAuthService.test.ts diff --git a/packages/backend-test-utils/src/next/services/MockAuthService.ts b/packages/backend-test-utils/src/services/MockAuthService.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockAuthService.ts rename to packages/backend-test-utils/src/services/MockAuthService.ts diff --git a/packages/backend-test-utils/src/next/services/MockEventsService.test.ts b/packages/backend-test-utils/src/services/MockEventsService.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockEventsService.test.ts rename to packages/backend-test-utils/src/services/MockEventsService.test.ts diff --git a/packages/backend-test-utils/src/next/services/MockEventsService.ts b/packages/backend-test-utils/src/services/MockEventsService.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockEventsService.ts rename to packages/backend-test-utils/src/services/MockEventsService.ts diff --git a/packages/backend-test-utils/src/next/services/MockHttpAuthService.test.ts b/packages/backend-test-utils/src/services/MockHttpAuthService.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockHttpAuthService.test.ts rename to packages/backend-test-utils/src/services/MockHttpAuthService.test.ts diff --git a/packages/backend-test-utils/src/next/services/MockHttpAuthService.ts b/packages/backend-test-utils/src/services/MockHttpAuthService.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockHttpAuthService.ts rename to packages/backend-test-utils/src/services/MockHttpAuthService.ts diff --git a/packages/backend-test-utils/src/next/services/MockPermissionsService.test.ts b/packages/backend-test-utils/src/services/MockPermissionsService.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockPermissionsService.test.ts rename to packages/backend-test-utils/src/services/MockPermissionsService.test.ts diff --git a/packages/backend-test-utils/src/next/services/MockPermissionsService.ts b/packages/backend-test-utils/src/services/MockPermissionsService.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockPermissionsService.ts rename to packages/backend-test-utils/src/services/MockPermissionsService.ts diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts b/packages/backend-test-utils/src/services/MockRootLoggerService.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts rename to packages/backend-test-utils/src/services/MockRootLoggerService.test.ts diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts b/packages/backend-test-utils/src/services/MockRootLoggerService.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockRootLoggerService.ts rename to packages/backend-test-utils/src/services/MockRootLoggerService.ts diff --git a/packages/backend-test-utils/src/next/services/MockUserInfoService.test.ts b/packages/backend-test-utils/src/services/MockUserInfoService.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockUserInfoService.test.ts rename to packages/backend-test-utils/src/services/MockUserInfoService.test.ts diff --git a/packages/backend-test-utils/src/next/services/MockUserInfoService.ts b/packages/backend-test-utils/src/services/MockUserInfoService.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/MockUserInfoService.ts rename to packages/backend-test-utils/src/services/MockUserInfoService.ts diff --git a/packages/backend-test-utils/src/next/services/index.ts b/packages/backend-test-utils/src/services/index.ts similarity index 83% rename from packages/backend-test-utils/src/next/services/index.ts rename to packages/backend-test-utils/src/services/index.ts index 347c50aaee..73f179ca41 100644 --- a/packages/backend-test-utils/src/next/services/index.ts +++ b/packages/backend-test-utils/src/services/index.ts @@ -13,6 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { mockServices, type ServiceMock } from './mockServices'; +export { mockServices } from './mockServices'; export { mockCredentials } from './mockCredentials'; -export { type MockActionsRegistry } from './MockActionsRegistry'; +export { type ServiceMock } from './simpleMock'; diff --git a/packages/backend-test-utils/src/next/services/mockCredentials.test.ts b/packages/backend-test-utils/src/services/mockCredentials.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/mockCredentials.test.ts rename to packages/backend-test-utils/src/services/mockCredentials.test.ts diff --git a/packages/backend-test-utils/src/next/services/mockCredentials.ts b/packages/backend-test-utils/src/services/mockCredentials.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/mockCredentials.ts rename to packages/backend-test-utils/src/services/mockCredentials.ts diff --git a/packages/backend-test-utils/src/next/services/mockServices.test.ts b/packages/backend-test-utils/src/services/mockServices.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/services/mockServices.test.ts rename to packages/backend-test-utils/src/services/mockServices.test.ts diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts similarity index 90% rename from packages/backend-test-utils/src/next/services/mockServices.ts rename to packages/backend-test-utils/src/services/mockServices.ts index a44bf912e7..06bf8f9a29 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -55,10 +55,8 @@ import { MockRootLoggerService } from './MockRootLoggerService'; import { MockUserInfoService } from './MockUserInfoService'; import { mockCredentials } from './mockCredentials'; import { MockEventsService } from './MockEventsService'; -import { actionsServiceFactory } from '@backstage/backend-defaults/actions'; -import { actionsRegistryServiceFactory } from '@backstage/backend-defaults/actionsRegistry'; import { MockPermissionsService } from './MockPermissionsService'; -import { MockActionsRegistry } from './MockActionsRegistry'; +import { simpleMock } from './simpleMock'; /** @internal */ function createLoggerMock() { @@ -95,43 +93,6 @@ function simpleFactoryWithOptions< ((...options: TOptions) => ServiceFactory); } -/** @public */ -export type ServiceMock = { - factory: ServiceFactory; -} & { - [Key in keyof TService]: TService[Key] extends ( - ...args: infer Args - ) => infer Return - ? TService[Key] & jest.MockInstance - : TService[Key]; -}; - -/** @internal */ -function simpleMock( - ref: ServiceRef, - mockFactory: () => jest.Mocked, -): (partialImpl?: Partial) => ServiceMock { - return partialImpl => { - const mock = mockFactory(); - if (partialImpl) { - for (const [key, impl] of Object.entries(partialImpl)) { - if (typeof impl === 'function') { - (mock as any)[key].mockImplementation(impl); - } else { - (mock as any)[key] = impl; - } - } - } - return Object.assign(mock, { - factory: createServiceFactory({ - service: ref, - deps: {}, - factory: () => mock, - }), - }) as ServiceMock; - }; -} - /** * Mock implementations of the core services, to be used in tests. * @@ -553,28 +514,6 @@ export namespace mockServices { search: jest.fn(), })); } - export namespace actions { - export const factory = () => actionsServiceFactory; - export const mock = simpleMock(coreServices.actions, () => ({ - list: jest.fn(), - invoke: jest.fn(), - })); - } - - export function actionsRegistry(options?: { - logger: LoggerService; - }): MockActionsRegistry { - return MockActionsRegistry.create({ - logger: options?.logger ?? mockServices.logger.mock(), - }); - } - - export namespace actionsRegistry { - export const factory = () => actionsRegistryServiceFactory; - export const mock = simpleMock(coreServices.actionsRegistry, () => ({ - register: jest.fn(), - })); - } /** * Creates a functional mock implementation of the diff --git a/packages/backend-test-utils/src/services/simpleMock.ts b/packages/backend-test-utils/src/services/simpleMock.ts new file mode 100644 index 0000000000..484969f235 --- /dev/null +++ b/packages/backend-test-utils/src/services/simpleMock.ts @@ -0,0 +1,57 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + createServiceFactory, + ServiceFactory, + ServiceRef, +} from '@backstage/backend-plugin-api'; + +/** @public */ +export type ServiceMock = { + factory: ServiceFactory; +} & { + [Key in keyof TService]: TService[Key] extends ( + ...args: infer Args + ) => infer Return + ? TService[Key] & jest.MockInstance + : TService[Key]; +}; + +/** @internal */ +export function simpleMock( + ref: ServiceRef, + mockFactory: () => jest.Mocked, +): (partialImpl?: Partial) => ServiceMock { + return partialImpl => { + const mock = mockFactory(); + if (partialImpl) { + for (const [key, impl] of Object.entries(partialImpl)) { + if (typeof impl === 'function') { + (mock as any)[key].mockImplementation(impl); + } else { + (mock as any)[key] = impl; + } + } + } + return Object.assign(mock, { + factory: createServiceFactory({ + service: ref, + deps: {}, + factory: () => mock, + }), + }) as ServiceMock; + }; +} diff --git a/packages/backend-test-utils/src/util/errorHandler.ts b/packages/backend-test-utils/src/util/errorHandler.ts index f534823f50..79f4d8fd04 100644 --- a/packages/backend-test-utils/src/util/errorHandler.ts +++ b/packages/backend-test-utils/src/util/errorHandler.ts @@ -15,7 +15,7 @@ */ import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; -import { mockServices } from '../next'; +import { mockServices } from '../services'; /** * A mock for error handler middleware that can be used in router tests. diff --git a/packages/backend-test-utils/src/next/wiring/ServiceFactoryTester.test.ts b/packages/backend-test-utils/src/wiring/ServiceFactoryTester.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/wiring/ServiceFactoryTester.test.ts rename to packages/backend-test-utils/src/wiring/ServiceFactoryTester.test.ts diff --git a/packages/backend-test-utils/src/next/wiring/ServiceFactoryTester.ts b/packages/backend-test-utils/src/wiring/ServiceFactoryTester.ts similarity index 97% rename from packages/backend-test-utils/src/next/wiring/ServiceFactoryTester.ts rename to packages/backend-test-utils/src/wiring/ServiceFactoryTester.ts index 83a6a42307..2b49abc88f 100644 --- a/packages/backend-test-utils/src/next/wiring/ServiceFactoryTester.ts +++ b/packages/backend-test-utils/src/wiring/ServiceFactoryTester.ts @@ -20,7 +20,7 @@ import { defaultServiceFactories } from './TestBackend'; // This is a relative import in order to make sure that the implementation is duplicated // rather than leading to an import from @backstage/backend-app-api. // eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { ServiceRegistry } from '../../../../backend-app-api/src/wiring/ServiceRegistry'; +import { ServiceRegistry } from '../../../backend-app-api/src/wiring/ServiceRegistry'; /** * Options for {@link ServiceFactoryTester}. diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts b/packages/backend-test-utils/src/wiring/TestBackend.test.ts similarity index 100% rename from packages/backend-test-utils/src/next/wiring/TestBackend.test.ts rename to packages/backend-test-utils/src/wiring/TestBackend.test.ts diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/wiring/TestBackend.ts similarity index 97% rename from packages/backend-test-utils/src/next/wiring/TestBackend.ts rename to packages/backend-test-utils/src/wiring/TestBackend.ts index 84042aedd8..cdfa1fc695 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/wiring/TestBackend.ts @@ -31,7 +31,7 @@ import express from 'express'; import { InternalBackendFeature, InternalBackendRegistrations, -} from '../../../../backend-plugin-api/src/wiring/types'; +} from '../../../backend-plugin-api/src/wiring/types'; import { DefaultRootHttpRouter, ExtendedHttpServer, @@ -40,6 +40,10 @@ import { createHttpServer, } from '@backstage/backend-defaults/rootHttpRouter'; import { HostDiscovery } from '@backstage/backend-defaults/discovery'; +import { + actionsRegistryServiceMock, + actionsServiceMock, +} from '../alpha/services'; /** @public */ export interface TestBackendOptions { @@ -84,8 +88,10 @@ export const defaultServiceFactories = [ mockServices.userInfo.factory(), mockServices.urlReader.factory(), mockServices.events.factory(), - mockServices.actionsRegistry.factory(), - mockServices.actions.factory(), + + // Alpha services + actionsRegistryServiceMock.factory(), + actionsServiceMock.factory(), ]; /** diff --git a/packages/backend-test-utils/src/next/wiring/index.ts b/packages/backend-test-utils/src/wiring/index.ts similarity index 100% rename from packages/backend-test-utils/src/next/wiring/index.ts rename to packages/backend-test-utils/src/wiring/index.ts