Example #1
0
        public void Create_RefWithMultipleMatchingTransactionId_UseLastReference()
        {
            // Arrange
            var func      = new SagaStepResolver().Create();
            var sagaEvent = new SagaEvent01();

            var references = new List <ISagaReference>
            {
                new SagaReference(new SagaVersion("1.0.0"), 0, SagaMessageType.Command, sagaEvent.ProcessId, sagaEvent.TransactionId),
                new SagaReference(new SagaVersion("1.0.0"), 1, SagaMessageType.Command, sagaEvent.ProcessId, sagaEvent.TransactionId)
            };

            var configuration  = new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 2, null);
            var configurations = new List <ISagaStepConfiguration>
            {
                new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 0, null),
                new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 1, null),
                configuration,
            };

            // Act
            var result = func(sagaEvent, references, configurations);

            // Assert
            Assert.Same(configuration, result);
        }
Example #2
0
        public async Task RunAsync_EventIsNull_ThrowsArgumentNull()
        {
            // Arrange
            var         sagaStepAdapter = CreateSagaStepAdapter();
            SagaEvent01 sagaEvent       = null;

            // Assert
            await Assert
            .ThrowsAsync <ArgumentNullException>(() => sagaStepAdapter.RunAsync(sagaEvent))
            .ConfigureAwait(false);
        }
Example #3
0
        public async Task RunAsync_NoAddStepsCalled_ThrowInvalidOperation()
        {
            // Arrange
            var sagaProcessor = CreateSagaProcessor();
            var sagaEvent     = new SagaEvent01();

            // Assert
            await Assert
            .ThrowsAsync <InvalidOperationException>(() => sagaProcessor.RunAsync(sagaEvent))
            .ConfigureAwait(false);
        }
Example #4
0
        public void Create_ConfigurationsNull_ThrowArgumentNull()
        {
            // Arrange
            var func      = new SagaStepResolver().Create();
            var sagaEvent = new SagaEvent01();

            IList <ISagaStepConfiguration> configurations = null;

            // Assert
            Assert.Throws <ArgumentNullException>(() => func(sagaEvent, null, configurations));
        }
Example #5
0
        public void IsResponsible_EventTypeEqualPredicateReturnsFalse_ReturnFalse()
        {
            // Arrange
            var sagaStepConfiguration = new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 1, _ => false);
            var sagaEvent             = new SagaEvent01();

            // Act
            var result = sagaStepConfiguration.IsResponsible(sagaEvent);

            // Assert
            Assert.False(result);
        }
Example #6
0
        public void Create_RefsNullOneStepWithFalsePredicate_ThrowInvalidOperation()
        {
            // Arrange
            var func      = new SagaStepResolver().Create();
            var sagaEvent = new SagaEvent01();

            var configurations = new List <ISagaStepConfiguration>
            {
                new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 0, _ => false)
            };

            // Assert
            Assert.Throws <InvalidOperationException>(() => func(sagaEvent, null, configurations));
        }
Example #7
0
        public async Task RunAsync_RunWithEvent_CompleteRun()
        {
            // Arrange
            var saga      = CreateSaga();
            var sagaEvent = new SagaEvent01();

            _mockSagaProfile.Setup(prfl => prfl.Configure(It.IsAny <ISagaProcessorBuilder>()));
            _mockSagaProcessorBuilder.Setup(bldr => bldr.Build()).Returns(_mockSagaProcessor.Object);
            _mockSagaProcessor.Setup(prcssr => prcssr.RunAsync(sagaEvent)).ReturnsAsync(new ArraySegment <ISagaCommand>());

            // Act
            await saga
            .RunAsync(sagaEvent)
            .ConfigureAwait(false);
        }
Example #8
0
        public void Create_RefsNullOneStepWithCorrectEvent_ReturnStep()
        {
            // Arrange
            var func           = new SagaStepResolver().Create();
            var sagaEvent      = new SagaEvent01();
            var configuartion  = new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 0, null);
            var configurations = new List <ISagaStepConfiguration>
            {
                configuartion
            };

            // Act
            var result = func(sagaEvent, null, configurations);

            // Assert
            Assert.Same(configuartion, result);
        }
Example #9
0
        public async Task RunAsync_ValidInjections_CallsRunAsyncOfStep()
        {
            // Arrange
            var sagaStepAdapter = CreateSagaStepAdapter();
            var sagaEvent       = new SagaEvent01();

            _mockSagaStep
            .Setup(stp => stp.RunAsync(It.IsAny <SagaEvent01>()))
            .ReturnsAsync(new List <ISagaCommand>());

            // Act
            await sagaStepAdapter
            .RunAsync(sagaEvent)
            .ConfigureAwait(false);

            // Assert
            _mockSagaStep.Verify(stp => stp.RunAsync(sagaEvent), Times.Once);
        }
Example #10
0
        public void Create_RefWithMatchingTransactionIdButFailingPredicate_ThrowInvalidOperation()
        {
            // Arrange
            var func      = new SagaStepResolver().Create();
            var sagaEvent = new SagaEvent01();

            var references = new List <ISagaReference>
            {
                new SagaReference(new SagaVersion("1.0.0"), 1, SagaMessageType.Command, sagaEvent.ProcessId, sagaEvent.TransactionId)
            };

            var configurations = new List <ISagaStepConfiguration>
            {
                new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 0, _ => false),
                new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 1, _ => false)
            };

            // Assert
            Assert.Throws <InvalidOperationException>(() => func(sagaEvent, references, configurations));
        }
Example #11
0
        public async Task RunAsync_ValidCall_ReturnsCommand()
        {
            // Arrange
            var sagaProcessor = CreateSagaProcessor();
            var sagaEvent     = new SagaEvent01();
            var sagaVersion   = new SagaVersion("1.0.0");

            var mockSagaStep        = new SagaStepAdapter <SagaEvent01>(sagaVersion, 0, new SagaStep01Mock());
            var mockConfiguration01 = _mockRepository.Create <ISagaStepConfiguration>();

            mockConfiguration01
            .Setup(cnfgrtn => cnfgrtn.Create(It.IsAny <ISagaServiceProvider>()))
            .Returns(mockSagaStep);

            var mockConfiguration02 = _mockRepository.Create <ISagaStepConfiguration>();

            var configurations = new List <ISagaStepConfiguration>
            {
                mockConfiguration01.Object,
                mockConfiguration02.Object
            };

            _mockSagaVersionStepResolver
            .Setup(rslvr => rslvr.ResolveAsync(sagaEvent, It.Is <IDictionary <ISagaVersion, IList <ISagaStepConfiguration> > >(dctnry => dctnry.Single().Value == configurations)))
            .ReturnsAsync(mockConfiguration01.Object);

            _mockSagaProcess
            .Setup(prcss => prcss.RunAsync(sagaEvent, mockSagaStep))
            .ReturnsAsync(await mockSagaStep.RunAsync(sagaEvent).ConfigureAwait(false));

            // Act
            sagaProcessor.AddSteps(sagaVersion, configurations);

            var commands = await sagaProcessor
                           .RunAsync(sagaEvent)
                           .ConfigureAwait(false);

            // Assert
            Assert.NotEmpty(commands);
        }
Example #12
0
        public async Task RunAsync_RunTwice_BuildCalledOnce()
        {
            // Arrange
            var saga      = CreateSaga();
            var sagaEvent = new SagaEvent01();

            _mockSagaProfile.Setup(prfl => prfl.Configure(It.IsAny <ISagaProcessorBuilder>()));
            _mockSagaProcessorBuilder.Setup(bldr => bldr.Build()).Returns(_mockSagaProcessor.Object);
            _mockSagaProcessor.Setup(prcssr => prcssr.RunAsync(sagaEvent)).ReturnsAsync(new ArraySegment <ISagaCommand>());

            // Act
            await saga
            .RunAsync(sagaEvent)
            .ConfigureAwait(false);

            await saga
            .RunAsync(sagaEvent)
            .ConfigureAwait(false);

            // Assert
            _mockSagaProcessorBuilder.Verify(bldr => bldr.Build(), Times.Once);
        }
Example #13
0
        public async Task ResolveAsync_EventStoreReturnsNull_FunctionsAreCalled()
        {
            // Arrange
            var sagaVersionStepResolver = CreateSagaVersionStepResolver();
            var sagaEvent = new SagaEvent01();

            var sagaVersion         = new SagaVersion("1.0.0");
            var mockConfiguration01 = _mockRepository.Create <ISagaStepConfiguration>();
            var mockConfiguration02 = _mockRepository.Create <ISagaStepConfiguration>();

            var versions = new Dictionary <ISagaVersion, IList <ISagaStepConfiguration> >
            {
                {
                    sagaVersion,
                    new List <ISagaStepConfiguration>
                    {
                        mockConfiguration01.Object,
                        mockConfiguration02.Object
                    }
                }
            };

            _mockSagaVersionResolver
            .Setup(vrsnRslvr => vrsnRslvr.Create())
            .Returns((_, versions) => versions.Single().Value);

            _mockSagaStepResolver
            .Setup(stpRslvr => stpRslvr.Create())
            .Returns((_, __, configurations) => configurations[0]);

            // Act
            var result = await sagaVersionStepResolver
                         .ResolveAsync(sagaEvent, versions)
                         .ConfigureAwait(false);

            // Assert
            Assert.Same(mockConfiguration01.Object, result);
        }
Example #14
0
        public void Create_RefsNullLastStepTruePredicate_ReturnLastStep()
        {
            // Arrange
            var func      = new SagaStepResolver().Create();
            var sagaEvent = new SagaEvent01();

            var configuartion = new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(
                new SagaVersion("1.0.0"),
                1,
                sgEvnt => sgEvnt.TransactionId == sagaEvent.TransactionId);

            var configurations = new List <ISagaStepConfiguration>
            {
                new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 0, _ => false),
                configuartion
            };

            // Act
            var result = func(sagaEvent, null, configurations);

            // Assert
            Assert.Same(configuartion, result);
        }
Example #15
0
        public void Create_RefWithoutMatchingReferenceId_HandledLikeRefsNull()
        {
            // Arrange
            var func      = new SagaStepResolver().Create();
            var sagaEvent = new SagaEvent01();

            var references = new List <ISagaReference>
            {
                new SagaReference(new SagaVersion("1.0.0"), 0, SagaMessageType.Command, Guid.NewGuid(), sagaEvent.TransactionId)
            };

            var configuration  = new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 0, null);
            var configurations = new List <ISagaStepConfiguration>
            {
                configuration,
                new SagaStepConfiguration <SagaEvent01, SagaStep01Mock>(new SagaVersion("1.0.0"), 1, null)
            };

            // Act
            var result = func(sagaEvent, references, configurations);

            // Assert
            Assert.Same(configuration, result);
        }