/* * 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.cases; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import org.kie.api.KieServices; import org.kie.api.runtime.process.ProcessInstance; import org.kie.server.api.model.ReleaseId; import org.kie.server.api.model.cases.CaseFile; import org.kie.server.api.model.cases.CaseInstance; import org.kie.server.api.model.instance.TaskSummary; import org.kie.server.api.exception.KieServicesException; import org.kie.server.integrationtests.jbpm.JbpmKieServerBaseIntegrationTest; import org.kie.server.integrationtests.shared.KieServerDeployer; import static org.junit.Assert.*; public class CaseServiceIntegrationTest extends JbpmKieServerBaseIntegrationTest { private static ReleaseId releaseId = new ReleaseId("org.kie.server.testing", "case-insurance", "1.0.0.Final"); private static final String CONTAINER_ID = "insurance"; private static final String PROPERTY_DAMAGE_REPORT_CLASS_NAME = "org.kie.server.testing.PropertyDamageReport"; private static final String CLAIM_REPORT_CLASS_NAME = "org.kie.server.testing.ClaimReport"; private static final String CLAIM_CASE_ID_PREFIX = "CAR_INS"; private static final String CLAIM_CASE_DEF_ID = "insurance-claims.CarInsuranceClaimCase"; private static final String CLAIM_CASE_DESRIPTION = "CarInsuranceClaimCase"; private static final String CASE_INSURED_ROLE = "insured"; private static final String CASE_INS_REP_ROLE = "insuranceRepresentative"; private static final String CONTAINER_ALIAS = "ins"; private static final String CAR_PRODUCER_REPORT_PARAMETER = "carId"; private static final String CAR_PRODUCER_REPORT_OUTPUT = "carProducerReport"; @BeforeClass public static void buildAndDeployArtifacts() { KieServerDeployer.buildAndDeployCommonMavenParent(); KieServerDeployer.buildAndDeployMavenProject(ClassLoader.class.getResource("/kjars-sources/case-insurance").getFile()); kieContainer = KieServices.Factory.get().newKieContainer(releaseId); createContainer(CONTAINER_ID, releaseId, CONTAINER_ALIAS); } @Override protected void addExtraCustomClasses(Map<String, Class<?>> extraClasses) throws Exception { extraClasses.put(CLAIM_REPORT_CLASS_NAME, Class.forName(CLAIM_REPORT_CLASS_NAME, true, kieContainer.getClassLoader())); extraClasses.put(PROPERTY_DAMAGE_REPORT_CLASS_NAME, Class.forName(PROPERTY_DAMAGE_REPORT_CLASS_NAME, true, kieContainer.getClassLoader())); } @Test public void testCreateCaseWithEmptyCaseFile() { String caseId = caseClient.startCase(CONTAINER_ID, CLAIM_CASE_DEF_ID); assertNotNull(caseId); assertTrue(caseId.startsWith(CLAIM_CASE_ID_PREFIX)); CaseInstance caseInstance = caseClient.getCaseInstance(CONTAINER_ID, caseId); assertCarInsuranceCaseInstance(caseInstance, caseId, USER_YODA); // since roles were not assigned to any users/groups no tasks are available List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); assertEquals(0, tasks.size()); } @Test public void testCreateCaseWithEmptyCaseFileButWithRoleAssignments() { CaseFile caseFile = CaseFile.builder().addUserAssignments(CASE_INSURED_ROLE, USER_YODA) .addUserAssignments(CASE_INS_REP_ROLE, USER_JOHN) .build(); String caseId = caseClient.startCase(CONTAINER_ID, CLAIM_CASE_DEF_ID, caseFile); assertNotNull(caseId); assertTrue(caseId.startsWith(CLAIM_CASE_ID_PREFIX)); CaseInstance caseInstance = caseClient.getCaseInstance(CONTAINER_ID, caseId); assertCarInsuranceCaseInstance(caseInstance, caseId, USER_YODA); List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); assertEquals(1, tasks.size()); TaskSummary task = tasks.get(0); assertNotNull(task); assertEquals("Provide accident information", task.getName()); assertEquals(null, task.getActualOwner()); assertEquals("Ready", task.getStatus()); } @Test public void testCreateCaseWithCaseFile() { Map<String, Object> caseData = new HashMap<>(); caseData.put("car", "ford"); CaseFile caseFile = CaseFile.builder().addUserAssignments(CASE_INSURED_ROLE, USER_YODA) .addUserAssignments(CASE_INS_REP_ROLE, USER_JOHN) .data(caseData) .build(); String caseId = caseClient.startCase(CONTAINER_ID, CLAIM_CASE_DEF_ID, caseFile); assertNotNull(caseId); assertTrue(caseId.startsWith(CLAIM_CASE_ID_PREFIX)); caseData = caseClient.getCaseInstanceData(CONTAINER_ID, caseId); assertNotNull(caseData); assertEquals(1, caseData.size()); assertEquals("ford", caseData.get("car")); caseClient.putCaseInstanceData(CONTAINER_ID, caseId, "car", "fiat"); Object carCaseData = caseClient.getCaseInstanceData(CONTAINER_ID, caseId, "car"); assertNotNull(carCaseData); assertTrue(carCaseData instanceof String); assertEquals("fiat", carCaseData); List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); assertEquals(1, tasks.size()); TaskSummary task = tasks.get(0); assertNotNull(task); assertEquals("Provide accident information", task.getName()); assertEquals(null, task.getActualOwner()); assertEquals("Ready", task.getStatus()); Map<String, Object> output = new HashMap<>(); Object claimReport = createInstance(CLAIM_REPORT_CLASS_NAME); setValue(claimReport, "name", "John Doe"); output.put("claimReport_", claimReport); taskClient.completeAutoProgress(CONTAINER_ID, task.getId(), USER_YODA, output); caseData = caseClient.getCaseInstanceData(CONTAINER_ID, caseId); assertNotNull(caseData); assertEquals(2, caseData.size()); assertEquals("fiat", caseData.get("car")); Object caseClaimReport = caseData.get("claimReport"); assertNotNull(caseClaimReport); assertEquals(caseClaimReport.getClass().getName(), CLAIM_REPORT_CLASS_NAME); caseClient.removeCaseInstanceData(CONTAINER_ID, caseId, "claimReport"); caseData = caseClient.getCaseInstanceData(CONTAINER_ID, caseId); assertNotNull(caseData); assertEquals(1, caseData.size()); assertEquals("fiat", caseData.get("car")); Map<String, Object> data = new HashMap<>(); data.put("owner", "john"); data.put("report", caseClaimReport); caseClient.putCaseInstanceData(CONTAINER_ID, caseId, data); caseData = caseClient.getCaseInstanceData(CONTAINER_ID, caseId); assertNotNull(caseData); assertEquals(3, caseData.size()); assertEquals("fiat", caseData.get("car")); assertEquals("john", caseData.get("owner")); caseClaimReport = caseData.get("report"); assertNotNull(caseClaimReport); assertEquals(caseClaimReport.getClass().getName(), CLAIM_REPORT_CLASS_NAME); } @Test public void testCreateCaseWithEmptyCaseFileThenDestroyIt() { String caseId = caseClient.startCase(CONTAINER_ID, CLAIM_CASE_DEF_ID); assertNotNull(caseId); assertTrue(caseId.startsWith(CLAIM_CASE_ID_PREFIX)); CaseInstance caseInstance = caseClient.getCaseInstance(CONTAINER_ID, caseId); assertCarInsuranceCaseInstance(caseInstance, caseId, USER_YODA); // since roles were not assigned to any users/groups no tasks are available List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); assertEquals(0, tasks.size()); caseClient.destroyCaseInstance(CONTAINER_ID, caseId); try { // this should throw exception as there is no case any more caseClient.getCaseInstance(CONTAINER_ID, caseId); fail("Case should not exists any more"); } catch (KieServicesException e) { // expected } } @Test public void testCreateCancelAndReopenCaseWithEmptyCaseFile() { String caseId = caseClient.startCase(CONTAINER_ID, CLAIM_CASE_DEF_ID); assertNotNull(caseId); assertTrue(caseId.startsWith(CLAIM_CASE_ID_PREFIX)); CaseInstance caseInstance = caseClient.getCaseInstance(CONTAINER_ID, caseId); assertCarInsuranceCaseInstance(caseInstance, caseId, USER_YODA); caseClient.cancelCaseInstance(CONTAINER_ID, caseId); try { // this should throw exception as there is no case any more caseClient.getCaseInstance(CONTAINER_ID, caseId); fail("Case should not exists any more"); } catch (KieServicesException e) { // expected } Map<String, Object> data = new HashMap<>(); data.put("additionalComment", "reopening the case"); caseClient.reopenCase(caseId, CONTAINER_ID, CLAIM_CASE_DEF_ID, data); caseInstance = caseClient.getCaseInstance(CONTAINER_ID, caseId); assertNotNull(caseInstance); assertEquals(caseId, caseInstance.getCaseId()); Object additionalComment = caseClient.getCaseInstanceData(CONTAINER_ID, caseId, "additionalComment"); assertNotNull(additionalComment); assertEquals("reopening the case", additionalComment); } @Test public void testCreateCaseWithEmptyCaseFileWithContainerAlias() { String caseId = caseClient.startCase(CONTAINER_ALIAS, CLAIM_CASE_DEF_ID); assertNotNull(caseId); assertTrue(caseId.startsWith(CLAIM_CASE_ID_PREFIX)); CaseInstance caseInstance = caseClient.getCaseInstance(CONTAINER_ALIAS, caseId); assertCarInsuranceCaseInstance(caseInstance, caseId, USER_YODA); // since roles were not assigned to any users/groups no tasks are available List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); assertEquals(0, tasks.size()); } @Test public void testCancelCaseInstanceNotExistingContainer() { try { caseClient.cancelCaseInstance("not-existing-container", CLAIM_CASE_DEF_ID); fail("Should have failed because of not existing container."); } catch (KieServicesException e) { // expected } } @Test public void testCancelCaseInstanceNotExistingCase() { try { caseClient.cancelCaseInstance(CONTAINER_ID, "not-existing-case"); fail("Should have failed because of not existing case definition Id."); } catch (KieServicesException e) { // expected } } @Test public void testDestroyCaseInstance() { Map<String, Object> caseData = new HashMap<>(); caseData.put("car", "ford"); CaseFile caseFile = CaseFile.builder() .data(caseData) .build(); String caseId = caseClient.startCase(CONTAINER_ID, CLAIM_CASE_DEF_ID, caseFile); assertNotNull(caseId); CaseInstance caseInstance = caseClient.getCaseInstance(CONTAINER_ID, caseId); assertCarInsuranceCaseInstance(caseInstance, caseId, USER_YODA); caseClient.destroyCaseInstance(CONTAINER_ID, caseId); try { // this should throw exception as there is no case any more caseClient.getCaseInstance(CONTAINER_ID, caseId); fail("Case should not exists any more"); } catch (KieServicesException e) { // expected } try { caseClient.reopenCase(caseId, CONTAINER_ID, CLAIM_CASE_DEF_ID); fail("Should have failed because destroyed case cannot be reopen."); } catch (KieServicesException e) { // expected } } @Test public void testDestroyCaseInstanceNotExistingContainer() { try { caseClient.destroyCaseInstance("not-existing-container", CLAIM_CASE_DEF_ID); fail("Should have failed because of not existing container."); } catch (KieServicesException e) { // expected } } @Test public void testDestroyCaseInstanceNotExistingCase() { try { caseClient.destroyCaseInstance(CONTAINER_ID, "not-existing-case"); fail("Should have failed because of not existing case definition Id."); } catch (KieServicesException e) { // expected } } @Test public void testAddDynamicWorkItemTask() { String carId = "Ford Mustang"; String producerReportResponse = carId + " was regularly maintained and checked."; String caseId = caseClient.startCase(CONTAINER_ID, CLAIM_CASE_DEF_ID); Map<String, Object> data = new HashMap<>(); data.put(CAR_PRODUCER_REPORT_PARAMETER, carId); caseClient.addDynamicTask(CONTAINER_ID, caseId, "ContactCarProducer", "Contact car producer", data); Map<String, Object> caseInstanceData = caseClient.getCaseInstanceData(CONTAINER_ID, caseId); assertTrue(caseInstanceData.containsKey(CAR_PRODUCER_REPORT_OUTPUT)); assertEquals(producerReportResponse, caseInstanceData.get(CAR_PRODUCER_REPORT_OUTPUT)); } @Test public void testAddDynamicWorkItemTaskNotExistingContainer() { try { caseClient.addDynamicTask("not-existing-container", "not-existing-case", "ContactCarProducer", "Contact car producer", null); fail("Should have failed because of not existing container."); } catch (KieServicesException e) { // expected } } @Test public void testAddDynamicWorkItemTaskNotExistingCase() { try { caseClient.addDynamicTask(CONTAINER_ID, "not-existing-case", "ContactCarProducer", "Contact car producer", null); fail("Should have failed because of not existing case case Id."); } catch (KieServicesException e) { // expected } } private void assertCarInsuranceCaseInstance(CaseInstance caseInstance, String caseId, String owner) { assertNotNull(caseInstance); assertEquals(caseId, caseInstance.getCaseId()); assertEquals(CLAIM_CASE_DEF_ID, caseInstance.getCaseDefinitionId()); assertEquals(CLAIM_CASE_DESRIPTION, caseInstance.getCaseDescription()); assertEquals(owner, caseInstance.getCaseOwner()); assertEquals(ProcessInstance.STATE_ACTIVE, caseInstance.getCaseStatus().intValue()); assertNotNull(caseInstance.getStartedAt()); assertNull(caseInstance.getCompletedAt()); assertEquals("", caseInstance.getCompletionMessage()); assertEquals(CONTAINER_ID, caseInstance.getContainerId()); } }