Closes #2316 - refactor DmnTaskRouterAccTest to use test-api

This commit is contained in:
jamesrdi 2023-07-11 11:11:43 +02:00 committed by Elena Mokeeva
parent e443169804
commit 3bf9306929
4 changed files with 149 additions and 12 deletions

View File

@ -82,6 +82,12 @@
<version>${version.oracle}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>pro.taskana</groupId>
<artifactId>taskana-test-api</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -2,29 +2,94 @@ package pro.taskana.routing.dmn;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static pro.taskana.testapi.DefaultTestEntities.defaultTestClassification;
import static pro.taskana.testapi.DefaultTestEntities.defaultTestWorkbasket;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.AbstractAccTest;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.api.models.ClassificationSummary;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.test.security.JaasExtension;
import pro.taskana.common.test.security.WithAccessId;
import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.spi.routing.api.TaskRoutingProvider;
import pro.taskana.spi.routing.internal.TaskRoutingManager;
import pro.taskana.task.api.TaskService;
import pro.taskana.task.api.models.ObjectReference;
import pro.taskana.task.api.models.Task;
import pro.taskana.testapi.TaskanaInject;
import pro.taskana.testapi.TaskanaIntegrationTest;
import pro.taskana.testapi.WithServiceProvider;
import pro.taskana.testapi.builder.ObjectReferenceBuilder;
import pro.taskana.testapi.builder.UserBuilder;
import pro.taskana.testapi.builder.WorkbasketAccessItemBuilder;
import pro.taskana.testapi.builder.WorkbasketBuilder;
import pro.taskana.testapi.security.WithAccessId;
import pro.taskana.user.api.UserService;
import pro.taskana.workbasket.api.WorkbasketPermission;
import pro.taskana.workbasket.api.WorkbasketService;
import pro.taskana.workbasket.api.WorkbasketType;
import pro.taskana.workbasket.api.models.WorkbasketSummary;
@ExtendWith(JaasExtension.class)
class DmnTaskRouterAccTest extends AbstractAccTest {
@WithServiceProvider(
serviceProviderInterface = TaskRoutingProvider.class,
serviceProviders = DmnTaskRouter.class)
@TaskanaIntegrationTest
class DmnTaskRouterAccTest {
TaskanaConfiguration taskanaConfiguration;
@TaskanaInject TaskService taskService;
@TaskanaInject ClassificationService classificationService;
@TaskanaInject WorkbasketService workbasketService;
@TaskanaInject UserService userService;
@TaskanaInject TaskanaEngine taskanaEngine;
@TaskanaInject InternalTaskanaEngine internalTaskanaEngine;
private final TaskService taskService = taskanaEngine.getTaskService();
ClassificationSummary defaultClassificationSummary;
WorkbasketSummary defaultWorkbasketSummary;
@WithAccessId(user = "businessadmin")
@BeforeAll
void setup() throws Exception {
taskanaConfiguration = taskanaEngine.getConfiguration();
defaultClassificationSummary =
defaultTestClassification().buildAndStoreAsSummary(classificationService);
defaultWorkbasketSummary = defaultTestWorkbasket().buildAndStoreAsSummary(workbasketService);
createWorkbasketWithDomainA("GPK_KSC").buildAndStoreAsSummary(workbasketService);
createWorkbasketWithDomainA("GPK_KSC_1").buildAndStoreAsSummary(workbasketService);
createWorkbasketWithDomainA("GPK_KSC_2").buildAndStoreAsSummary(workbasketService);
WorkbasketAccessItemBuilder.newWorkbasketAccessItem()
.workbasketId(defaultWorkbasketSummary.getId())
.accessId("user-1-2")
.permission(WorkbasketPermission.OPEN)
.permission(WorkbasketPermission.READ)
.permission(WorkbasketPermission.APPEND)
.buildAndStore(workbasketService);
UserBuilder.newUser()
.id("user-1-2")
.firstName("Max")
.lastName("Mustermann")
.longName("Long name of user-1-2")
.buildAndStore(userService);
changeDmnTable("/dmn-table.dmn");
reinitializeTaskRoutingProviders();
}
@WithAccessId(user = "taskadmin")
@Test
void should_RouteTaskToCorrectWorkbasket_When_DmnTaskRouterFindsRule() throws Exception {
Task taskToRoute = taskService.newTask();
taskToRoute.setClassificationKey("T2100");
taskToRoute.setClassificationKey(defaultClassificationSummary.getKey());
ObjectReference objectReference =
createObjectReference("company", null, null, "MyType1", "00000001");
taskToRoute.setPrimaryObjRef(objectReference);
@ -36,9 +101,8 @@ class DmnTaskRouterAccTest extends AbstractAccTest {
@WithAccessId(user = "taskadmin")
@Test
void should_ThrowException_When_DmnTaskRouterFindsNoRule() {
Task taskToRoute = taskService.newTask();
taskToRoute.setClassificationKey("T2100");
taskToRoute.setClassificationKey(defaultClassificationSummary.getKey());
ObjectReference objectReference =
createObjectReference("company", null, null, "MyTeö", "000002");
taskToRoute.setPrimaryObjRef(objectReference);
@ -49,4 +113,51 @@ class DmnTaskRouterAccTest extends AbstractAccTest {
.extracting(Throwable::getMessage)
.isEqualTo("Cannot create a Task outside a Workbasket");
}
ObjectReference createObjectReference(
String company, String system, String systemInstance, String type, String value) {
return ObjectReferenceBuilder.newObjectReference()
.company(company)
.system(system)
.systemInstance(systemInstance)
.type(type)
.value(value)
.build();
}
private void changeDmnTable(String newPath) throws Exception {
Map<String, String> mutableProperties = new HashMap<>();
String dmnTableProperty = "taskana.routing.dmn";
mutableProperties.put(dmnTableProperty, newPath);
Field property = taskanaConfiguration.getClass().getDeclaredField("properties");
property.setAccessible(true);
property.set(taskanaConfiguration, mutableProperties);
property.setAccessible(false);
}
private Object getProperty(String declaredField, Object object) throws Exception {
Field property = object.getClass().getDeclaredField(declaredField);
property.setAccessible(true);
Object returnObject = property.get(object);
property.setAccessible(false);
return returnObject;
}
private void reinitializeTaskRoutingProviders() throws Exception {
TaskRoutingManager taskRoutingManager = internalTaskanaEngine.getTaskRoutingManager();
List<TaskRoutingProvider> taskRoutingProviders =
(List<TaskRoutingProvider>) getProperty("taskRoutingProviders", taskRoutingManager);
for (TaskRoutingProvider taskRoutingProvider : taskRoutingProviders) {
taskRoutingProvider.initialize(taskanaEngine);
}
}
private WorkbasketBuilder createWorkbasketWithDomainA(String key) {
return WorkbasketBuilder.newWorkbasket()
.key(key)
.domain("DOMAIN_A")
.name("Megabasket")
.type(WorkbasketType.GROUP)
.orgLevel1("company");
}
}

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0m4jljf" name="DRD" namespace="http://camunda.org/schema/1.0/dmn" exporter="Camunda Modeler" exporterVersion="5.12.1" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.2.0">
<decision id="workbasketRouting" name="Workbasket Routing">
<decisionTable id="workbasketRouting_decisionTable" hitPolicy="FIRST">
<input id="Input_1">
<inputExpression id="InputExpression_1" typeRef="string">
<text></text>
</inputExpression>
</input>
<output id="Output_1" typeRef="string" />
</decisionTable>
</decision>
<dmndi:DMNDI>
<dmndi:DMNDiagram>
<dmndi:DMNShape dmnElementRef="Decision_1e62yjv">
<dc:Bounds height="80" width="180" x="160" y="100" />
</dmndi:DMNShape>
</dmndi:DMNDiagram>
</dmndi:DMNDI>
</definitions>

View File

@ -20,7 +20,7 @@ taskana.jobs.history.cleanup.runEvery=P1D
taskana.workingTime.holidays.german.enabled=true
taskana.workingTime.holidays.german.corpus-christi.enabled=true
taskana.history.logger.name=AUDIT
taskana.routing.dmn=/dmn-table.dmn
taskana.routing.dmn=/empty.dmn
# enable or disable the jobscheduler at all
# set it to false and no jobs are running
taskana.jobs.scheduler.enabled=false