Beispiel #1
0
        public void SagaMachine_Should_Not_Stop_Saga_If_An_Exception_Happens()
        {
            //Arrange
            string dummyLockToken;

            _keyValueStoreMock.Setup(o => o.TakeLockWithDefaultExpiryTime(It.IsAny <string>(), out dummyLockToken)).Returns(true);
            _keyValueStoreMock.Setup(o => o.ReleaseLock(It.IsAny <string>(), It.IsAny <string>())).Returns(true);

            _keyValueStoreMock.Setup(o => o.GetValue <TestState>(It.IsAny <string>()))
            .Returns(new HashedValue <TestState>
            {
                Hash  = Guid.Empty.ToString(),
                Value = new TestState()
            });

            // We need the below to set the return value
            _keyValueStoreMock.Setup(kv => kv.Remove(It.IsAny <string>(), It.IsAny <string>())).Returns(true);

            Func <IEnumerable <ISagaMessageIdentifier>, Task> publisher = async messages =>
            {
                foreach (var message in messages)
                {
                    if (message is GoodbyeMessage)
                    {
                        await Task.Delay(1000);

                        throw new Exception();
                    }

                    await Task.Delay(500);
                }
            };

            //Act
            _sagaMachine = new SagaMachine <TestState>(_keyValueStoreMock.Object, publisher, _mockEventloggerFactory.Object);
            _sagaMachine
            .WithMessage <HelloMessage>((proccess, msg) => proccess
                                        .Publish((msgForPub, state) => new[] { new GoodbyeMessage() })
                                        .StopSaga()
                                        .Execute()
                                        );

            Func <Task> act = async() => { await _sagaMachine.Handle(new HelloMessage()).ConfigureAwait(false); };

            act.ShouldThrow <Exception>();

            //Assert
            _keyValueStoreMock.Verify(o => o.TrySetValue(It.IsAny <string>(), It.IsAny <TestState>(), It.IsAny <string>()), Times.Never);
            _keyValueStoreMock.Verify(kv => kv.Remove(It.IsAny <string>(), It.IsAny <string>()), Times.Never);
        }
Beispiel #2
0
        public async Task SagaMachineShouldInitialiseState()
        {
            //Arrange
            var sagaInstanceId = Guid.NewGuid();

            _keyValueStoreMock.Setup(o => o.TrySetValue(sagaInstanceId.ToString(), It.IsAny <TestState>(), string.Empty)).Returns(true);
            _keyValueStoreMock.Setup(o => o.TakeLockWithDefaultExpiryTime(sagaInstanceId.ToString(), It.IsAny <Guid>())).ReturnsAsync(true);
            _keyValueStoreMock.Setup(o => o.ReleaseLock(sagaInstanceId.ToString(), It.IsAny <Guid>())).ReturnsAsync(true);

            _sagaMachine
            .WithMessage <HelloMessage>((proccess, msg) => proccess
                                        .InitialiseState(hello => new TestState
            {
                SomeStateVariable = hello.Message,
                SagaInstanceId    = sagaInstanceId
            })
                                        .Execute()
                                        );

            //Act
            await _sagaMachine.Handle(new HelloMessage
            {
                Message        = "Initialised",
                SagaInstanceId = sagaInstanceId
            });

            //Assert
            _keyValueStoreMock.Verify(o => o.TrySetValue(sagaInstanceId.ToString(), It.Is <TestState>(state => state.SomeStateVariable == "Initialised"), string.Empty), Times.AtLeastOnce);
        }