public async Task Getting_snapshot_and_forward_events() { var snapshotStrategy = CreateSnapshotStrategy(); var eventStore = new StubEventStore(); var session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy); var stubAggregate = StubSnapshotAggregate.Create("Snap"); await session.AddAsync(stubAggregate).ConfigureAwait(false); await session.SaveChangesAsync().ConfigureAwait(false); // Version 1 stubAggregate.ChangeName("Renamed"); stubAggregate.ChangeName("Renamed again"); // dont make snapshot snapshotStrategy = CreateSnapshotStrategy(false); session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy); await session.AddAsync(stubAggregate).ConfigureAwait(false); await session.SaveChangesAsync().ConfigureAwait(false); // Version 3 var stubAggregateFromSnapshot = await session.GetByIdAsync <StubSnapshotAggregate>(stubAggregate.Id).ConfigureAwait(false); stubAggregateFromSnapshot.Version.Should().Be(3); }
public async Task Should_restore_aggregate_using_snapshot() { var snapshotStrategy = CreateSnapshotStrategy(); var eventStore = new StubEventStore(); var session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy); var stubAggregate = StubSnapshotAggregate.Create("Snap"); stubAggregate.AddEntity("Child 1"); stubAggregate.AddEntity("Child 2"); await session.AddAsync(stubAggregate).ConfigureAwait(false); await session.SaveChangesAsync().ConfigureAwait(false); session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy); var aggregate = await session.GetByIdAsync <StubSnapshotAggregate>(stubAggregate.Id).ConfigureAwait(false); eventStore.GetSnapshotMethodCalled.Should().BeTrue(); aggregate.Version.Should().Be(3); aggregate.Id.Should().Be(stubAggregate.Id); }
public async Task Access_metadata_from_all_emitted_events() { // Arrange var snapshotStrategy = CreateSnapshotStrategy(); var eventsMetadataService = new EventsMetadataService(); var eventStore = new StubEventStore(); var session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy, eventsMetadataService); var stubAggregate = StubSnapshotAggregate.Create("Snap"); stubAggregate.AddEntity("Child 1"); stubAggregate.AddEntity("Child 2"); await session.AddAsync(stubAggregate).ConfigureAwait(false); // Act await session.SaveChangesAsync().ConfigureAwait(false); // Assert var eventsWithMetadata = eventsMetadataService.GetEvents().ToList(); eventsWithMetadata.Count().Should().Be(3); eventsWithMetadata[0].Metadata.GetValue(MetadataKeys.EventName).Should().Be("StubCreated"); eventsWithMetadata[1].Metadata.GetValue(MetadataKeys.EventName).Should().Be(nameof(ChildCreatedEvent)); eventsWithMetadata[2].Metadata.GetValue(MetadataKeys.EventName).Should().Be(nameof(ChildCreatedEvent)); }
public async Task When_Save_events_Then_aggregate_projection_should_be_updated() { var snapshotStrategy = CreateSnapshotStrategy(false); var eventStore = new StubEventStore(); var session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy, null); var stubAggregate1 = StubAggregate.Create("Walter White"); await session.AddAsync(stubAggregate1).ConfigureAwait(false); await session.SaveChangesAsync().ConfigureAwait(false); stubAggregate1 = await session.GetByIdAsync <StubAggregate>(stubAggregate1.Id).ConfigureAwait(false); stubAggregate1.ChangeName("Jesse Pinkman"); await session.SaveChangesAsync().ConfigureAwait(false); eventStore.Projections.Count.Should().Be(1); var projectionKey = new InMemoryEventStore.ProjectionKey(stubAggregate1.Id, typeof(StubAggregateProjection).Name); eventStore.Projections.ContainsKey(projectionKey).Should().BeTrue(); var projection = _textSerializer.Deserialize <StubAggregateProjection>(eventStore.Projections[projectionKey].ToString()); projection.Id.Should().Be(stubAggregate1.Id); projection.Name.Should().Be(stubAggregate1.Name); }
public async Task When_call_SaveChanges_Should_store_the_snapshot() { // Arrange var snapshotStrategy = CreateSnapshotStrategy(); var eventStore = new StubEventStore(); var session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy); var stubAggregate = StubSnapshotAggregate.Create("Snap"); stubAggregate.AddEntity("Child 1"); stubAggregate.AddEntity("Child 2"); await session.AddAsync(stubAggregate).ConfigureAwait(false); // Act await session.SaveChangesAsync().ConfigureAwait(false); // Assert eventStore.SaveSnapshotMethodCalled.Should().BeTrue(); var commitedSnapshot = StubEventStore.Snapshots.First(e => e.AggregateId == stubAggregate.Id); commitedSnapshot.Should().NotBeNull(); var metadata = (IMetadata)_textSerializer.Deserialize <EventSource.Metadata>(commitedSnapshot.SerializedMetadata); var snapshotClrType = metadata.GetValue(MetadataKeys.SnapshotClrType); Type.GetType(snapshotClrType).Name.Should().Be(typeof(StubSnapshotAggregateSnapshot).Name); var snapshot = _textSerializer.Deserialize <StubSnapshotAggregateSnapshot>(commitedSnapshot.SerializedData); snapshot.Name.Should().Be(stubAggregate.Name); snapshot.SimpleEntities.Count.Should().Be(stubAggregate.Entities.Count); }
public Task Should_throws_exception_When_aggregate_was_not_found() { var snapshotStrategy = CreateSnapshotStrategy(); var eventStore = new StubEventStore(); var session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy); var newId = Guid.NewGuid(); Func <Task> act = async() => { await session.GetByIdAsync <StubAggregate>(newId).ConfigureAwait(false); }; var assertion = act.ShouldThrowExactly <AggregateNotFoundException>(); assertion.Which.AggregateName.Should().Be(typeof(StubAggregate).Name); assertion.Which.AggregateId.Should().Be(newId); return(Task.CompletedTask); }
public async Task When_not_exists_snapshot_yet_Then_aggregate_should_be_constructed_using_your_events() { var snapshotStrategy = CreateSnapshotStrategy(false); var eventStore = new StubEventStore(); var session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy); var stubAggregate = StubSnapshotAggregate.Create("Snap"); stubAggregate.AddEntity("Child 1"); stubAggregate.AddEntity("Child 2"); await session.AddAsync(stubAggregate).ConfigureAwait(false); await session.SaveChangesAsync().ConfigureAwait(false); session = _sessionFactory(eventStore, _eventPublisherMock.Object, snapshotStrategy); var aggregate = await session.GetByIdAsync <StubSnapshotAggregate>(stubAggregate.Id).ConfigureAwait(false); aggregate.Name.Should().Be(stubAggregate.Name); aggregate.Entities.Count.Should().Be(stubAggregate.Entities.Count); }