diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index 79f0f36540..1c0bf5a0ef 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -28,8 +28,6 @@ import { BackendInitializer } from './BackendInitializer'; import { mockServices } from '@backstage/backend-test-utils'; import { BackendStartupError } from './BackendStartupError'; -const ID_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/i; - const baseFactories = [ mockServices.rootLifecycle.factory(), mockServices.lifecycle.factory(), @@ -1013,53 +1011,6 @@ describe('BackendInitializer', () => { "Service or extension point dependencies of module 'test-mod' for plugin 'test' are missing for the following ref(s): serviceRef{a}", ); }); - it('should reject plugins with invalid pluginId', async () => { - const init = new BackendInitializer(baseFactories); - init.add( - createBackendPlugin({ - pluginId: 'test:invalid&id', - register(reg) { - reg.registerInit({ - deps: {}, - async init() {}, - }); - }, - }), - ); - await expect(init.start()).rejects.toThrow( - `Invalid pluginId 'test:invalid&id', must match the pattern ${ID_PATTERN} (letters, digits, and dashes only, starting with a letter)`, - ); - }); - - it('should reject modules with invalid moduleId', async () => { - const init = new BackendInitializer(baseFactories); - init.add( - createBackendPlugin({ - pluginId: 'test', - register(reg) { - reg.registerInit({ - deps: {}, - async init() {}, - }); - }, - }), - ); - init.add( - createBackendModule({ - pluginId: 'test', - moduleId: 'invalid:module&id', - register(reg) { - reg.registerInit({ - deps: {}, - async init() {}, - }); - }, - }), - ); - await expect(init.start()).rejects.toThrow( - `Invalid moduleId 'invalid:module&id' for plugin 'test', must match the pattern ${ID_PATTERN} (letters, digits, and dashes only, starting with a letter)`, - ); - }); it('should properly load double-default CJS modules', async () => { expect.assertions(3); diff --git a/packages/backend-plugin-api/src/wiring/createBackendModule.test.ts b/packages/backend-plugin-api/src/wiring/createBackendModule.test.ts index 4d927c86f6..20b3599148 100644 --- a/packages/backend-plugin-api/src/wiring/createBackendModule.test.ts +++ b/packages/backend-plugin-api/src/wiring/createBackendModule.test.ts @@ -15,6 +15,7 @@ */ import { createServiceRef } from '../services'; +import { ID_PATTERN } from './constants'; import { createBackendModule } from './createBackendModule'; import { createExtensionPoint } from './createExtensionPoint'; import { InternalBackendRegistrations } from './types'; @@ -77,4 +78,20 @@ describe('createBackendModule', () => { expect(plugin.$$type).toEqual('@backstage/BackendFeature'); }); + it('should reject modules with invalid moduleId', async () => { + expect(() => + createBackendModule({ + pluginId: 'test', + moduleId: 'invalid:module&id', + register(reg) { + reg.registerInit({ + deps: {}, + async init() {}, + }); + }, + }), + ).toThrow( + `Invalid moduleId 'invalid:module&id' for plugin 'test', must match the pattern ${ID_PATTERN} (letters, digits, and dashes only, starting with a letter)`, + ); + }); }); diff --git a/packages/backend-plugin-api/src/wiring/createBackendPlugin.test.ts b/packages/backend-plugin-api/src/wiring/createBackendPlugin.test.ts index 5acd8e46d7..4759bd2754 100644 --- a/packages/backend-plugin-api/src/wiring/createBackendPlugin.test.ts +++ b/packages/backend-plugin-api/src/wiring/createBackendPlugin.test.ts @@ -15,6 +15,7 @@ */ import { createServiceRef } from '../services'; +import { ID_PATTERN } from './constants'; import { createBackendPlugin } from './createBackendPlugin'; import { createExtensionPoint } from './createExtensionPoint'; import { InternalBackendRegistrations } from './types'; @@ -90,4 +91,19 @@ describe('createBackendPlugin', () => { expect(plugin.$$type).toEqual('@backstage/BackendFeature'); }); + it('should reject plugins with invalid pluginId', async () => { + expect(() => + createBackendPlugin({ + pluginId: 'test:invalid&id', + register(reg) { + reg.registerInit({ + deps: {}, + async init() {}, + }); + }, + }), + ).toThrow( + `Invalid pluginId 'test:invalid&id', must match the pattern ${ID_PATTERN} (letters, digits, and dashes only, starting with a letter)`, + ); + }); }); diff --git a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.test.ts b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.test.ts index a3226721a1..1e1f7e1a84 100644 --- a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.test.ts @@ -142,6 +142,17 @@ describe('createFrontendPlugin', () => { expect(String(plugin)).toBe('Plugin{id=test}'); }); + it('should warn about invalid plugin IDs', () => { + const consoleWarn = jest + .spyOn(console, 'warn') + .mockImplementation(() => {}); + createFrontendPlugin({ pluginId: 'invalid&id' }); + expect(consoleWarn).toHaveBeenCalledWith( + expect.stringContaining("The pluginId 'invalid&id' will be invalid soon"), + ); + consoleWarn.mockRestore(); + }); + it('should create a plugin with extension instances', async () => { const plugin = createFrontendPlugin({ pluginId: 'test',