Skip to content

Commit be37d69

Browse files
committed
Add feature test for courses counter
1 parent ee8ea8f commit be37d69

File tree

23 files changed

+141
-97
lines changed

23 files changed

+141
-97
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"scripts": {
1414
"dev": "NODE_ENV=dev ts-node-dev --ignore-watch node_modules --inspect=0.0.0.0:9267 ./src/apps/mooc_backend/server.ts",
1515
"test": "npm run test:unit && npm run test:features",
16-
"test:unit": "NODE_ENV=test jest --watch",
16+
"test:unit": "NODE_ENV=test jest",
1717
"test:features": "NODE_ENV=test cucumber-js -p default",
1818
"start": "NODE_ENV=production node dist/src/apps/mooc_backend/server",
1919
"build": "npm run build:clean && npm run build:tsc && npm run build:di",

src/Contexts/Mooc/Courses/domain/CourseCreatedDomainEvent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export class CourseCreatedDomainEvent extends DomainEvent {
3737
};
3838
}
3939

40-
static fromPrimitive(
40+
static fromPrimitives(
4141
aggregateId: string,
4242
body: CreateCourseDomainEventBody,
4343
eventId: string,

src/Contexts/Mooc/CoursesCounter/application/Increment/IncrementCoursesCounterOnCourseCreated.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export class IncrementCoursesCounterOnCourseCreated implements DomainEventSubscr
1010
return [CourseCreatedDomainEvent.EVENT_NAME];
1111
}
1212

13-
on(domainEvent: CourseCreatedDomainEvent): void {
14-
this.incrementer.run(new CourseId(domainEvent.aggregateId));
13+
async on(domainEvent: CourseCreatedDomainEvent) {
14+
await this.incrementer.run(new CourseId(domainEvent.aggregateId));
1515
}
1616
}

src/Contexts/Shared/domain/DomainEventSubscriber.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ import { DomainEvent } from './DomainEvent';
33
export interface DomainEventSubscriber<T extends DomainEvent> {
44
subscribedTo(): Array<string>;
55

6-
on(domainEvent: T): void;
6+
on(domainEvent: T): Promise<void>;
77
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { DomainEvent } from './DomainEvent';
2+
import { DomainEventSubscriber } from './DomainEventSubscriber';
23

34
export interface EventBus {
4-
publish(events: Array<DomainEvent>): void;
5+
publish(events: Array<DomainEvent>): Promise<void>;
6+
addSubscribers(subscribers: Array<DomainEventSubscriber<DomainEvent>>): void;
57
}

src/Contexts/Shared/infrastructure/EventEmitterBus.ts renamed to src/Contexts/Shared/infrastructure/EventBus/EventEmitterBus.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { DomainEvent } from '../domain/DomainEvent';
2-
import { DomainEventSubscriber } from '../domain/DomainEventSubscriber';
1+
import { DomainEvent } from '../../domain/DomainEvent';
2+
import { DomainEventSubscriber } from '../../domain/DomainEventSubscriber';
33
import { EventEmitter } from 'events';
44

55
export class EventEmitterBus extends EventEmitter {
@@ -9,7 +9,7 @@ export class EventEmitterBus extends EventEmitter {
99
this.registerSubscribers(subscribers);
1010
}
1111

12-
private registerSubscribers(subscribers?: DomainEventSubscriber<DomainEvent>[]) {
12+
registerSubscribers(subscribers?: DomainEventSubscriber<DomainEvent>[]) {
1313
subscribers?.map(subscriber => {
1414
this.registerSubscriber(subscriber);
1515
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { DomainEvent } from '../../domain/DomainEvent';
2+
import { DomainEventSubscriber } from '../../domain/DomainEventSubscriber';
3+
import { EventBus } from '../../domain/EventBus';
4+
import { EventEmitterBus } from './EventEmitterBus';
5+
6+
export class InMemoryAsyncEventBus implements EventBus {
7+
private bus: EventEmitterBus;
8+
9+
constructor(subscribers: Array<DomainEventSubscriber<DomainEvent>>) {
10+
this.bus = new EventEmitterBus(subscribers);
11+
}
12+
13+
async publish(events: DomainEvent[]): Promise<void> {
14+
this.bus.publish(events);
15+
}
16+
17+
addSubscribers(subscribers: Array<DomainEventSubscriber<DomainEvent>>) {
18+
this.bus.registerSubscribers(subscribers);
19+
}
20+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { EventBus } from '../../domain/EventBus';
2+
import { DomainEvent } from '../../domain/DomainEvent';
3+
import { DomainEventSubscriber } from '../../domain/DomainEventSubscriber';
4+
5+
type Subscription = {
6+
boundedCallback: Function;
7+
originalCallback: Function;
8+
};
9+
10+
export class InMemorySyncEventBus implements EventBus {
11+
private subscriptions: Map<string, Array<Subscription>>;
12+
13+
constructor() {
14+
this.subscriptions = new Map();
15+
}
16+
17+
async publish(events: Array<DomainEvent>): Promise<void> {
18+
const executions: any = [];
19+
events.map(event => {
20+
const subscribers = this.subscriptions.get(event.eventName);
21+
if (subscribers) {
22+
return subscribers.map(subscriber => executions.push(subscriber.boundedCallback(event)));
23+
}
24+
});
25+
26+
await Promise.all(executions);
27+
}
28+
29+
addSubscribers(subscribers: Array<DomainEventSubscriber<DomainEvent>>) {
30+
subscribers.map(subscriber => subscriber.subscribedTo().map(event => this.subscribe(event, subscriber)));
31+
}
32+
33+
private subscribe(topic: string, subscriber: DomainEventSubscriber<DomainEvent>): void {
34+
const currentSubscriptions = this.subscriptions.get(topic);
35+
const subscription = { boundedCallback: subscriber.on.bind(subscriber), originalCallback: subscriber.on };
36+
if (currentSubscriptions) {
37+
currentSubscriptions.push(subscription);
38+
} else {
39+
this.subscriptions.set(topic, [subscription]);
40+
}
41+
}
42+
}

src/Contexts/Shared/infrastructure/InMemoryAsyncEventBus.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/apps/mooc_backend/app.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import express from 'express';
33
import helmet from 'helmet';
44
import compress from 'compression';
55
import { registerRoutes } from './routes';
6+
import { registerSubscribers } from './subscribers';
67

78
const app: express.Express = express();
89

@@ -17,5 +18,6 @@ app.use(helmet.frameguard({ action: 'deny' }));
1718
app.use(compress());
1819

1920
registerRoutes(app);
21+
registerSubscribers();
2022

2123
export default app;

0 commit comments

Comments
 (0)