public async void ProcessForkWithException() { // Arrange var settings = new StepSettings { TrackStateChanges = true, AutoProgress = true }; const string firstStepName = "first"; const string forkStepName = "fork"; const string secondStepName = "second"; const string exceptionalStepName = "exceptionalStep"; const string fourthStepName = "fourth"; var firstBaseStep = new BaseStep(firstStepName, settings); var secondStepAsync = new AsyncStep(500, secondStepName); var exceptionalStep = new ExceptionalStep(exceptionalStepName); var fourthStepAsync = new AsyncStep(200, fourthStepName); firstBaseStep.Fork( name: forkStepName, stepSettings: settings, secondStepAsync, exceptionalStep, fourthStepAsync); var expectedExecutionStarted = new[] { firstStepName, forkStepName, secondStepName, exceptionalStepName, fourthStepName }; var expectedExecutionCompletionOrder = new[] { firstStepName, fourthStepName, secondStepName }; var expectedFailedOrder = new[] { forkStepName, exceptionalStepName }; // Actssert try { await firstBaseStep.Execute(_workflowState); } catch (WorkflowActionException <SimpleWorkflowState> ex) { var result = ex.WorkflowState; var orderedByStarted = result.WorkflowChain.ToList().Select(x => x.StepName).ToArray(); var orderedByCompletion = result.WorkflowChain.ToList() .Where(x => x.StepActivities.Any(y => y.Activity == StepActivityStages.ExecutionCompleted)) .OrderBy(x => x.StepActivities.FirstOrDefault(y => y.Activity == StepActivityStages.ExecutionCompleted).DateTimeOffset) .Select(x => x.StepName) .ToArray(); var failedStepNames = result.WorkflowChain.ToList() .Where(x => x.StepActivities.Any(y => y.Activity == StepActivityStages.ExecutionFailed)) .Select(x => x.StepName) .ToArray(); // Assert Assert.True(expectedExecutionStarted.SequenceEqual(orderedByStarted)); Assert.True(expectedExecutionCompletionOrder.SequenceEqual(orderedByCompletion)); Assert.True(expectedFailedOrder.SequenceEqual(failedStepNames)); } }
public async void ExecuteCurrent() { // Arrange var baseStepName = "base"; var originStep = new BaseStep(name: baseStepName); // Act var result = await originStep.Execute(_workflowState); // Assert Assert.Equal(_originalWorfklowState.MyInteger + 1, result.State.MyInteger); }
public async void WorkflowChainUpdatedWithSnapshot() { // Arrange var baseStepName = "base"; var originStep = new BaseStep(name: baseStepName); // Act var result = await originStep.Execute(_workflowState); var link = result.WorkflowChain.First.Value; // Assert Assert.Single(result.WorkflowChain); Assert.Equal(baseStepName, link.StepName); Assert.Equal(originStep.Id, link.StepIdentifier); Assert.Equal(0, link.SequenceNumber); Assert.Null(link.GetUncompressedStateSnapshot <SimpleWorkflowState>()); Assert.Equal(StepActivityStages.Executing, link.StepActivities.First().Activity); Assert.Equal(StepActivityStages.ExecutionCompleted, link.StepActivities.Last().Activity); }
public async void ProcessFork() { // Arrange var settings = new StepSettings { TrackStateChanges = true, AutoProgress = true }; const string firstStepName = "first"; const string forkStepName = "fork"; const string secondStepName = "second"; const string thirdStepName = "third"; const string fourthStepName = "fourth"; var firstBaseStep = new BaseStep(firstStepName, settings); var secondStepAsync = new AsyncStep(500, secondStepName); var thirdStepAsync = new AsyncStep(0, thirdStepName); var fourthStepAsync = new AsyncStep(200, fourthStepName); firstBaseStep.Fork( name: forkStepName, stepSettings: settings, secondStepAsync, thirdStepAsync, fourthStepAsync); var expectedExecutionStarted = new[] { firstStepName, forkStepName, secondStepName, thirdStepName, fourthStepName }; var expectedExecutionCompletionOrder = new[] { firstStepName, thirdStepName, fourthStepName, secondStepName, forkStepName }; // Act var result = await firstBaseStep.Execute(_workflowState); var orderedByStarted = result.WorkflowChain.ToList().Select(x => x.StepName).ToArray(); var orderedByCompletion = result.WorkflowChain.ToList() .OrderBy(x => x.StepActivities.FirstOrDefault(y => y.Activity == StepActivityStages.ExecutionCompleted).DateTimeOffset) .Select(x => x.StepName) .ToArray(); // Assert Assert.True(expectedExecutionStarted.SequenceEqual(orderedByStarted)); Assert.True(expectedExecutionCompletionOrder.SequenceEqual(orderedByCompletion)); }
public async void WorkflowChainUpdated() { // Arrange var baseStepName = "base"; var settings = new StepSettings { TrackStateChanges = true }; var originStep = new BaseStep(name: baseStepName, settings); // Act var result = await originStep.Execute(_workflowState); var link = result.WorkflowChain.First.Value; // Assert Assert.Single(result.WorkflowChain); Assert.Equal(baseStepName, link.StepName); Assert.Equal(originStep.Id, link.StepIdentifier); Assert.Equal(0, link.SequenceNumber); Assert.Equal(_originalWorfklowState.MyInteger + 1, link.GetUncompressedStateSnapshot <SimpleWorkflowState>().MyInteger); Assert.Equal(StepActivityStages.Executing, link.StepActivities.First().Activity); Assert.Equal(StepActivityStages.ExecutionCompleted, link.StepActivities.Last().Activity); }
public async void AutoProgressSetting() { // Arrange var baseStepName = "base"; var nextStepName = "next"; var settings = new StepSettings() { AutoProgress = true, TrackStateChanges = true }; var originStep = new BaseStep(name: baseStepName, stepSettings: settings); var nextStep = new BaseStep(name: nextStepName, stepSettings: settings); originStep.SetNext(nextStep); // Act var result = await originStep.Execute(_workflowState); // Assert Assert.Equal(_originalWorfklowState.MyInteger + 2, result.State.MyInteger); Assert.Equal(2, result.WorkflowChain.Count); var firstLink = result.WorkflowChain.First.Value; var secondLink = result.WorkflowChain.Last.Value; Assert.Equal(originStep.Id, firstLink.StepIdentifier); Assert.Equal(1, firstLink.GetUncompressedStateSnapshot <SimpleWorkflowState>().MyInteger); Assert.Equal(nextStep.Id, secondLink.StepIdentifier); Assert.Equal(2, secondLink.GetUncompressedStateSnapshot <SimpleWorkflowState>().MyInteger); Assert.Equal(StepActivityStages.Executing, firstLink.StepActivities.First().Activity); Assert.Equal(StepActivityStages.ExecutionCompleted, firstLink.StepActivities.Last().Activity); Assert.Equal(StepActivityStages.Executing, secondLink.StepActivities.First().Activity); Assert.Equal(StepActivityStages.ExecutionCompleted, secondLink.StepActivities.Last().Activity); }