Skip to content

Commit cad8537

Browse files
author
Juan Marín
committed
test: add coverage for handler registry and event bus
1 parent 68ef1f0 commit cad8537

15 files changed

+206
-101
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ node_js:
99
- '11'
1010
- '8'
1111
script:
12-
- npm run test:prod && npm run build
12+
- npm run build
1313
after_success:
1414
- npm run travis-deploy-once "npm run report-coverage"
1515
branches:

example/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,26 @@ const app = new ReactiveCommons(broker, registry, {
77
})
88

99
registry.listenEvent<string>('myInstance.appCreated', event => {
10-
console.log(`Evento recibido: ${event.data}`)
10+
console.log(`Event received: ${event.data}`)
1111
return Promise.resolve()
1212
})
1313

14-
registry.serverQuery<string, string>('cosa.traeme', request => {
14+
registry.serveQuery<string, string>('cosa.traeme', request => {
1515
return new Promise((resolve, reject) => {
16-
setTimeout(() => resolve('holiii ' + request.queryData), 0)
16+
setTimeout(() => resolve('hi ' + request.queryData), 0)
1717
})
1818
})
1919

2020
app
2121
.start()
2222
.then(connection => {
23-
connection.onConnect(() => console.log('Nos conectamos mi pana'))
23+
connection.onConnect(() => console.log('Connection stablished'))
2424
connection.onDisconnect(err => console.error(err))
2525

2626
const appCreated = createEvent<string>('myInstance.appCreated')
2727
connection.eventBus
28-
.emit(appCreated('133', 'holi'))
28+
.emit(appCreated('133', 'myApp'))
2929
.then(() => console.log('this will succeed'))
3030
.catch(err => console.error(err))
3131
})
32-
.catch(err => console.error(`Esto se puteó`, err))
32+
.catch(err => console.error('Error initializing app', err))

package-lock.json

Lines changed: 11 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/domain/api/handler-registry.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { EventEmitter } from 'events'
99
export class HandlerRegistry {
1010
private _commandHandlers: HandlerRegistryRoutes<CommandHandler<any>> = {}
1111
private _queryHandlers: HandlerRegistryRoutes<QueryHandler<any, any>> = {}
12-
private _eventListeners: HandlerRegistryRoutes<EventListener<any>> = {}
12+
private _eventListeners: HandlerRegistryRoutes<Array<EventListener<any>>> = {}
1313
private eventListenersUpdates: EventEmitter
1414

1515
get commandHandlers() {
@@ -32,24 +32,32 @@ export class HandlerRegistry {
3232
return new HandlerRegistry()
3333
}
3434

35-
public getCommandHandlers<M>(name: string): CommandHandler<M>[] {
36-
return this.commandHandlers[name] || []
35+
public getCommandHandler<M>(name: string): CommandHandler<M> {
36+
return this.commandHandlers[name]
3737
}
3838

39-
public getQueryHandlers<M, R>(resource: string): QueryHandler<M, R>[] {
40-
return this.queryHandlers[resource] || []
39+
public getQueryHandler<M, R>(resource: string): QueryHandler<M, R> {
40+
return this.queryHandlers[resource]
4141
}
4242

4343
public getEventListeners<M>(name: string): EventListener<M>[] {
4444
return this.eventListeners[name] || []
4545
}
4646

4747
public handleCommand<M>(name: string, handler: CommandHandler<M>): void {
48-
this.push(this.commandHandlers, name, handler)
48+
if (this.commandHandlers[name]) {
49+
throw new Error(`Command ${name} already registered`)
50+
}
51+
52+
this.commandHandlers[name] = handler
4953
}
5054

51-
public serverQuery<M, R>(resource: string, handler: QueryHandler<M, R>): void {
52-
this.push(this.queryHandlers, resource, handler)
55+
public serveQuery<M, R>(resource: string, handler: QueryHandler<M, R>): void {
56+
if (this.queryHandlers[resource]) {
57+
throw new Error(`Query ${resource} already registered`)
58+
}
59+
60+
this.queryHandlers[resource] = handler
5361
}
5462

5563
public listenEvent<M>(name: string, listener: EventListener<M>): void {
@@ -61,7 +69,7 @@ export class HandlerRegistry {
6169
this.eventListenersUpdates.on('eventListenerPushed', handle)
6270
}
6371

64-
private push<H>(routes: HandlerRegistryRoutes<H>, path: string, handler: H) {
72+
private push<H>(routes: HandlerRegistryRoutes<Array<H>>, path: string, handler: H) {
6573
if (!routes[path]) {
6674
routes[path] = []
6775
}

src/domain/api/listeners/query-listener.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,9 @@ export class QueryListener {
2828
`${this.config.appName}.queries`,
2929
message => {
3030
const query = message.data
31-
const handlers = this.registry
32-
.getQueryHandlers(query.resource)
33-
.map(handler => handler(query).then(response => this.publishResponse(message, response)))
31+
const handler = this.registry.getQueryHandler(query.resource)
3432

35-
return Promise.all(handlers).then()
33+
return handler(query).then(response => this.publishResponse(message, response))
3634
}
3735
)
3836
}

src/domain/api/reactive-commons.ts

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -27,50 +27,4 @@ export class ReactiveCommons {
2727
queryListener.startListening()
2828
]).then(() => connection)
2929
}
30-
31-
private listenForEvents(connection: Connection) {
32-
return connection.receiver.consume(`${this.config.appName}.subscribedEvents`, message => {
33-
console.log(message)
34-
return Promise.resolve()
35-
})
36-
}
37-
38-
private declareEventsTopic(connectioon: Connection): Promise<void> {
39-
return connectioon.sender.declareTopic({
40-
name: 'domainEvents',
41-
type: 'topic'
42-
})
43-
}
44-
45-
private declareDirectMessagesTopic(connection: Connection): Promise<void> {
46-
return connection.sender.declareTopic({
47-
name: 'directMessages',
48-
type: 'direct'
49-
})
50-
}
51-
52-
private declareCommandsQueue(connection: Connection): Promise<void> {
53-
return connection.sender.declareQueue({
54-
name: `${this.config.appName}.commands`
55-
})
56-
}
57-
58-
private declareQueriesQueue(connection: Connection): Promise<void> {
59-
return connection.sender.declareQueue({
60-
name: `${this.config.appName}.queries`
61-
})
62-
}
63-
64-
private declareEventsQueue(connection: Connection): Promise<void> {
65-
return connection.sender.declareQueue({
66-
name: `${this.config.appName}.subscribedEvents`
67-
})
68-
}
69-
70-
private declareReplyQueue(connection: Connection): Promise<void> {
71-
return connection.sender.declareQueue({
72-
name: `${this.config.appName}.${connection.id}.replies`,
73-
exclusive: true
74-
})
75-
}
7630
}

src/domain/model/message-handlers.model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ export type QueryHandler<M, R> = (message: Query<M>) => Promise<R>
55
export type EventListener<M> = (message: Event<M>) => Promise<void>
66

77
export type HandlerRegistryRoutes<H> = {
8-
[path: string]: H[]
8+
[path: string]: H
99
}

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ export { AmqpReceiver } from './adapter/amqp/amqp-receiver'
44
export { AmqpSender } from './adapter/amqp/amqp-sender'
55
export { HandlerRegistry } from './domain/api/handler-registry'
66
export { createCommand, createEvent, createQuery } from './domain/api/message-factory'
7+
export { ReactiveCommons } from './domain/api/reactive-commons'
8+
export { Message } from './domain/model/broker.model'
79
export { Command, Event, Query } from './domain/model/messages.model'
810
export {
911
BindingSpecification,
1012
QueueSpecitication,
1113
TopicSpecification
1214
} from './domain/model/resources.model'
13-
export { ReactiveCommons } from './domain/api/reactive-commons'

test/adapter/amqp-broker.test.ts renamed to test/adapter/amqp/amqp-broker.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { connect } from 'amqp-connection-manager'
22
import { ConnectionOptions } from 'tls'
3-
import { AmqpBroker } from '../../src'
4-
import { AmqpConnection } from '../../src/adapter/amqp/amqp-connection'
3+
import { AmqpBroker } from '../../../src'
4+
import { AmqpConnection } from '../../../src/adapter/amqp/amqp-connection'
55

66
jest.mock('amqp-connection-manager')
7-
jest.mock('../../src/adapter/amqp/amqp-connection')
7+
jest.mock('../../../src/adapter/amqp/amqp-connection')
88

99
const url = 'amqp://myrabbitserver'
1010
const options: ConnectionOptions = { timeout: 10 }

test/adapter/amqp-connection.test.ts renamed to test/adapter/amqp/amqp-connection.test.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import { AmqpConnectionManager } from 'amqp-connection-manager'
2-
import { AmqpConnection, AmqpSender, AmqpReceiver } from '../../src'
2+
import { AmqpConnection, AmqpReceiver, AmqpSender } from '../../../src'
3+
import { EventBus } from '../../../src/domain/api/emitters/event-bus'
4+
5+
jest.mock('../../../src/domain/api/emitters/event-bus')
6+
jest.mock('../../../src/adapter/amqp/amqp-sender')
7+
jest.mock('../../../src/adapter/amqp/amqp-receiver')
8+
39

410
describe(`AMQP connection`, () => {
511
let createChannelMock
@@ -29,6 +35,12 @@ describe(`AMQP connection`, () => {
2935
expect(receiver).toBeInstanceOf(AmqpReceiver)
3036
})
3137

38+
it(`creates EventBus instance`, () => {
39+
const receiver = connection.eventBus
40+
41+
expect(receiver).toBeInstanceOf(EventBus)
42+
})
43+
3244
it(`calls onConnect callback when connectionManager emits it`, () => {
3345
const url = 'amqp://myrabbitserver'
3446

0 commit comments

Comments
 (0)