Skip to content

Commit 421a607

Browse files
committed
Closes #2364 - Add Rerouting of Tasks in JAVA-API
1 parent 5af380e commit 421a607

File tree

11 files changed

+1009
-1
lines changed

11 files changed

+1009
-1
lines changed

history/taskana-simplehistory-provider/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@
3737
</dependency>
3838

3939
<!-- test dependencies -->
40+
<dependency>
41+
<groupId>pro.taskana</groupId>
42+
<artifactId>taskana-test-api</artifactId>
43+
<version>${project.version}</version>
44+
<scope>test</scope>
45+
</dependency>
4046
<dependency>
4147
<groupId>pro.taskana</groupId>
4248
<artifactId>taskana-common-data</artifactId>
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
package acceptance.events.task;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import acceptance.events.task.CreateHistoryEventOnTaskRerouteAccTest.TaskRoutingProviderForDomainA;
6+
import java.lang.reflect.Field;
7+
import java.util.List;
8+
import org.apache.ibatis.session.SqlSessionManager;
9+
import org.json.JSONArray;
10+
import org.json.JSONObject;
11+
import org.junit.jupiter.api.BeforeAll;
12+
import org.junit.jupiter.api.Test;
13+
import org.junit.jupiter.api.extension.ExtendWith;
14+
import pro.taskana.classification.api.ClassificationService;
15+
import pro.taskana.classification.api.models.ClassificationSummary;
16+
import pro.taskana.common.api.TaskanaEngine;
17+
import pro.taskana.common.test.security.JaasExtension;
18+
import pro.taskana.common.test.security.WithAccessId;
19+
import pro.taskana.simplehistory.impl.SimpleHistoryServiceImpl;
20+
import pro.taskana.simplehistory.impl.TaskHistoryQueryImpl;
21+
import pro.taskana.simplehistory.impl.TaskanaHistoryEngineImpl;
22+
import pro.taskana.simplehistory.impl.task.TaskHistoryQueryMapper;
23+
import pro.taskana.spi.history.api.TaskanaHistory;
24+
import pro.taskana.spi.history.api.events.task.TaskHistoryEvent;
25+
import pro.taskana.spi.history.api.events.task.TaskHistoryEventType;
26+
import pro.taskana.spi.routing.api.TaskRoutingProvider;
27+
import pro.taskana.task.api.TaskService;
28+
import pro.taskana.task.api.models.Task;
29+
import pro.taskana.testapi.DefaultTestEntities;
30+
import pro.taskana.testapi.TaskanaInject;
31+
import pro.taskana.testapi.TaskanaIntegrationTest;
32+
import pro.taskana.testapi.WithServiceProvider;
33+
import pro.taskana.testapi.builder.TaskBuilder;
34+
import pro.taskana.testapi.builder.WorkbasketAccessItemBuilder;
35+
import pro.taskana.workbasket.api.WorkbasketPermission;
36+
import pro.taskana.workbasket.api.WorkbasketService;
37+
import pro.taskana.workbasket.api.models.Workbasket;
38+
import pro.taskana.workbasket.api.models.WorkbasketSummary;
39+
40+
@WithServiceProvider(
41+
serviceProviderInterface = TaskRoutingProvider.class,
42+
serviceProviders = TaskRoutingProviderForDomainA.class)
43+
@WithServiceProvider(
44+
serviceProviderInterface = TaskanaHistory.class,
45+
serviceProviders = SimpleHistoryServiceImpl.class)
46+
@TaskanaIntegrationTest
47+
@ExtendWith(JaasExtension.class)
48+
class CreateHistoryEventOnTaskRerouteAccTest {
49+
@TaskanaInject TaskanaEngine taskanaEngine;
50+
@TaskanaInject TaskService taskService;
51+
@TaskanaInject WorkbasketService workbasketService;
52+
@TaskanaInject ClassificationService classificationService;
53+
54+
ClassificationSummary classificationSummary;
55+
WorkbasketSummary domainAWorkbasketSummary;
56+
WorkbasketSummary domainBWorkbasketSummary;
57+
Task task1;
58+
Task task2;
59+
Task task3;
60+
Task task4;
61+
SimpleHistoryServiceImpl historyService;
62+
TaskanaHistoryEngineImpl taskanaHistoryEngine;
63+
64+
@WithAccessId(user = "admin")
65+
@BeforeAll
66+
void setup() throws Exception {
67+
historyService = new SimpleHistoryServiceImpl();
68+
taskanaHistoryEngine = TaskanaHistoryEngineImpl.createTaskanaEngine(taskanaEngine);
69+
historyService.initialize(taskanaEngine);
70+
classificationSummary =
71+
DefaultTestEntities.defaultTestClassification()
72+
.buildAndStoreAsSummary(classificationService);
73+
domainAWorkbasketSummary =
74+
DefaultTestEntities.defaultTestWorkbasket()
75+
.domain("DOMAIN_A")
76+
.buildAndStoreAsSummary(workbasketService);
77+
domainBWorkbasketSummary =
78+
DefaultTestEntities.defaultTestWorkbasket()
79+
.domain("DOMAIN_B")
80+
.buildAndStoreAsSummary(workbasketService);
81+
82+
task1 =
83+
TaskBuilder.newTask()
84+
.classificationSummary(classificationSummary)
85+
.workbasketSummary(domainAWorkbasketSummary)
86+
.primaryObjRef(DefaultTestEntities.defaultTestObjectReference().build())
87+
.buildAndStore(taskService);
88+
task2 =
89+
TaskBuilder.newTask()
90+
.classificationSummary(classificationSummary)
91+
.workbasketSummary(domainAWorkbasketSummary)
92+
.primaryObjRef(DefaultTestEntities.defaultTestObjectReference().build())
93+
.buildAndStore(taskService);
94+
task3 =
95+
TaskBuilder.newTask()
96+
.classificationSummary(classificationSummary)
97+
.workbasketSummary(domainBWorkbasketSummary)
98+
.primaryObjRef(DefaultTestEntities.defaultTestObjectReference().build())
99+
.buildAndStore(taskService);
100+
101+
task4 =
102+
TaskBuilder.newTask()
103+
.classificationSummary(classificationSummary)
104+
.workbasketSummary(domainAWorkbasketSummary)
105+
.primaryObjRef(DefaultTestEntities.defaultTestObjectReference().build())
106+
.buildAndStore(taskService);
107+
108+
WorkbasketAccessItemBuilder.newWorkbasketAccessItem()
109+
.workbasketId(domainAWorkbasketSummary.getId())
110+
.accessId("user-1-1")
111+
.permission(WorkbasketPermission.OPEN)
112+
.permission(WorkbasketPermission.READ)
113+
.permission(WorkbasketPermission.APPEND)
114+
.buildAndStore(workbasketService);
115+
116+
WorkbasketAccessItemBuilder.newWorkbasketAccessItem()
117+
.workbasketId(domainBWorkbasketSummary.getId())
118+
.accessId("user-1-1")
119+
.permission(WorkbasketPermission.OPEN)
120+
.permission(WorkbasketPermission.READ)
121+
.permission(WorkbasketPermission.APPEND)
122+
.buildAndStore(workbasketService);
123+
}
124+
125+
@WithAccessId(user = "admin")
126+
@Test
127+
void should_CreateRerouteHistoryEvent_When_TaskIsRerouted() throws Exception {
128+
historyService.deleteHistoryEventsByTaskIds(List.of(task4.getId()));
129+
TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper();
130+
taskService.rerouteTask(task4.getId());
131+
132+
List<TaskHistoryEvent> events =
133+
taskHistoryQueryMapper.queryHistoryEvents(
134+
(TaskHistoryQueryImpl) historyService.createTaskHistoryQuery().taskIdIn(task4.getId()));
135+
136+
assertThat(events).hasSize(1);
137+
String eventType = events.get(0).getEventType();
138+
assertThat(eventType).isEqualTo(TaskHistoryEventType.REROUTED.getName());
139+
assertRerouteHistoryEvent(
140+
events.get(0).getId(),
141+
domainAWorkbasketSummary.getId(),
142+
domainBWorkbasketSummary.getId(),
143+
"admin");
144+
145+
historyService.deleteHistoryEventsByTaskIds(List.of(task4.getId()));
146+
}
147+
148+
@WithAccessId(user = "admin")
149+
@Test
150+
void should_CreateRerouteHistoryEvent_When_MultipleTasksAreRerouted() throws Exception {
151+
List<String> taskIds = List.of(task1.getId(), task2.getId(), task3.getId());
152+
historyService.deleteHistoryEventsByTaskIds(taskIds);
153+
TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper();
154+
taskService.rerouteTasks(taskIds);
155+
156+
List<TaskHistoryEvent> events =
157+
taskHistoryQueryMapper.queryHistoryEvents(
158+
(TaskHistoryQueryImpl)
159+
historyService.createTaskHistoryQuery().taskIdIn(taskIds.toArray(new String[0])));
160+
161+
assertThat(events)
162+
.extracting(TaskHistoryEvent::getTaskId)
163+
.containsExactlyInAnyOrderElementsOf(taskIds);
164+
165+
for (TaskHistoryEvent event : events) {
166+
if (event.getTaskId().equals(task1.getId())) {
167+
assertRerouteHistoryEvent(
168+
event.getId(),
169+
domainAWorkbasketSummary.getId(),
170+
domainBWorkbasketSummary.getId(),
171+
"admin");
172+
} else if (event.getTaskId().equals(task2.getId())) {
173+
assertRerouteHistoryEvent(
174+
event.getId(),
175+
domainAWorkbasketSummary.getId(),
176+
domainBWorkbasketSummary.getId(),
177+
"admin");
178+
} else {
179+
assertRerouteHistoryEvent(
180+
event.getId(),
181+
domainBWorkbasketSummary.getId(),
182+
domainAWorkbasketSummary.getId(),
183+
"admin");
184+
}
185+
}
186+
}
187+
188+
private TaskHistoryQueryMapper getHistoryQueryMapper()
189+
throws NoSuchFieldException, IllegalAccessException {
190+
Field sessionManagerField = TaskanaHistoryEngineImpl.class.getDeclaredField("sessionManager");
191+
sessionManagerField.setAccessible(true);
192+
SqlSessionManager sqlSessionManager =
193+
(SqlSessionManager) sessionManagerField.get(taskanaHistoryEngine);
194+
195+
return sqlSessionManager.getMapper(TaskHistoryQueryMapper.class);
196+
}
197+
198+
private void assertRerouteHistoryEvent(
199+
String eventId, String expectedOldValue, String expectedNewValue, String expectedUser)
200+
throws Exception {
201+
TaskHistoryEvent event = historyService.getTaskHistoryEvent(eventId);
202+
assertThat(event.getDetails()).isNotNull();
203+
JSONArray changes = new JSONObject(event.getDetails()).getJSONArray("changes");
204+
assertThat(changes.length()).isPositive();
205+
boolean foundField = false;
206+
for (int i = 0; i < changes.length() && !foundField; i++) {
207+
JSONObject change = changes.getJSONObject(i);
208+
if (change.get("fieldName").equals("workbasketSummary")) {
209+
foundField = true;
210+
String oldWorkbasketStr = change.get("oldValue").toString();
211+
String newWorkbasketStr = change.get("newValue").toString();
212+
Workbasket oldWorkbasket = workbasketService.getWorkbasket(expectedOldValue);
213+
assertThat(oldWorkbasketStr)
214+
.isEqualTo(JSONObject.wrap(oldWorkbasket.asSummary()).toString());
215+
Workbasket newWorkbasket = workbasketService.getWorkbasket(expectedNewValue);
216+
assertThat(newWorkbasketStr)
217+
.isEqualTo(JSONObject.wrap(newWorkbasket.asSummary()).toString());
218+
}
219+
}
220+
assertThat(foundField).describedAs("changes do not contain field 'workbasketSummary'").isTrue();
221+
222+
assertThat(event.getId()).startsWith("THI:");
223+
assertThat(event.getOldValue()).isEqualTo(expectedOldValue);
224+
assertThat(event.getNewValue()).isEqualTo(expectedNewValue);
225+
assertThat(event.getUserId()).isEqualTo(expectedUser);
226+
assertThat(event.getEventType()).isEqualTo(TaskHistoryEventType.REROUTED.getName());
227+
}
228+
229+
class TaskRoutingProviderForDomainA implements TaskRoutingProvider {
230+
231+
@Override
232+
public void initialize(TaskanaEngine taskanaEngine) {}
233+
234+
@Override
235+
public String determineWorkbasketId(Task task) {
236+
if ("DOMAIN_A".equals(task.getDomain())) {
237+
return domainBWorkbasketSummary.getId();
238+
} else if ("DOMAIN_B".equals(task.getDomain())) {
239+
return domainAWorkbasketSummary.getId();
240+
}
241+
return null;
242+
}
243+
}
244+
}

0 commit comments

Comments
 (0)