public void UowDispatcherNoUow()
        {
            var uowAdapter = new FakeUowAdapter();
            var storage    = new MemoryStorage();
            var context    = Substitute.For <IDownstreamContext>();
            var msg        = new DispatchEvent(new FakeEvent());

            var handler = new TransactionalHandler(uowAdapter, storage);

            handler.HandleDownstream(context, msg);

            context.Received().SendDownstream(msg);
        }
        public void UowDispatcher_UowNotReleased()
        {
            var uowAdapter = new FakeUowAdapter();
            var storage    = Substitute.For <IDomainEventStorage>();
            var context    = Substitute.For <IDownstreamContext>();
            var msg        = new DispatchEvent(new FakeEvent());
            var uowMapper  = new ThreadBatchIdMapper();

            var handler = new TransactionalHandler(uowAdapter, storage, uowMapper);

            uowAdapter.Observer.Create(uowAdapter);
            handler.HandleDownstream(context, msg);


            storage.Received().Hold(uowMapper.GetBatchId(), msg.DomainEvent);
        }
        public void UowDispatcher_UowReleasedFailed()
        {
            var uowAdapter = new FakeUowAdapter();
            var storage    = Substitute.For <IDomainEventStorage>();
            var context    = Substitute.For <IDownstreamContext>();
            var msg        = new DispatchEvent(new FakeEvent());
            var uowMapper  = new ThreadBatchIdMapper();
            var handler    = new TransactionalHandler(uowAdapter, storage, uowMapper);

            uowAdapter.Observer.Create(uowAdapter);
            var batchId = uowMapper.GetBatchId();

            storage.Release(batchId).Returns(new[] { new FakeEvent() });

            handler.HandleDownstream(context, msg);
            context.DidNotReceive().SendDownstream(msg);
            uowAdapter.Observer.Released(uowAdapter, false);


            storage.Received().Hold(batchId, msg.DomainEvent);
            storage.Received().Delete(batchId);
            context.DidNotReceive().SendDownstream(Arg.Any <DispatchEvent>());
        }