TSK-1967: make owner of Task updatable when Task is 'READY_FOR_REVIEW'

This commit is contained in:
Norman Schmidt 2022-10-18 16:08:38 +02:00 committed by Mustapha Zorgati
parent b9b49f47a1
commit dc9e2e1d5f
4 changed files with 174 additions and 111 deletions

View File

@ -43,6 +43,7 @@ INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000100', 'ETI:0000000
INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000101', 'ETI:000000000000000000000000000000000101', RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(2) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000101' , 'DOC_0000000000000000101' , 'user-1-2' , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , 'el' , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 );
INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000102', 'ETI:000000000000000000000000000000000102', RELATIVE_DATE(-2) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-2) , RELATIVE_DATE(2) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000102' , 'DOC_0000000000000000102' , 'user-1-2' , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 );
INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000103', 'ETI:000000000000000000000000000000000103', RELATIVE_DATE(-2) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(3) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000103' , 'DOC_0000000000000000103' , 'user-1-2' , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 );
INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000104', 'ETI:000000000000000000000000000000000104', RELATIVE_DATE(-2) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(3) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'READY_FOR_REVIEW', 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000103' , 'DOC_0000000000000000103' , null , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 );
-- Tasks for DeleteTaskAccTest
INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000036', 'ETI:000000000000000000000000000000000036', RELATIVE_DATE(0) , RELATIVE_DATE(0) , RELATIVE_DATE(0) , RELATIVE_DATE(0) , null , RELATIVE_DATE(0) , RELATIVE_DATE(0) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'COMPLETED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000036' , 'DOC_0000000000000000036' , 'user-1-2' , '00' , 'PASystem' , '00' , 'SDNR' , '00011122' , true , false , null , 'NONE' , null , null , null , null , null , 'ew' , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 );
INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000037', 'ETI:000000000000000000000000000000000037', RELATIVE_DATE(0) , RELATIVE_DATE(0) , RELATIVE_DATE(0) , RELATIVE_DATE(0) , null , RELATIVE_DATE(0) , RELATIVE_DATE(0) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'COMPLETED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000037' , 'DOC_0000000000000000037' , 'user-1-2' , '00' , 'PASystem' , '00' , 'SDNR' , '00011122' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 );

View File

@ -804,7 +804,7 @@ public class TaskServiceImpl implements TaskService {
getMinimalTaskSummaries(taskIds);
bulkLog.addAllErrors(existingAndAuthorizedTasks.getRight());
Pair<List<String>, BulkLog> taskIdsToUpdate =
filterOutTasksWhichAreNotReady(existingAndAuthorizedTasks.getLeft());
filterOutTasksWhichAreInInvalidState(existingAndAuthorizedTasks.getLeft());
bulkLog.addAllErrors(taskIdsToUpdate.getRight());
if (!taskIdsToUpdate.getLeft().isEmpty()) {
@ -1032,17 +1032,20 @@ public class TaskServiceImpl implements TaskService {
.collect(Collectors.toList());
}
private Pair<List<String>, BulkLog> filterOutTasksWhichAreNotReady(
private Pair<List<String>, BulkLog> filterOutTasksWhichAreInInvalidState(
Collection<MinimalTaskSummary> minimalTaskSummaries) {
List<String> filteredTasks = new ArrayList<>(minimalTaskSummaries.size());
BulkLog bulkLog = new BulkLog();
for (MinimalTaskSummary taskSummary : minimalTaskSummaries) {
if (taskSummary.getTaskState() != TaskState.READY) {
if (!taskSummary.getTaskState().in(TaskState.READY, TaskState.READY_FOR_REVIEW)) {
bulkLog.addError(
taskSummary.getTaskId(),
new InvalidTaskStateException(
taskSummary.getTaskId(), taskSummary.getTaskState(), TaskState.READY));
taskSummary.getTaskId(),
taskSummary.getTaskState(),
TaskState.READY,
TaskState.READY_FOR_REVIEW));
} else {
filteredTasks.add(taskSummary.getTaskId());
}
@ -2013,11 +2016,11 @@ public class TaskServiceImpl implements TaskService {
newTaskImpl1.setBusinessProcessId(oldTaskImpl.getBusinessProcessId());
}
// owner can only be changed if task is in state ready
// owner can only be changed if task is either in state ready or ready_for_review
boolean isOwnerChanged = !Objects.equals(newTaskImpl1.getOwner(), oldTaskImpl.getOwner());
if (isOwnerChanged && oldTaskImpl.getState() != TaskState.READY) {
if (isOwnerChanged && !oldTaskImpl.getState().in(TaskState.READY, TaskState.READY_FOR_REVIEW)) {
throw new InvalidTaskStateException(
oldTaskImpl.getId(), oldTaskImpl.getState(), TaskState.READY);
oldTaskImpl.getId(), oldTaskImpl.getState(), TaskState.READY, TaskState.READY_FOR_REVIEW);
}
}

View File

@ -33,14 +33,14 @@ class SetOwnerAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-2")
@Test
void testSetOwnerAndSubsequentClaimSucceeds() throws Exception {
void testSetOwnerOfReadyTaskAndSubsequentClaimSucceeds() throws Exception {
TaskService taskService = taskanaEngine.getTaskService();
String taskReadyId = "TKI:000000000000000000000000000000000025";
Task taskReady = taskService.getTask(taskReadyId);
assertThat(taskReady.getState()).isEqualTo(TaskState.READY);
assertThat(taskReady.getOwner()).isNull();
String anyUserName = "TestUser27";
assertThat(taskReady.getOwner()).isNotEqualTo(anyUserName);
Task modifiedTaskReady = setOwner(taskReadyId, anyUserName);
assertThat(modifiedTaskReady.getState()).isEqualTo(TaskState.READY);
@ -50,6 +50,25 @@ class SetOwnerAccTest extends AbstractAccTest {
assertThat(taskClaimed.getOwner()).isEqualTo("user-1-2");
}
@WithAccessId(user = "user-1-2")
@Test
void testSetOwnerOfReadyForReviewTaskAndSubsequentClaimSucceeds() throws Exception {
TaskService taskService = taskanaEngine.getTaskService();
String taskReadyForReviewId = "TKI:100000000000000000000000000000000025";
Task taskReady = taskService.getTask(taskReadyForReviewId);
assertThat(taskReady.getState()).isEqualTo(TaskState.READY_FOR_REVIEW);
String anyUserName = "TestUser28";
assertThat(taskReady.getOwner()).isNotEqualTo(anyUserName);
Task modifiedTaskReady = setOwner(taskReadyForReviewId, anyUserName);
assertThat(modifiedTaskReady.getState()).isEqualTo(TaskState.READY_FOR_REVIEW);
assertThat(modifiedTaskReady.getOwner()).isEqualTo(anyUserName);
Task taskClaimed = taskService.claim(taskReadyForReviewId);
assertThat(taskClaimed.getState()).isEqualTo(TaskState.IN_REVIEW);
assertThat(taskClaimed.getOwner()).isEqualTo("user-1-2");
}
@WithAccessId(user = "user-1-2")
@Test
void testSetOwnerViaUpdateTaskNotAuthorized() {
@ -95,6 +114,18 @@ class SetOwnerAccTest extends AbstractAccTest {
.isInstanceOf(MismatchedWorkbasketPermissionException.class);
}
@WithAccessId(user = "user-1-2")
@Test
void testSetOwnerOfReadyAndReadyForReviewTasks() {
List<String> taskIds =
List.of(
"TKI:000000000000000000000000000000000033", "TKI:500000000000000000000000000000000028");
BulkOperationResults<String, TaskanaException> results =
taskanaEngine.getTaskService().setOwnerOfTasks("someUser", taskIds);
assertThat(results.containsErrors()).isFalse();
}
@WithAccessId(user = "user-b-2")
@Test
void testSetOwnerOfTasksWithDuplicatesSucceeds() {
@ -177,10 +208,10 @@ class SetOwnerAccTest extends AbstractAccTest {
c -> c.getClass() == MismatchedWorkbasketPermissionException.class,
"MismatchedWorkbasketPermissionException");
assertThat(results.getErrorMap())
.hasSize(97)
.hasSize(95)
.extractingFromEntries(Entry::getValue)
.hasOnlyElementsOfTypes(InvalidTaskStateException.class, NotAuthorizedException.class)
.areExactly(37, invalidTaskStateException)
.areExactly(35, invalidTaskStateException)
.areExactly(60, mismatchedWorkbasketPermissionException);
}
@ -196,7 +227,7 @@ class SetOwnerAccTest extends AbstractAccTest {
assertThat(allTaskSummaries).hasSize(99);
assertThat(results.containsErrors()).isTrue();
assertThat(results.getErrorMap())
.hasSize(51)
.hasSize(49)
.extractingFromEntries(Entry::getValue)
.hasOnlyElementsOfType(InvalidStateException.class);
}

View File

@ -84,6 +84,34 @@ class TaskControllerIntTest {
sampleDataGenerator.generateSampleData();
}
@Test
void should_UpdateTaskOwnerOfReadyForReviewTask() {
final String url = restHelper.toUrl("/api/v1/tasks/TKI:000000000000000000000000000000000104");
HttpEntity<Object> auth = new HttpEntity<>(RestHelper.generateHeadersForUser("user-1-2"));
// retrieve task from Rest Api
ResponseEntity<TaskRepresentationModel> responseGet =
TEMPLATE.exchange(url, HttpMethod.GET, auth, TASK_MODEL_TYPE);
assertThat(responseGet.getBody()).isNotNull();
TaskRepresentationModel theTaskRepresentationModel = responseGet.getBody();
assertThat(theTaskRepresentationModel.getState()).isEqualTo(TaskState.READY_FOR_REVIEW);
assertThat(theTaskRepresentationModel.getOwner()).isNull();
// set Owner and update Task
theTaskRepresentationModel.setOwner("dummyUser");
HttpEntity<TaskRepresentationModel> auth2 =
new HttpEntity<>(theTaskRepresentationModel, RestHelper.generateHeadersForUser("user-1-2"));
ResponseEntity<TaskRepresentationModel> responseUpdate =
TEMPLATE.exchange(url, HttpMethod.PUT, auth2, TASK_MODEL_TYPE);
assertThat(responseUpdate.getBody()).isNotNull();
TaskRepresentationModel theUpdatedTaskRepresentationModel = responseUpdate.getBody();
assertThat(theUpdatedTaskRepresentationModel.getState()).isEqualTo(TaskState.READY_FOR_REVIEW);
assertThat(theUpdatedTaskRepresentationModel.getOwner()).isEqualTo("dummyUser");
}
private TaskRepresentationModel getTaskResourceSample() {
ClassificationSummaryRepresentationModel classificationResource =
new ClassificationSummaryRepresentationModel();
@ -130,7 +158,7 @@ class TaskControllerIntTest {
assertThat(response.getBody()).isNotNull();
assertThat((response.getBody()).getLink(IanaLinkRelations.SELF)).isNotNull();
assertThat(response.getBody().getContent()).hasSize(60);
assertThat(response.getBody().getContent()).hasSize(61);
}
@Test
@ -830,7 +858,7 @@ class TaskControllerIntTest {
assertThat(response.getBody()).isNotNull();
assertThat((response.getBody()).getLink(IanaLinkRelations.SELF)).isNotNull();
assertThat(response.getBody().getContent()).hasSize(21);
assertThat(response.getBody().getContent()).hasSize(22);
}
@Test
@ -874,7 +902,7 @@ class TaskControllerIntTest {
assertThat(response.getBody()).isNotNull();
assertThat((response.getBody()).getLink(IanaLinkRelations.SELF)).isNotNull();
assertThat(response.getBody().getContent()).hasSize(91);
assertThat(response.getBody().getContent()).hasSize(92);
}
@Test
@ -950,7 +978,7 @@ class TaskControllerIntTest {
TEMPLATE.exchange(url, HttpMethod.GET, auth, TASK_SUMMARY_PAGE_MODEL_TYPE);
assertThat(response.getBody()).isNotNull();
assertThat((response.getBody()).getContent()).hasSize(60);
assertThat((response.getBody()).getContent()).hasSize(61);
String url2 =
restHelper.toUrl(RestEndpoints.URL_TASKS)
@ -960,9 +988,9 @@ class TaskControllerIntTest {
assertThat(response.getBody()).isNotNull();
assertThat((response.getBody()).getContent()).hasSize(5);
assertThat(response.getBody().getRequiredLink(IanaLinkRelations.LAST).getHref())
.contains("page=12");
.contains("page=13");
assertThat(response.getBody().getContent().iterator().next().getTaskId())
.isEqualTo("TKI:000000000000000000000000000000000073");
.isEqualTo("TKI:000000000000000000000000000000000072");
assertThat(response.getBody().getLink(IanaLinkRelations.SELF)).isNotNull();
assertThat(response.getBody().getRequiredLink(IanaLinkRelations.SELF).getHref())
.endsWith("/api/v1/tasks?sort-by=DUE&order=DESCENDING&page-size=5&page=5");
@ -1025,7 +1053,7 @@ class TaskControllerIntTest {
assertThat(response.getBody()).isNotNull();
assertThat((response.getBody()).getLink(IanaLinkRelations.SELF)).isNotNull();
assertThat(response.getBody().getContent()).hasSize(84);
assertThat(response.getBody().getContent()).hasSize(85);
}
@Test