diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index d2bfd7038d..401c507ae2 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -36,6 +36,7 @@ "@backstage/backend-plugin-api": "workspace:^" }, "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^" }, "files": [ diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 89a8e96b28..2fa802e0ad 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -16,10 +16,17 @@ import { coreServices, + createBackendPlugin, createServiceFactory, + createServiceRef, + createSharedEnvironment, } from '@backstage/backend-plugin-api'; +import { mockConfigFactory } from '@backstage/backend-test-utils'; import { createBackend } from './CreateBackend'; +const fooServiceRef = createServiceRef({ id: 'foo', scope: 'root' }); +const barServiceRef = createServiceRef({ id: 'bar', scope: 'root' }); + describe('createBackend', () => { it('should not throw when overriding a default service implementation', () => { expect(() => @@ -69,4 +76,91 @@ describe('createBackend', () => { }), ).toThrow('The core.pluginMetadata service cannot be overridden'); }); + + it('should throw if an unsupported InternalSharedEnvironment version is passed in', () => { + expect(() => + createBackend({ + env: {} as any, + }), + ).toThrow( + "Shared environment version 'undefined' is invalid or not supported", + ); + expect(() => + createBackend({ + env: { version: {} } as any, + }), + ).toThrow( + "Shared environment version '[object Object]' is invalid or not supported", + ); + expect(() => + createBackend({ + env: { version: 'v2' } as any, + }), + ).toThrow("Shared environment version 'v2' is invalid or not supported"); + }); + + it('should prioritize services correctly', async () => { + const backend = createBackend({ + env: createSharedEnvironment({ + services: [ + createServiceFactory({ + service: coreServices.rootHttpRouter, + deps: {}, + async factory() { + return { + use() {}, + }; + }, + }), + mockConfigFactory({ + data: { root: 'root-env' }, + }), + createServiceFactory({ + service: fooServiceRef, + deps: {}, + async factory() { + return 'foo-env'; + }, + }), + createServiceFactory({ + service: barServiceRef, + deps: {}, + async factory() { + return 'bar-env'; + }, + }), + ], + })(), + services: [ + createServiceFactory({ + service: fooServiceRef, + deps: {}, + factory: async () => 'foo-backend', + }), + ], + }); + + expect.assertions(3); + backend.add( + createBackendPlugin({ + id: 'test', + register(reg) { + reg.registerInit({ + deps: { + config: coreServices.config, + foo: fooServiceRef, + bar: barServiceRef, + }, + async init({ config, foo, bar }) { + expect(config.get('root')).toBe('root-env'); + expect(foo).toBe('foo-backend'); + expect(bar).toBe('bar-env'); + }, + }); + }, + })(), + ); + + await backend.start(); + }); }); diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 374574645f..e6b5a15336 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -85,7 +85,9 @@ export function createBackend(options?: CreateBackendOptions): Backend { if (options?.env) { const env = options.env as unknown as InternalSharedBackendEnvironment; if (env.version !== 'v1') { - throw new Error(`Unsupported shared environment version: ${env.version}`); + throw new Error( + `Shared environment version '${env.version}' is invalid or not supported`, + ); } const environmentServices = diff --git a/yarn.lock b/yarn.lock index d6822cad9d..a3c21bddad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3515,6 +3515,7 @@ __metadata: dependencies: "@backstage/backend-app-api": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" languageName: unknown linkType: soft