From ce38f17255f9fb8b9f9ed04c938638b94df0857c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 16 Jan 2023 15:23:07 +0100 Subject: [PATCH 1/7] backend-test-utils: refactor to export mockServices and mockFactories Signed-off-by: Patrik Oldsberg --- packages/backend-test-utils/api-report.md | 27 ++++++++++---- .../src/next/implementations/index.ts | 3 +- .../src/next/implementations/mockFactories.ts | 36 +++++++++++++++++++ .../{mockConfigService.ts => mockServices.ts} | 28 +++++++-------- .../src/next/wiring/TestBackend.ts | 4 +-- 5 files changed, 73 insertions(+), 25 deletions(-) create mode 100644 packages/backend-test-utils/src/next/implementations/mockFactories.ts rename packages/backend-test-utils/src/next/implementations/{mockConfigService.ts => mockServices.ts} (63%) diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 8ff29f8545..ffcc0f3d35 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -5,6 +5,7 @@ ```ts import { Backend } from '@backstage/backend-app-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; +import { ConfigReader } from '@backstage/config'; import { ConfigService } from '@backstage/backend-plugin-api'; import { ExtendedHttpServer } from '@backstage/backend-app-api'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; @@ -17,13 +18,25 @@ import { ServiceRef } from '@backstage/backend-plugin-api'; export function isDockerDisabledForTests(): boolean; // @alpha (undocumented) -export const mockConfigFactory: ( - options?: - | { - data?: JsonObject | undefined; - } - | undefined, -) => ServiceFactory; +export namespace mockFactories { + const // (undocumented) + config: ( + options?: mockServices.config.Options | undefined, + ) => ServiceFactory; +} + +// @alpha (undocumented) +export namespace mockServices { + // (undocumented) + export namespace config { + // (undocumented) + export type Options = { + data?: JsonObject; + }; + } + // (undocumented) + export function config(options?: config.Options): ConfigReader; +} // @public export function setupRequestMockHandlers(worker: { diff --git a/packages/backend-test-utils/src/next/implementations/index.ts b/packages/backend-test-utils/src/next/implementations/index.ts index 55f417f8df..f962b392d8 100644 --- a/packages/backend-test-utils/src/next/implementations/index.ts +++ b/packages/backend-test-utils/src/next/implementations/index.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { mockConfigFactory } from './mockConfigService'; +export { mockFactories } from './mockFactories'; +export { mockServices } from './mockServices'; diff --git a/packages/backend-test-utils/src/next/implementations/mockFactories.ts b/packages/backend-test-utils/src/next/implementations/mockFactories.ts new file mode 100644 index 0000000000..7d55588402 --- /dev/null +++ b/packages/backend-test-utils/src/next/implementations/mockFactories.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2023 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 { + coreServices, + createServiceFactory, +} from '@backstage/backend-plugin-api'; +import { mockServices } from './mockServices'; + +/** + * @alpha + */ +export namespace mockFactories { + export const config = createServiceFactory( + (options?: mockServices.config.Options) => ({ + service: coreServices.config, + deps: {}, + async factory() { + return mockServices.config(options); + }, + }), + ); +} diff --git a/packages/backend-test-utils/src/next/implementations/mockConfigService.ts b/packages/backend-test-utils/src/next/implementations/mockServices.ts similarity index 63% rename from packages/backend-test-utils/src/next/implementations/mockConfigService.ts rename to packages/backend-test-utils/src/next/implementations/mockServices.ts index 1d04faad91..0ede7625c3 100644 --- a/packages/backend-test-utils/src/next/implementations/mockConfigService.ts +++ b/packages/backend-test-utils/src/next/implementations/mockServices.ts @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Backstage Authors + * Copyright 2023 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. @@ -14,20 +14,18 @@ * limitations under the License. */ -import { - coreServices, - createServiceFactory, -} from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { JsonObject } from '@backstage/types'; -/** @alpha */ -export const mockConfigFactory = createServiceFactory( - (options?: { data?: JsonObject }) => ({ - service: coreServices.config, - deps: {}, - async factory() { - return new ConfigReader(options?.data, 'mock-config'); - }, - }), -); +/** + * @alpha + */ +export namespace mockServices { + export namespace config { + export type Options = { data?: JsonObject }; + } + + export function config(options?: config.Options) { + return new ConfigReader(options?.data, 'mock-config'); + } +} diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 78c2f78e5e..699dfa6396 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -41,7 +41,7 @@ import { coreServices, } from '@backstage/backend-plugin-api'; -import { mockConfigFactory } from '../implementations/mockConfigService'; +import { mockFactories } from '../implementations'; import { mockRootLoggerService } from '../implementations/mockRootLoggerService'; import { mockTokenManagerFactory } from '../implementations/mockTokenManagerService'; import { ConfigReader } from '@backstage/config'; @@ -89,7 +89,7 @@ const defaultServiceFactories = [ httpRouterFactory(), lifecycleFactory(), loggerFactory(), - mockConfigFactory(), + mockFactories.config(), mockRootLoggerService(), mockIdentityFactory(), mockTokenManagerFactory(), From 034116c3105ee6cfe7e9f9cd6cd8305e29c3faef Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 16 Jan 2023 15:34:55 +0100 Subject: [PATCH 2/7] backend-test-utils: move the rest of the mock services to new structure Signed-off-by: Patrik Oldsberg --- packages/backend-test-utils/api-report.md | 61 +++++++++++++++++++ .../src/next/implementations/mockFactories.ts | 48 +++++++++++++++ .../implementations/mockIdentityService.ts | 16 +---- .../implementations/mockRootLoggerService.ts | 27 +++----- .../src/next/implementations/mockServices.ts | 40 +++++++++++- .../mockTokenManagerService.ts | 40 ------------ .../src/next/wiring/TestBackend.ts | 35 ++++------- 7 files changed, 168 insertions(+), 99 deletions(-) delete mode 100644 packages/backend-test-utils/src/next/implementations/mockTokenManagerService.ts diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index ffcc0f3d35..6221a32d5b 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -5,14 +5,27 @@ ```ts import { Backend } from '@backstage/backend-app-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; +import { CacheService } from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { ConfigService } from '@backstage/backend-plugin-api'; +import { DatabaseService } from '@backstage/backend-plugin-api'; import { ExtendedHttpServer } from '@backstage/backend-app-api'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { HttpRouterFactoryOptions } from '@backstage/backend-app-api'; +import { HttpRouterService } from '@backstage/backend-plugin-api'; +import { IdentityService } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { Knex } from 'knex'; +import { LifecycleService } from '@backstage/backend-plugin-api'; +import { LoggerService } from '@backstage/backend-plugin-api'; +import { PermissionsService } from '@backstage/backend-plugin-api'; +import { RootLifecycleService } from '@backstage/backend-plugin-api'; +import { RootLoggerService } from '@backstage/backend-plugin-api'; +import { SchedulerService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; +import { TokenManagerService } from '@backstage/backend-plugin-api'; +import { UrlReaderService } from '@backstage/backend-plugin-api'; // @public (undocumented) export function isDockerDisabledForTests(): boolean; @@ -23,6 +36,34 @@ export namespace mockFactories { config: ( options?: mockServices.config.Options | undefined, ) => ServiceFactory; + const // (undocumented) + rootLogger: ( + options?: mockServices.rootLogger.Options | undefined, + ) => ServiceFactory; + const // (undocumented) + tokenManager: () => ServiceFactory; + const // (undocumented) + identity: () => ServiceFactory; + const // (undocumented) + cache: () => ServiceFactory; + const // (undocumented) + database: () => ServiceFactory; + const // (undocumented) + httpRouter: ( + options?: HttpRouterFactoryOptions | undefined, + ) => ServiceFactory; + const // (undocumented) + lifecycle: () => ServiceFactory; + const // (undocumented) + logger: () => ServiceFactory; + const // (undocumented) + permissions: () => ServiceFactory; + const // (undocumented) + rootLifecycle: () => ServiceFactory; + const // (undocumented) + scheduler: () => ServiceFactory; + const // (undocumented) + urlReader: () => ServiceFactory; } // @alpha (undocumented) @@ -36,6 +77,26 @@ export namespace mockServices { } // (undocumented) export function config(options?: config.Options): ConfigReader; + // (undocumented) + export function identity(): IdentityService; + // (undocumented) + export namespace rootLogger { + // (undocumented) + export type Options = { + levels: + | boolean + | { + error: boolean; + warn: boolean; + info: boolean; + debug: boolean; + }; + }; + } + // (undocumented) + export function rootLogger(options?: rootLogger.Options): LoggerService; + // (undocumented) + export function tokenManager(): TokenManagerService; } // @public diff --git a/packages/backend-test-utils/src/next/implementations/mockFactories.ts b/packages/backend-test-utils/src/next/implementations/mockFactories.ts index 7d55588402..d3bfe28c61 100644 --- a/packages/backend-test-utils/src/next/implementations/mockFactories.ts +++ b/packages/backend-test-utils/src/next/implementations/mockFactories.ts @@ -14,6 +14,17 @@ * limitations under the License. */ +import { + cacheFactory, + databaseFactory, + httpRouterFactory, + lifecycleFactory, + loggerFactory, + permissionsFactory, + rootLifecycleFactory, + schedulerFactory, + urlReaderFactory, +} from '@backstage/backend-app-api'; import { coreServices, createServiceFactory, @@ -33,4 +44,41 @@ export namespace mockFactories { }, }), ); + + export const rootLogger = createServiceFactory( + (options?: mockServices.rootLogger.Options) => ({ + service: coreServices.rootLogger, + deps: {}, + async factory() { + return mockServices.rootLogger(options); + }, + }), + ); + + export const tokenManager = createServiceFactory({ + service: coreServices.tokenManager, + deps: {}, + async factory() { + return mockServices.tokenManager(); + }, + }); + + export const identity = createServiceFactory({ + service: coreServices.identity, + deps: {}, + async factory() { + return mockServices.identity(); + }, + }); + + // For all other services, we just use the default implementations + export const cache = cacheFactory; + export const database = databaseFactory; + export const httpRouter = httpRouterFactory; + export const lifecycle = lifecycleFactory; + export const logger = loggerFactory; + export const permissions = permissionsFactory; + export const rootLifecycle = rootLifecycleFactory; + export const scheduler = schedulerFactory; + export const urlReader = urlReaderFactory; } diff --git a/packages/backend-test-utils/src/next/implementations/mockIdentityService.ts b/packages/backend-test-utils/src/next/implementations/mockIdentityService.ts index a838c8c879..ff424f79c2 100644 --- a/packages/backend-test-utils/src/next/implementations/mockIdentityService.ts +++ b/packages/backend-test-utils/src/next/implementations/mockIdentityService.ts @@ -13,17 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - coreServices, - createServiceFactory, - IdentityService, -} from '@backstage/backend-plugin-api'; +import { IdentityService } from '@backstage/backend-plugin-api'; import { IdentityApiGetIdentityRequest, BackstageIdentityResponse, } from '@backstage/plugin-auth-node'; -class MockIdentityServiceImpl implements IdentityService { +export class MockIdentityService implements IdentityService { getIdentity( _options: IdentityApiGetIdentityRequest, ): Promise { @@ -37,11 +33,3 @@ class MockIdentityServiceImpl implements IdentityService { }); } } - -export const mockIdentityFactory = createServiceFactory({ - service: coreServices.identity, - deps: {}, - async factory() { - return new MockIdentityServiceImpl(); - }, -}); diff --git a/packages/backend-test-utils/src/next/implementations/mockRootLoggerService.ts b/packages/backend-test-utils/src/next/implementations/mockRootLoggerService.ts index bb3af6a9fb..e7450dfc9c 100644 --- a/packages/backend-test-utils/src/next/implementations/mockRootLoggerService.ts +++ b/packages/backend-test-utils/src/next/implementations/mockRootLoggerService.ts @@ -15,21 +15,14 @@ */ import { - coreServices, - createServiceFactory, LoggerService, LogMeta, RootLoggerService, } from '@backstage/backend-plugin-api'; +import type { mockServices } from './mockServices'; -interface MockLoggerOptions { - levels: - | boolean - | { error: boolean; warn: boolean; info: boolean; debug: boolean }; -} - -class MockLogger implements RootLoggerService { - #levels: Exclude; +export class MockLogger implements RootLoggerService { + #levels: Exclude; #meta: LogMeta; error(message: string, meta?: LogMeta | Error | undefined): void { @@ -52,7 +45,10 @@ class MockLogger implements RootLoggerService { return new MockLogger(this.#levels, { ...this.#meta, ...meta }); } - constructor(levels: MockLoggerOptions['levels'], meta: LogMeta) { + constructor( + levels: mockServices.rootLogger.Options['levels'], + meta: LogMeta, + ) { if (typeof levels === 'boolean') { this.#levels = { error: levels, @@ -79,12 +75,3 @@ class MockLogger implements RootLoggerService { } } } - -/** @alpha */ -export const mockRootLoggerService = createServiceFactory({ - service: coreServices.rootLogger, - deps: {}, - async factory(_deps) { - return new MockLogger(false, {}); - }, -}); diff --git a/packages/backend-test-utils/src/next/implementations/mockServices.ts b/packages/backend-test-utils/src/next/implementations/mockServices.ts index 0ede7625c3..8baed04daa 100644 --- a/packages/backend-test-utils/src/next/implementations/mockServices.ts +++ b/packages/backend-test-utils/src/next/implementations/mockServices.ts @@ -14,8 +14,15 @@ * limitations under the License. */ +import { + IdentityService, + LoggerService, + TokenManagerService, +} from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { JsonObject } from '@backstage/types'; +import { MockIdentityService } from './mockIdentityService'; +import { MockLogger } from './mockRootLoggerService'; /** * @alpha @@ -24,8 +31,39 @@ export namespace mockServices { export namespace config { export type Options = { data?: JsonObject }; } - export function config(options?: config.Options) { return new ConfigReader(options?.data, 'mock-config'); } + + export namespace rootLogger { + export type Options = { + levels: + | boolean + | { error: boolean; warn: boolean; info: boolean; debug: boolean }; + }; + } + export function rootLogger(options?: rootLogger.Options): LoggerService { + return new MockLogger(options?.levels ?? false, {}); + } + + export function tokenManager(): TokenManagerService { + return { + async getToken(): Promise<{ token: string }> { + return { token: 'mock-token' }; + }, + async authenticate(token: string): Promise { + if (token !== 'mock-token') { + throw new Error('Invalid token'); + } + }, + }; + } + + export function identity(): IdentityService { + return new MockIdentityService(); + } + + // TODO(Rugvip): Not all core services have implementations available here yet. + // some may need a bit more refactoring for it to be simpler to + // re-implement functioning mock versions here. } diff --git a/packages/backend-test-utils/src/next/implementations/mockTokenManagerService.ts b/packages/backend-test-utils/src/next/implementations/mockTokenManagerService.ts deleted file mode 100644 index 2cfc15220e..0000000000 --- a/packages/backend-test-utils/src/next/implementations/mockTokenManagerService.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2023 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 { TokenManager } from '@backstage/backend-common'; -import { - coreServices, - createServiceFactory, -} from '@backstage/backend-plugin-api'; - -class TokenManagerMock implements TokenManager { - async getToken(): Promise<{ token: string }> { - return { token: 'mock-token' }; - } - async authenticate(token: string): Promise { - if (token !== 'mock-token') { - throw new Error('Invalid token'); - } - } -} - -/** @alpha */ -export const mockTokenManagerFactory = createServiceFactory({ - service: coreServices.tokenManager, - deps: {}, - async factory() { - return new TokenManagerMock(); - }, -}); diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 699dfa6396..f2e7f45d08 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -17,15 +17,6 @@ import { Backend, createSpecializedBackend, - lifecycleFactory, - rootLifecycleFactory, - loggerFactory, - cacheFactory, - permissionsFactory, - schedulerFactory, - urlReaderFactory, - databaseFactory, - httpRouterFactory, MiddlewareFactory, createHttpServer, ExtendedHttpServer, @@ -42,11 +33,8 @@ import { } from '@backstage/backend-plugin-api'; import { mockFactories } from '../implementations'; -import { mockRootLoggerService } from '../implementations/mockRootLoggerService'; -import { mockTokenManagerFactory } from '../implementations/mockTokenManagerService'; import { ConfigReader } from '@backstage/config'; import express from 'express'; -import { mockIdentityFactory } from '../implementations/mockIdentityService'; /** @alpha */ export interface TestBackendOptions< @@ -84,19 +72,18 @@ export interface TestBackend extends Backend { } const defaultServiceFactories = [ - cacheFactory(), - databaseFactory(), - httpRouterFactory(), - lifecycleFactory(), - loggerFactory(), + mockFactories.cache(), + mockFactories.database(), + mockFactories.httpRouter(), + mockFactories.lifecycle(), + mockFactories.logger(), mockFactories.config(), - mockRootLoggerService(), - mockIdentityFactory(), - mockTokenManagerFactory(), - permissionsFactory(), - rootLifecycleFactory(), - schedulerFactory(), - urlReaderFactory(), + mockFactories.identity(), + mockFactories.tokenManager(), + mockFactories.permissions(), + mockFactories.rootLifecycle(), + mockFactories.scheduler(), + mockFactories.urlReader(), ]; const backendInstancesToCleanUp = new Array(); From d0901c9ba4a3c68ee78ed9625da5b1eaf1d9654e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 16 Jan 2023 15:38:23 +0100 Subject: [PATCH 3/7] changesets: added changeset for new mock exports from backend-test-utils Signed-off-by: Patrik Oldsberg --- .changeset/twenty-parents-relate.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/twenty-parents-relate.md diff --git a/.changeset/twenty-parents-relate.md b/.changeset/twenty-parents-relate.md new file mode 100644 index 0000000000..f1408bfa88 --- /dev/null +++ b/.changeset/twenty-parents-relate.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +All mock service factories and mock service implementations are now available via two new exports, `mockServices`, and `mockFactories`. From 846b310dbb995c971c84aef1bb593400ae1e1d1f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 16 Jan 2023 17:13:34 +0100 Subject: [PATCH 4/7] backend-test-utils: merge mockFactories into mockServices Signed-off-by: Patrik Oldsberg --- .changeset/twenty-parents-relate.md | 2 +- packages/backend-test-utils/api-report.md | 127 ++++++++++++------ .../src/next/implementations/index.ts | 1 - .../src/next/implementations/mockFactories.ts | 84 ------------ .../src/next/implementations/mockServices.ts | 90 ++++++++++++- .../src/next/wiring/TestBackend.ts | 26 ++-- 6 files changed, 187 insertions(+), 143 deletions(-) delete mode 100644 packages/backend-test-utils/src/next/implementations/mockFactories.ts diff --git a/.changeset/twenty-parents-relate.md b/.changeset/twenty-parents-relate.md index f1408bfa88..a883873c16 100644 --- a/.changeset/twenty-parents-relate.md +++ b/.changeset/twenty-parents-relate.md @@ -2,4 +2,4 @@ '@backstage/backend-test-utils': patch --- -All mock service factories and mock service implementations are now available via two new exports, `mockServices`, and `mockFactories`. +All mock service factories and mock service implementations are now available via the new experimental `mockServices` export. diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 6221a32d5b..232f7e8136 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -30,56 +30,84 @@ import { UrlReaderService } from '@backstage/backend-plugin-api'; // @public (undocumented) export function isDockerDisabledForTests(): boolean; -// @alpha (undocumented) -export namespace mockFactories { - const // (undocumented) - config: ( - options?: mockServices.config.Options | undefined, - ) => ServiceFactory; - const // (undocumented) - rootLogger: ( - options?: mockServices.rootLogger.Options | undefined, - ) => ServiceFactory; - const // (undocumented) - tokenManager: () => ServiceFactory; - const // (undocumented) - identity: () => ServiceFactory; - const // (undocumented) - cache: () => ServiceFactory; - const // (undocumented) - database: () => ServiceFactory; - const // (undocumented) - httpRouter: ( - options?: HttpRouterFactoryOptions | undefined, - ) => ServiceFactory; - const // (undocumented) - lifecycle: () => ServiceFactory; - const // (undocumented) - logger: () => ServiceFactory; - const // (undocumented) - permissions: () => ServiceFactory; - const // (undocumented) - rootLifecycle: () => ServiceFactory; - const // (undocumented) - scheduler: () => ServiceFactory; - const // (undocumented) - urlReader: () => ServiceFactory; -} - // @alpha (undocumented) export namespace mockServices { + // (undocumented) + export namespace cache { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } + // (undocumented) + export function config(options?: config.Options): ConfigReader; // (undocumented) export namespace config { // (undocumented) export type Options = { data?: JsonObject; }; + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: (options?: Options | undefined) => ServiceFactory; } // (undocumented) - export function config(options?: config.Options): ConfigReader; + export namespace database { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } + // (undocumented) + export namespace httpRouter { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: ( + options?: HttpRouterFactoryOptions | undefined, + ) => ServiceFactory; + } // (undocumented) export function identity(): IdentityService; // (undocumented) + export namespace identity { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } + // (undocumented) + export namespace lifecycle { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } + // (undocumented) + export namespace logger { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } + // (undocumented) + export namespace permissions { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } + // (undocumented) + export namespace rootLifecycle { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } + // (undocumented) + export function rootLogger(options?: rootLogger.Options): LoggerService; + // (undocumented) export namespace rootLogger { // (undocumented) export type Options = { @@ -92,11 +120,34 @@ export namespace mockServices { debug: boolean; }; }; + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: (options?: Options | undefined) => ServiceFactory; } // (undocumented) - export function rootLogger(options?: rootLogger.Options): LoggerService; + export namespace scheduler { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } // (undocumented) export function tokenManager(): TokenManagerService; + // (undocumented) + export namespace tokenManager { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } + // (undocumented) + export namespace urlReader { + const // (undocumented) + ref: ServiceRef; + const // (undocumented) + factory: () => ServiceFactory; + } } // @public diff --git a/packages/backend-test-utils/src/next/implementations/index.ts b/packages/backend-test-utils/src/next/implementations/index.ts index f962b392d8..f562150efa 100644 --- a/packages/backend-test-utils/src/next/implementations/index.ts +++ b/packages/backend-test-utils/src/next/implementations/index.ts @@ -13,5 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { mockFactories } from './mockFactories'; export { mockServices } from './mockServices'; diff --git a/packages/backend-test-utils/src/next/implementations/mockFactories.ts b/packages/backend-test-utils/src/next/implementations/mockFactories.ts deleted file mode 100644 index d3bfe28c61..0000000000 --- a/packages/backend-test-utils/src/next/implementations/mockFactories.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2023 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 { - cacheFactory, - databaseFactory, - httpRouterFactory, - lifecycleFactory, - loggerFactory, - permissionsFactory, - rootLifecycleFactory, - schedulerFactory, - urlReaderFactory, -} from '@backstage/backend-app-api'; -import { - coreServices, - createServiceFactory, -} from '@backstage/backend-plugin-api'; -import { mockServices } from './mockServices'; - -/** - * @alpha - */ -export namespace mockFactories { - export const config = createServiceFactory( - (options?: mockServices.config.Options) => ({ - service: coreServices.config, - deps: {}, - async factory() { - return mockServices.config(options); - }, - }), - ); - - export const rootLogger = createServiceFactory( - (options?: mockServices.rootLogger.Options) => ({ - service: coreServices.rootLogger, - deps: {}, - async factory() { - return mockServices.rootLogger(options); - }, - }), - ); - - export const tokenManager = createServiceFactory({ - service: coreServices.tokenManager, - deps: {}, - async factory() { - return mockServices.tokenManager(); - }, - }); - - export const identity = createServiceFactory({ - service: coreServices.identity, - deps: {}, - async factory() { - return mockServices.identity(); - }, - }); - - // For all other services, we just use the default implementations - export const cache = cacheFactory; - export const database = databaseFactory; - export const httpRouter = httpRouterFactory; - export const lifecycle = lifecycleFactory; - export const logger = loggerFactory; - export const permissions = permissionsFactory; - export const rootLifecycle = rootLifecycleFactory; - export const scheduler = schedulerFactory; - export const urlReader = urlReaderFactory; -} diff --git a/packages/backend-test-utils/src/next/implementations/mockServices.ts b/packages/backend-test-utils/src/next/implementations/mockServices.ts index 8baed04daa..5cb1371d95 100644 --- a/packages/backend-test-utils/src/next/implementations/mockServices.ts +++ b/packages/backend-test-utils/src/next/implementations/mockServices.ts @@ -15,35 +15,69 @@ */ import { + coreServices, + createServiceFactory, IdentityService, LoggerService, + ServiceFactory, + ServiceRef, TokenManagerService, } from '@backstage/backend-plugin-api'; +import { + cacheFactory, + databaseFactory, + httpRouterFactory, + lifecycleFactory, + loggerFactory, + permissionsFactory, + rootLifecycleFactory, + schedulerFactory, + urlReaderFactory, +} from '@backstage/backend-app-api'; import { ConfigReader } from '@backstage/config'; import { JsonObject } from '@backstage/types'; import { MockIdentityService } from './mockIdentityService'; import { MockLogger } from './mockRootLoggerService'; +function simpleFactory( + ref: ServiceRef, + factory: (...options: TOptions) => TService, +): (...options: TOptions) => ServiceFactory { + return createServiceFactory((options: unknown) => ({ + service: ref as ServiceRef, + deps: {}, + async factory() { + return (factory as any)(options); + }, + })); +} + /** * @alpha */ export namespace mockServices { - export namespace config { - export type Options = { data?: JsonObject }; - } export function config(options?: config.Options) { return new ConfigReader(options?.data, 'mock-config'); } + export namespace config { + export type Options = { data?: JsonObject }; + export const ref = coreServices.config; + export const factory = simpleFactory(ref, config); + } + + export function rootLogger(options?: rootLogger.Options): LoggerService { + return new MockLogger(options?.levels ?? false, {}); + } export namespace rootLogger { export type Options = { levels: | boolean | { error: boolean; warn: boolean; info: boolean; debug: boolean }; }; - } - export function rootLogger(options?: rootLogger.Options): LoggerService { - return new MockLogger(options?.levels ?? false, {}); + + export const ref = coreServices.rootLogger; + export const factory = simpleFactory(ref, rootLogger); } export function tokenManager(): TokenManagerService { @@ -58,12 +92,56 @@ export namespace mockServices { }, }; } + export namespace tokenManager { + export const ref = coreServices.tokenManager; + export const factory = simpleFactory(ref, tokenManager); + } export function identity(): IdentityService { return new MockIdentityService(); } + export namespace identity { + export const ref = coreServices.identity; + export const factory = simpleFactory(ref, identity); + } // TODO(Rugvip): Not all core services have implementations available here yet. // some may need a bit more refactoring for it to be simpler to // re-implement functioning mock versions here. + export namespace cache { + export const ref = coreServices.cache; + export const factory = cacheFactory; + } + export namespace database { + export const ref = coreServices.database; + export const factory = databaseFactory; + } + export namespace httpRouter { + export const ref = coreServices.httpRouter; + export const factory = httpRouterFactory; + } + export namespace lifecycle { + export const ref = coreServices.lifecycle; + export const factory = lifecycleFactory; + } + export namespace logger { + export const ref = coreServices.logger; + export const factory = loggerFactory; + } + export namespace permissions { + export const ref = coreServices.permissions; + export const factory = permissionsFactory; + } + export namespace rootLifecycle { + export const ref = coreServices.rootLifecycle; + export const factory = rootLifecycleFactory; + } + export namespace scheduler { + export const ref = coreServices.scheduler; + export const factory = schedulerFactory; + } + export namespace urlReader { + export const ref = coreServices.urlReader; + export const factory = urlReaderFactory; + } } diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index f2e7f45d08..279e64daac 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -32,7 +32,7 @@ import { coreServices, } from '@backstage/backend-plugin-api'; -import { mockFactories } from '../implementations'; +import { mockServices } from '../implementations'; import { ConfigReader } from '@backstage/config'; import express from 'express'; @@ -72,18 +72,18 @@ export interface TestBackend extends Backend { } const defaultServiceFactories = [ - mockFactories.cache(), - mockFactories.database(), - mockFactories.httpRouter(), - mockFactories.lifecycle(), - mockFactories.logger(), - mockFactories.config(), - mockFactories.identity(), - mockFactories.tokenManager(), - mockFactories.permissions(), - mockFactories.rootLifecycle(), - mockFactories.scheduler(), - mockFactories.urlReader(), + mockServices.cache.factory(), + mockServices.database.factory(), + mockServices.httpRouter.factory(), + mockServices.lifecycle.factory(), + mockServices.logger.factory(), + mockServices.config.factory(), + mockServices.identity.factory(), + mockServices.tokenManager.factory(), + mockServices.permissions.factory(), + mockServices.rootLifecycle.factory(), + mockServices.scheduler.factory(), + mockServices.urlReader.factory(), ]; const backendInstancesToCleanUp = new Array(); From cf2967561f9ef303947a2a9352c4e8744f91fbb1 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 17 Jan 2023 10:33:41 +0100 Subject: [PATCH 5/7] update tests to use mockServices Signed-off-by: Patrik Oldsberg --- packages/backend-defaults/src/CreateBackend.test.ts | 4 ++-- .../BitbucketCloudEntityProviderCatalogModule.test.ts | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 35b3a7decf..2cfb92c3a6 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -21,7 +21,7 @@ import { createServiceRef, createSharedEnvironment, } from '@backstage/backend-plugin-api'; -import { mockConfigFactory } from '@backstage/backend-test-utils'; +import { mockServices } from '@backstage/backend-test-utils'; import { createBackend } from './CreateBackend'; const fooServiceRef = createServiceRef({ id: 'foo', scope: 'root' }); @@ -112,7 +112,7 @@ describe('createBackend', () => { }; }, }), - mockConfigFactory({ + mockServices.config.factory({ data: { root: 'root-env' }, }), createServiceFactory({ diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts index d44281600c..1b18ab0ed9 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts @@ -19,10 +19,7 @@ import { PluginTaskScheduler, TaskScheduleDefinition, } from '@backstage/backend-tasks'; -import { - startTestBackend, - mockConfigFactory, -} from '@backstage/backend-test-utils'; +import { startTestBackend, mockServices } from '@backstage/backend-test-utils'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; import { eventsExtensionPoint } from '@backstage/plugin-events-node'; import { Duration } from 'luxon'; @@ -59,7 +56,7 @@ describe('bitbucketCloudEntityProviderCatalogModule', () => { [eventsExtensionPoint, eventsExtensionPointImpl], ], services: [ - mockConfigFactory({ + mockServices.config.factory({ data: { catalog: { providers: { From 8702e9f78d2ea48b1a39d8b8cdfb7efaeb62fa77 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 17 Jan 2023 10:35:25 +0100 Subject: [PATCH 6/7] backend-test-utils: add missing rootLogger factory to startTestBackend Signed-off-by: Patrik Oldsberg --- packages/backend-test-utils/src/next/wiring/TestBackend.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 279e64daac..f87e0927e2 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -73,16 +73,17 @@ export interface TestBackend extends Backend { const defaultServiceFactories = [ mockServices.cache.factory(), + mockServices.config.factory(), mockServices.database.factory(), mockServices.httpRouter.factory(), + mockServices.identity.factory(), mockServices.lifecycle.factory(), mockServices.logger.factory(), - mockServices.config.factory(), - mockServices.identity.factory(), - mockServices.tokenManager.factory(), mockServices.permissions.factory(), mockServices.rootLifecycle.factory(), + mockServices.rootLogger.factory(), mockServices.scheduler.factory(), + mockServices.tokenManager.factory(), mockServices.urlReader.factory(), ]; From bdaf4b9c34c261f0408391e58d78b26c177e87e7 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 18 Jan 2023 11:17:05 +0100 Subject: [PATCH 7/7] backend-test-utils: renamed service dir to services + internal renames Signed-off-by: Patrik Oldsberg --- packages/backend-test-utils/src/next/index.ts | 2 +- .../MockIdentityService.ts} | 0 .../MockRootLoggerService.ts} | 4 ++-- .../src/next/{implementations => services}/index.ts | 0 .../src/next/{implementations => services}/mockServices.ts | 6 +++--- packages/backend-test-utils/src/next/wiring/TestBackend.ts | 3 +-- 6 files changed, 7 insertions(+), 8 deletions(-) rename packages/backend-test-utils/src/next/{implementations/mockIdentityService.ts => services/MockIdentityService.ts} (100%) rename packages/backend-test-utils/src/next/{implementations/mockRootLoggerService.ts => services/MockRootLoggerService.ts} (93%) rename packages/backend-test-utils/src/next/{implementations => services}/index.ts (100%) rename packages/backend-test-utils/src/next/{implementations => services}/mockServices.ts (95%) diff --git a/packages/backend-test-utils/src/next/index.ts b/packages/backend-test-utils/src/next/index.ts index 9f9edfd837..572fb3a9e7 100644 --- a/packages/backend-test-utils/src/next/index.ts +++ b/packages/backend-test-utils/src/next/index.ts @@ -15,4 +15,4 @@ */ export * from './wiring'; -export * from './implementations'; +export * from './services'; diff --git a/packages/backend-test-utils/src/next/implementations/mockIdentityService.ts b/packages/backend-test-utils/src/next/services/MockIdentityService.ts similarity index 100% rename from packages/backend-test-utils/src/next/implementations/mockIdentityService.ts rename to packages/backend-test-utils/src/next/services/MockIdentityService.ts diff --git a/packages/backend-test-utils/src/next/implementations/mockRootLoggerService.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts similarity index 93% rename from packages/backend-test-utils/src/next/implementations/mockRootLoggerService.ts rename to packages/backend-test-utils/src/next/services/MockRootLoggerService.ts index e7450dfc9c..780d330bfb 100644 --- a/packages/backend-test-utils/src/next/implementations/mockRootLoggerService.ts +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-plugin-api'; import type { mockServices } from './mockServices'; -export class MockLogger implements RootLoggerService { +export class MockRootLoggerService implements RootLoggerService { #levels: Exclude; #meta: LogMeta; @@ -42,7 +42,7 @@ export class MockLogger implements RootLoggerService { } child(meta: LogMeta): LoggerService { - return new MockLogger(this.#levels, { ...this.#meta, ...meta }); + return new MockRootLoggerService(this.#levels, { ...this.#meta, ...meta }); } constructor( diff --git a/packages/backend-test-utils/src/next/implementations/index.ts b/packages/backend-test-utils/src/next/services/index.ts similarity index 100% rename from packages/backend-test-utils/src/next/implementations/index.ts rename to packages/backend-test-utils/src/next/services/index.ts diff --git a/packages/backend-test-utils/src/next/implementations/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts similarity index 95% rename from packages/backend-test-utils/src/next/implementations/mockServices.ts rename to packages/backend-test-utils/src/next/services/mockServices.ts index 5cb1371d95..f86d8bac55 100644 --- a/packages/backend-test-utils/src/next/implementations/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -36,8 +36,8 @@ import { } from '@backstage/backend-app-api'; import { ConfigReader } from '@backstage/config'; import { JsonObject } from '@backstage/types'; -import { MockIdentityService } from './mockIdentityService'; -import { MockLogger } from './mockRootLoggerService'; +import { MockIdentityService } from './MockIdentityService'; +import { MockRootLoggerService } from './MockRootLoggerService'; function simpleFactory( ref: ServiceRef, @@ -67,7 +67,7 @@ export namespace mockServices { } export function rootLogger(options?: rootLogger.Options): LoggerService { - return new MockLogger(options?.levels ?? false, {}); + return new MockRootLoggerService(options?.levels ?? false, {}); } export namespace rootLogger { export type Options = { diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index f87e0927e2..db1016fcb6 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -31,8 +31,7 @@ import { ExtensionPoint, coreServices, } from '@backstage/backend-plugin-api'; - -import { mockServices } from '../implementations'; +import { mockServices } from '../services'; import { ConfigReader } from '@backstage/config'; import express from 'express';