From 54955003b513e1c970cbf4066de76cf1178685bc Mon Sep 17 00:00:00 2001 From: Eduwer Camacaro Date: Mon, 24 Feb 2025 10:44:19 -0500 Subject: [PATCH] Validate null on UserTaskRun arrival for userId and userGroup --- .../core/usertaskrun/UserTaskRunModel.java | 4 +++ server/src/test/java/e2e/UserTaskTest.java | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/server/src/main/java/io/littlehorse/common/model/getable/core/usertaskrun/UserTaskRunModel.java b/server/src/main/java/io/littlehorse/common/model/getable/core/usertaskrun/UserTaskRunModel.java index 2e4277a47..d3e4d46ff 100644 --- a/server/src/main/java/io/littlehorse/common/model/getable/core/usertaskrun/UserTaskRunModel.java +++ b/server/src/main/java/io/littlehorse/common/model/getable/core/usertaskrun/UserTaskRunModel.java @@ -237,6 +237,10 @@ public void onArrival(Date time) throws NodeFailureException { ? null : thread.assignVariable(node.getUserGroup()).asStr().getStrVal(); + if (newUserId == null && newUserGroup == null) { + throw new NodeFailureException(new FailureModel("Invalid user task assignment", LHConstants.VAR_ERROR)); + } + // Set owners and schedule all on-assignment hooks this.assignTo(newUserId, newUserGroup, true); diff --git a/server/src/test/java/e2e/UserTaskTest.java b/server/src/test/java/e2e/UserTaskTest.java index 90b189dcd..f72e42ddb 100644 --- a/server/src/test/java/e2e/UserTaskTest.java +++ b/server/src/test/java/e2e/UserTaskTest.java @@ -7,6 +7,7 @@ import io.littlehorse.common.util.LHUtil; import io.littlehorse.sdk.common.LHLibUtil; import io.littlehorse.sdk.common.proto.CompleteUserTaskRunRequest; +import io.littlehorse.sdk.common.proto.Failure; import io.littlehorse.sdk.common.proto.ListUserTaskRunRequest; import io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub; import io.littlehorse.sdk.common.proto.NodeRun.NodeTypeCase; @@ -40,6 +41,7 @@ import io.littlehorse.test.internal.TestExecutionContext; import io.littlehorse.test.internal.step.SearchResultCaptor; import java.time.Duration; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import org.assertj.core.api.Assertions; @@ -71,6 +73,9 @@ public class UserTaskTest { @LHWorkflow("worker-context-receives-user-details") private Workflow workerContextReceivesUserDetails; + @LHWorkflow("user-task-assignment") + private Workflow userTaskAssignment; + @LHUserTaskForm(USER_TASK_DEF_NAME) private MyForm myForm = new MyForm(); @@ -323,6 +328,22 @@ void shouldScheduleAndExecuteReminderTask() { .start(); } + @Test + void shouldValidateUserIdOrUserGroup() { + workflowVerifier + .prepareRun(userTaskAssignment) + .waitForStatus(ERROR) + .waitForNodeRunStatus(0, 1, ERROR) + .thenVerifyNodeRun(0, 1, nodeRun -> { + List failures = nodeRun.getFailuresList(); + Assertions.assertThat(failures).hasSize(1); + Failure nodeFailure = failures.get(0); + Assertions.assertThat(nodeFailure.getFailureName()).isEqualTo("VAR_ERROR"); + Assertions.assertThat(nodeFailure.getMessage()).isEqualTo("Invalid user task assignment"); + }) + .start(); + } + @Test void verifyWorkerContextHasUserIdOrUserGroup() { workflowVerifier @@ -424,6 +445,15 @@ public Workflow buildCancelUserTaskOnReassignmentWorkflow() { }); } + @LHWorkflow("user-task-assignment") + public Workflow buildUserTaskAssignmentWorkflow() { + return new WorkflowImpl("user-task-assignment", wf -> { + WfRunVariable userId = wf.declareStr("userId"); + WfRunVariable userGroup = wf.declareStr("userGroup"); + wf.assignUserTask(USER_TASK_DEF_NAME, userId, userGroup); + }); + } + @LHTaskMethod("my-custom-task") public String obiwan(MyForm formData) { return "String was " + formData.myStr + " and int was " + formData.myInt;