public void CanCallDisposeMoreThanOnce() { var decoratedAggregateStore = new Mock <IStoreAggregates>(); using (var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object)) { cachedAggregateStore.Dispose(); cachedAggregateStore.Dispose(); } }
public void LoadFromUnderlyingStoreIfNotCached() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock<IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); decoratedAggregateStore.Setup(mock => mock.Get(typeof(FakeAggregate), aggregate.Id)).Returns(aggregate); cachedAggregateStore.Get(typeof(FakeAggregate), aggregate.Id); decoratedAggregateStore.Verify(mock => mock.Get(typeof(FakeAggregate), aggregate.Id), Times.Once()); }
public void UseCachedAggregateIfAvailable() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock<IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); memoryCache.Add(aggregate.CacheKey, aggregate, new CacheItemPolicy()); Assert.Same(aggregate, cachedAggregateStore.Get(typeof(FakeAggregate), aggregate.Id)); decoratedAggregateStore.Verify(mock => mock.Get(typeof(FakeAggregate), aggregate.Id), Times.Never()); }
public void LoadFromUnderlyingStoreIfNotCached() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock <IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); decoratedAggregateStore.Setup(mock => mock.Get(typeof(FakeAggregate), aggregate.Id)).Returns(aggregate); cachedAggregateStore.Get(typeof(FakeAggregate), aggregate.Id); decoratedAggregateStore.Verify(mock => mock.Get(typeof(FakeAggregate), aggregate.Id), Times.Once()); }
public void UseCachedAggregateIfAvailable() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock <IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); memoryCache.Add(aggregate.CacheKey, aggregate, new CacheItemPolicy()); Assert.Same(aggregate, cachedAggregateStore.Get(typeof(FakeAggregate), aggregate.Id)); decoratedAggregateStore.Verify(mock => mock.Get(typeof(FakeAggregate), aggregate.Id), Times.Never()); }
public void UpdateCacheOnSuccessfulSave() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock <IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); memoryCache.Add(aggregate.CacheKey, aggregate, new CacheItemPolicy()); using (var context = new CommandContext(GuidStrategy.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty)) cachedAggregateStore.Save(aggregate, context); Assert.NotSame(aggregate, memoryCache.Get(aggregate.CacheKey)); }
public void CopyAggregateBeforeSaving() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock<IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); // ReSharper disable AccessToDisposedClosure using (var context = new CommandContext(GuidStrategy.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty)) { cachedAggregateStore.Save(aggregate, context); decoratedAggregateStore.Verify(mock => mock.Save(It.Is<Aggregate>(copy => !ReferenceEquals(aggregate, copy)), context), Times.Once()); } // ReSharper restore AccessToDisposedClosure }
public void CopyAggregateBeforeSaving() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock <IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); // ReSharper disable AccessToDisposedClosure using (var context = new CommandContext(GuidStrategy.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty)) { cachedAggregateStore.Save(aggregate, context); decoratedAggregateStore.Verify(mock => mock.Save(It.Is <Aggregate>(copy => !ReferenceEquals(aggregate, copy)), context), Times.Once()); } // ReSharper restore AccessToDisposedClosure }
public void RemoveAggregateFromCacheOnConcurrencyException() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock <IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); // ReSharper disable AccessToDisposedClosure using (var context = new CommandContext(GuidStrategy.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty)) { memoryCache.Add(aggregate.CacheKey, aggregate, new CacheItemPolicy()); decoratedAggregateStore.Setup(mock => mock.Save(It.Is <Aggregate>(copy => !ReferenceEquals(aggregate, copy)), context)).Throws <ConcurrencyException>(); Assert.Throws <ConcurrencyException>(() => cachedAggregateStore.Save(aggregate, context)); Assert.False(memoryCache.Contains(aggregate.CacheKey)); } // ReSharper restore AccessToDisposedClosure }
public void RemoveAggregateFromCacheOnConcurrencyException() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock<IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); // ReSharper disable AccessToDisposedClosure using (var context = new CommandContext(GuidStrategy.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty)) { memoryCache.Add(aggregate.CacheKey, aggregate, new CacheItemPolicy()); decoratedAggregateStore.Setup(mock => mock.Save(It.Is<Aggregate>(copy => !ReferenceEquals(aggregate, copy)), context)).Throws<ConcurrencyException>(); Assert.Throws<ConcurrencyException>(() => cachedAggregateStore.Save(aggregate, context)); Assert.False(memoryCache.Contains(aggregate.CacheKey)); } // ReSharper restore AccessToDisposedClosure }
public void UpdateCacheOnSuccessfulSave() { var aggregate = new FakeAggregate(); var decoratedAggregateStore = new Mock<IStoreAggregates>(); var memoryCache = new MemoryCache(Guid.NewGuid().ToString()); var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object, TimeSpan.FromMinutes(1), memoryCache); memoryCache.Add(aggregate.CacheKey, aggregate, new CacheItemPolicy()); using (var context = new CommandContext(GuidStrategy.NewGuid(), HeaderCollection.Empty, CommandEnvelope.Empty)) cachedAggregateStore.Save(aggregate, context); Assert.NotSame(aggregate, memoryCache.Get(aggregate.CacheKey)); }
public void CanCallDisposeMoreThanOnce() { var decoratedAggregateStore = new Mock<IStoreAggregates>(); using (var cachedAggregateStore = new CachedAggregateStore(decoratedAggregateStore.Object)) { cachedAggregateStore.Dispose(); cachedAggregateStore.Dispose(); } }