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); }
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); }