backend-test-utils: remove services from startTestBackend

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
This commit is contained in:
Vincenzo Scamporlino
2023-08-15 14:34:15 +02:00
committed by Patrik Oldsberg
parent 175e4c3516
commit f66d490332
31 changed files with 317 additions and 325 deletions
@@ -95,7 +95,7 @@ describe('featureDiscoveryServiceFactory', () => {
const fn = jest.fn().mockResolvedValue({});
await startTestBackend({
services: [
features: [
createServiceFactory({
service: coreServices.identity,
deps: {},
@@ -61,8 +61,7 @@ describe('schedulerFactory', () => {
});
await startTestBackend({
features: [plugin()],
services: [subject],
features: [plugin(), subject],
});
});
});
@@ -31,7 +31,7 @@ const sf1 = createServiceFactory({
async factory() {
return { x: 1 };
},
})();
});
const ref2 = createServiceRef<{ x: number }>({
scope: 'root',
@@ -43,14 +43,14 @@ const sf2 = createServiceFactory({
async factory() {
return { x: 2 };
},
})();
});
const sf2b = createServiceFactory({
service: ref2,
deps: {},
async factory() {
return { x: 22 };
},
})();
});
const refDefault1 = createServiceRef<{ x: number }>({
id: '1',
@@ -61,7 +61,7 @@ const refDefault1 = createServiceRef<{ x: number }>({
async factory() {
return { x: 10 };
},
})(),
}),
});
const refDefault2a = createServiceRef<{ x: number }>({
@@ -95,7 +95,7 @@ describe('ServiceRegistry', () => {
});
it('should return an implementation for a registered ref', async () => {
const registry = new ServiceRegistry([sf1]);
const registry = new ServiceRegistry([sf1()]);
await expect(registry.get(ref1, 'catalog')).resolves.toEqual({ x: 1 });
await expect(registry.get(ref1, 'scaffolder')).resolves.toEqual({ x: 1 });
expect(await registry.get(ref1, 'catalog')).toBe(
@@ -110,7 +110,7 @@ describe('ServiceRegistry', () => {
});
it('should handle multiple factories with different serviceRefs', async () => {
const registry = new ServiceRegistry([sf1, sf2]);
const registry = new ServiceRegistry([sf1(), sf2()]);
await expect(registry.get(ref1, 'catalog')).resolves.toEqual({
x: 1,
@@ -131,7 +131,7 @@ describe('ServiceRegistry', () => {
return { x: 2 };
},
});
const registry = new ServiceRegistry([factory(), sf1]);
const registry = new ServiceRegistry([factory(), sf1()]);
await expect(registry.get(ref2, 'catalog')).rejects.toThrow(
"Failed to instantiate 'root' scoped service '2' because it depends on 'plugin' scoped service '1'.",
);
@@ -145,7 +145,7 @@ describe('ServiceRegistry', () => {
return { x: rootDep.x };
},
});
const registry = new ServiceRegistry([factory(), sf2]);
const registry = new ServiceRegistry([factory(), sf2()]);
await expect(registry.get(ref1, 'catalog')).resolves.toEqual({
x: 2,
});
@@ -160,7 +160,7 @@ describe('ServiceRegistry', () => {
return { x: rootDep.x };
},
});
const registry = new ServiceRegistry([factory(), sf2]);
const registry = new ServiceRegistry([factory(), sf2()]);
await expect(registry.get(ref, 'catalog')).resolves.toEqual({
x: 2,
});
@@ -182,7 +182,7 @@ describe('ServiceRegistry', () => {
});
it('should use the last factory for each ref', async () => {
const registry = new ServiceRegistry([sf2, sf2b]);
const registry = new ServiceRegistry([sf2(), sf2b()]);
await expect(registry.get(ref2, 'catalog')).resolves.toEqual({
x: 22,
});
@@ -196,7 +196,7 @@ describe('ServiceRegistry', () => {
});
it('should not use the defaultFactory from the ref if provided to the registry', async () => {
const registry = new ServiceRegistry([sf1]);
const registry = new ServiceRegistry([sf1()]);
await expect(registry.get(refDefault1, 'catalog')).resolves.toEqual({
x: 1,
});
+4 -20
View File
@@ -21,7 +21,6 @@ import { RootConfigService } from '@backstage/backend-plugin-api';
import { RootLifecycleService } 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';
@@ -127,11 +126,8 @@ export function setupRequestMockHandlers(worker: {
}): void;
// @public (undocumented)
export function startTestBackend<
TServices extends any[],
TExtensionPoints extends any[],
>(
options: TestBackendOptions<TServices, TExtensionPoints>,
export function startTestBackend<TExtensionPoints extends any[]>(
options: TestBackendOptions<TExtensionPoints>,
): Promise<TestBackend>;
// @public (undocumented)
@@ -140,10 +136,7 @@ export interface TestBackend extends Backend {
}
// @public (undocumented)
export interface TestBackendOptions<
TServices extends any[],
TExtensionPoints extends any[],
> {
export interface TestBackendOptions<TExtensionPoints extends any[]> {
// (undocumented)
extensionPoints?: readonly [
...{
@@ -154,16 +147,7 @@ export interface TestBackendOptions<
},
];
// (undocumented)
features?: BackendFeature[];
// (undocumented)
services?: readonly [
...{
[index in keyof TServices]:
| ServiceFactory<TServices[index]>
| (() => ServiceFactory<TServices[index]>)
| [ServiceRef<TServices[index]>, Partial<TServices[index]>];
},
];
features?: Array<BackendFeature | (() => BackendFeature)>;
}
// @public
@@ -31,7 +31,6 @@ import { startTestBackend } from './TestBackend';
let globalTestBackendHasBeenStopped = false;
beforeAll(async () => {
await startTestBackend({
services: [],
features: [
createBackendModule({
moduleId: 'test.module',
@@ -46,7 +45,7 @@ beforeAll(async () => {
},
});
},
})(),
}),
],
});
});
@@ -68,17 +67,37 @@ describe('TestBackend', () => {
const extensionPoint5 = createExtensionPoint<Obj>({ id: 'b5' });
await expect(
startTestBackend({
services: [
features: [
// @ts-expect-error
[extensionPoint1, { a: 'a' }],
[serviceRef, { a: 'a' }],
[serviceRef, { a: 'a', b: 'b' }],
// @ts-expect-error
[serviceRef, { c: 'c' }],
// @ts-expect-error
[serviceRef, { a: 'a', c: 'c' }],
// @ts-expect-error
[serviceRef, { a: 'a', b: 'b', c: 'c' }],
createServiceFactory(() => ({
service: serviceRef,
deps: {},
// @ts-expect-error
factory: async () => ({ a: 'a' }),
})),
createServiceFactory(() => ({
service: serviceRef,
deps: {},
factory: async () => ({ a: 'a', b: 'b' }),
})),
createServiceFactory(() => ({
service: serviceRef,
deps: {},
// @ts-expect-error
factory: async () => ({ c: 'c' }),
})),
createServiceFactory(() => ({
service: serviceRef,
deps: {},
// @ts-expect-error
factory: async () => ({ a: 'a', c: 'c' }),
})),
createServiceFactory(() => ({
service: serviceRef,
deps: {},
factory: async () => ({ a: 'a', b: 'b', c: 'c' }),
})),
],
extensionPoints: [
// @ts-expect-error
@@ -124,8 +143,7 @@ describe('TestBackend', () => {
});
await startTestBackend({
services: [sf],
features: [testModule()],
features: [testModule(), sf()],
});
expect(testFn).toHaveBeenCalledWith('winning');
@@ -150,7 +168,6 @@ describe('TestBackend', () => {
});
const backend = await startTestBackend({
services: [],
features: [testModule()],
});
@@ -192,7 +209,6 @@ describe('TestBackend', () => {
});
await startTestBackend({
services: [],
features: [testPlugin()],
});
});
@@ -244,7 +260,7 @@ describe('TestBackend', () => {
},
});
},
})(),
}),
createBackendModule({
pluginId: 'testB',
moduleId: 'test',
@@ -256,7 +272,7 @@ describe('TestBackend', () => {
},
});
},
})(),
}),
],
}),
).resolves.not.toBeUndefined();
@@ -277,7 +293,7 @@ describe('TestBackend', () => {
async init() {},
});
},
})(),
}),
createBackendModule({
pluginId: 'testB',
moduleId: 'test',
@@ -287,7 +303,7 @@ describe('TestBackend', () => {
async init() {},
});
},
})(),
}),
],
}),
).rejects.toThrow(
@@ -24,8 +24,6 @@ import {
} from '@backstage/backend-app-api';
import { HostDiscovery } from '@backstage/backend-common';
import {
ServiceFactory,
ServiceRef,
createServiceFactory,
BackendFeature,
ExtensionPoint,
@@ -40,18 +38,7 @@ import express from 'express';
import { InternalBackendFeature } from '@backstage/backend-plugin-api/src/wiring/types';
/** @public */
export interface TestBackendOptions<
TServices extends any[],
TExtensionPoints extends any[],
> {
services?: readonly [
...{
[index in keyof TServices]:
| ServiceFactory<TServices[index]>
| (() => ServiceFactory<TServices[index]>)
| [ServiceRef<TServices[index]>, Partial<TServices[index]>];
},
];
export interface TestBackendOptions<TExtensionPoints extends any[]> {
extensionPoints?: readonly [
...{
[index in keyof TExtensionPoints]: [
@@ -60,7 +47,7 @@ export interface TestBackendOptions<
];
},
];
features?: BackendFeature[];
features?: Array<BackendFeature | (() => BackendFeature)>;
}
/** @public */
@@ -95,17 +82,22 @@ const defaultServiceFactories = [
* @returns
*/
function createExtensionPointTestModules(
features: BackendFeature[],
features: Array<BackendFeature | (() => BackendFeature)>,
extensionPointTuples?: readonly [
ref: ExtensionPoint<unknown>,
impl: unknown,
][],
): BackendFeature[] {
): Array<() => BackendFeature> {
if (!extensionPointTuples) {
return [];
}
const registrations = features.flatMap(feature => {
const registrations = features.flatMap(featureOrFunction => {
const feature =
typeof featureOrFunction === 'function'
? featureOrFunction()
: featureOrFunction;
if (feature.$$type !== '@backstage/BackendFeature') {
throw new Error(
`Failed to add feature, invalid type '${feature.$$type}'`,
@@ -170,7 +162,7 @@ function createExtensionPointTestModules(
reg.registerInit({ deps: {}, async init() {} });
},
})(),
}),
);
}
@@ -180,18 +172,10 @@ function createExtensionPointTestModules(
const backendInstancesToCleanUp = new Array<Backend>();
/** @public */
export async function startTestBackend<
TServices extends any[],
TExtensionPoints extends any[],
>(
options: TestBackendOptions<TServices, TExtensionPoints>,
export async function startTestBackend<TExtensionPoints extends any[]>(
options: TestBackendOptions<TExtensionPoints>,
): Promise<TestBackend> {
const {
services = [],
extensionPoints,
features = [],
...otherOptions
} = options;
const { extensionPoints, features = [], ...otherOptions } = options;
let server: ExtendedHttpServer;
@@ -247,40 +231,10 @@ export async function startTestBackend<
},
});
const factories = services.map(serviceDef => {
if (Array.isArray(serviceDef)) {
// if type is ExtensionPoint?
// do something differently?
const [ref, impl] = serviceDef;
if (ref.scope === 'plugin') {
return createServiceFactory({
service: ref as ServiceRef<unknown, 'plugin'>,
deps: {},
factory: async () => impl,
})();
}
return createServiceFactory({
service: ref as ServiceRef<unknown, 'root'>,
deps: {},
factory: async () => impl,
})();
}
if (typeof serviceDef === 'function') {
return serviceDef();
}
return serviceDef as ServiceFactory;
});
for (const factory of defaultServiceFactories) {
if (!factories.some(f => f.service.id === factory.service.id)) {
factories.push(factory);
}
}
const backend = createSpecializedBackend({
...otherOptions,
defaultServiceFactories: [
...factories,
...defaultServiceFactories,
rootHttpRouterFactory,
discoveryFactory,
],
@@ -39,8 +39,8 @@ describe('appPlugin', () => {
it('boots', async () => {
const { server } = await startTestBackend({
features: [appPlugin()],
services: [
features: [
appPlugin(),
mockServices.rootConfig.factory({
data: {
app: {
@@ -15,13 +15,15 @@
*/
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
import { catalogModuleAwsS3EntityProvider } from './catalogModuleAwsS3EntityProvider';
@@ -45,7 +47,7 @@ describe('catalogModuleAwsS3EntityProvider', () => {
},
} as unknown as PluginTaskScheduler;
const config = new ConfigReader({
const config = {
catalog: {
providers: {
awsS3: {
@@ -57,16 +59,24 @@ describe('catalogModuleAwsS3EntityProvider', () => {
},
},
},
});
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
catalogModuleAwsS3EntityProvider(),
mockServices.rootConfig.factory({ data: config }),
createServiceFactory(() => ({
service: coreServices.logger,
deps: {},
factory: getVoidLogger,
}))(),
createServiceFactory(() => ({
service: coreServices.scheduler,
deps: {},
factory: () => scheduler,
}))(),
],
features: [catalogModuleAwsS3EntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
@@ -14,14 +14,15 @@
* limitations under the License.
*/
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
import { catalogModuleAzureDevOpsEntityProvider } from './catalogModuleAzureDevOpsEntityProvider';
@@ -45,7 +46,7 @@ describe('catalogModuleAzureDevOpsEntityProvider', () => {
},
} as unknown as PluginTaskScheduler;
const config = new ConfigReader({
const config = {
catalog: {
providers: {
azureDevOps: {
@@ -60,16 +61,20 @@ describe('catalogModuleAzureDevOpsEntityProvider', () => {
},
},
},
});
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
catalogModuleAzureDevOpsEntityProvider(),
mockServices.rootConfig.factory({ data: config }),
mockServices.logger.factory(),
createServiceFactory(() => ({
deps: {},
service: coreServices.scheduler,
factory: async () => scheduler,
})),
],
features: [catalogModuleAzureDevOpsEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
@@ -14,7 +14,10 @@
* limitations under the License.
*/
import { coreServices } from '@backstage/backend-plugin-api';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
@@ -55,7 +58,8 @@ describe('catalogModuleBitbucketCloudEntityProvider', () => {
[catalogProcessingExtensionPoint, catalogExtensionPointImpl],
[eventsExtensionPoint, eventsExtensionPointImpl],
],
services: [
features: [
catalogModuleBitbucketCloudEntityProvider(),
mockServices.rootConfig.factory({
data: {
catalog: {
@@ -71,9 +75,12 @@ describe('catalogModuleBitbucketCloudEntityProvider', () => {
},
},
}),
[coreServices.scheduler, scheduler],
createServiceFactory({
service: coreServices.scheduler,
deps: {},
factory: async () => scheduler,
}),
],
features: [catalogModuleBitbucketCloudEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
@@ -14,14 +14,15 @@
* limitations under the License.
*/
import { ConfigReader } from '@backstage/config';
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { catalogModuleBitbucketServerEntityProvider } from './catalogModuleBitbucketServerEntityProvider';
import { Duration } from 'luxon';
@@ -45,7 +46,7 @@ describe('catalogModuleBitbucketServerEntityProvider', () => {
},
} as unknown as PluginTaskScheduler;
const config = new ConfigReader({
const config = {
catalog: {
providers: {
bitbucketServer: {
@@ -64,16 +65,20 @@ describe('catalogModuleBitbucketServerEntityProvider', () => {
},
],
},
});
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
catalogModuleBitbucketServerEntityProvider(),
mockServices.rootConfig.factory({ data: config }),
mockServices.logger.factory(),
createServiceFactory({
service: coreServices.scheduler,
deps: {},
factory: async () => scheduler,
}),
],
features: [catalogModuleBitbucketServerEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
@@ -14,14 +14,15 @@
* limitations under the License.
*/
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
import { catalogModuleGerritEntityProvider } from './catalogModuleGerritEntityProvider';
@@ -45,7 +46,7 @@ describe('catalogModuleGerritEntityProvider', () => {
},
} as unknown as PluginTaskScheduler;
const config = new ConfigReader({
const config = {
catalog: {
providers: {
gerrit: {
@@ -70,16 +71,20 @@ describe('catalogModuleGerritEntityProvider', () => {
},
],
},
});
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
catalogModuleGerritEntityProvider(),
mockServices.rootConfig.factory({ data: config }),
mockServices.logger.factory(),
createServiceFactory({
service: coreServices.scheduler,
deps: {},
factory: async () => scheduler,
}),
],
features: [catalogModuleGerritEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
@@ -14,18 +14,19 @@
* limitations under the License.
*/
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
import { catalogModuleGithubEntityProvider } from './catalogModuleGithubEntityProvider';
import { GithubEntityProvider } from '../providers/GithubEntityProvider';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
describe('catalogModuleGithubEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
@@ -45,7 +46,7 @@ describe('catalogModuleGithubEntityProvider', () => {
},
} as unknown as PluginTaskScheduler;
const config = new ConfigReader({
const config = {
catalog: {
providers: {
github: {
@@ -57,16 +58,19 @@ describe('catalogModuleGithubEntityProvider', () => {
},
},
},
});
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
catalogModuleGithubEntityProvider(),
mockServices.rootConfig.factory({ data: config }),
createServiceFactory({
service: coreServices.scheduler,
deps: {},
factory: async () => scheduler,
}),
],
features: [catalogModuleGithubEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
@@ -14,14 +14,15 @@
* limitations under the License.
*/
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
import { catalogModuleGitlabDiscoveryEntityProvider } from './catalogModuleGitlabDiscoveryEntityProvider';
@@ -45,7 +46,7 @@ describe('catalogModuleGitlabDiscoveryEntityProvider', () => {
},
} as unknown as PluginTaskScheduler;
const config = new ConfigReader({
const config = {
integrations: {
gitlab: [
{
@@ -69,16 +70,20 @@ describe('catalogModuleGitlabDiscoveryEntityProvider', () => {
},
},
},
});
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
catalogModuleGitlabDiscoveryEntityProvider(),
mockServices.rootConfig.factory({ data: config }),
mockServices.logger.factory(),
createServiceFactory({
deps: {},
service: coreServices.scheduler,
factory: async () => scheduler,
}),
],
features: [catalogModuleGitlabDiscoveryEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
@@ -14,13 +14,8 @@
* limitations under the License.
*/
import { getVoidLogger } from '@backstage/backend-common';
import {
coreServices,
createBackendModule,
} from '@backstage/backend-plugin-api';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { createBackendModule } from '@backstage/backend-plugin-api';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { IncrementalEntityProvider } from '../types';
import {
@@ -43,26 +38,16 @@ describe('catalogModuleIncrementalIngestionEntityProvider', () => {
const addEntityProvider = jest.fn();
const httpRouterUse = jest.fn();
const scheduler = {};
const database = {
getClient: jest.fn(),
};
const httpRouter = {
use: httpRouterUse,
};
await startTestBackend({
extensionPoints: [
[catalogProcessingExtensionPoint, { addEntityProvider }],
],
services: [
[coreServices.rootConfig, new ConfigReader({})],
[coreServices.database, database],
[coreServices.httpRouter, httpRouter],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
features: [
mockServices.rootConfig.factory(),
mockServices.database.factory(),
mockServices.httpRouter.factory(),
mockServices.logger.factory(),
mockServices.scheduler.factory(),
catalogModuleIncrementalIngestionEntityProvider(),
createBackendModule({
pluginId: 'catalog',
@@ -82,7 +67,7 @@ describe('catalogModuleIncrementalIngestionEntityProvider', () => {
},
});
},
})(),
}),
],
});
@@ -85,7 +85,7 @@ async function main() {
},
});
},
})(),
}),
);
await backend.start();
@@ -14,14 +14,15 @@
* limitations under the License.
*/
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
import { catalogModuleMicrosoftGraphOrgEntityProvider } from './catalogModuleMicrosoftGraphOrgEntityProvider';
@@ -45,7 +46,7 @@ describe('catalogModuleMicrosoftGraphOrgEntityProvider', () => {
},
} as unknown as PluginTaskScheduler;
const config = new ConfigReader({
const config = {
catalog: {
providers: {
microsoftGraphOrg: {
@@ -62,16 +63,19 @@ describe('catalogModuleMicrosoftGraphOrgEntityProvider', () => {
},
},
},
});
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
catalogModuleMicrosoftGraphOrgEntityProvider(),
mockServices.rootConfig.factory({ data: config }),
createServiceFactory(() => ({
deps: {},
service: coreServices.scheduler,
factory: async () => scheduler,
})),
],
features: [catalogModuleMicrosoftGraphOrgEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('PT30M'));
@@ -14,14 +14,15 @@
* limitations under the License.
*/
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import {
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
PluginTaskScheduler,
TaskScheduleDefinition,
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { catalogModulePuppetDbEntityProvider } from './catalogModulePuppetDbEntityProvider';
import { PuppetDbEntityProvider } from '../providers/PuppetDbEntityProvider';
@@ -44,7 +45,7 @@ describe('catalogModulePuppetDbEntityProvider', () => {
},
} as unknown as PluginTaskScheduler;
const config = new ConfigReader({
const config = {
catalog: {
providers: {
puppetdb: {
@@ -56,16 +57,19 @@ describe('catalogModulePuppetDbEntityProvider', () => {
},
},
},
});
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
catalogModulePuppetDbEntityProvider(),
mockServices.rootConfig.factory({ data: config }),
createServiceFactory(() => ({
deps: {},
service: coreServices.scheduler,
factory: async () => scheduler,
})),
],
features: [catalogModulePuppetDbEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual({ minutes: 10 });
@@ -180,7 +180,6 @@ describePerformanceTest('stitchingPerformance', () => {
const tracker = new Tracker(knex, load);
const backend = await startTestBackend({
services: [staticDatabase(knex)],
features: [
catalogPlugin(),
createBackendModule({
@@ -201,7 +200,8 @@ describePerformanceTest('stitchingPerformance', () => {
},
});
},
})(),
}),
staticDatabase(knex),
],
});
@@ -14,10 +14,12 @@
* limitations under the License.
*/
import { getVoidLogger } from '@backstage/backend-common';
import { coreServices } from '@backstage/backend-plugin-api';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import {
coreServices,
createServiceFactory,
SchedulerService,
} from '@backstage/backend-plugin-api';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import { TestEventBroker } from '@backstage/plugin-events-backend-test-utils';
import { eventsModuleAwsSqsConsumingEventPublisher } from './eventsModuleAwsSqsConsumingEventPublisher';
@@ -25,31 +27,6 @@ import { AwsSqsConsumingEventPublisher } from '../publisher/AwsSqsConsumingEvent
describe('eventsModuleAwsSqsConsumingEventPublisher', () => {
it('should be correctly wired and set up', async () => {
const config = new ConfigReader({
events: {
modules: {
awsSqs: {
awsSqsConsumingEventPublisher: {
topics: {
fake1: {
queue: {
region: 'eu-west-1',
url: 'https://fake1.queue.url',
},
},
fake2: {
queue: {
region: 'us-east-1',
url: 'https://fake2.queue.url',
},
},
},
},
},
},
},
});
let addedPublishers: AwsSqsConsumingEventPublisher[] | undefined;
const extensionPoint = {
addPublishers: (publishers: any) => {
@@ -59,16 +36,44 @@ describe('eventsModuleAwsSqsConsumingEventPublisher', () => {
const scheduler = {
scheduleTask: jest.fn(),
};
} as unknown as SchedulerService;
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [
[coreServices.rootConfig, config],
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
features: [
eventsModuleAwsSqsConsumingEventPublisher(),
mockServices.rootConfig.factory({
data: {
events: {
modules: {
awsSqs: {
awsSqsConsumingEventPublisher: {
topics: {
fake1: {
queue: {
region: 'eu-west-1',
url: 'https://fake1.queue.url',
},
},
fake2: {
queue: {
region: 'us-east-1',
url: 'https://fake2.queue.url',
},
},
},
},
},
},
},
},
}),
createServiceFactory({
service: coreServices.scheduler,
deps: {},
factory: () => scheduler,
}),
],
features: [eventsModuleAwsSqsConsumingEventPublisher()],
});
expect(addedPublishers).not.toBeUndefined();
@@ -34,7 +34,6 @@ describe('eventsModuleAzureDevOpsEventRouter', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
features: [eventsModuleAzureDevOpsEventRouter()],
});
@@ -34,7 +34,6 @@ describe('eventsModuleBitbucketCloudEventRouter', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
features: [eventsModuleBitbucketCloudEventRouter()],
});
@@ -34,7 +34,6 @@ describe('eventsModuleGerritEventRouter', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
features: [eventsModuleGerritEventRouter()],
});
@@ -34,7 +34,6 @@ describe('eventsModuleGithubEventRouter', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
features: [eventsModuleGithubEventRouter()],
});
@@ -14,9 +14,7 @@
* limitations under the License.
*/
import { coreServices } from '@backstage/backend-plugin-api';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import {
HttpPostIngressOptions,
@@ -47,20 +45,22 @@ describe('eventsModuleGithubWebhook', () => {
},
};
const config = new ConfigReader({
events: {
modules: {
github: {
webhookSecret: secret,
},
},
},
});
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [[coreServices.rootConfig, config]],
features: [eventsModuleGithubWebhook()],
features: [
eventsModuleGithubWebhook(),
mockServices.rootConfig.factory({
data: {
events: {
modules: {
github: {
webhookSecret: secret,
},
},
},
},
}),
],
});
expect(addedIngress).not.toBeUndefined();
@@ -34,7 +34,6 @@ describe('eventsModuleGitlabEventRouter', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
features: [eventsModuleGitlabEventRouter()],
});
@@ -14,9 +14,7 @@
* limitations under the License.
*/
import { coreServices } from '@backstage/backend-plugin-api';
import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import {
HttpPostIngressOptions,
@@ -42,20 +40,22 @@ describe('gitlabWebhookEventsModule', () => {
},
};
const config = new ConfigReader({
events: {
modules: {
gitlab: {
webhookSecret: 'test-secret',
},
},
},
});
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [[coreServices.rootConfig, config]],
features: [eventsModuleGitlabWebhook()],
features: [
eventsModuleGitlabWebhook(),
mockServices.rootConfig.factory({
data: {
events: {
modules: {
gitlab: {
webhookSecret: 'test-secret',
},
},
},
},
}),
],
});
expect(addedIngress).not.toBeUndefined();
@@ -14,13 +14,13 @@
* limitations under the License.
*/
import { errorHandler, getVoidLogger } from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { errorHandler } from '@backstage/backend-common';
import {
coreServices,
createBackendModule,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import { startTestBackend } from '@backstage/backend-test-utils';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import {
TestEventBroker,
@@ -38,14 +38,6 @@ describe('eventPlugin', () => {
const publisher = new TestEventPublisher();
const subscriber = new TestEventSubscriber('sub', ['fake']);
const config = new ConfigReader({
events: {
http: {
topics: ['fake'],
},
},
});
const httpRouter = Router();
httpRouter.use(express.json());
httpRouter.use(errorHandler());
@@ -70,12 +62,25 @@ describe('eventPlugin', () => {
await startTestBackend({
extensionPoints: [],
services: [
[coreServices.rootConfig, config],
[coreServices.httpRouter, httpRouter],
[coreServices.logger, getVoidLogger()],
features: [
eventsPlugin(),
testModule(),
mockServices.logger.factory(),
mockServices.rootConfig.factory({
data: {
events: {
http: {
topics: ['fake'],
},
},
},
}),
createServiceFactory({
service: coreServices.httpRouter,
deps: {},
factory: async () => httpRouter,
}),
],
features: [eventsPlugin(), testModule()],
});
expect(publisher.eventBroker).toBe(eventBroker);
@@ -49,8 +49,8 @@ describe('searchModuleCatalogCollator', () => {
},
],
],
features: [searchModuleCatalogCollator()],
services: [
features: [
searchModuleCatalogCollator(),
mockServices.rootConfig.factory({
data: {
search: {
@@ -34,8 +34,8 @@ describe('searchModuleExploreCollator', () => {
extensionPoints: [
[searchIndexRegistryExtensionPoint, extensionPointMock],
],
features: [searchModuleExploreCollator()],
services: [
features: [
searchModuleExploreCollator(),
mockServices.rootConfig.factory({
data: {
search: {
@@ -34,8 +34,8 @@ describe('searchModuleTechDocsCollator', () => {
extensionPoints: [
[searchIndexRegistryExtensionPoint, extensionPointMock],
],
features: [searchModuleTechDocsCollator()],
services: [
features: [
searchModuleTechDocsCollator(),
mockServices.rootConfig.factory({
data: {
search: {