//[Ignore("This test will fail until the clone activity is fixed")] public void ContinueTheOldWorkflow() { var workflow = CreateWorkflowWithUserAction(); workflow.Save(); var input = new Dictionary <string, object> { { "input", "my input" } }; var run = RunWorkflow(workflow, input); Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunPaused, run.WorkflowRunStatus_Enum, "The workflow is paused"); WorkflowUpdateHelper.Update(workflow.Id, () => { }); var resumeEvent = new UserCompletesTaskEvent() { CompletionStateId = run.WorkflowBeingRun.FirstActivity.ForwardTransitions.First().Id, UserTaskId = run.TaskWithinWorkflowRun.First().Id }; // break the workflow workflow.Delete(); run = WorkflowRunner.Instance.ResumeWorkflow(run, resumeEvent); Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunCompleted, run.WorkflowRunStatus_Enum, "The workflow completed"); }
private void ActOnTask(DisplayFormUserTask task, TransitionStart userResponse, List <Action> actions) { //TODO: Serialize the workflow runs like the trigger on save. var workflowRun = task.WorkflowRunForTask; if ((task.UserTaskIsComplete ?? false) && (workflowRun != null) && (workflowRun.WorkflowRunStatus_Enum == WorkflowRunState_Enumeration.WorkflowRunPaused)) { var resumeEvent = new UserCompletesTaskEvent { CompletionStateId = userResponse.Id, UserTaskId = task.Id }; var runId = workflowRun.Id; var runInThread = WorkflowRunContext.Current.RunTriggersInCurrentThread; Action act; if (Factory.FeatureSwitch.Get("longRunningWorkflow")) { act = () => ActionOnTask_new(runId, resumeEvent, runInThread); } else { act = () => ActionOnTask_old(runId, resumeEvent, runInThread); } WorkflowRunContext.Current.DeferAction(act); } }
void ActionOnTask_old(long runId, UserCompletesTaskEvent resumeEvent, bool runInThread) { Action act = () => { using (new SecurityBypassContext()) { var run = Entity.Get <WorkflowRun>(runId); // If we don't do this we get caching problems using (new WorkflowRunContext(true) { RunTriggersInCurrentThread = true }) { WorkflowRunner.Instance.ResumeWorkflow(run, resumeEvent); } } }; if (runInThread) { act(); } else { WorkflowRunContext.Current.QueueAction(act); } }
void ActionOnTask_new(long runId, UserCompletesTaskEvent resumeEvent, bool runInThread) { BackgroundTask bgTask; using (new SecurityBypassContext()) { var run = Entity.Get <WorkflowRun>(runId); // If we don't do this we get caching problems var wf = run.WorkflowBeingRun; bgTask = ResumeWorkflowHandler.CreateBackgroundTask(run, resumeEvent); } if (runInThread) { Factory.BackgroundTaskManager.ExecuteImmediately(bgTask); } else { Factory.BackgroundTaskManager.EnqueueTask(bgTask); } }
//[RunAsDefaultTenant] //[Ignore("This workflow is not working due to clone not correctly cloning the first activity relationship.")] public void ContinueTheOldWorkflow() { var workflow = CreateWorkflowWithUserAction(); workflow.Save(); var input = new Dictionary <string, object> { { "input", "my input" } }; WorkflowRun run; using (new WorkflowRunContext { RunTriggersInCurrentThread = true }) { run = TestBase.RunWorkflow(workflow, input); } Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunPaused, run.WorkflowRunStatus_Enum, "The workflow is paused"); UpgradeWithUpdate(workflow); var completionState = run.WorkflowBeingRun.FirstActivity.ForwardTransitions.First(); // break the workflow workflow.Delete(); var resumeEvent = new UserCompletesTaskEvent { CompletionStateId = completionState.Id, UserTaskId = run.TaskWithinWorkflowRun.First().Id }; run = WorkflowRunner.Instance.ResumeWorkflow(run, resumeEvent); Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunCompleted, run.WorkflowRunStatus_Enum, "The workflow completed"); }
public void OnAfterSave(IEnumerable <IEntity> entities, IDictionary <string, object> state) { var tasks = (List <BaseUserTask>)state[CompletedTasksKey]; var actions = new List <Action>(); var invoker = WorkflowInvoker.DefaultInvokerForThread; foreach (var task in tasks) { //TODO: Serialize the workflow runs like the trigger on save. if (task.WorkflowRunForTask != null && task.WorkflowRunForTask.WorkflowRunStatus_Enum == WorkflowRunState_Enumeration.WorkflowRunPaused) { var resumeEvent = new UserCompletesTaskEvent() { CompletionState = task.UserResponse, UserTaskRef = task.Id }; var run = task.WorkflowRunForTask; actions.Add(() => WorkflowRunHelper.ResumeWorkflow(run, resumeEvent, invoker)); } } RunActionsInThread(actions); }
public void TestDisplayFormDeleteInputParameter_Bug_25116() { using (new WorkflowRunContext { RunTriggersInCurrentThread = true }) { IEntity driver = null; Workflow wf = null; try { WorkflowRun run, run2; #region Arrange var driverType = new EntityRef("test", "driver"); driver = Entity.Create(driverType); driver.SetField("core:name", "Test Delete Driver"); driver.Save(); wf = Entity.Create <Workflow>(); wf.Name = "TEST WF"; wf.AddDefaultExitPoint(); wf.AddInput <ResourceArgument>("Input", Entity.Get <EntityType>(driverType)); wf.InputArgumentForAction = wf.InputArguments.First(); var i = Entity.Create <WfExpression>(); i.ArgumentToPopulate = wf.InputArgumentForAction; wf.ExpressionMap = new EntityCollection <WfExpression> { i }; wf.InputArgumentForAction.PopulatedByExpression = new EntityCollection <WfExpression> { i }; var uAExitA = Entity.Create <ExitPoint>(); uAExitA.Name = "Exit A"; uAExitA.ExitPointActionSummary = "Exit A action summary"; uAExitA.IsDefaultExitPoint = true; uAExitA.Save(); var userActionA = Entity.Create <DisplayFormActivity>(); userActionA.Name = "A"; userActionA.ExitPoints.Add(uAExitA); var uA = userActionA.As <WfActivity>(); wf.AddActivity(uA); ActivityTestHelper.AddExpressionToActivityArgument(wf, uA, "Record", "[Input]"); ActivityTestHelper.AddExpressionToActivityArgument(wf, uA, "Wait for next form", "true"); ActivityTestHelper.AddExpressionToActivityArgument(wf, uA, "Hide comment field", "true"); ActivityTestHelper.AddExpressionToActivityArgument(wf, uA, "Record history", "false"); ActivityTestHelper.AddEntityExpression(wf, uA, uA.GetInputArgument("For Person"), new EntityRef("core", "administratorPerson")); ActivityTestHelper.AddEntityExpression(wf, uA, uA.GetInputArgument("Form"), new EntityRef("test", "personForm")); uA.Save(); var delete = Entity.Create <DeleteActivity>(); delete.Name = "Delete"; var d = delete.As <WfActivity>(); wf.AddActivity(d); ActivityTestHelper.AddExpressionToActivityArgument(wf, d, "Record", "[Input]"); d.Save(); var uBExitC = Entity.Create <ExitPoint>(); uBExitC.Name = "Exit C"; uBExitC.ExitPointActionSummary = "Exit C action summary"; uBExitC.IsDefaultExitPoint = true; uBExitC.Save(); var userActionB = Entity.Create <DisplayFormActivity>(); userActionB.Name = "B"; userActionB.ExitPoints.Add(uBExitC); var uB = userActionB.As <WfActivity>(); wf.AddActivity(uB); ActivityTestHelper.AddEntityExpression(wf, uB, uB.GetInputArgument("For Person"), new EntityRef("core", "administratorPerson")); uB.Save(); ActivityTestHelper.AddMissingExpressionParametersToWorkflow(wf); wf.Save(); #endregion // Act var wfInput = new Dictionary <string, object> { { "Input", driver } }; using (new WorkflowRunContext(true)) { run = RunWorkflow(wf, wfInput); } run.WorkflowRunStatus_Enum.Should().Be(WorkflowRunState_Enumeration.WorkflowRunPaused); run.PendingActivity.Should().NotBeNull(); run.PendingActivity.Name.Should().Be("A"); run.TaskWithinWorkflowRun.Should().NotBeNull().And.NotBeEmpty().And.HaveCount(1); var userTaskA = run.TaskWithinWorkflowRun.First().AsWritable <DisplayFormUserTask>(); userTaskA.AvailableTransitions.Should().NotBeNull().And.NotBeEmpty().And.HaveCount(1); userTaskA.WorkflowRunForTask.Id.Should().Be(run.Id); var resumeEvent = new UserCompletesTaskEvent { CompletionStateId = userTaskA.AvailableTransitions.First(t => t.Name == "Exit A").Id, UserTaskId = run.TaskWithinWorkflowRun.First().Id }; using (new WorkflowRunContext(true)) { run2 = WorkflowRunner.Instance.ResumeWorkflow(run, resumeEvent); } // Assert run2.WorkflowRunStatus_Enum.Should().Be(WorkflowRunState_Enumeration.WorkflowRunPaused); run2.PendingActivity.Should().NotBeNull(); run2.PendingActivity.Name.Should().Be("B"); run2.TaskWithinWorkflowRun.Should().NotBeNull().And.NotBeEmpty().And.HaveCount(1); var deletedDriver = Entity.Exists(new EntityRef(driver.Id)); deletedDriver.Should().BeFalse(); } finally { if (wf != null) { ToDelete.Add(wf.Id); } if (driver != null && Entity.Exists(new EntityRef(driver.Id))) { ToDelete.Add(driver.Id); } } } }