/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.server.integrationtests.jbpm.admin; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.assertj.core.api.Assertions; import org.assertj.core.api.ThrowableAssert; import org.junit.After; import org.junit.BeforeClass; import org.junit.Test; import org.kie.api.KieServices; import org.kie.server.api.exception.KieServicesException; import org.kie.server.api.model.ReleaseId; import org.kie.server.api.model.admin.EmailNotification; import org.kie.server.api.model.admin.OrgEntities; import org.kie.server.api.model.admin.TaskNotification; import org.kie.server.api.model.admin.TaskReassignment; import org.kie.server.api.model.instance.TaskInstance; import org.kie.server.api.model.instance.TaskSummary; import org.kie.server.integrationtests.config.TestConfig; import org.kie.server.integrationtests.jbpm.JbpmKieServerBaseIntegrationTest; import org.kie.server.integrationtests.shared.KieServerDeployer; import org.kie.server.integrationtests.shared.KieServerSynchronization; public class UserTaskAdminServiceIntegrationTest extends JbpmKieServerBaseIntegrationTest { private static ReleaseId releaseId = new ReleaseId("org.kie.server.testing", "definition-project", "1.0.0.Final"); @BeforeClass public static void buildAndDeployArtifacts() { KieServerDeployer.buildAndDeployCommonMavenParent(); KieServerDeployer.buildAndDeployMavenProject(ClassLoader.class.getResource("/kjars-sources/definition-project").getFile()); kieContainer = KieServices.Factory.get().newKieContainer(releaseId); createContainer(CONTAINER_ID, releaseId, CONTAINER_ID_ALIAS, null); createContainer(CONTAINER_ID_V2, releaseId); } @Override protected void addExtraCustomClasses(Map<String, Class<?>> extraClasses) throws Exception { extraClasses.put(PERSON_CLASS_NAME, Class.forName(PERSON_CLASS_NAME, true, kieContainer.getClassLoader())); } @After public void resetUser() throws Exception { changeUser(TestConfig.getUsername()); } @Test public void testAddPotentialOwnersToNonExistentTask() throws Exception { changeUser(USER_ADMINISTRATOR); OrgEntities add = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.addPotentialOwners(CONTAINER_ID, BAD_TASK_ID, false, add), "Error code: 404", "Task with id " + BAD_TASK_ID + " not found"); } @Test public void testRemovePotentialOwnersToNonExistentTask() throws Exception { changeUser(USER_ADMINISTRATOR); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.removePotentialOwnerUsers(CONTAINER_ID, BAD_TASK_ID, USER_YODA), "Error code: 404", "Task with id " + BAD_TASK_ID + " not found"); } /* * Test scenario for container id that is not registered. */ @Test public void testAddPotentialOwnersWithBadContainerId() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); OrgEntities add = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.addPotentialOwners(BAD_CONTAINER_ID, task.getId(), false, add), "Error code: 404", "Task Id: " + task.getId() + " is not associated with the provided container id: " + BAD_CONTAINER_ID + " or its alias."); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } /* * Test scenario where container id exists or is an alias but is not valid for the task being updated. */ @Test public void testAddPotentialOwnersWithBadContainerAlias() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID_V2, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); OrgEntities add = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.addPotentialOwners(CONTAINER_ID_ALIAS, task.getId(), false, add), "Error code: 404", "Task Id: " + task.getId() + " is not associated with the provided container id: " + CONTAINER_ID_ALIAS + " or its alias."); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID_V2, processInstanceId); } } } /* * Test scenario for container id that is not registered. */ @Test public void testRemovePotentialOwnersWithBadContainerId() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.removePotentialOwnerUsers(BAD_CONTAINER_ID, task.getId(), USER_YODA), "Error code: 404", "Task Id: " + task.getId() + " is not associated with the provided container id: " + BAD_CONTAINER_ID + " or its alias."); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } /* * Test scenario where container id exists or is an alias but is not valid for the task being updated. */ @Test public void testRemovePotentialOwnersWithBadContainerAlias() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID_V2, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.removePotentialOwnerUsers(CONTAINER_ID_ALIAS, task.getId(), USER_YODA), "Error code: 404", "Task Id: " + task.getId() + " is not associated with the provided container id: " + CONTAINER_ID_ALIAS + " or its alias."); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID_V2, processInstanceId); } } } /* * Test to add and remove of potential owners of a task using a container's alias, not the original container id with which it was created. */ @Test public void testAddRemovePotOwnersWithContainerAlias() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<String, Object>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); Assertions.assertThat(processInstanceId).isNotNull(); Assertions.assertThat(processInstanceId.longValue()).isGreaterThan(0); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); Assertions.assertThat(tasks).hasSize(1); TaskSummary task = tasks.get(0); TaskInstance instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); List<String> potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(3); Assertions.assertThat(potOwners).contains(USER_YODA, "PM", "HR"); OrgEntities add = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); userTaskAdminClient.addPotentialOwners(CONTAINER_ID_ALIAS, task.getId(), false, add); instance = taskClient.getTaskInstance(CONTAINER_ID_ALIAS, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(4); Assertions.assertThat(potOwners).contains(USER_YODA, USER_JOHN, "PM", "HR"); userTaskAdminClient.removePotentialOwnerUsers(CONTAINER_ID_ALIAS, task.getId(), USER_YODA); instance = taskClient.getTaskInstance(CONTAINER_ID_ALIAS, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(3); Assertions.assertThat(potOwners).contains(USER_JOHN, "PM", "HR"); userTaskAdminClient.removePotentialOwnerGroups(CONTAINER_ID_ALIAS, task.getId(), "PM", "HR"); instance = taskClient.getTaskInstance(CONTAINER_ID_ALIAS, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(1); Assertions.assertThat(potOwners).contains(USER_JOHN); add = OrgEntities.builder().users(Arrays.asList(USER_YODA)).groups(Arrays.asList("PM")).build(); userTaskAdminClient.addPotentialOwners(CONTAINER_ID_ALIAS, task.getId(), false, add); instance = taskClient.getTaskInstance(CONTAINER_ID_ALIAS, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(3); Assertions.assertThat(potOwners).contains(USER_YODA, USER_JOHN, "PM"); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID_ALIAS, processInstanceId); } } } @Test public void testReassignNotCompletedOnNonExistentTask() throws Exception { OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.reassignWhenNotCompleted(CONTAINER_ID, BAD_TASK_ID, "2s", reassign), "Error code: 404", "Task with id " + BAD_TASK_ID + " not found"); } @Test public void testReassignNotStartedOnNonExistentTask() throws Exception { OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.reassignWhenNotCompleted(CONTAINER_ID, BAD_TASK_ID, "2s", reassign), "Error code: 404", "Task with id " + BAD_TASK_ID + " not found"); } @Test public void testReassignNotCompletedWithBadTimeFormat() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.reassignWhenNotCompleted(CONTAINER_ID, task.getId(), "2sssss", reassign), "Error code: 400", "Error parsing time string:"); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } @Test public void testReassignNotStartedWithBadTimeFormat() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.reassignWhenNotStarted(CONTAINER_ID, task.getId(), "2ssss", reassign), "Error code: 400", "Error parsing time string:"); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } /* * Test scenario for container id that is not registered. */ @Test public void testReassignNotStartedWithBadContainerId() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.reassignWhenNotStarted(BAD_CONTAINER_ID, task.getId(), "2s", reassign), "Error code: 404", "Task Id: " + task.getId() + " is not associated with the provided container id: " + BAD_CONTAINER_ID + " or its alias."); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } /* * Test scenario where container id exists or is an alias but is not valid for the task being updated. */ @Test public void testReassignNotStartedWithBadContainerAlias() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID_V2, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.reassignWhenNotStarted(CONTAINER_ID_ALIAS, task.getId(), "2s", reassign), "Error code: 404", "Task Id: " + task.getId() + " is not associated with the provided container id: " + CONTAINER_ID_ALIAS + " or its alias."); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID_V2, processInstanceId); } } } /* * Test scenario for container id that is not registered. */ @Test public void testReassignNotCompletedWithBadContainerId() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.reassignWhenNotCompleted(BAD_CONTAINER_ID, task.getId(), "2s", reassign), "Error code: 404", "Task Id: " + task.getId() + " is not associated with the provided container id: " + BAD_CONTAINER_ID + " or its alias."); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } /* * Test scenario where container id exists or is an alias but is not valid for the task being updated. */ @Test public void testReassignNotCompletedWithBadContainerAlias() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID_V2, PROCESS_ID_EVALUATION, parameters); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); TaskSummary task = tasks.get(0); OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); assertExceptionContainsCorrectMessage(() -> userTaskAdminClient.reassignWhenNotCompleted(CONTAINER_ID_ALIAS, task.getId(), "2s", reassign), "Error code: 404", "Task Id: " + task.getId() + " is not associated with the provided container id: " + CONTAINER_ID_ALIAS + " or its alias."); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID_V2, processInstanceId); } } } @Test public void testAddRemovePotOwners() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<String, Object>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); Assertions.assertThat(processInstanceId).isNotNull(); Assertions.assertThat(processInstanceId.longValue()).isGreaterThan(0); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); Assertions.assertThat(tasks).hasSize(1); TaskSummary task = tasks.get(0); TaskInstance instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); List<String> potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(3); Assertions.assertThat(potOwners).contains(USER_YODA, "PM", "HR"); OrgEntities add = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); userTaskAdminClient.addPotentialOwners(CONTAINER_ID, task.getId(), false, add); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(4); Assertions.assertThat(potOwners).contains(USER_YODA, USER_JOHN, "PM", "HR"); userTaskAdminClient.removePotentialOwnerUsers(CONTAINER_ID, task.getId(), USER_YODA); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(3); Assertions.assertThat(potOwners).contains(USER_JOHN, "PM", "HR"); userTaskAdminClient.removePotentialOwnerGroups(CONTAINER_ID, task.getId(), "PM", "HR"); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(1); Assertions.assertThat(potOwners).contains(USER_JOHN); add = OrgEntities.builder().users(Arrays.asList(USER_YODA)).groups(Arrays.asList("PM")).build(); userTaskAdminClient.addPotentialOwners(CONTAINER_ID, task.getId(), false, add); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(3); Assertions.assertThat(potOwners).contains(USER_YODA, USER_JOHN, "PM"); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } @Test public void testAddRemoveExcludedOwners() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<String, Object>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); Assertions.assertThat(processInstanceId).isNotNull(); Assertions.assertThat(processInstanceId.longValue()).isGreaterThan(0); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); Assertions.assertThat(tasks).hasSize(1); TaskSummary task = tasks.get(0); TaskInstance instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); List<String> excludedOwners = instance.getExcludedOwners(); Assertions.assertThat(excludedOwners).hasSize(0); OrgEntities add = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); userTaskAdminClient.addExcludedOwners(CONTAINER_ID, task.getId(), false, add); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); excludedOwners = instance.getExcludedOwners(); Assertions.assertThat(excludedOwners).hasSize(1); Assertions.assertThat(excludedOwners).contains(USER_JOHN); userTaskAdminClient.removeExcludedOwnerUsers(CONTAINER_ID, task.getId(), USER_JOHN); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); excludedOwners = instance.getExcludedOwners(); Assertions.assertThat(excludedOwners).hasSize(0); add = OrgEntities.builder().users(Arrays.asList(USER_YODA)).groups(Arrays.asList("PM")).build(); userTaskAdminClient.addExcludedOwners(CONTAINER_ID, task.getId(), false, add); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); excludedOwners = instance.getExcludedOwners(); Assertions.assertThat(excludedOwners).hasSize(2); Assertions.assertThat(excludedOwners).contains(USER_YODA, "PM"); userTaskAdminClient.removeExcludedOwnerGroups(CONTAINER_ID, task.getId(), "PM"); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); excludedOwners = instance.getExcludedOwners(); Assertions.assertThat(excludedOwners).hasSize(1); Assertions.assertThat(excludedOwners).contains(USER_YODA); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } @Test public void testAddRemoveBusinessAdmins() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<String, Object>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); Assertions.assertThat(processInstanceId).isNotNull(); Assertions.assertThat(processInstanceId.longValue()).isGreaterThan(0); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); Assertions.assertThat(tasks).hasSize(1); TaskSummary task = tasks.get(0); TaskInstance instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); List<String> businessAdmins = instance.getBusinessAdmins(); Assertions.assertThat(businessAdmins).hasSize(2); Assertions.assertThat(businessAdmins).contains(USER_ADMINISTRATOR, "Administrators"); OrgEntities add = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); userTaskAdminClient.addBusinessAdmins(CONTAINER_ID, task.getId(), false, add); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); businessAdmins = instance.getBusinessAdmins(); Assertions.assertThat(businessAdmins).hasSize(3); Assertions.assertThat(businessAdmins).contains(USER_ADMINISTRATOR, "Administrators", USER_JOHN); userTaskAdminClient.removeBusinessAdminUsers(CONTAINER_ID, task.getId(), USER_JOHN); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); businessAdmins = instance.getBusinessAdmins(); Assertions.assertThat(businessAdmins).hasSize(2); Assertions.assertThat(businessAdmins).contains(USER_ADMINISTRATOR, "Administrators"); add = OrgEntities.builder().users(Arrays.asList(USER_YODA)).groups(Arrays.asList("Administrators2")).build(); userTaskAdminClient.addBusinessAdmins(CONTAINER_ID, task.getId(), false, add); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); businessAdmins = instance.getBusinessAdmins(); Assertions.assertThat(businessAdmins).hasSize(4); Assertions.assertThat(businessAdmins).contains(USER_YODA, USER_ADMINISTRATOR, "Administrators", "Administrators2"); userTaskAdminClient.removeBusinessAdminGroups(CONTAINER_ID, task.getId(), "Administrators2"); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, false, true); Assertions.assertThat(instance).isNotNull(); businessAdmins = instance.getBusinessAdmins(); Assertions.assertThat(businessAdmins).hasSize(3); Assertions.assertThat(businessAdmins).contains(USER_YODA, USER_ADMINISTRATOR, "Administrators"); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } @Test public void testManageTaskInputAndOutput() throws Exception { changeUser(USER_ADMINISTRATOR); Map<String, Object> parameters = new HashMap<String, Object>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); Assertions.assertThat(processInstanceId).isNotNull(); Assertions.assertThat(processInstanceId.longValue()).isGreaterThan(0); List<TaskSummary> tasks = taskClient.findTasksAssignedAsBusinessAdministrator(USER_ADMINISTRATOR, 0, 10); Assertions.assertThat(tasks).hasSize(1); TaskSummary task = tasks.get(0); TaskInstance instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), true, false, false); Assertions.assertThat(instance).isNotNull(); Map<String, Object> input = instance.getInputData(); Assertions.assertThat(input).isNotNull(); Assertions.assertThat(input).hasSize(4); Assertions.assertThat(input).doesNotContainKey("new content"); Map<String, Object> data = new HashMap<>(); data.put("new content", "test"); userTaskAdminClient.addTaskInputs(CONTAINER_ID, task.getId(), data); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), true, false, false); Assertions.assertThat(instance).isNotNull(); input = instance.getInputData(); Assertions.assertThat(input).isNotNull(); Assertions.assertThat(input).hasSize(5); Assertions.assertThat(input.get("new content")).isEqualTo("test"); userTaskAdminClient.removeTaskInputs(CONTAINER_ID, task.getId(), "new content"); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), true, false, false); Assertions.assertThat(instance).isNotNull(); input = instance.getInputData(); Assertions.assertThat(input).isNotNull(); Assertions.assertThat(input).hasSize(4); Assertions.assertThat(input).doesNotContainKey("new content"); taskClient.saveTaskContent(CONTAINER_ID, task.getId(), data); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, true, false); Assertions.assertThat(instance).isNotNull(); Map<String, Object> output = instance.getOutputData(); Assertions.assertThat(output).isNotNull(); Assertions.assertThat(output).hasSize(1); Assertions.assertThat(output.get("new content")).isEqualTo("test"); userTaskAdminClient.removeTaskOutputs(CONTAINER_ID, task.getId(), "new content"); instance = taskClient.getTaskInstance(CONTAINER_ID, task.getId(), false, true, false); Assertions.assertThat(instance).isNotNull(); output = instance.getOutputData(); Assertions.assertThat(output).isNotNull(); Assertions.assertThat(output).hasSize(0); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } @Test public void testReassignmentWhenNotStarted() throws Exception { testReassignment(true); } @Test public void testReassignmentWhenNotCompleted() throws Exception { testReassignment(false); } @Test public void testCancelReassignWhenNotStarted() throws Exception { testCancelReassign(true); } @Test public void testCancelReassignWhenNotCompleted() throws Exception { testCancelReassign(false); } @Test public void testCancelNotifyWhenNotStarted() throws Exception { testCancelNotify(true); } @Test public void testCancelNotifyWhenNotCompleted() throws Exception { testCancelNotify(false); } private void testReassignment(boolean whenNotStarted) throws Exception { Map<String, Object> parameters = new HashMap<String, Object>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); Assertions.assertThat(processInstanceId).isNotNull(); Assertions.assertThat(processInstanceId.longValue()).isGreaterThan(0); changeUser(USER_YODA); List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); Assertions.assertThat(tasks).hasSize(1); long taskId = tasks.get(0).getId(); taskClient.claimTask(CONTAINER_ID, taskId, USER_YODA); changeUser(USER_ADMINISTRATOR); TaskInstance instance = taskClient.getTaskInstance(CONTAINER_ID, taskId, false, false, true); Assertions.assertThat(instance).isNotNull(); Assertions.assertThat(instance.getStatus()).isEqualTo("Reserved"); List<String> potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(3); Assertions.assertThat(potOwners).contains(USER_YODA, "PM", "HR"); OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); if (whenNotStarted) { userTaskAdminClient.reassignWhenNotStarted(CONTAINER_ID, taskId, "2s", reassign); } else { userTaskAdminClient.reassignWhenNotCompleted(CONTAINER_ID, taskId, "2s", reassign); } KieServerSynchronization.waitForTaskStatus(taskClient, taskId, "Ready"); instance = taskClient.getTaskInstance(CONTAINER_ID, taskId, false, false, true); Assertions.assertThat(instance).isNotNull(); Assertions.assertThat(instance.getStatus()).isEqualTo("Ready"); potOwners = instance.getPotentialOwners(); Assertions.assertThat(potOwners).hasSize(1); Assertions.assertThat(potOwners).contains(USER_JOHN); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } private void testCancelReassign(boolean whenNotStarted) throws Exception { Map<String, Object> parameters = new HashMap<String, Object>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); Assertions.assertThat(processInstanceId).isNotNull(); Assertions.assertThat(processInstanceId.longValue()).isGreaterThan(0); changeUser(USER_YODA); List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); Assertions.assertThat(tasks).hasSize(1); long taskId = tasks.get(0).getId(); taskClient.claimTask(CONTAINER_ID, taskId, USER_YODA); changeUser(USER_ADMINISTRATOR); List<TaskReassignment> reassignments = userTaskAdminClient.getTaskReassignments(CONTAINER_ID, taskId, true); Assertions.assertThat(reassignments).isNotNull(); Assertions.assertThat(reassignments).hasSize(0); OrgEntities reassign = OrgEntities.builder().users(Arrays.asList(USER_JOHN)).build(); Long reassignmentId = null; if (whenNotStarted) { reassignmentId = userTaskAdminClient.reassignWhenNotStarted(CONTAINER_ID, taskId, "10s", reassign); } else { reassignmentId = userTaskAdminClient.reassignWhenNotCompleted(CONTAINER_ID, taskId, "10s", reassign); } reassignments = userTaskAdminClient.getTaskReassignments(CONTAINER_ID, taskId, true); Assertions.assertThat(reassignments).isNotNull(); Assertions.assertThat(reassignments).hasSize(1); userTaskAdminClient.cancelReassignment(CONTAINER_ID, taskId, reassignmentId); reassignments = userTaskAdminClient.getTaskReassignments(CONTAINER_ID, taskId, true); Assertions.assertThat(reassignments).isNotNull(); Assertions.assertThat(reassignments).hasSize(0); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } private void testCancelNotify(boolean whenNotStarted) throws Exception { Map<String, Object> parameters = new HashMap<String, Object>(); Long processInstanceId = null; try { processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters); Assertions.assertThat(processInstanceId).isNotNull(); Assertions.assertThat(processInstanceId.longValue()).isGreaterThan(0); changeUser(USER_YODA); List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); Assertions.assertThat(tasks).hasSize(1); long taskId = tasks.get(0).getId(); taskClient.claimTask(CONTAINER_ID, taskId, USER_YODA); changeUser(USER_ADMINISTRATOR); List<TaskNotification> notifications = userTaskAdminClient.getTaskNotifications(CONTAINER_ID, taskId, true); Assertions.assertThat(notifications).isNotNull(); Assertions.assertThat(notifications).hasSize(0); EmailNotification emailNotification = EmailNotification.builder().from("test@jbpm.org").replyTo("no-reply@jbpm.org").subject("reminder").body("my test content").users(Arrays.asList(USER_JOHN)).build(); Long notificationId = null; if (whenNotStarted) { notificationId = userTaskAdminClient.notifyWhenNotStarted(CONTAINER_ID, taskId, "10s", emailNotification); } else { notificationId = userTaskAdminClient.notifyWhenNotCompleted(CONTAINER_ID, taskId, "10s", emailNotification); } notifications = userTaskAdminClient.getTaskNotifications(CONTAINER_ID, taskId, true); Assertions.assertThat(notifications).isNotNull(); Assertions.assertThat(notifications).hasSize(1); userTaskAdminClient.cancelNotification(CONTAINER_ID, taskId, notificationId); notifications = userTaskAdminClient.getTaskNotifications(CONTAINER_ID, taskId, true); Assertions.assertThat(notifications).isNotNull(); Assertions.assertThat(notifications).hasSize(0); } finally { if (processInstanceId != null) { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } } private void assertExceptionContainsCorrectMessage(ThrowableAssert.ThrowingCallable callable, String restMessage, String jmsMessage) throws Exception { if (configuration.isRest()) { Assertions.assertThatThrownBy(callable).isInstanceOf(KieServicesException.class).hasMessageContaining(restMessage); } else { Assertions.assertThatThrownBy(callable).isInstanceOf(KieServicesException.class).hasMessageContaining(jmsMessage); } } }