public void Signal_timer_is_ignored_when_it_is_fired_after_receiving_the_signals_and_signal_timer_and_signals_are_processed_together_also_signal_was_received_after_timedout(
            Type workflowType, ScheduleId promoteEmployee, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddHours(-2);
            var lg             = completedGraph(completedStamp);

            _builder.AddProcessedEvents(lg);
            var signalTriggerEventId = lg.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(promoteEmployee, signalTriggerEventId, completedStamp, _waitingSignals));
            var hrSignal = _graphBuilder.WorkflowSignaledEvent("HRApproved", "input", completedTime: currentTime.AddMinutes(1));

            _builder.AddNewEvents(hrSignal);
            var managerSignal = _graphBuilder.WorkflowSignaledEvent("ManagerApproved", "input", completedTime: currentTime.AddMinutes(1));

            _builder.AddNewEvents(managerSignal);
            var timerFiredGraph = _graphBuilder.TimerFiredGraph(promoteEmployee, TimeSpan.FromHours(1), TimerType.SignalTimer, signalTriggerEventId, currentTime.AddMinutes(1));

            _builder.AddNewEvents(timerFiredGraph);
            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(3));
            Assert.That(decisions[0], Is.EqualTo(new ScheduleLambdaDecision(_hrApprovalTimedout, "")));
            Assert.That(decisions[1], Is.EqualTo(new ScheduleLambdaDecision(_managerApprovalTimedout, "")));
            decisions[2].AssertSignalTimedout(promoteEmployee, signalTriggerEventId, _waitingSignals, hrSignal.EventId);
        }
        public void Continue_with_manager_approval_timeout_when_hrapproval_is_received_and_processed_before_timeout_and_signal_timer_is_fired(
            Type workflowType, ScheduleId promoteEmployee, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddHours(-2);
            var lg             = completedGraph(completedStamp);

            _builder.AddProcessedEvents(lg);
            var signalTriggerEventId = lg.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(promoteEmployee, signalTriggerEventId, completedStamp, _waitingSignals));
            _builder.AddProcessedEvents(_graphBuilder.WorkflowSignaledEvent("HRApproved", "input", completedTime: currentTime.AddHours(-1)));
            _builder.AddProcessedEvents(_graphBuilder.WorkflowItemSignalledEvent(promoteEmployee, signalTriggerEventId, "HRApproved"));

            var timerFiredGraph = _graphBuilder.TimerFiredGraph(promoteEmployee, TimeSpan.FromHours(1), TimerType.SignalTimer, signalTriggerEventId, currentTime);

            _builder.AddNewEvents(timerFiredGraph);

            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(2));
            decisions[0].AssertSignalTimedout(promoteEmployee, signalTriggerEventId, new[] { "ManagerApproved" }, timerFiredGraph.First().EventId);
            Assert.That(decisions[1], Is.EqualTo(new ScheduleLambdaDecision(_managerApprovalTimedout, "")));
        }
        public void Continue_with_manager_approval_timeout_when_hrapproval_is_received_before_timeout_and_manager_approval_is_received_after_timeout_and_both_signals_are_processed_togather(
            Type workflowType, ScheduleId promoteEmployee, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddMinutes(-121);
            var lg             = completedGraph(completedStamp);

            _builder.AddProcessedEvents(lg);
            var signalTriggerEventId = lg.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(promoteEmployee, signalTriggerEventId, completedStamp, _waitingSignals));
            var hrSignal = _graphBuilder.WorkflowSignaledEvent("HRApproved", "input", completedTime: currentTime.AddHours(-1));

            _builder.AddNewEvents(hrSignal);
            var managerSignal = _graphBuilder.WorkflowSignaledEvent("ManagerApproved", "input", completedTime: currentTime);

            _builder.AddNewEvents(managerSignal);

            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(3));
            Assert.That(decisions[0], Is.EqualTo(new WorkflowItemSignalledDecision(promoteEmployee, signalTriggerEventId, "HRApproved", hrSignal.EventId)));
            Assert.That(decisions[1], Is.EqualTo(new ScheduleLambdaDecision(_managerApprovalTimedout, "")));
            decisions[2].AssertSignalTimedout(promoteEmployee, signalTriggerEventId, new[] { "ManagerApproved" }, managerSignal.EventId);
        }
示例#4
0
        public void Signal_is_ignored_when_it_is_received_after_signal_timer_and_signal_timer_and_signal_are_processed_together(
            Type workflowType, ScheduleId confirmEmailId, CompletedEventGraph completedGraph)
        {
            var currentTime      = DateTime.UtcNow;
            var completeDateTime = currentTime.AddHours(-2);
            var lg = completedGraph(completeDateTime);

            _builder.AddProcessedEvents(lg);
            var signalTriggerEventId = lg.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(confirmEmailId, signalTriggerEventId, completeDateTime, "Confirmed"));

            var timerFiredGraph = _graphBuilder.TimerFiredGraph(confirmEmailId, TimeSpan.FromHours(1), TimerType.SignalTimer, signalTriggerEventId, currentTime);

            _builder.AddNewEvents(timerFiredGraph);

            var s = _graphBuilder.WorkflowSignaledEvent("Confirmed", "input", completedTime: currentTime);

            _builder.AddNewEvents(s);
            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(2));
            decisions[0].AssertSignalTimedout(confirmEmailId, signalTriggerEventId, new[] { "Confirmed" }, timerFiredGraph.First().EventId);
            Assert.That(decisions[1], Is.EqualTo(new ScheduleLambdaDecision(_blockAccountId, "")));
        }
        public void Return_timer_decision_and_continue_execution_with_signal_timedout_when_signal_and_workflow_item_completed_events_comes_together_but_signals_comes_after_timeout(
            Type workflowType, ScheduleId promoteEmployee, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddHours(-4);
            var graph          = completedGraph(completedStamp);

            _builder.AddNewEvents(graph);
            var hrSignal = _graphBuilder.WorkflowSignaledEvent("HRApproved", "", currentTime.AddHours(-1));

            _builder.AddNewEvents(hrSignal);
            var managerApproved = _graphBuilder.WorkflowSignaledEvent("ManagerApproved", "", currentTime.AddHours(-1));

            _builder.AddNewEvents(managerApproved);
            _builder.AddNewEvents(_graphBuilder.DecisionStartedEvent(DateTime.UtcNow));
            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(5));

            var triggerEventId = graph.First().EventId;

            decisions[0].AssertWaitForAllSignals(promoteEmployee, triggerEventId, completedStamp, TimeSpan.FromHours(2), _waitingSignals);
            decisions[1].AssertSignalTimer(promoteEmployee, triggerEventId, TimeSpan.FromHours(0));
            Assert.That(decisions[2], Is.EqualTo(new ScheduleLambdaDecision(_hrApprovalTimedout, "")));
            Assert.That(decisions[3], Is.EqualTo(new ScheduleLambdaDecision(_managerApprovalTimedout, "")));
            decisions[4].AssertSignalTimedout(promoteEmployee, triggerEventId, _waitingSignals, hrSignal.EventId);
        }
        private static IEnumerable <TestCaseData> TestCaseData()
        {
            var lambdaId = Identity.Lambda(ApproveExpense).ScheduleId();
            var l        = new CompletedEventGraph(e => LambdaCompletedEventGraph(lambdaId, e));

            yield return(new TestCaseData(typeof(ApprovalWorkflowWithLambdaAndApprovedTimedoutCheck), lambdaId, l));

            yield return(new TestCaseData(typeof(ApprovalWorkflowWithLambdaAndRejectedTimedoutCheck), lambdaId, l));

            yield return(new TestCaseData(typeof(ApprovalWorkflowWithLambdaAndApprovedTimedoutCheckUsingAPI), lambdaId, l));

            yield return(new TestCaseData(typeof(ApprovalWorkflowWithLambdaAndRejectedTimedoutCheckUsingAPI), lambdaId, l));

            var activityId = Identity.New(ApproveExpense, Version).ScheduleId();
            var a          = new CompletedEventGraph(e => ActivityCompletedEventGraph(activityId, e));

            yield return(new TestCaseData(typeof(ApprovalWorkflowWithActivityAndApprovedTimedoutCheck), activityId, a));

            yield return(new TestCaseData(typeof(ApprovalWorkflowWithActivityAndRejectedTimedoutCheckUsingApi), activityId, a));

            var workflowId = Identity.New(ApproveExpense, Version).ScheduleId(WorkflowRunId);
            var c          = new CompletedEventGraph(e => ChildWorkflowCompletedEventGraph(workflowId, e));

            yield return(new TestCaseData(typeof(ApprovalWorkflowWithChildWorkflowAndApprovedTimeoutCheck), workflowId, c));

            yield return(new TestCaseData(typeof(ApprovalWorkflowWithChildWorkflowAndRejectedTimeoutCheckUsingAPI), workflowId, c));

            var timerId = Identity.Timer(ApproveExpense).ScheduleId();
            var t       = new CompletedEventGraph(e => TimerFiredEventGraph(timerId, e));

            yield return(new TestCaseData(typeof(ApproveWorkflowWithTimerAndApprovedTimeoutCheck), timerId, t));

            yield return(new TestCaseData(typeof(ApproveWorkflowWithTimerAndRejectedTimeoutCheckUsingAPI), timerId, t));
        }
        public void Return_timer_decision_and_continue_execution_with_signal_timedout_when_signal_and_workflow_item_completed_events_comes_together_but_signal_comes_after_timeout(
            Type workflowType, ScheduleId approveExpenses, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddHours(-4);
            var graph          = completedGraph(completedStamp);

            _builder.AddNewEvents(graph);
            var s = _graphBuilder.WorkflowSignaledEvent("Rejected", "", currentTime.AddHours(-1));

            _builder.AddNewEvents(s);
            _builder.AddNewEvents(_graphBuilder.DecisionStartedEvent(DateTime.UtcNow));
            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(4));

            var triggerEventId = graph.First().EventId;

            decisions[0].AssertWaitForAnySignal(approveExpenses, triggerEventId, completedStamp, TimeSpan.FromHours(2), "Approved", "Rejected");
            decisions[1].AssertSignalTimer(approveExpenses, triggerEventId, TimeSpan.FromHours(0));
            Assert.That(decisions[2], Is.EqualTo(new ScheduleLambdaDecision(_approvalTimedout, "")));
            decisions[3].AssertSignalTimedout(approveExpenses, triggerEventId, new[] { "Approved", "Rejected" }, s.EventId);
        }
        public void Signal_timer_is_ignored_when_it_is_fired_after_receiving_the_signal_and_signal_timer_and_signal_are_processed_together_also_signal_was_received_after_timedout(
            Type workflowType, ScheduleId approveExpenses, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddMinutes(-121);
            var lg             = completedGraph(completedStamp);

            _builder.AddProcessedEvents(lg);
            var signalTriggerEventId = lg.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(approveExpenses, signalTriggerEventId, completedStamp, "Approved", "Rejected"));
            var s = _graphBuilder.WorkflowSignaledEvent("Approved", "input", completedTime: currentTime);

            _builder.AddNewEvents(s);
            var timerFiredGraph = _graphBuilder.TimerFiredGraph(approveExpenses, TimeSpan.FromHours(1), TimerType.SignalTimer, signalTriggerEventId, currentTime);

            _builder.AddNewEvents(timerFiredGraph);
            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(2));
            Assert.That(decisions[0], Is.EqualTo(new ScheduleLambdaDecision(_approvalTimedout, "")));
            decisions[1].AssertSignalTimedout(approveExpenses, signalTriggerEventId, new[] { "Approved", "Rejected" }, s.EventId);
        }
示例#9
0
        private static IEnumerable <TestCaseData> TestCaseData()
        {
            var lambdaId = Identity.Lambda(ConfirmEmail).ScheduleId();
            var l        = new CompletedEventGraph(e => LambdaCompletedEventGraph(lambdaId, e));

            yield return(new TestCaseData(typeof(UserActivateWorkflowWithLambda), lambdaId, l));

            yield return(new TestCaseData(typeof(UserActivateWorkflowWithLambdaAndSignalAPI), lambdaId, l));

            var activityId = Identity.New(ConfirmEmail, Version).ScheduleId();
            var a          = new CompletedEventGraph(e => ActivityCompletedEventGraph(activityId, e));

            yield return(new TestCaseData(typeof(UserActivateWorkflowWithActivity), activityId, a));

            yield return(new TestCaseData(typeof(UserActivateWorkflowWithActivityAndSignalAPI), activityId, a));

            var workflowId = Identity.New(ConfirmEmail, Version).ScheduleId(WorkflowRunId);
            var c          = new CompletedEventGraph(e => ChildWorkflowCompletedEventGraph(workflowId, e));

            yield return(new TestCaseData(typeof(UserActivateWorkflowWithChildWorkflow), workflowId, c));

            yield return(new TestCaseData(typeof(UserActivateWorkflowWithChildWorkflowAndSignalAPI), workflowId, c));

            var timerId = Identity.Timer(ConfirmEmail).ScheduleId();
            var t       = new CompletedEventGraph(e => TimerFiredEventGraph(timerId, e));

            yield return(new TestCaseData(typeof(UserActivateWorkflowWithTimer), timerId, t));

            yield return(new TestCaseData(typeof(UserActivateWorkflowWithTimerAndSignalAPI), timerId, t));
        }
        public void Signal_timer_is_ignored_when_it_is_fired_after_receiving_the_signal(
            Type workflowType, ScheduleId promoteEmployee, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddHours(-2);
            var lg             = completedGraph(completedStamp);

            _builder.AddProcessedEvents(lg);
            var signalTriggerEventId = lg.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(promoteEmployee, signalTriggerEventId, completedStamp, _waitingSignals));
            _builder.AddProcessedEvents(_graphBuilder.WorkflowSignaledEvent("HRApproved", "input", completedTime: currentTime.AddHours(-1)));
            _builder.AddProcessedEvents(_graphBuilder.WorkflowItemSignalledEvent(promoteEmployee, signalTriggerEventId, "HRApproved"));
            _builder.AddProcessedEvents(_graphBuilder.WorkflowSignaledEvent("ManagerApproved", "input", completedTime: currentTime.AddHours(-1)));
            _builder.AddProcessedEvents(_graphBuilder.WorkflowItemSignalledEvent(promoteEmployee, signalTriggerEventId, "ManagerApproved"));

            var timerFiredGraph = _graphBuilder.TimerFiredGraph(promoteEmployee, TimeSpan.FromHours(1), TimerType.SignalTimer, signalTriggerEventId, currentTime);
            var workflow        = (Workflow)Activator.CreateInstance(workflowType);

            _builder.AddNewEvents(timerFiredGraph);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions, Is.Empty);
        }
        private static IEnumerable <TestCaseData> TestCaseData()
        {
            var lambdaId = Identity.Lambda(PromoteEmployee).ScheduleId();
            var l        = new CompletedEventGraph(e => LambdaCompletedEventGraph(lambdaId, e));

            yield return(new TestCaseData(typeof(PromoteWorkflowWithLambda), lambdaId, l));

            yield return(new TestCaseData(typeof(PromoteWorkflowWithLambdaUsingAPI), lambdaId, l));

            yield return(new TestCaseData(typeof(PromoteWorkflowWithLambdaUsingAnySignalIsTriggeredAPI), lambdaId, l));
        }
        public void Returns_the_timer_decision_and_decision_to_wait_for_a_signal_when_the_workflow_item_completed_event_is_processed_immediately
            (Type workflowType, ScheduleId promoteEmployee, CompletedEventGraph completedGraph)
        {
            var completedStamp = DateTime.UtcNow;
            var graph          = completedGraph(completedStamp);

            _builder.AddNewEvents(graph);
            _builder.AddNewEvents(_graphBuilder.DecisionStartedEvent(DateTime.UtcNow));
            var workflow         = (Workflow)Activator.CreateInstance(workflowType);
            var completedEventId = graph.First().EventId;

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(2));
            decisions[0].AssertWaitForAllSignals(promoteEmployee, completedEventId, completedStamp, TimeSpan.FromHours(2), _waitingSignals);
            decisions[1].AssertSignalTimer(promoteEmployee, completedEventId, TimeSpan.FromHours(2));
        }
示例#13
0
        public void Returns_the_timer_decision_to_fire_immediately_and_decision_to_wait_for_a_signal_when_workflow_item_completed_event_is_processed_after_timeout(
            Type workflowType, ScheduleId confirmEmailId, CompletedEventGraph completedGraph)
        {
            var completedStamp = DateTime.UtcNow.AddHours(-4);
            var graph          = completedGraph(completedStamp);

            _builder.AddNewEvents(graph);
            _builder.AddNewEvents(_graphBuilder.DecisionStartedEvent(DateTime.UtcNow));
            var workflow         = (Workflow)Activator.CreateInstance(workflowType);
            var completedEventId = graph.First().EventId;

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Length, Is.EqualTo(2));
            decisions[0].AssertWaitForAnySignal(confirmEmailId, completedEventId, completedStamp, TimeSpan.FromHours(2), "Confirmed");
            decisions[1].AssertSignalTimer(confirmEmailId, completedEventId, TimeSpan.FromHours(0));
        }
        public void Reduce_signal_timer_timeout_by_an_hour_when_execution_of_wait_for_signal_workflow_action_is_delayed_by_one_hour(
            Type workflowType, ScheduleId approveExpenses, CompletedEventGraph completedGraph)
        {
            var completedStamp = DateTime.UtcNow.AddHours(-1);
            var graph          = completedGraph(completedStamp);

            _builder.AddNewEvents(graph);
            _builder.AddNewEvents(_graphBuilder.DecisionStartedEvent(DateTime.UtcNow));
            var workflow         = (Workflow)Activator.CreateInstance(workflowType);
            var completedEventId = graph.First().EventId;

            var decisions = workflow.Decisions(_builder.Result()).ToArray();


            Assert.That(decisions.Length, Is.EqualTo(2));
            decisions[0].AssertWaitForAllSignals(approveExpenses, completedEventId, completedStamp, TimeSpan.FromHours(2), _waitingSignals);
            decisions[1].AssertSignalTimer(approveExpenses, completedEventId, TimeSpan.FromHours(1));
        }
        public void Wait_for_signal_is_timedout_when_timer_is_fired_before_receiving_the_signal(
            Type workflowType, ScheduleId approveExpenses, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddHours(-2);
            var lg             = completedGraph(completedStamp);

            _builder.AddProcessedEvents(lg);
            var signalTriggerEventId = lg.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(approveExpenses, signalTriggerEventId, completedStamp, "Approved", "Rejected"));
            var timerFiredGraph = _graphBuilder.TimerFiredGraph(approveExpenses, TimeSpan.FromHours(1), TimerType.SignalTimer, signalTriggerEventId, currentTime);

            _builder.AddNewEvents(timerFiredGraph);
            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions.Count(), Is.EqualTo(2));
            decisions[0].AssertSignalTimedout(approveExpenses, signalTriggerEventId, new[] { "Approved", "Rejected" }, timerFiredGraph.First().EventId);
            Assert.That(decisions[1], Is.EqualTo(new ScheduleLambdaDecision(_approvalTimedout, "input")));
        }
示例#16
0
        public void Return_timer_decision_and_continue_execution_with_signal_triggered_when_signal_and_workflow_item_completed_events_comes_together_and_signal_come_just_on_timeout(
            Type workflowType, ScheduleId confirmEmailId, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completedStamp = currentTime.AddHours(-2);
            var graph          = completedGraph(completedStamp);

            _builder.AddNewEvents(graph);
            var s = _graphBuilder.WorkflowSignaledEvent("Confirmed", "", currentTime);

            _builder.AddNewEvents(s);
            var workflow  = (Workflow)Activator.CreateInstance(workflowType);
            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            var triggerEventId = graph.First().EventId;

            Assert.That(decisions.Length, Is.EqualTo(4));
            decisions[0].AssertWaitForAnySignal(confirmEmailId, triggerEventId, completedStamp, TimeSpan.FromHours(2), "Confirmed");
            decisions[1].AssertSignalTimer(confirmEmailId, triggerEventId, TimeSpan.FromHours(0));
            Assert.That(decisions[2], Is.EqualTo(new ScheduleLambdaDecision(_activateUserId, "")));
            Assert.That(decisions[3], Is.EqualTo(new WorkflowItemSignalledDecision(confirmEmailId, triggerEventId, "Confirmed", s.EventId)));
        }
        public void Signal_is_ignored_when_it_come_after_wait_is_timedout_by_signal_timer(
            Type workflowType, ScheduleId approveExpenses, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completionDate = currentTime.AddHours(-2);
            var graph          = completedGraph(completionDate);

            _builder.AddProcessedEvents(graph);
            var completedEventId = graph.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(approveExpenses, completedEventId, completionDate, "Approved", "Rejected"));
            var timerFiredGraph = _graphBuilder.TimerFiredGraph(approveExpenses, TimeSpan.FromHours(2), TimerType.SignalTimer, completedEventId, currentTime);

            _builder.AddProcessedEvents(timerFiredGraph);
            _builder.AddProcessedEvents(_graphBuilder.WorkflowItemSignalTimedoutEvent(approveExpenses, completedEventId, new[] { "Confirmed" }, timerFiredGraph.First().EventId));
            _builder.AddNewEvents(_graphBuilder.WorkflowSignaledEvent("Confirmed", "input", currentTime.AddMinutes(1)));
            _builder.AddNewEvents(_graphBuilder.DecisionStartedEvent(currentTime.AddMinutes(2)));
            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions, Is.Empty);
        }
        public void Signals_are_ignored_when_they_come_after_wait_is_timedout_by_signal_timer(
            Type workflowType, ScheduleId promoteEmployee, CompletedEventGraph completedGraph)
        {
            var currentTime    = DateTime.UtcNow;
            var completionDate = currentTime.AddHours(-4);
            var graph          = completedGraph(completionDate);

            _builder.AddProcessedEvents(graph);
            var completedEventId = graph.First().EventId;

            _builder.AddProcessedEvents(WaitForSignalEvent(promoteEmployee, completedEventId, completionDate, _waitingSignals));
            var timerFiredGraph = _graphBuilder.TimerFiredGraph(promoteEmployee, TimeSpan.FromHours(2), TimerType.SignalTimer, completedEventId, currentTime.AddHours(-2));

            _builder.AddProcessedEvents(timerFiredGraph);
            _builder.AddProcessedEvents(_graphBuilder.WorkflowItemSignalTimedoutEvent(promoteEmployee, completedEventId, _waitingSignals, timerFiredGraph.First().EventId));
            _builder.AddNewEvents(_graphBuilder.WorkflowSignaledEvent("HRApproved", "input", currentTime));
            _builder.AddNewEvents(_graphBuilder.WorkflowSignaledEvent("ManagerApproved", "input", currentTime));
            _builder.AddNewEvents(_graphBuilder.DecisionStartedEvent(DateTime.UtcNow));
            var workflow = (Workflow)Activator.CreateInstance(workflowType);

            var decisions = workflow.Decisions(_builder.Result()).ToArray();

            Assert.That(decisions, Is.Empty);
        }