eventric
Version:
behavior-first application development
180 lines (138 loc) • 5.71 kB
text/coffeescript
describe 'Context Feature', ->
describe 'subscribing to a domain event by name and aggregate id', ->
it 'should call the handler function with the domain event given the event is emitted', (done) ->
aggregateId = null
exampleContext = eventric.context 'ExampleContext'
exampleContext.defineDomainEvents
'ExampleCreated': ->
'ExampleModified': ->
class ExampleAggregate
create: ->
@$emitDomainEvent 'ExampleCreated'
modify: ->
@$emitDomainEvent 'ExampleModified'
exampleContext.addAggregate 'Example', ExampleAggregate
exampleContext.addCommandHandlers
CreateExample: (params) ->
@$aggregate.create 'Example'
.then (example) ->
example.$save()
ModifyExample: (params) ->
@$aggregate.load 'Example', params.exampleId
.then (example) ->
example.modify params.exampleId
example.$save()
exampleContext.initialize()
.then ->
exampleContext.command 'CreateExample', {}
.then (exampleId) ->
exampleContext.subscribeToDomainEventWithAggregateId 'ExampleModified', exampleId, (domainEvent) ->
expect(domainEvent).to.be.ok
done()
exampleContext.command 'ModifyExample',
exampleId: exampleId
.catch done
return
describe 'adding projections', ->
it 'should call the initialize method of the projection', ->
exampleContext = eventric.context 'exampleContext'
projectionObject =
initialize: sandbox.stub().yields()
exampleContext.addProjection projectionObject
exampleContext.initialize()
.then ->
expect(projectionObject.initialize).to.have.been.called
it 'should correctly call the initialize methods of multiple projections', ->
exampleContext = eventric.context 'exampleContext'
firstProjection = initialize: sandbox.stub().yields()
secondProjection = initialize: sandbox.stub().yields()
exampleContext.addProjection firstProjection
exampleContext.addProjection secondProjection
exampleContext.initialize()
.then ->
expect(firstProjection.initialize).to.have.been.called
expect(secondProjection.initialize).to.have.been.called
describe 'destroying a context', ->
exampleContext = null
beforeEach ->
exampleContext = eventric.context 'ExampleContext'
it 'should reject with an error given a command is executed afterwards', ->
exampleContext.addCommandHandlers DoSomething: ->
commandParams = foo: 'bar'
exampleContext.destroy()
.then ->
exampleContext.command 'DoSomething', commandParams
.catch (error) ->
expect(error).to.be.an.instanceOf Error
expect(error.message).to.contain 'command'
expect(error.message).to.contain 'DoSomething'
expect(error.message).to.contain 'ExampleContext'
expect(error.message).to.match /"foo"\:\s*"bar"/
it 'should call destroy on the event bus', ->
EventBus = require 'eventric/event_bus'
sandbox.stub(EventBus::, 'destroy').returns Promise.resolve()
exampleContext.initialize()
.then ->
exampleContext.destroy()
.then ->
expect(EventBus::destroy).to.have.been.called
it 'should wait to resolve given there are ongoing command operations', ->
commandSpy = sandbox.spy()
exampleContext.addCommandHandlers
DoSomething: (params) ->
new Promise (resolve) ->
setTimeout ->
commandSpy params
resolve()
, 15
exampleContext.initialize()
.then ->
exampleContext.command 'DoSomething', call: 1
exampleContext.command 'DoSomething', call: 2
exampleContext.destroy()
.then ->
expect(commandSpy).to.have.been.calledWith call: 1
expect(commandSpy).to.have.been.calledWith call: 2
it 'should resolve correctly given previous command operations rejected', ->
commandSpy = sandbox.spy()
exampleContext.addCommandHandlers
DoSomething: (params) ->
new Promise (resolve, reject) ->
commandSpy params
reject()
exampleContext.initialize()
.then ->
exampleContext.command 'DoSomething', {}
exampleContext.destroy()
.then ->
expect(commandSpy).to.have.been.called
it 'should wait to resolve given a command which publishes a domain event \
which triggers another command with domain event', ->
exampleContext.addAggregate 'Example', class Example
create: ->
@$emitDomainEvent 'ExampleCreated', {}
modify: ->
@$emitDomainEvent 'ExampleModified', {}
exampleContext.defineDomainEvents
ExampleCreated: ->
ExampleModified: ->
exampleContext.addCommandHandlers
CreateExample: ->
@$aggregate.create 'Example'
.then (example) ->
example.$save()
ModifyExample: ({id}) ->
@$aggregate.load 'Example', id
.then (example) ->
example.modify()
example.$save()
exampleContext.subscribeToDomainEvent 'ExampleCreated', (domainEvent) ->
exampleContext.command 'ModifyExample', id: domainEvent.aggregate.id
domainEventHandlerStub = sandbox.stub()
exampleContext.subscribeToDomainEvent 'ExampleModified', domainEventHandlerStub
exampleContext.initialize()
.then ->
exampleContext.command 'CreateExample', {}
exampleContext.destroy()
.then ->
expect(domainEventHandlerStub).to.have.been.called