Skip to content

Commit

Permalink
feat(events): add event service
Browse files Browse the repository at this point in the history
Signed-off-by: Patrick Jungermann <Patrick.Jungermann@gmail.com>
  • Loading branch information
pjungermann committed Jan 21, 2024
1 parent de15284 commit 21cca84
Show file tree
Hide file tree
Showing 56 changed files with 859 additions and 382 deletions.
3 changes: 2 additions & 1 deletion plugins/events-backend-module-azure/api-report.md
Expand Up @@ -4,11 +4,12 @@
```ts
import { EventParams } from '@backstage/plugin-events-node';
import { EventService } from '@backstage/plugin-events-node';
import { SubTopicEventRouter } from '@backstage/plugin-events-node';

// @public
export class AzureDevOpsEventRouter extends SubTopicEventRouter {
constructor();
constructor(options: { eventService: EventService });
// (undocumented)
protected determineSubTopic(params: EventParams): string | undefined;
}
Expand Down
Expand Up @@ -14,37 +14,44 @@
* limitations under the License.
*/

import { TestEventBroker } from '@backstage/plugin-events-backend-test-utils';
import { TestEventService } from '@backstage/plugin-events-backend-test-utils';
import { AzureDevOpsEventRouter } from './AzureDevOpsEventRouter';

describe('AzureDevOpsEventRouter', () => {
const eventRouter = new AzureDevOpsEventRouter();
const eventService = new TestEventService();
const eventRouter = new AzureDevOpsEventRouter({ eventService });
const topic = 'azureDevOps';
const eventPayload = { eventType: 'test.type', test: 'payload' };
const metadata = {};

it('no $.eventType', () => {
const eventBroker = new TestEventBroker();
eventRouter.setEventBroker(eventBroker);
beforeEach(() => {
eventService.reset();
});

it('subscribed to topic', () => {
eventRouter.subscribe();

expect(eventService.subscribed).toHaveLength(1);
expect(eventService.subscribed[0].id).toEqual('AzureDevOpsEventRouter');
expect(eventService.subscribed[0].topics).toEqual([topic]);
});

it('no $.eventType', () => {
eventRouter.onEvent({
topic,
eventPayload: { invalid: 'payload' },
metadata,
});

expect(eventBroker.published).toEqual([]);
expect(eventService.published).toEqual([]);
});

it('with $.eventType', () => {
const eventBroker = new TestEventBroker();
eventRouter.setEventBroker(eventBroker);

eventRouter.onEvent({ topic, eventPayload, metadata });

expect(eventBroker.published.length).toBe(1);
expect(eventBroker.published[0].topic).toEqual('azureDevOps.test.type');
expect(eventBroker.published[0].eventPayload).toEqual(eventPayload);
expect(eventBroker.published[0].metadata).toEqual(metadata);
expect(eventService.published).toHaveLength(1);
expect(eventService.published[0].topic).toEqual('azureDevOps.test.type');
expect(eventService.published[0].eventPayload).toEqual(eventPayload);
expect(eventService.published[0].metadata).toEqual(metadata);
});
});
Expand Up @@ -16,6 +16,7 @@

import {
EventParams,
EventService,
SubTopicEventRouter,
} from '@backstage/plugin-events-node';

Expand All @@ -27,8 +28,11 @@ import {
* @public
*/
export class AzureDevOpsEventRouter extends SubTopicEventRouter {
constructor() {
super('azureDevOps');
constructor(options: { eventService: EventService }) {
super({
eventService: options.eventService,
topic: 'azureDevOps',
});
}

protected determineSubTopic(params: EventParams): string | undefined {
Expand Down
Expand Up @@ -14,32 +14,28 @@
* limitations under the License.
*/

import { createServiceFactory } from '@backstage/backend-plugin-api';
import { startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import { TestEventService } from '@backstage/plugin-events-backend-test-utils';
import { eventServiceRef } from '@backstage/plugin-events-node';
import { eventsModuleAzureDevOpsEventRouter } from './eventsModuleAzureDevOpsEventRouter';
import { AzureDevOpsEventRouter } from '../router/AzureDevOpsEventRouter';

describe('eventsModuleAzureDevOpsEventRouter', () => {
it('should be correctly wired and set up', async () => {
let addedPublisher: AzureDevOpsEventRouter | undefined;
let addedSubscriber: AzureDevOpsEventRouter | undefined;
const extensionPoint = {
addPublishers: (publisher: any) => {
addedPublisher = publisher;
const eventService = new TestEventService();
const eventServiceFactory = createServiceFactory({
service: eventServiceRef,
deps: {},
async factory({}) {
return eventService;
},
addSubscribers: (subscriber: any) => {
addedSubscriber = subscriber;
},
};
});

await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
features: [eventsModuleAzureDevOpsEventRouter()],
features: [eventServiceFactory(), eventsModuleAzureDevOpsEventRouter()],
});

expect(addedPublisher).not.toBeUndefined();
expect(addedPublisher).toBeInstanceOf(AzureDevOpsEventRouter);
expect(addedSubscriber).not.toBeUndefined();
expect(addedSubscriber).toBeInstanceOf(AzureDevOpsEventRouter);
expect(eventService.subscribed).toHaveLength(1);
expect(eventService.subscribed[0].id).toEqual('AzureDevOpsEventRouter');
});
});
Expand Up @@ -15,7 +15,7 @@
*/

import { createBackendModule } from '@backstage/backend-plugin-api';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import { eventServiceRef } from '@backstage/plugin-events-node';
import { AzureDevOpsEventRouter } from '../router/AzureDevOpsEventRouter';

/**
Expand All @@ -31,13 +31,11 @@ export const eventsModuleAzureDevOpsEventRouter = createBackendModule({
register(env) {
env.registerInit({
deps: {
events: eventsExtensionPoint,
eventService: eventServiceRef,
},
async init({ events }) {
const eventRouter = new AzureDevOpsEventRouter();

events.addPublishers(eventRouter);
events.addSubscribers(eventRouter);
async init({ eventService }) {
const eventRouter = new AzureDevOpsEventRouter({ eventService });
await eventRouter.subscribe();
},
});
},
Expand Down
3 changes: 2 additions & 1 deletion plugins/events-backend-module-bitbucket-cloud/api-report.md
Expand Up @@ -4,11 +4,12 @@
```ts
import { EventParams } from '@backstage/plugin-events-node';
import { EventService } from '@backstage/plugin-events-node';
import { SubTopicEventRouter } from '@backstage/plugin-events-node';

// @public
export class BitbucketCloudEventRouter extends SubTopicEventRouter {
constructor();
constructor(options: { eventService: EventService });
// (undocumented)
protected determineSubTopic(params: EventParams): string | undefined;
}
Expand Down
Expand Up @@ -14,33 +14,40 @@
* limitations under the License.
*/

import { TestEventBroker } from '@backstage/plugin-events-backend-test-utils';
import { TestEventService } from '@backstage/plugin-events-backend-test-utils';
import { BitbucketCloudEventRouter } from './BitbucketCloudEventRouter';

describe('BitbucketCloudEventRouter', () => {
const eventRouter = new BitbucketCloudEventRouter();
const eventService = new TestEventService();
const eventRouter = new BitbucketCloudEventRouter({ eventService });
const topic = 'bitbucketCloud';
const eventPayload = { test: 'payload' };
const metadata = { 'x-event-key': 'test:type' };

it('no x-event-key', () => {
const eventBroker = new TestEventBroker();
eventRouter.setEventBroker(eventBroker);
beforeEach(() => {
eventService.reset();
});

it('subscribed to topic', () => {
eventRouter.subscribe();

expect(eventService.subscribed).toHaveLength(1);
expect(eventService.subscribed[0].id).toEqual('BitbucketCloudEventRouter');
expect(eventService.subscribed[0].topics).toEqual([topic]);
});

it('no x-event-key', () => {
eventRouter.onEvent({ topic, eventPayload });

expect(eventBroker.published).toEqual([]);
expect(eventService.published).toEqual([]);
});

it('with x-event-key', () => {
const eventBroker = new TestEventBroker();
eventRouter.setEventBroker(eventBroker);

eventRouter.onEvent({ topic, eventPayload, metadata });

expect(eventBroker.published.length).toBe(1);
expect(eventBroker.published[0].topic).toEqual('bitbucketCloud.test:type');
expect(eventBroker.published[0].eventPayload).toEqual(eventPayload);
expect(eventBroker.published[0].metadata).toEqual(metadata);
expect(eventService.published.length).toBe(1);
expect(eventService.published[0].topic).toEqual('bitbucketCloud.test:type');
expect(eventService.published[0].eventPayload).toEqual(eventPayload);
expect(eventService.published[0].metadata).toEqual(metadata);
});
});
Expand Up @@ -16,6 +16,7 @@

import {
EventParams,
EventService,
SubTopicEventRouter,
} from '@backstage/plugin-events-node';

Expand All @@ -27,8 +28,11 @@ import {
* @public
*/
export class BitbucketCloudEventRouter extends SubTopicEventRouter {
constructor() {
super('bitbucketCloud');
constructor(options: { eventService: EventService }) {
super({
eventService: options.eventService,
topic: 'bitbucketCloud',
});
}

protected determineSubTopic(params: EventParams): string | undefined {
Expand Down
Expand Up @@ -14,32 +14,31 @@
* limitations under the License.
*/

import { createServiceFactory } from '@backstage/backend-plugin-api';
import { startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import { TestEventService } from '@backstage/plugin-events-backend-test-utils';
import { eventServiceRef } from '@backstage/plugin-events-node';
import { eventsModuleBitbucketCloudEventRouter } from './eventsModuleBitbucketCloudEventRouter';
import { BitbucketCloudEventRouter } from '../router/BitbucketCloudEventRouter';

describe('eventsModuleBitbucketCloudEventRouter', () => {
it('should be correctly wired and set up', async () => {
let addedPublisher: BitbucketCloudEventRouter | undefined;
let addedSubscriber: BitbucketCloudEventRouter | undefined;
const extensionPoint = {
addPublishers: (publisher: any) => {
addedPublisher = publisher;
const eventService = new TestEventService();
const eventServiceFactory = createServiceFactory({
service: eventServiceRef,
deps: {},
async factory({}) {
return eventService;
},
addSubscribers: (subscriber: any) => {
addedSubscriber = subscriber;
},
};
});

await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
features: [eventsModuleBitbucketCloudEventRouter()],
features: [
eventServiceFactory(),
eventsModuleBitbucketCloudEventRouter(),
],
});

expect(addedPublisher).not.toBeUndefined();
expect(addedPublisher).toBeInstanceOf(BitbucketCloudEventRouter);
expect(addedSubscriber).not.toBeUndefined();
expect(addedSubscriber).toBeInstanceOf(BitbucketCloudEventRouter);
expect(eventService.subscribed).toHaveLength(1);
expect(eventService.subscribed[0].id).toEqual('BitbucketCloudEventRouter');
});
});
Expand Up @@ -15,7 +15,7 @@
*/

import { createBackendModule } from '@backstage/backend-plugin-api';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import { eventServiceRef } from '@backstage/plugin-events-node';
import { BitbucketCloudEventRouter } from '../router/BitbucketCloudEventRouter';

/**
Expand All @@ -31,13 +31,11 @@ export const eventsModuleBitbucketCloudEventRouter = createBackendModule({
register(env) {
env.registerInit({
deps: {
events: eventsExtensionPoint,
eventService: eventServiceRef,
},
async init({ events }) {
const eventRouter = new BitbucketCloudEventRouter();

events.addPublishers(eventRouter);
events.addSubscribers(eventRouter);
async init({ eventService }) {
const eventRouter = new BitbucketCloudEventRouter({ eventService });
await eventRouter.subscribe();
},
});
},
Expand Down
3 changes: 2 additions & 1 deletion plugins/events-backend-module-gerrit/api-report.md
Expand Up @@ -4,11 +4,12 @@
```ts
import { EventParams } from '@backstage/plugin-events-node';
import { EventService } from '@backstage/plugin-events-node';
import { SubTopicEventRouter } from '@backstage/plugin-events-node';

// @public
export class GerritEventRouter extends SubTopicEventRouter {
constructor();
constructor(options: { eventService: EventService });
// (undocumented)
protected determineSubTopic(params: EventParams): string | undefined;
}
Expand Down

0 comments on commit 21cca84

Please sign in to comment.