From b66e4d9f862a14fc740e1c25c00e80e81c74abe9 Mon Sep 17 00:00:00 2001 From: Mustapha Zorgati <15628173+mustaphazorgati@users.noreply.github.com> Date: Wed, 19 May 2021 12:19:42 +0200 Subject: [PATCH] TSK-1642: now setting details attribute for TaskTransferHistoryEvent --- .../util/ObjectAttributeChangeDetector.java | 2 +- .../taskana/common/internal/util/Pair.java | 2 +- .../taskana/common/internal/util/Triplet.java | 6 +- ...eateHistoryEventOnTaskTransferAccTest.java | 173 ++++++++++----- .../api/events/task/TaskTransferredEvent.java | 11 +- .../pro/taskana/task/internal/TaskMapper.java | 5 +- .../task/internal/TaskServiceImpl.java | 18 +- .../task/internal/TaskTransferrer.java | 204 +++++++++-------- .../task/internal/models/TaskSummaryImpl.java | 2 +- .../acceptance/task/QueryTasksAccTest.java | 33 ++- .../acceptance/task/TransferTaskAccTest.java | 208 +++++++----------- 11 files changed, 355 insertions(+), 309 deletions(-) diff --git a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/ObjectAttributeChangeDetector.java b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/ObjectAttributeChangeDetector.java index 2ee632b82..ff3889ecd 100644 --- a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/ObjectAttributeChangeDetector.java +++ b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/ObjectAttributeChangeDetector.java @@ -57,7 +57,7 @@ public class ObjectAttributeChangeDetector { .peek(field -> field.setAccessible(true)) .map( CheckedFunction.wrap( - field -> new Triplet<>(field, field.get(oldObject), field.get(newObject)))) + field -> Triplet.of(field, field.get(oldObject), field.get(newObject)))) .filter(areFieldsNotEqual.and(isFieldNotCustomAttributes)) .map( fieldAndValuePairTriplet -> { diff --git a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/Pair.java b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/Pair.java index d2c1d15df..453edf248 100644 --- a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/Pair.java +++ b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/Pair.java @@ -8,7 +8,7 @@ public final class Pair { private final R right; - public Pair(L left, R right) { + private Pair(L left, R right) { this.left = left; this.right = right; } diff --git a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/Triplet.java b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/Triplet.java index 9556e8343..c6736b339 100644 --- a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/Triplet.java +++ b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/Triplet.java @@ -6,12 +6,16 @@ public class Triplet { private final M middle; private final R right; - public Triplet(L left, M middle, R right) { + private Triplet(L left, M middle, R right) { this.left = left; this.middle = middle; this.right = right; } + public static Triplet of(L left, M middle, R right) { + return new Triplet<>(left, middle, right); + } + public L getLeft() { return left; } diff --git a/history/taskana-simplehistory-provider/src/test/java/acceptance/events/task/CreateHistoryEventOnTaskTransferAccTest.java b/history/taskana-simplehistory-provider/src/test/java/acceptance/events/task/CreateHistoryEventOnTaskTransferAccTest.java index a000b8f9c..475ce54d4 100644 --- a/history/taskana-simplehistory-provider/src/test/java/acceptance/events/task/CreateHistoryEventOnTaskTransferAccTest.java +++ b/history/taskana-simplehistory-provider/src/test/java/acceptance/events/task/CreateHistoryEventOnTaskTransferAccTest.java @@ -1,13 +1,20 @@ package acceptance.events.task; import static org.assertj.core.api.Assertions.assertThat; +import static pro.taskana.common.internal.util.CheckedConsumer.wrap; import acceptance.AbstractAccTest; -import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.Test; +import java.util.function.Consumer; +import java.util.stream.Stream; +import org.json.JSONArray; +import org.json.JSONObject; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.function.ThrowingConsumer; +import pro.taskana.common.internal.util.Triplet; import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.WithAccessId; import pro.taskana.simplehistory.impl.SimpleHistoryServiceImpl; @@ -16,6 +23,8 @@ import pro.taskana.simplehistory.impl.task.TaskHistoryQueryMapper; import pro.taskana.spi.history.api.events.task.TaskHistoryEvent; import pro.taskana.spi.history.api.events.task.TaskHistoryEventType; import pro.taskana.task.api.TaskService; +import pro.taskana.workbasket.api.WorkbasketService; +import pro.taskana.workbasket.api.models.Workbasket; @ExtendWith(JaasExtension.class) class CreateHistoryEventOnTaskTransferAccTest extends AbstractAccTest { @@ -24,76 +33,140 @@ class CreateHistoryEventOnTaskTransferAccTest extends AbstractAccTest { private final SimpleHistoryServiceImpl historyService = getHistoryService(); @WithAccessId(user = "admin") - @Test - void should_CreateTransferredHistoryEvent_When_TaskIstransferred() throws Exception { + @TestFactory + Stream should_CreateTransferredHistoryEvent_When_TaskIsTransferred() { + List>> testCases = + List.of( + Triplet.of( + "Using WorkbasketId", + "TKI:000000000000000000000000000000000003", + wrap( + (String taskId) -> + taskService.transfer(taskId, "WBI:100000000000000000000000000000000006"))), + Triplet.of( + "Using WorkbasketKey and Domain", + "TKI:000000000000000000000000000000000004", + wrap((String taskId) -> taskService.transfer(taskId, "USER-1-1", "DOMAIN_A")))); - final String taskId = "TKI:000000000000000000000000000000000003"; + ThrowingConsumer>> test = + t -> { + String taskId = t.getMiddle(); + Consumer transferMethod = t.getRight(); - TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper(); + TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper(); - List events = - taskHistoryQueryMapper.queryHistoryEvents( - (TaskHistoryQueryImpl) historyService.createTaskHistoryQuery().taskIdIn(taskId)); + List events = + taskHistoryQueryMapper.queryHistoryEvents( + (TaskHistoryQueryImpl) historyService.createTaskHistoryQuery().taskIdIn(taskId)); - assertThat(events).isEmpty(); + assertThat(events).isEmpty(); - taskService.transfer(taskId, "WBI:100000000000000000000000000000000006"); + transferMethod.accept(taskId); - events = - taskHistoryQueryMapper.queryHistoryEvents( - (TaskHistoryQueryImpl) historyService.createTaskHistoryQuery().taskIdIn(taskId)); + events = + taskHistoryQueryMapper.queryHistoryEvents( + (TaskHistoryQueryImpl) historyService.createTaskHistoryQuery().taskIdIn(taskId)); - assertThat(events).hasSize(1); + assertThat(events).hasSize(1); + assertTransferHistoryEvent( + events.get(0).getId(), + "WBI:100000000000000000000000000000000001", + "WBI:100000000000000000000000000000000006", + "admin"); + }; - String eventType = events.get(0).getEventType(); - - assertThat(eventType).isEqualTo(TaskHistoryEventType.TRANSFERRED.getName()); + return DynamicTest.stream(testCases.iterator(), Triplet::getLeft, test); } @WithAccessId(user = "admin") - @Test - void should_CreateTransferredHistoryEvents_When_TaskBulkTransfer() throws Exception { + @TestFactory + Stream should_CreateTransferredHistoryEvents_When_TaskBulkTransfer() { + List, Consumer>>> testCases = + List.of( + Triplet.of( + "Using WorkbasketId", + List.of( + "TKI:000000000000000000000000000000000021", + "TKI:000000000000000000000000000000000022"), + wrap( + (List taskIds) -> + taskService.transferTasks( + "WBI:100000000000000000000000000000000007", taskIds))), + Triplet.of( + "Using WorkbasketKey and Domain", + List.of( + "TKI:000000000000000000000000000000000023", + "TKI:000000000000000000000000000000000024"), + wrap( + (List taskIds) -> + taskService.transferTasks("USER-1-2", "DOMAIN_A", taskIds)))); - final String taskId = "TKI:000000000000000000000000000000000004"; - final String taskId2 = "TKI:000000000000000000000000000000000002"; + ThrowingConsumer, Consumer>>> test = + t -> { + List taskIds = t.getMiddle(); + Consumer> transferMethod = t.getRight(); - final String destinationWorkbasketKey = "WBI:100000000000000000000000000000000007"; + TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper(); - List taskIds = new ArrayList<>(); + List events = + taskHistoryQueryMapper.queryHistoryEvents( + (TaskHistoryQueryImpl) + historyService + .createTaskHistoryQuery() + .taskIdIn(taskIds.toArray(new String[0]))); - taskIds.add(taskId); - taskIds.add(taskId2); + assertThat(events).isEmpty(); - TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper(); + transferMethod.accept(taskIds); - List events = - taskHistoryQueryMapper.queryHistoryEvents( - (TaskHistoryQueryImpl) - historyService.createTaskHistoryQuery().taskIdIn(taskIds.toArray(new String[0]))); + events = + taskHistoryQueryMapper.queryHistoryEvents( + (TaskHistoryQueryImpl) + historyService + .createTaskHistoryQuery() + .taskIdIn(taskIds.toArray(new String[0]))); - assertThat(events).isEmpty(); + assertThat(events) + .extracting(TaskHistoryEvent::getTaskId) + .containsExactlyInAnyOrderElementsOf(taskIds); - taskService.transferTasks(destinationWorkbasketKey, taskIds); - events = - taskHistoryQueryMapper.queryHistoryEvents( - (TaskHistoryQueryImpl) - historyService - .createTaskHistoryQuery() - .taskIdIn(taskIds.stream().toArray(String[]::new))); + for (TaskHistoryEvent event : events) { + assertTransferHistoryEvent( + event.getId(), + "WBI:100000000000000000000000000000000001", + "WBI:100000000000000000000000000000000007", + "admin"); + } + }; - assertThat(events).hasSize(2); + return DynamicTest.stream(testCases.iterator(), Triplet::getLeft, test); + } - assertThat(events) - .extracting(TaskHistoryEvent::getEventType) - .containsOnly(TaskHistoryEventType.TRANSFERRED.getName()); + private void assertTransferHistoryEvent( + String eventId, String expectedOldValue, String expectedNewValue, String expectedUser) + throws Exception { + TaskHistoryEvent event = historyService.getTaskHistoryEvent(eventId); + assertThat(event.getDetails()).isNotNull(); + JSONArray changes = new JSONObject(event.getDetails()).getJSONArray("changes"); - assertThat(events) - .extracting(TaskHistoryEvent::getOldValue) - .containsExactlyInAnyOrder( - "WBI:100000000000000000000000000000000006", "WBI:100000000000000000000000000000000001"); + assertThat(changes.length()).isPositive(); + for (int i = 0; i < changes.length(); i++) { + JSONObject change = changes.getJSONObject(i); + if (change.get("fieldName").equals("workbasketSummary")) { + String oldWorkbasketStr = (String) change.get("oldValue"); + String newWorkbasketStr = (String) change.get("newValue"); + WorkbasketService workbasketService = taskanaEngine.getWorkbasketService(); + Workbasket oldWorkbasket = workbasketService.getWorkbasket(expectedOldValue); + assertThat(oldWorkbasket.asSummary()).hasToString(oldWorkbasketStr); + Workbasket newWorkbasket = workbasketService.getWorkbasket(expectedNewValue); + assertThat(newWorkbasket.asSummary()).hasToString(newWorkbasketStr); + } + } - assertThat(events) - .extracting(TaskHistoryEvent::getNewValue) - .containsOnly("WBI:100000000000000000000000000000000007"); + assertThat(event.getId()).startsWith("THI:"); + assertThat(event.getOldValue()).isEqualTo(expectedOldValue); + assertThat(event.getNewValue()).isEqualTo(expectedNewValue); + assertThat(event.getUserId()).isEqualTo(expectedUser); + assertThat(event.getEventType()).isEqualTo(TaskHistoryEventType.TRANSFERRED.getName()); } } diff --git a/lib/taskana-core/src/main/java/pro/taskana/spi/history/api/events/task/TaskTransferredEvent.java b/lib/taskana-core/src/main/java/pro/taskana/spi/history/api/events/task/TaskTransferredEvent.java index 1b426e263..40dc7226f 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/spi/history/api/events/task/TaskTransferredEvent.java +++ b/lib/taskana-core/src/main/java/pro/taskana/spi/history/api/events/task/TaskTransferredEvent.java @@ -1,13 +1,18 @@ package pro.taskana.spi.history.api.events.task; -import pro.taskana.task.api.models.Task; +import pro.taskana.task.api.models.TaskSummary; /** Event fired if a task is transferred. */ public class TaskTransferredEvent extends TaskHistoryEvent { public TaskTransferredEvent( - String id, Task task, String oldWorkbasketId, String newWorkbasketId, String userId) { - super(id, task, userId, null); + String id, + TaskSummary task, + String oldWorkbasketId, + String newWorkbasketId, + String userId, + String details) { + super(id, task, userId, details); eventType = TaskHistoryEventType.TRANSFERRED.getName(); created = task.getModified(); this.oldValue = oldWorkbasketId; diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskMapper.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskMapper.java index 34f0feae4..d784a8b4a 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskMapper.java @@ -3,6 +3,7 @@ package pro.taskana.task.internal; import java.time.Instant; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Options; @@ -18,7 +19,6 @@ import pro.taskana.task.api.CallbackState; import pro.taskana.task.api.models.TaskSummary; import pro.taskana.task.internal.models.MinimalTaskSummary; import pro.taskana.task.internal.models.TaskImpl; -import pro.taskana.task.internal.models.TaskSummaryImpl; /** This class is the mybatis mapping of task. */ @SuppressWarnings("checkstyle:LineLength") @@ -146,8 +146,7 @@ public interface TaskMapper { + " WHERE ID IN #{taskId}" + "") void updateTransfered( - @Param("taskIds") List taskIds, - @Param("referencetask") TaskSummaryImpl referencetask); + @Param("taskIds") Set taskIds, @Param("referencetask") TaskImpl referencetask); @Update( "