Esempio n. 1
0
        public void SnapshotStoreShouldNotThrowExceptionWhenNoSnapshotIsAvailable()
        {
            var persistentSnapshotStore = new InMemorySnapshotStore();
            var snapshotStore           = new SnapshotStore(persistentSnapshotStore);

            Action act = () => snapshotStore.GetSnapshot(Guid.NewGuid());

            act.ShouldNotThrow();
        }
        public async Task ShouldCreateAndGetSnapshots()
        {
            var snaphotRepository = new InMemorySnapshotStore <SomeDataAggregate>();

            var eventFilterOne    = new[] { "a", "b", "c" };
            var entityA           = $"{Guid.NewGuid()}";
            var someDataAggregate = new SomeDataAggregate(entityA);

            var snapshots = await snaphotRepository.GetByVersionOrLast(eventFilterOne);

            Assert.NotNull(snapshots);
            Assert.True(snapshots.Length == 0);

            someDataAggregate.ApplyEvent(new SomeData(entityA, Guid.NewGuid())
            {
                EventNumber = 0
            }, saveAsPendingEvent: false);

            await snaphotRepository.Save(eventFilterOne, someDataAggregate);

            snapshots = await snaphotRepository.GetByVersionOrLast(eventFilterOne);

            Assert.NotNull(snapshots);
            Assert.True(snapshots.Length == 1);
            Assert.AreEqual(entityA, snapshots[0].EntityId);

            snapshots = await snaphotRepository.GetByVersionOrLast(eventFilterOne, 0);

            Assert.NotNull(snapshots);
            Assert.True(snapshots.Length == 1);
            Assert.AreEqual(entityA, snapshots[0].EntityId);

            snapshots = await snaphotRepository.GetByVersionOrLast(eventFilterOne, 1);

            Assert.NotNull(snapshots);
            Assert.True(snapshots.Length == 0);

            someDataAggregate.ApplyEvent(new SomeData(entityA, Guid.NewGuid())
            {
                EventNumber = 1
            }, saveAsPendingEvent: false);

            Assert.True(someDataAggregate.Version == 1);

            await snaphotRepository.Save(eventFilterOne, someDataAggregate);

            snapshots = await snaphotRepository.GetByVersionOrLast(eventFilterOne, 1);

            Assert.NotNull(snapshots);
            Assert.True(snapshots.Length == 1);
            Assert.AreEqual(entityA, snapshots[0].EntityId);
        }
Esempio n. 3
0
        public void SnapshotStoreLoadsSnapshotFromPersistentStore()
        {
            var persistentSnapshotStore = new InMemorySnapshotStore();
            var snapshotStore           = new SnapshotStore(persistentSnapshotStore);

            var guid      = Guid.NewGuid();
            var aggregate = new TestSnapshotAggregate(guid, "Test aggregate");

            snapshotStore.SaveSnapshot(aggregate);

            snapshotStore.GetSnapshot(guid).Should().NotBeNull();
            snapshotStore.GetSnapshot(guid).AggregateId.Should().Be(guid);
        }
Esempio n. 4
0
        public void SnapshotStoreSavesSnapshotToPersistentStore()
        {
            var persistentSnapshotStore = new InMemorySnapshotStore();
            var snapshotStore           = new SnapshotStore(persistentSnapshotStore);

            var guid      = Guid.NewGuid();
            var aggregate = new TestSnapshotAggregate(guid, "Test aggregate");

            snapshotStore.SaveSnapshot(aggregate);

            persistentSnapshotStore.Find(guid).FirstOrDefault().Should().NotBeNull();
            persistentSnapshotStore.Find(guid).FirstOrDefault().AggregateId.Should().Be(guid);
        }
Esempio n. 5
0
        public void SnapshotStoreShouldReturnTheCorrectAggregateType()
        {
            var persistentSnapshotStore = new InMemorySnapshotStore();
            var snapshotStore           = new SnapshotStore(persistentSnapshotStore);

            var guid      = Guid.NewGuid();
            var aggregate = new TestSnapshotAggregate(guid, "Test aggregate");

            snapshotStore.SaveSnapshot(aggregate);

            var snapshot = snapshotStore.GetSnapshot(guid) as TestAggregateSnapshot;

            snapshot.Should().NotBeNull();
        }
Esempio n. 6
0
        public void SnapshotShouldBeSuccessfullyAppliedToAggregate()
        {
            var persistentSnapshotStore = new InMemorySnapshotStore();
            var snapshotStore           = new SnapshotStore(persistentSnapshotStore);

            var          guid      = Guid.NewGuid();
            const string name      = "Test aggregate";
            var          aggregate = new TestSnapshotAggregate(guid, name);

            snapshotStore.SaveSnapshot(aggregate);
            var snapshot = snapshotStore.GetSnapshot(guid) as TestAggregateSnapshot;

            var newAggregate = new TestSnapshotAggregate(Guid.NewGuid(), String.Empty);

            newAggregate.SetSnapshot(snapshot);

            newAggregate.Id.Should().Be(guid);
            newAggregate.ReturnNameForTest().Should().Be(name);
        }
        public async Task ShouldCreateAndGetSnapshotsForSeveralStreams()
        {
            var snaphotRepository = new InMemorySnapshotStore <SomeDataAggregate>();

            var eventFilterOne = new[] { "d", "e", "f" };
            var eventFilterTwo = new[] { "g", "h", "i" };

            var entityA = $"{Guid.NewGuid()}";
            var entityB = $"{Guid.NewGuid()}";
            var entityC = $"{Guid.NewGuid()}";

            var someDataAggregateA = new SomeDataAggregate(entityA);
            var someDataAggregateB = new SomeDataAggregate(entityB);
            var someDataAggregateC = new SomeDataAggregate(entityC);

            someDataAggregateA.ApplyEvent(new SomeData(entityA, Guid.NewGuid()), saveAsPendingEvent: false);
            someDataAggregateB.ApplyEvent(new SomeData(entityB, Guid.NewGuid()), saveAsPendingEvent: false);
            someDataAggregateC.ApplyEvent(new SomeData(entityC, Guid.NewGuid()), saveAsPendingEvent: false);

            await snaphotRepository.Save(eventFilterOne, someDataAggregateA);

            await snaphotRepository.Save(eventFilterOne, someDataAggregateB);

            await snaphotRepository.Save(eventFilterTwo, someDataAggregateC);

            var snapshots = await snaphotRepository.GetByVersionOrLast(eventFilterOne);

            Assert.NotNull(snapshots);
            Assert.True(snapshots.Length == 2);

            snapshots = await snaphotRepository.GetByVersionOrLast(eventFilterTwo);

            Assert.NotNull(snapshots);
            Assert.True(snapshots.Length == 1);

            var snapshot = await snaphotRepository.GetByVersionOrLast($"{entityA}", eventFilterTwo);

            Assert.Null(snapshot);

            snapshot = await snaphotRepository.GetByVersionOrLast($"{entityA}", eventFilterOne);

            Assert.NotNull(snapshot);
        }
Esempio n. 8
0
        public async Task VerionAppliedToSnapshot()
        {
            var id             = Guid.NewGuid();
            var store          = new InMemoryEventStore();
            var snapshotStore  = new InMemorySnapshotStore();
            var streamName     = typeof(TestState).Name.AsStreamName(id).StreamName;
            var arrangeVersion = await store.AppendToStreamAsync(streamName, 0, new IEvent[] { new AggregateId(id).Pipe(x => new TestEvent(x).AddTestMetaData <string>(x)) });

            await ApplicationService.ExecuteAsync <TestState>
                (store, new TestCommand(id),
                state => new EventRecord[] { new TestEventRecord("test") }, e => Task.CompletedTask, snapshotStore, s => s.Version, (v, s) => s.Tap(x => x.Version = v));

            var result = await store.LoadEventStreamAsync(streamName, 0);

            var state = await snapshotStore.Get <TestState>(streamName);

            Assert.Equal(1, arrangeVersion);
            Assert.Equal(2, result.Version);
            Assert.Equal(2, state.Version);
            Assert.Equal(2, state.Applied.Count());
        }
        public static AggregateRepository <TAggregate> CreateEnvironment <TAggregate>(
            out EventBus eventBus,
            out EventStore eventStore,
            out SnapshotStore snapshotStore,
            out SnapshotProcessor snapshotProcessor,
            out InMemorySnapshotStore memorySnapshotStore,
            int snapshotThreashold = 10)
            where TAggregate : IAggregateRoot, new()
        {
            TestDatabase.Items.Clear();

            var savedHandler = new TestAggregateSavedEventHandler();

            DependencyServiceMock.SetMock(new List <DependencyDescriptor>()
            {
                new DependencyDescriptor(typeof(IEventHandler <TestAggregateCreatedEvent>),
                                         new TestAggregateCreatedEventHandler()),
                new DependencyDescriptor(typeof(IEventHandler <TestAggregateChangedEvent>),
                                         new TestAggregateChangedEventHandler()),
                new DependencyDescriptor(typeof(IEventHandler <AggregateSavedEvent>), savedHandler)
            });

            eventBus            = new EventBus();
            eventStore          = new EventStore(eventBus, new InMemoryEventStore(), PerformanceCounterMock.GetMock());
            memorySnapshotStore = new InMemorySnapshotStore();
            snapshotStore       = new SnapshotStore(memorySnapshotStore);
            var repository = new AggregateRepository <TAggregate>(eventStore, snapshotStore);

            snapshotProcessor = new SnapshotProcessor(snapshotStore, new List <ISnapshotableRepository>()
            {
                repository
            },
                                                      snapshotThreashold, PerformanceCounterMock.GetMock());
            savedHandler.Processor = snapshotProcessor;

            return(repository);
        }
Esempio n. 10
0
 static void ArbitraryConfigurationStep(string container, InMemorySnapshotStore store)
 {
     Console.WriteLine("This ran after creation {2} built {0}.  The hash code is {1}",
         store.GetType(), store.GetHashCode(), container);
 }
Esempio n. 11
0
 static void ArbitraryConfigurationStep(string container, InMemorySnapshotStore store)
 {
     Console.WriteLine("This ran after creation {2} built {0}.  The hash code is {1}",
                       store.GetType(), store.GetHashCode(), container);
 }