예제 #1
0
        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));
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }