public async void Pipeline_Result_Ids_Equal_Node_Ids() { var pipelineNode = new PipelineNode <TestObjectA> { Id = "PipelineNode1", FlowId = "Flow1" }; pipelineNode.AddChild(new SimpleTestNodeA1 { FlowId = "Flow1" }); pipelineNode.AddChild(new SimpleTestNodeA2 { Id = "Child2", FlowId = "Flow1" }); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); result.FlowId.ShouldEqual("Flow1"); result.Id.ShouldEqual("PipelineNode1"); result.ChildResults.First().Id.ShouldEqual("Banzai.Test.SimpleTestNodeA1"); result.ChildResults.First().FlowId.ShouldEqual("Flow1"); var secondResult = result.ChildResults.FirstOrDefault(x => x.Id == "Child2"); secondResult.ShouldNotBeNull(); secondResult.FlowId.ShouldEqual("Flow1"); }
public async Task Pipeline_Overall_Result_Subject_Equals_Last_Changed_Subject() { var pipelineNode = new PipelineNode <TestObjectA>(); var node1 = new SimpleTestNodeA1(); var node2 = new SubjectChangingNode1(); var node3 = new SimpleTestNodeA2(); var node4 = new SubjectChangingNode1(); pipelineNode.AddChild(node1); pipelineNode.AddChild(node2); pipelineNode.AddChild(node3); pipelineNode.AddChild(node4); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); pipelineNode.Status.Should().Be(NodeRunStatus.Completed); var childResults = result.ChildResults.ToList(); result.Subject.Should().NotBeSameAs(testObject); result.Subject.Should().NotBeSameAs(childResults[1].Subject); result.Subject.Should().NotBeSameAs(childResults[2].Subject); result.Subject.Should().BeSameAs(childResults[3].Subject); }
public async void Parent_Pipeline_Cancels_Execution_When_Child_Pipeline_Node_Cancelled() { var testNode1 = new SimpleTestNodeA1(); var testNode2 = new SimpleTestNodeA1(true, false, true); var testNode3 = new SimpleTestNodeA2(); var innerPipelineNode = new PipelineNode <TestObjectA>(); innerPipelineNode.AddChild(testNode1); innerPipelineNode.AddChild(testNode2); var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(innerPipelineNode); pipelineNode.AddChild(testNode3); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.ShouldEqual(NodeResultStatus.Succeeded); innerPipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); testNode1.Status.ShouldEqual(NodeRunStatus.Completed); testNode2.Status.ShouldEqual(NodeRunStatus.NotRun); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); testNode3.Status.ShouldEqual(NodeRunStatus.NotRun); }
public async Task Adding_State_To_A_Node_Is_Available_In_Following_Node() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new FuncNode <TestObjectA> { ExecutedFunc = ctxt => { ctxt.State.Foo = "Bar"; return(Task.FromResult(NodeResultStatus.Succeeded)); } }); pipelineNode.AddChild(new FuncNode <TestObjectA> { ExecutedFunc = ctxt => ctxt.State.Foo == "Bar" ? Task.FromResult(NodeResultStatus.Succeeded) : Task.FromResult(NodeResultStatus.Failed) }); var testObject = new TestObjectA(); var result = await pipelineNode.ExecuteAsync(testObject); result.Status.Should().Be(NodeResultStatus.Succeeded); }
public async void Successful_Pipeline_Run_Status_Is_Succeeded() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); }
public async void Pipeline_Result_Should_Equal_Initial_Subject() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); result.Subject.ShouldBeSameAs(testObject); }
public async Task Pipeline_Run_With_Initial_Failure_Returns_Failed_Status() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new FailingTestNodeA()); pipelineNode.AddChild(new SimpleTestNodeA1()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.Should().Be(NodeResultStatus.Failed); pipelineNode.Status.Should().Be(NodeRunStatus.Completed); }
public async void Pipeline_Run_With_Failure_After_Success_Returns_Failed_Status() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new FailingTestNodeA()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.ShouldEqual(NodeResultStatus.Failed); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); }
public async void Pipeline_Child_Result_Count_Equals_Child_Node_Count() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); result.ChildResults.Count().ShouldEqual(2); }
public async void Logging_Set_With_Log4Net_Doesnt_Err() { LogWriter.SetFactory(new Log4NetWriterFactory()); var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); }
public async void Successful_Pipeline_Result_Matches_Expectations() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.ShouldEqual(NodeResultStatus.Succeeded); testObject.TestValueString.ShouldEqual("Completed"); testObject.TestValueInt.ShouldEqual(100); }
public async Task Pipeline_Run_With_Initial_Failure_Returns_Failed_Status() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new FaultingTestNodeA()); pipelineNode.AddChild(new SimpleTestNodeA1()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); IEnumerable <Exception> exceptions = result.GetFailExceptions(); exceptions.Should().NotBeNull(); exceptions.Count().Should().Be(1); }
public async void Nested_Pipeline_Results_Contain_All_Child_Results() { var pipelineNode = new PipelineNode <TestObjectA>(); var pipelineNode2 = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(pipelineNode2); pipelineNode2.AddChild(new SimpleTestNodeA2()); pipelineNode2.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.ChildResults.Count().ShouldEqual(1); result.ChildResults.First().ChildResults.Count().ShouldEqual(2); }
public async Task Successful_Transition_Run_Status_Is_Succeeded() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new SimpleTransitionNode { ChildNode = new SimpleTestNodeB1() }); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.Should().Be(NodeResultStatus.Succeeded); pipelineNode.Status.Should().Be(NodeRunStatus.Completed); }
public async Task Failed_Transition_Node_Child_Results_In_Failed_Parent() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new SimpleTransitionNode { ChildNode = new FailingTestNodeB() }); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.Should().Be(NodeResultStatus.Failed); pipelineNode.Status.Should().Be(NodeRunStatus.Completed); }
public async void Faulted_Transition_Node_Child_Results_In_Failed_Parent_With_Exception() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new SimpleTransitionNode { ChildNode = new FaultingTestNodeB() }); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.ShouldEqual(NodeResultStatus.Failed); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); result.Exception.ShouldNotBeNull(); }
public async Task Can_Add_Base_Type_Nodes_To_Inherited_Type_Pipeline() { var testNode = new SimpleTestNodeA1(); var testNode2 = new SimpleTestNodeASub1(); var pipeline = new PipelineNode <TestObjectASub>(); pipeline.AddChild(testNode); pipeline.AddChild(testNode2); var testObject = new TestObjectASub(); var result = await pipeline.ExecuteAsync(testObject); testNode.Status.Should().Be(NodeRunStatus.Completed); result.Status.Should().Be(NodeResultStatus.Succeeded); }
public async void Pipeline_Run_With_Final_Fault_And_ContinueOnError_Returns_SucceededWithErrors_Status() { var pipelineNode = new PipelineNode <TestObjectA> { LocalOptions = new ExecutionOptions { ContinueOnFailure = true } }; pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new FaultingTestNodeA()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.ShouldEqual(NodeResultStatus.SucceededWithErrors); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); }
public async void Adding_State_To_A_Node_Is_Available_In_Global_Context() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new FuncNode <TestObjectA> { ExecutedFunc = ctxt => { ctxt.State.Foo = "Bar"; return(Task.FromResult(NodeResultStatus.Succeeded)); } }); var testObject = new TestObjectA(); var context = new ExecutionContext <TestObjectA>(testObject); NodeResult result = await pipelineNode.ExecuteAsync(context); result.Status.ShouldEqual(NodeResultStatus.Succeeded); Assert.AreEqual("Bar", context.State.Foo); }
public async Task Faulting_TransitionSourceFunc_Returns_Fail_Result() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new TransitionFuncNode <TestObjectA, TestObjectB> { ChildNode = new SimpleTestNodeB1(), TransitionSourceFuncAsync = ctxt => { throw new Exception(); } }); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.Should().Be(NodeResultStatus.Failed); pipelineNode.Status.Should().Be(NodeRunStatus.Completed); }
public async Task Simple_TransitionSourceAsyncFunc_Succeeds() { var pipelineNode = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(new SimpleTestNodeA1()); pipelineNode.AddChild(new TransitionFuncNode <TestObjectA, TestObjectB> { ChildNode = new SimpleTestNodeB1(), TransitionSourceFuncAsync = ctxt => Task.FromResult(new TestObjectB()) }); pipelineNode.AddChild(new SimpleTestNodeA2()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.Should().Be(NodeResultStatus.Succeeded); pipelineNode.Status.Should().Be(NodeRunStatus.Completed); }
public async Task ShouldExecuteFunc_On_Test_Object_Is_Evaluated() { var testNode = new SimpleTestNodeA1(); var testNode2 = new SimpleTestNodeASub1(); testNode2.AddShouldExecute(context => Task.FromResult(context.Subject.TestValueDecimal == 1)); var pipeline = new PipelineNode <TestObjectASub>(); pipeline.AddChild(testNode); pipeline.AddChild(testNode2); var testObject = new TestObjectASub(); var result = await pipeline.ExecuteAsync(testObject); testNode.Status.Should().Be(NodeRunStatus.Completed); testNode2.Status.Should().Be(NodeRunStatus.NotRun); }
public async Task Pipeline_With_ContinueOnError_Returns_Exceptions_On_All_Failures() { var pipelineNode = new PipelineNode <TestObjectA> { LocalOptions = new ExecutionOptions { ContinueOnFailure = true } }; pipelineNode.AddChild(new FaultingTestNodeA()); pipelineNode.AddChild(new FaultingTestNodeA()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); IEnumerable <Exception> exceptions = result.GetFailExceptions(); exceptions.Should().NotBeNull(); exceptions.Count().Should().Be(2); }
public async void When_Cancelling_Pipeline_At_First_Node_Then_Status_Is_NotRun() { var pipelineNode = new PipelineNode <TestObjectA>(); var testNode1 = new SimpleTestNodeA1(true, false, true); var testNode2 = new SimpleTestNodeA2(); pipelineNode.AddChild(testNode1); pipelineNode.AddChild(testNode2); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.ShouldEqual(NodeResultStatus.NotRun); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); testNode1.Status.ShouldEqual(NodeRunStatus.NotRun); testNode2.Status.ShouldEqual(NodeRunStatus.NotRun); }
public async void Pipeline_With_ContinueOnError_Excludes_Initial_Exception() { var pipelineNode = new PipelineNode <TestObjectA> { LocalOptions = new ExecutionOptions { ContinueOnFailure = true } }; pipelineNode.AddChild(new FaultingTestNodeA()); pipelineNode.AddChild(new SimpleTestNodeA1()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); IEnumerable <Exception> exceptions = result.GetFailExceptions(); exceptions.ShouldNotBeNull(); exceptions.Count().ShouldEqual(0); }
public async Task When_Cancelling_Pipeline_At_Later_Node_Then_Status_Is_Success() { var pipelineNode = new PipelineNode <TestObjectA>(); var testNode1 = new SimpleTestNodeA1(); var testNode2 = new SimpleTestNodeA1(true, false, true); var testNode3 = new SimpleTestNodeA2(); pipelineNode.AddChild(testNode1); pipelineNode.AddChild(testNode2); pipelineNode.AddChild(testNode3); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); result.Status.Should().Be(NodeResultStatus.Succeeded); pipelineNode.Status.Should().Be(NodeRunStatus.Completed); testNode1.Status.Should().Be(NodeRunStatus.Completed); testNode2.Status.Should().Be(NodeRunStatus.NotRun); testNode3.Status.Should().Be(NodeRunStatus.NotRun); }
public async void Pipeline_Node_Results_Following_Subject_Change_Node_Return_Changed_Subject() { var pipelineNode = new PipelineNode <TestObjectA>(); var node1 = new SimpleTestNodeA1(); var node2 = new SubjectChangingNode1(); var node3 = new SimpleTestNodeA2(); pipelineNode.AddChild(node1); pipelineNode.AddChild(node2); pipelineNode.AddChild(node3); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); pipelineNode.Status.ShouldEqual(NodeRunStatus.Completed); var childResults = result.ChildResults.ToList(); childResults[0].Subject.ShouldBeSameAs(testObject); childResults[1].Subject.ShouldNotBeSameAs(testObject); childResults[2].Subject.ShouldNotBeSameAs(testObject); childResults[1].Subject.ShouldEqual(childResults[2].Subject); }
public async Task Nested_Exception_Is_Included_In_Collection() { var pipelineNode = new PipelineNode <TestObjectA>(); var pipelineNode2 = new PipelineNode <TestObjectA>(); pipelineNode.AddChild(pipelineNode2); pipelineNode2.AddChild(new FaultingTestNodeA()); var testObject = new TestObjectA(); NodeResult result = await pipelineNode.ExecuteAsync(testObject); IEnumerable <Exception> exceptions = result.GetFailExceptions(); exceptions.Should().NotBeNull(); exceptions.Count().Should().Be(1); }
public async Task Can_Add_Inherited_Func_Node_To_Pipleline() { var testNode = new FuncNode <TestObjectA>(); testNode.AddShouldExecute(context => Task.FromResult(context.Subject.TestValueInt == 0)); testNode.ExecutedFunc = context => { context.Subject.TestValueString = "Completed"; return(Task.FromResult(NodeResultStatus.Succeeded)); }; var testObject = new TestObjectASub(); var pipeline = new PipelineNode <TestObjectASub>(); pipeline.AddChild(testNode); var result = await pipeline.ExecuteAsync(testObject); testNode.Status.Should().Be(NodeRunStatus.Completed); result.Status.Should().Be(NodeResultStatus.Succeeded); }