public async Task When_a_snapshot_is_not_up_to_date_then_GetLatest_retrieves_later_events_and_applies_them()
        {
            // arrange
            var snapshotRepository = new InMemorySnapshotRepository();

            Configuration.Current.UseDependency <ISnapshotRepository>(_ => snapshotRepository);

            var snapshot = new CustomerAccountSnapshot
            {
                AggregateId       = Any.Guid(),
                Version           = 123,
                AggregateTypeName = AggregateType <CustomerAccount> .EventStreamName,
                EmailAddress      = Any.Email(),
                NoSpam            = true,
                UserName          = Any.FullName(),
                ETags             = new[] { Any.Word(), Any.Word() }
            };
            await snapshotRepository.SaveSnapshot(snapshot);

            await SaveEventsDirectly(new CustomerAccount.RequestedSpam
            {
                AggregateId    = snapshot.AggregateId,
                SequenceNumber = 124
            }.ToStoredEvent());

            // act
            var account = await CreateRepository <CustomerAccount>().GetLatest(snapshot.AggregateId);

            // assert
            account.Version.Should().Be(124);
            account.NoSpam.Should().Be(false);
        }
        public async Task GetLatest_can_return_an_aggregate_built_from_a_snapshot_projection()
        {
            // arrange
            var snapshotRepository = new InMemorySnapshotRepository();

            Configuration.Current.UseDependency <ISnapshotRepository>(_ => snapshotRepository);

            var snapshot = new CustomerAccountSnapshot
            {
                AggregateId       = Any.Guid(),
                Version           = 123,
                AggregateTypeName = AggregateType <CustomerAccount> .EventStreamName,
                EmailAddress      = Any.Email(),
                NoSpam            = true,
                UserName          = Any.FullName(),
                ETags             = new[] { Any.Word(), Any.Word() }
            };
            await snapshotRepository.SaveSnapshot(snapshot);

            // act
            var account = await CreateRepository <CustomerAccount>().GetLatest(snapshot.AggregateId);

            // assert
            account.Id.Should().Be(snapshot.AggregateId);
            account.Version.Should().Be(snapshot.Version);
            account.EmailAddress.Should().Be(snapshot.EmailAddress);
            account.UserName.Should().Be(snapshot.UserName);
            account.NoSpam.Should().Be(snapshot.NoSpam);

            foreach (var etag in snapshot.ETags)
            {
                account.HasETag(etag).Should().BeTrue("etags are expected to be loaded from the snapshot");
            }
        }
        public async Task When_new_events_are_added_to_an_aggregate_sourced_from_a_stale_snapshot_the_version_increments_correctly()
        {
            // arrange
            var snapshotRepository = new InMemorySnapshotRepository();

            Configuration.Current.UseDependency <ISnapshotRepository>(_ => snapshotRepository);

            var snapshot = new CustomerAccountSnapshot
            {
                AggregateId       = Any.Guid(),
                Version           = 122,
                AggregateTypeName = AggregateType <CustomerAccount> .EventStreamName,
                EmailAddress      = Any.Email(),
                NoSpam            = true,
                UserName          = Any.FullName(),
                ETags             = new[] { Any.Word(), Any.Word() }
            };

            await snapshotRepository.SaveSnapshot(snapshot);

            await SaveEventsDirectly(new CustomerAccount.RequestedSpam
            {
                AggregateId    = snapshot.AggregateId,
                SequenceNumber = snapshot.Version + 1
            }.ToStoredEvent());

            // act
            var account = await CreateRepository <CustomerAccount>().GetLatest(snapshot.AggregateId);

            account.Apply(new RequestSpam());

            // assert
            account.Version.Should().Be(124);
        }
Exemple #4
0
        public async Task GetLatest_can_return_an_aggregate_built_from_a_snapshot_projection()
        {
            // arrange
            var snapshotRepository = new InMemorySnapshotRepository();

            Configuration.Current.UseDependency <ISnapshotRepository>(_ => snapshotRepository);

            var etags       = new[] { Any.Word(), Any.Word() };
            var bloomFilter = new BloomFilter();

            etags.ForEach(bloomFilter.Add);

            var snapshot = new CustomerAccountSnapshot
            {
                AggregateId       = Any.Guid(),
                Version           = 123,
                AggregateTypeName = AggregateType <CustomerAccount> .EventStreamName,
                EmailAddress      = Any.Email(),
                NoSpam            = true,
                UserName          = Any.FullName(),
                ETags             = bloomFilter
            };
            await snapshotRepository.SaveSnapshot(snapshot);

            // act
            var account = await CreateRepository <CustomerAccount>().GetLatest(snapshot.AggregateId);

            // assert
            account.Id.Should().Be(snapshot.AggregateId);
            account.Version.Should().Be(snapshot.Version);
            account.EmailAddress.Should().Be(snapshot.EmailAddress);
            account.UserName.Should().Be(snapshot.UserName);
            account.NoSpam.Should().Be(snapshot.NoSpam);
        }