Example #1
0
        public async Task GivenAnIdAndVersionThatExistsThenTheAggregateIsReturnedAsync()
        {
            var aggregate = new SerializableAggregateRoot();

            _ = repository
                .Setup(repo => repo.GetAsync(
                           It.Is <Guid>(id => id == aggregate.Id),
                           It.IsAny <CancellationToken?>(),
                           It.Is <SignedVersion>(v => v == aggregate.Version)))
                .ReturnsAsync(aggregate);

            AggregateRoot value = await repository.Object.GetAsync(
                context,
                aggregate.Id,
                version : aggregate.Version);

            repository.Verify(
                repo => repo.GetAsync(
                    It.IsAny <Guid>(),
                    It.IsAny <CancellationToken?>(),
                    It.IsAny <SignedVersion>()),
                Times.Once);

            Assert.Equal(aggregate, value);
        }
        public void GivenANewAggregateAndNoCurrentAggregateThenNoExceptionIsThrown()
        {
            var proposed = new SerializableAggregateRoot();
            SerializableAggregateRoot?current = default;

            AggregateDoesNotConflict(proposed, current);
        }
 public WhenPublishAsyncIsCalled()
 {
     aggregate = new SerializableAggregateRoot();
     context   = new SerializableMessage();
     store     = new Mock <IStore <AtomicUnit, Guid> >();
     bus       = new PersistentBus(store.Object);
 }
Example #4
0
        public void GivenAnAggregateThenTheVersionOfThatAggregateIsReturned()
        {
            var           aggregate = new SerializableAggregateRoot();
            SignedVersion version   = aggregate;

            Assert.Equal(aggregate.Version, version);
        }
Example #5
0
        public void GivenADifferentVersionThenTheResponseIsNegative()
        {
            SignedVersion version = aggregate.Version;
            var           other   = new SerializableAggregateRoot();

            Assert.False(other.Version.IsNext(version));
        }
Example #6
0
        public async Task GivenAVersionedReferenceAndARequestForASpecificVersionWhenMoreThanOneVersionExistsThenTheRequestedVersionIsReturnedAsync()
        {
            var           aggregate    = new SerializableAggregateRoot();
            SignedVersion firstVersion = aggregate.Version;
            var           reference    = Reference.Create(aggregate);

            aggregate.MarkChangesAsCommitted();

            var context = new SerializableMessage();

            aggregate.Set();

            _ = repository
                .Setup(repo => repo.GetAsync(
                           It.Is <Guid>(id => id == aggregate.Id),
                           It.IsAny <CancellationToken?>(),
                           It.Is <SignedVersion>(v => v == firstVersion)))
                .ReturnsAsync(aggregate);

            AggregateRoot value = await repository.Object.GetAsync(context, reference, latest : false);

            repository.Verify(
                repo => repo.GetAsync(
                    It.IsAny <Guid>(),
                    It.IsAny <CancellationToken?>(),
                    It.IsAny <SignedVersion>()),
                Times.Once);

            Assert.Equal(aggregate, value);
        }
Example #7
0
        public void GivenAnVersionThenAGuidMatchingThatVersionIsReturned()
        {
            var           aggregate = new SerializableAggregateRoot();
            SignedVersion version   = aggregate.Version.Next();

            var expected = new Guid(new[]
            {
                version.Header.ElementAt(0),
                version.Header.ElementAt(1),
                version.Header.ElementAt(2),
                version.Header.ElementAt(3),
                version.Header.ElementAt(4),
                version.Header.ElementAt(5),
                version.Header.ElementAt(6),
                version.Header.ElementAt(7),
                version.Footer.ElementAt(0),
                version.Footer.ElementAt(1),
                version.Footer.ElementAt(2),
                version.Footer.ElementAt(3),
                version.Footer.ElementAt(4),
                version.Footer.ElementAt(5),
                version.Footer.ElementAt(6),
                version.Footer.ElementAt(7),
            });

            var actual = version.ToGuid();

            Assert.Equal(expected, actual);
        }
Example #8
0
        public async Task GivenAVersionedReferenceThatDoesNotExistsThenAnAggregateVersionNotFoundExceptionIsThrownAsync()
        {
            _ = repository
                .Setup(repo => repo.GetAsync(
                           It.IsAny <Guid>(),
                           It.IsAny <CancellationToken?>(),
                           It.IsAny <SignedVersion>()))
                .ReturnsAsync(default(SerializableAggregateRoot));

            var aggregate = new SerializableAggregateRoot();
            var reference = Reference.Create(aggregate);

            AggregateVersionNotFoundException <SerializableAggregateRoot> exception =
                await Assert.ThrowsAsync <AggregateVersionNotFoundException <SerializableAggregateRoot> >(
                    () => repository.Object.GetAsync(context, reference, latest: false));

            repository.Verify(
                repo => repo.GetAsync(
                    It.IsAny <Guid>(),
                    It.IsAny <CancellationToken?>(),
                    It.IsAny <SignedVersion>()),
                Times.Once);

            Assert.Equal(reference, exception.Aggregate);
            Assert.Equal(context, exception.Context);
        }
        public void GivenAnAggregateThenTheIdForThatAggregateIsReturned()
        {
            var  aggregate = new SerializableAggregateRoot();
            Guid id        = aggregate;

            Assert.Equal(aggregate.Id, id);
        }
        public async Task GivenANewAggregateWhenNoExistingMemberWithTheSameIdExistsThenTheSavingEventIsRaisedPriorToTheVersionIncrementAsync()
        {
            var  expectedAggregate = new SerializableAggregateRoot();
            bool wasInvoked        = false;

            IRepository <SerializableAggregateRoot> expectedRepository =
                Create <SerializableAggregateRoot>();

            Task Aggregate_Saving(
                IRepository <SerializableAggregateRoot> actualRepository,
                AggregateSavingAsyncEventArgs <SerializableAggregateRoot> e)
            {
                Assert.Equal(expectedRepository, actualRepository);
                Assert.Equal(expectedAggregate, e.Aggregate);
                Assert.Same(expectedAggregate, e.Aggregate);
                Assert.True(e.Aggregate.Version.IsNew);

                return(Task.FromResult(wasInvoked = true));
            }

            expectedRepository.AggregateSaving += Aggregate_Saving;

            await expectedRepository.SaveAsync(expectedAggregate);

            Assert.True(wasInvoked);
        }
        public async Task GivenAReferenceThatExistsThenTheLatestAggregateIsReturnedAsync()
        {
            var aggregateId     = Guid.NewGuid();
            var firstAggregate  = new Mock <SerializableAggregateRoot>(aggregateId);
            var secondAggregate = new Mock <SerializableAggregateRoot>(aggregateId);
            var reference       = Reference <SerializableAggregateRoot> .Create(aggregateId);

            _ = repository
                .Setup(repo => repo.GetAsync(
                           It.Is <Guid>(id => id == aggregateId),
                           It.IsAny <CancellationToken?>(),
                           It.Is <SignedVersion>(v => v == default)))
                .ReturnsAsync(secondAggregate.Object);

            SerializableAggregateRoot value = await reference.RetrieveAsync(context, repository.Object);

            repository.Verify(
                repo => repo.GetAsync(
                    It.IsAny <Guid>(),
                    It.IsAny <CancellationToken?>(),
                    It.IsAny <SignedVersion>()),
                Times.Once);

            Assert.Equal(secondAggregate.Object, value);
        }
        public void GivenAnAggregateThenAReferenceForThatAggregateIsReturned()
        {
            var aggregate = new SerializableAggregateRoot();
            Reference reference = aggregate;

            Assert.True(reference.IsMatch(aggregate));
        }
Example #13
0
        public void GivenADifferentVersionWhenFooterAndNumberAreUsedThenTheResponseIsNegative()
        {
            SignedVersion version = aggregate.Version;
            var           other   = new SerializableAggregateRoot();

            Assert.False(other.Version.IsNext(version.Footer, version.Number));
        }
        public void GivenAnVersionThenTheVersionSignatureIsReturned()
        {
            var           aggregate = new SerializableAggregateRoot();
            SignedVersion version   = aggregate.Version;
            Guid          signature = version;

            Assert.Equal(version.Signature, signature);
        }
        public void GivenAnIdThenTheIdIsPropagated()
        {
            var expectedId = Guid.NewGuid();
            var aggregate  = new SerializableAggregateRoot(expectedId);

            Assert.Equal(expectedId, aggregate.Id);
            Assert.True(aggregate.HasUncommittedChanges);
        }
Example #16
0
        public void GivenAnAggregateAndNoInvariantsThenNoExceptionIsThrown()
        {
            var context   = new SerializableMessage();
            var request   = new TestableRequest(context);
            var aggregate = new SerializableAggregateRoot();

            request.Satisfies(aggregate);
        }
        public void GivenAnAggregateThenAnInstanceIsReturnedWithTheAggregateReferenceSet()
        {
            var aggregate = new SerializableAggregateRoot();
            var instance  = new SerializableProjection <SerializableAggregateRoot>(aggregate);
            var expected  = aggregate.ToReference();

            Assert.Equal(expected, instance.Aggregate);
        }
Example #18
0
        public void GivenAnAggregateThenAnInstanceIsCreated()
        {
            var aggregate = new SerializableAggregateRoot();
            var @event    = new AggregateSavedAsyncEventArgs <SerializableAggregateRoot>(aggregate);

            Assert.Equal(aggregate, @event.Aggregate);
            Assert.Same(aggregate, @event.Aggregate);
        }
        public void GivenAMatchingReferenceThenTrueIsReturned()
        {
            var       aggregateId = Guid.NewGuid();
            var       aggregate   = new SerializableAggregateRoot(aggregateId);
            Reference reference   = Create <SerializableAggregateRoot>(aggregateId);

            Assert.True(condition: reference.IsMatch(aggregate));
        }
Example #20
0
        public void GivenAProjectionWhenCastToAnUntypedReferenceThenTheUntypedReferenceForItsAggregateIsReturned()
        {
            var       aggregate  = new SerializableAggregateRoot();
            var       projection = new SerializableProjection <SerializableAggregateRoot>(aggregate);
            Reference reference  = projection;

            Assert.True(reference.IsMatch(aggregate));
        }
Example #21
0
        public void GivenAnVersionThenTheVersionNumberIsReturned()
        {
            var           aggregate = new SerializableAggregateRoot();
            SignedVersion version   = aggregate.Version;
            ulong         number    = version;

            Assert.Equal(version.Number, number);
        }
        public void GivenAVersionedReferenceThatDoesNotExistsThenNoEntryIsReturned()
        {
            var aggregate = new SerializableAggregateRoot();
            var reference = aggregate.ToReference();

            bool exists = Dictionary.TryGetValue(reference, out _);

            Assert.False(exists);
        }
Example #23
0
        public void GivenAMatchingProjectionThenANegativeResponseIsReturned()
        {
            var aggregate = new SerializableAggregateRoot();
            var first     = new SerializableProjection <SerializableAggregateRoot>(aggregate);
            var second    = new SerializableProjection <SerializableAggregateRoot>(aggregate);

            Assert.False(first != second);
            Assert.False(second != first);
        }
Example #24
0
        public void GivenATypedReferenceThenTheIdOfThatReferenceIsReturned()
        {
            var  aggregate = new SerializableAggregateRoot();
            var  reference = aggregate.ToReference();
            Type type      = reference;

            Assert.Equal(reference.Type, type);
            Assert.Equal(typeof(SerializableAggregateRoot), type);
        }
        private static DomainEvent[] CreateEvents()
        {
            var aggregate   = new SerializableAggregateRoot();
            var context     = new SerializableMessage();
            var firstEvent  = new SerializableDomainEvent <SerializableAggregateRoot>(context, aggregate);
            var secondEvent = new SerializableDomainEvent <SerializableAggregateRoot>(context, aggregate);

            return(new[] { firstEvent, secondEvent });
        }
        public void GivenASignedVersionThenAllPropertiesArePropagated()
        {
            var           aggregate    = new SerializableAggregateRoot();
            SignedVersion original     = aggregate.Version;
            SignedVersion deserialized = original.Clone();

            Assert.NotSame(original, deserialized);
            Assert.Equal(original, deserialized);
        }
        public void GivenAMatchingProjectionThenAPositiveResponseIsReturned()
        {
            var aggregate = new SerializableAggregateRoot();
            var first     = new SerializableProjection <SerializableAggregateRoot>(aggregate);
            var second    = new SerializableProjection <SerializableAggregateRoot>(aggregate);

            Assert.True(first == second);
            Assert.True(first.Equals(second));
            Assert.True(second == first);
        }
        public void GivenAUnTypedReferenceThenTheReferenceIsReturned()
        {
            var       aggregate = new SerializableAggregateRoot();
            Reference original  = aggregate.ToReference();

            _ = info.TryAddReference(nameof(original), original);
            Reference retrieved = info.TryGetReference(nameof(original));

            Assert.Equal(original, retrieved);
        }
        public void GiveEventsFromTwoAggregatesThenAnArgumentExceptionIsThrown()
        {
            var firstAggregate  = new SerializableAggregateRoot();
            var secondAggregate = new SerializableAggregateRoot();
            var context         = new SerializableMessage();
            var firstEvent      = new SerializableDomainEvent <SerializableAggregateRoot>(context, firstAggregate);
            var secondEvent     = new SerializableDomainEvent <SerializableAggregateRoot>(context, secondAggregate);

            _ = Assert.Throws <ArgumentException>(() => new AtomicUnit(new[] { firstEvent, secondEvent }));
        }
Example #30
0
        public void GivenTheAggregateAndTheEventAggregateThenAnInstanceIsReturnedWithAllPropertiesSet()
        {
            var subject        = new SerializableAggregateRoot();
            var aggregate      = subject.ToReference();
            var eventAggregate = subject.ToReference();
            var instance       = new AggregateEventMismatchException(aggregate, eventAggregate);

            Assert.Equal(aggregate, instance.Aggregate);
            Assert.Equal(eventAggregate, instance.EventAggregate);
        }