Exemple #1
0
        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 customerAccount = new CustomerAccount()
                                  .Apply(new ChangeEmailAddress(Any.Email()));

            var repository = CreateRepository <CustomerAccount>();

            await repository.Save(customerAccount);

            var snapshot = customerAccount.CreateSnapshot();

            Console.WriteLine(snapshot.Body);

            await snapshotRepository.SaveSnapshot(snapshot);

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

            // act
            var account = await repository.GetLatest(snapshot.AggregateId);

            // assert
            account.Version.Should().Be(124);
            account.NoSpam.Should().Be(false);
        }
        public void When_instantiated_from_a_snapshot_the_aggregate_version_is_correct()
        {
            // arrange
            var customerAccount = new CustomerAccount()
                                  .Apply(new ChangeEmailAddress(Any.Email()));

            customerAccount.ConfirmSave();
            var snapshot = customerAccount.CreateSnapshot();

            snapshot.Version = 12;

            // act
            var accountFromSnapshot = new CustomerAccount(snapshot);

            // assert
            accountFromSnapshot.Version.Should().Be(12);
        }
        public void EventSourcedAggregate_can_be_rehydrated_from_an_empty_event_sequence_when_using_a_snapshot()
        {
            // arrange
            var emailAddress = Any.Email();

            var customerAccount = new CustomerAccount()
                                  .Apply(new ChangeEmailAddress(emailAddress));

            customerAccount.ConfirmSave();
            var snapshot = customerAccount.CreateSnapshot();

            //act
            var fromSnapshot = new CustomerAccount(snapshot);

            // assert
            fromSnapshot.EmailAddress
            .Should()
            .Be(emailAddress);
        }
        public void An_aggregate_instantiated_from_a_snapshot_adds_new_events_at_the_correct_sequence_number()
        {
            // arrange
            var account = new CustomerAccount()
                          .Apply(new ChangeEmailAddress(Any.Email()));

            account.ConfirmSave();
            var snapshot = account.CreateSnapshot();

            snapshot.Version = 12;

            // act
            var accountFromSnapshot = new CustomerAccount(snapshot);

            accountFromSnapshot.Apply(new RequestNoSpam());

            // assert
            accountFromSnapshot.Version.Should().Be(13);
            accountFromSnapshot.PendingEvents.Last().SequenceNumber.Should().Be(13);
        }
        public void Accessing_event_history_from_an_aggregate_instantiated_using_a_snapshot_throws()
        {
            // arrange
            var account = new CustomerAccount()
                          .Apply(new ChangeEmailAddress(Any.Email()));

            account.ConfirmSave();
            var snapshot = account
                           .CreateSnapshot();

            snapshot.Version = 10;
            account          = new CustomerAccount(snapshot);

            // act
            Action getEvents = () => account.Events();

            // assert
            getEvents.ShouldThrow <InvalidOperationException>()
            .And
            .Message
            .Should()
            .Contain("Aggregate was sourced from a snapshot, so event history is unavailable.");
        }
        public void Attempting_to_re_source_an_aggregate_that_was_instantiated_using_a_snapshot_succeeds_if_the_specified_version_is_at_or_after_the_snapshot()
        {
            // arrange
            var originalEmail = Any.Email();

            var account = new CustomerAccount()
                          .Apply(new ChangeEmailAddress(originalEmail));

            account.ConfirmSave();

            var snapshot = account.CreateSnapshot();

            snapshot.Version = 10;
            account          = new CustomerAccount(snapshot);

            account.Apply(new ChangeEmailAddress(Any.Email()));

            // act
            var accountAtVersion10 = account.AsOfVersion(10);

            // arrange
            accountAtVersion10.Version.Should().Be(10);
            accountAtVersion10.EmailAddress.Should().Be(originalEmail);
        }
        public void Attempting_to_re_source_an_aggregate_that_was_instantiated_using_a_snapshot_throws_if_the_specified_version_is_prior_to_the_snapshot()
        {
            // arrange
            var account = new CustomerAccount()
                          .Apply(new ChangeEmailAddress(Any.Email()));

            account.ConfirmSave();
            var snapshot = account
                           .CreateSnapshot();

            snapshot.Version = 10;

            account = new CustomerAccount(snapshot);

            // act
            Action rollBack = () => account.AsOfVersion(9);

            // assert
            rollBack.ShouldThrow <InvalidOperationException>()
            .And
            .Message
            .Should()
            .Contain("Snapshot version is later than specified version.");
        }