public void OrderPostSavePipelineHooksByOrderThenByNameReversed()
            {
                var pipelineHooks = new PipelineHook[] { new PipelineHookC(), new PipelineHookA(), new PipelineHookB() };
                var aggregateStore = new HookableAggregateStore(new Mock<IStoreAggregates>().Object, pipelineHooks);
                var postSaveHooks = aggregateStore.PostSaveHooks.AsList();

                Assert.IsType(typeof(PipelineHookA), postSaveHooks[0]);
                Assert.IsType(typeof(PipelineHookC), postSaveHooks[1]);
                Assert.IsType(typeof(PipelineHookB), postSaveHooks[2]);
            }
Example #2
0
            public void OrderPostSavePipelineHooksByOrderThenByNameReversed()
            {
                var pipelineHooks  = new PipelineHook[] { new PipelineHookC(), new PipelineHookA(), new PipelineHookB() };
                var aggregateStore = new HookableAggregateStore(new Mock <IStoreAggregates>().Object, pipelineHooks);
                var postSaveHooks  = aggregateStore.PostSaveHooks.AsList();

                Assert.IsType(typeof(PipelineHookA), postSaveHooks[0]);
                Assert.IsType(typeof(PipelineHookC), postSaveHooks[1]);
                Assert.IsType(typeof(PipelineHookB), postSaveHooks[2]);
            }
Example #3
0
            public void CanCallDisposeMoreThanOnce()
            {
                var pipelineHook   = new DisposablePipelineHook();
                var pipelineHooks  = new PipelineHook[] { pipelineHook };
                var aggregateStore = new HookableAggregateStore(new Mock <IStoreAggregates>().Object, pipelineHooks);

                aggregateStore.Dispose();
                aggregateStore.Dispose();

                Assert.True(pipelineHook.Disposed);
            }
Example #4
0
            public void ReturnAggregateIfNoExceptionsThrown()
            {
                var id                      = Guid.NewGuid();
                var type                    = typeof(Aggregate);
                var aggregate               = new Mock <Aggregate>();
                var pipelineHook            = new Mock <PipelineHook>();
                var decoratedAggregateStore = new Mock <IStoreAggregates>();
                var aggregateStore          = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });

                decoratedAggregateStore.Setup(mock => mock.Get(type, id)).Returns(aggregate.Object);

                Assert.Same(aggregate.Object, aggregateStore.Get(type, id));
            }
Example #5
0
            public void InvokePreGetHooksBeforeDecoratedGet()
            {
                var id                      = Guid.NewGuid();
                var type                    = typeof(Aggregate);
                var pipelineHook            = new Mock <PipelineHook>();
                var decoratedAggregateStore = new Mock <IStoreAggregates>();
                var aggregateStore          = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });

                pipelineHook.Setup(mock => mock.PreGet(type, id)).Throws(new InvalidOperationException());

                Assert.Throws <InvalidOperationException>(() => aggregateStore.Get(type, id));

                decoratedAggregateStore.Verify(mock => mock.Get(type, id), Times.Never());
            }
Example #6
0
            public void ReturnSaveResultIfNoExceptionsThrown()
            {
                var aggregate               = new Mock <Aggregate>();
                var pipelineHook            = new Mock <PipelineHook>();
                var decoratedAggregateStore = new Mock <IStoreAggregates>();
                var commit         = (Commit)FormatterServices.GetUninitializedObject(typeof(Commit));
                var aggregateStore = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });
                var saveResult     = new SaveResult(aggregate.Object, commit);

                // ReSharper disable AccessToDisposedClosure
                using (var context = new CommandContext(Guid.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty))
                {
                    decoratedAggregateStore.Setup(mock => mock.Save(aggregate.Object, context)).Returns(saveResult);

                    Assert.Same(saveResult, aggregateStore.Save(aggregate.Object, context));
                }
                // ReSharper restore AccessToDisposedClosure
            }
Example #7
0
            public void InvokePostSaveHooksIfDecoratedSaveThrowsException()
            {
                var aggregate               = new Mock <Aggregate>();
                var pipelineHook            = new Mock <PipelineHook>();
                var error                   = new InvalidOperationException();
                var decoratedAggregateStore = new Mock <IStoreAggregates>();
                var aggregateStore          = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });

                // ReSharper disable AccessToDisposedClosure
                using (var context = new CommandContext(Guid.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty))
                {
                    decoratedAggregateStore.Setup(mock => mock.Save(aggregate.Object, context)).Throws(error);

                    Assert.Throws <InvalidOperationException>(() => aggregateStore.Save(aggregate.Object, context));

                    pipelineHook.Verify(mock => mock.PostSave(aggregate.Object, null, error), Times.Once());
                }
                // ReSharper restore AccessToDisposedClosure
            }
Example #8
0
            public void InvokePostSaveHooksAfterDecoratedSave()
            {
                var aggregate               = new Mock <Aggregate>();
                var pipelineHook            = new Mock <PipelineHook>();
                var decoratedAggregateStore = new Mock <IStoreAggregates>();
                var commit         = (Commit)FormatterServices.GetUninitializedObject(typeof(Commit));
                var aggregateStore = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });


                // ReSharper disable AccessToDisposedClosure
                using (var context = new CommandContext(Guid.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty))
                {
                    decoratedAggregateStore.Setup(mock => mock.Save(aggregate.Object, context)).Returns(new SaveResult(aggregate.Object, commit));
                    pipelineHook.Setup(mock => mock.PostSave(aggregate.Object, commit, null)).Throws(new InvalidOperationException());

                    Assert.Throws <InvalidOperationException>(() => aggregateStore.Save(aggregate.Object, context));

                    decoratedAggregateStore.Verify(mock => mock.Save(aggregate.Object, context), Times.Once());
                }
                // ReSharper restore AccessToDisposedClosure
            }
            public void CanCallDisposeMoreThanOnce()
            {
                var pipelineHook = new DisposablePipelineHook();
                var pipelineHooks = new PipelineHook[] { pipelineHook };
                var aggregateStore = new HookableAggregateStore(new Mock<IStoreAggregates>().Object, pipelineHooks);

                aggregateStore.Dispose();
                aggregateStore.Dispose();

                Assert.True(pipelineHook.Disposed);
            }
            public void ReturnSaveResultIfNoExceptionsThrown()
            {
                var aggregate = new Mock<Aggregate>();
                var pipelineHook = new Mock<PipelineHook>();
                var decoratedAggregateStore = new Mock<IStoreAggregates>();
                var commit = (Commit)FormatterServices.GetUninitializedObject(typeof(Commit));
                var aggregateStore = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });
                var saveResult = new SaveResult(aggregate.Object, commit);

                // ReSharper disable AccessToDisposedClosure
                using (var context = new CommandContext(Guid.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty))
                {
                    decoratedAggregateStore.Setup(mock => mock.Save(aggregate.Object, context)).Returns(saveResult);

                    Assert.Same(saveResult, aggregateStore.Save(aggregate.Object, context));
                }
                // ReSharper restore AccessToDisposedClosure
            }
            public void InvokePostSaveHooksIfDecoratedSaveThrowsException()
            {
                var aggregate = new Mock<Aggregate>();
                var pipelineHook = new Mock<PipelineHook>();
                var error = new InvalidOperationException();
                var decoratedAggregateStore = new Mock<IStoreAggregates>();
                var aggregateStore = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });

                // ReSharper disable AccessToDisposedClosure
                using (var context = new CommandContext(Guid.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty))
                {
                    decoratedAggregateStore.Setup(mock => mock.Save(aggregate.Object, context)).Throws(error);

                    Assert.Throws<InvalidOperationException>(() => aggregateStore.Save(aggregate.Object, context));

                    pipelineHook.Verify(mock => mock.PostSave(aggregate.Object, null, error), Times.Once());
                }
                // ReSharper restore AccessToDisposedClosure
            }
            public void InvokePostSaveHooksAfterDecoratedSave()
            {
                var aggregate = new Mock<Aggregate>();
                var pipelineHook = new Mock<PipelineHook>();
                var decoratedAggregateStore = new Mock<IStoreAggregates>();
                var commit = (Commit)FormatterServices.GetUninitializedObject(typeof(Commit));
                var aggregateStore = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });

                // ReSharper disable AccessToDisposedClosure
                using (var context = new CommandContext(Guid.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty))
                {
                    decoratedAggregateStore.Setup(mock => mock.Save(aggregate.Object, context)).Returns(new SaveResult(aggregate.Object, commit));
                    pipelineHook.Setup(mock => mock.PostSave(aggregate.Object, commit, null)).Throws(new InvalidOperationException());

                    Assert.Throws<InvalidOperationException>(() => aggregateStore.Save(aggregate.Object, context));

                    decoratedAggregateStore.Verify(mock => mock.Save(aggregate.Object, context), Times.Once());
                }
                // ReSharper restore AccessToDisposedClosure
            }
            public void ReturnAggregateIfNoExceptionsThrown()
            {
                var id = Guid.NewGuid();
                var type = typeof(Aggregate);
                var aggregate = new Mock<Aggregate>();
                var pipelineHook = new Mock<PipelineHook>();
                var decoratedAggregateStore = new Mock<IStoreAggregates>();
                var aggregateStore = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });

                decoratedAggregateStore.Setup(mock => mock.Get(type, id)).Returns(aggregate.Object);

                Assert.Same(aggregate.Object, aggregateStore.Get(type, id));
            }
            public void InvokePostGetHooksAfterDecoratedGet()
            {
                var id = Guid.NewGuid();
                var type = typeof(Aggregate);
                var aggregate = new Mock<Aggregate>();
                var pipelineHook = new Mock<PipelineHook>();
                var decoratedAggregateStore = new Mock<IStoreAggregates>();
                var aggregateStore = new HookableAggregateStore(decoratedAggregateStore.Object, new[] { pipelineHook.Object });

                decoratedAggregateStore.Setup(mock => mock.Get(type, id)).Returns(aggregate.Object);
                pipelineHook.Setup(mock => mock.PostGet(aggregate.Object)).Throws(new InvalidOperationException());

                Assert.Throws<InvalidOperationException>(() => aggregateStore.Get(type, id));

                decoratedAggregateStore.Verify(mock => mock.Get(type, id), Times.Once());
            }