예제 #1
0
        public void can_retrieve_correlated_aggregate()
        {
            var command1 = CorrelatedMessage.NewRoot();
            var id       = Guid.NewGuid();
            var agg      = new CorrelatedAggregate(id, command1);

            agg.RaiseCorrelatedEvent();
            agg.RaiseCorrelatedEvent();
            _repo.Save(agg);

            var command2  = CorrelatedMessage.NewRoot();
            var recovered = _repo.GetById <CorrelatedAggregate>(id, command2);

            Assert.NotNull(recovered);
            Assert.Equal(2, recovered.Version);//zero based, includes created

            recovered.RaiseCorrelatedEvent();
            recovered.RaiseCorrelatedEvent();

            _repo.Save(recovered);
            var command3   = CorrelatedMessage.NewRoot();
            var recovered2 = _repo.GetById <CorrelatedAggregate>(id, command3);

            Assert.NotNull(recovered2);
            Assert.Equal(4, recovered2.Version);
        }
예제 #2
0
        public void taking_events_removes_source()
        {
            var agg = new CorrelatedAggregate();

            agg.ApplyNewSource(_command);
            agg.RaiseCorrelatedEvent();
            var evt = agg.TakeEvents()[0] as CorrelatedAggregate.CorrelatedEvent;

            Assert.NotNull(evt);
            Assert.Throws <NullReferenceException>(() => agg.RaiseCorrelatedEvent());
            Assert.Empty(agg.TakeEvents());
        }
예제 #3
0
        public void cannot_raise_events_without_source()
        {
            var otherRoot = CorrelatedMessage.NewRoot();
            var agg       = new CorrelatedAggregate();

            Assert.Throws <NullReferenceException>(() => agg.RaiseCorrelatedEvent());
            Assert.Throws <InvalidOperationException>(() => agg.RaiseUncorrelatedEvent());
            Assert.Throws <InvalidOperationException>(() => agg.RaiseExternallyCorrelatedEvent(otherRoot));
            agg.ApplyNewSource(otherRoot);
            agg.RaiseCorrelatedEvent();
            var evt = agg.TakeEvents()[0] as CorrelatedAggregate.CorrelatedEvent;

            Assert.NotNull(evt);
            Assert.Throws <NullReferenceException>(() => agg.RaiseCorrelatedEvent());
            Assert.Empty(agg.TakeEvents());
        }
예제 #4
0
        public void correlation_and_causation_are_injected()
        {
            var command1 = MessageBuilder.New(() => new TestCommands.Command1());
            var id       = Guid.NewGuid();
            var agg      = new CorrelatedAggregate(id, command1);

            agg.RaiseCorrelatedEvent();
            agg.RaiseCorrelatedEvent();

            var raisedEvents = ((IEventSource)agg).TakeEvents();

            Assert.Collection(raisedEvents,
                              @event => {
                var created = @event as CorrelatedAggregate.Created;
                Assert.NotNull(created);
                Assert.Equal(command1.MsgId, created.CausationId);
                Assert.Equal(command1.CorrelationId, created.CorrelationId);
            },
                              @event => {
                var corrEvent = @event as CorrelatedAggregate.CorrelatedEvent;
                Assert.NotNull(corrEvent);
                Assert.Equal(command1.MsgId, corrEvent.CausationId);
                Assert.Equal(command1.CorrelationId, corrEvent.CorrelationId);
            },
                              @event => {
                var corrEvent = @event as CorrelatedAggregate.CorrelatedEvent;
                Assert.NotNull(corrEvent);
                Assert.Equal(command1.MsgId, corrEvent.CausationId);
                Assert.Equal(command1.CorrelationId, corrEvent.CorrelationId);
            });
            var command2 = MessageBuilder.New(() => new TestCommands.Command2());

            ((ICorrelatedEventSource)agg).Source = command2;

            agg.RaiseCorrelatedEvent();
            raisedEvents = ((IEventSource)agg).TakeEvents();
            Assert.Collection(raisedEvents,
                              @event => {
                var corrEvent = @event as CorrelatedAggregate.CorrelatedEvent;
                Assert.NotNull(corrEvent);
                Assert.Equal(command2.MsgId, corrEvent.CausationId);
                Assert.Equal(command2.CorrelationId, corrEvent.CorrelationId);
            });
        }
예제 #5
0
        public void source_is_not_persisted()
        {
            var command1 = CorrelatedMessage.NewRoot();
            var id       = Guid.NewGuid();
            var agg      = new CorrelatedAggregate(id, command1);

            agg.RaiseCorrelatedEvent();
            agg.RaiseCorrelatedEvent();
            _stdRepo.Save(agg);

            var command2  = CorrelatedMessage.NewRoot();
            var recovered = _stdRepo.GetById <CorrelatedAggregate>(id);

            Assert.NotNull(recovered);
            Assert.Equal(2, recovered.Version);//zero based, includes created

            //no source has been set
            Assert.Throws <NullReferenceException>(() => recovered.RaiseCorrelatedEvent());
            recovered.ApplyNewSource(command2);
            recovered.RaiseCorrelatedEvent();
        }
예제 #6
0
        public void source_is_not_persisted()
        {
            var command1 = MessageBuilder.New(() => new TestCommands.Command1());
            var id       = Guid.NewGuid();
            var agg      = new CorrelatedAggregate(id, command1);

            agg.RaiseCorrelatedEvent();
            agg.RaiseCorrelatedEvent();
            _stdRepo.Save(agg);

            var command2  = MessageBuilder.New(() => new TestCommands.Command2());
            var recovered = _stdRepo.GetById <CorrelatedAggregate>(id);

            Assert.NotNull(recovered);
            Assert.Equal(2, recovered.Version);//zero based, includes created

            //no source has been set
            Assert.Throws <InvalidOperationException>(() => recovered.RaiseCorrelatedEvent());
            ((ICorrelatedEventSource)recovered).Source = command2;
            recovered.RaiseCorrelatedEvent();
        }
예제 #7
0
        public void after_taking_events_new_source_may_be_applied()
        {
            var agg = new CorrelatedAggregate();

            agg.ApplyNewSource(_command);
            agg.RaiseCorrelatedEvent();
            var evt = agg.TakeEvents()[0] as CorrelatedAggregate.CorrelatedEvent;

            Assert.NotNull(evt);
            Assert.Equal(_command.CorrelationId, evt.CorrelationId);
            Assert.Equal(_command.MsgId, evt.SourceId);
            Assert.Throws <NullReferenceException>(() => agg.RaiseCorrelatedEvent());
            Assert.Empty(agg.TakeEvents());
            var otherRoot = CorrelatedMessage.NewRoot();

            agg.ApplyNewSource(otherRoot);
            agg.RaiseCorrelatedEvent();
            evt = agg.TakeEvents()[0] as CorrelatedAggregate.CorrelatedEvent;
            Assert.NotNull(evt);
            Assert.Equal(otherRoot.CorrelationId, evt.CorrelationId);
            Assert.Equal(otherRoot.MsgId, evt.SourceId);
        }
예제 #8
0
        public void can_raise_correlated_events_from_constructor_source()
        {
            var agg = new CorrelatedAggregate(Guid.NewGuid(), _command);

            agg.RaiseCorrelatedEvent();
            var events = agg.TakeEvents();

            Assert.Collection(events, new Action <object>[] {
                e => {
                    if (e is CorrelatedAggregate.Created created)
                    {
                        Assert.Equal(_command.CorrelationId, created.CorrelationId);
                        Assert.Equal(_command.MsgId, created.CausationId);
                    }
                    else
                    {
                        throw new Exception("wrong event");
                    };
                },
예제 #9
0
        public void can_raise_correlated_events()
        {
            var agg = new CorrelatedAggregate();

            agg.ApplyNewSource(_command);
            agg.RaiseCorrelatedEvent();
            agg.RaiseCorrelatedEventByIds();
            var events = agg.TakeEvents();

            Assert.Equal(2, events.Length);
            var @event = events[0] as CorrelatedAggregate.CorrelatedEvent;

            Assert.NotNull(@event);
            Assert.Equal(_command.CorrelationId, @event.CorrelationId);
            Assert.Equal(_command.MsgId, @event.SourceId);

            @event = events[1] as CorrelatedAggregate.CorrelatedEvent;
            Assert.NotNull(@event);
            Assert.Equal(_command.CorrelationId, @event.CorrelationId);
            Assert.Equal(_command.MsgId, @event.SourceId);
        }