TSK-1261: test data for task creation's due and planned date calculation is now more robust and test don't fail based on todays date anymore
This commit is contained in:
parent
d4a516863e
commit
7f88472b9a
|
@ -1,20 +1,16 @@
|
|||
package acceptance.task;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
import acceptance.AbstractAccTest;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
import org.apache.ibatis.session.Configuration;
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
|
||||
import org.assertj.core.data.TemporalUnitWithinOffset;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestTemplate;
|
||||
|
@ -22,7 +18,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
|
|||
|
||||
import pro.taskana.classification.api.ClassificationService;
|
||||
import pro.taskana.classification.api.exceptions.ClassificationNotFoundException;
|
||||
import pro.taskana.classification.api.models.Classification;
|
||||
import pro.taskana.common.api.exceptions.InvalidArgumentException;
|
||||
import pro.taskana.common.api.exceptions.NotAuthorizedException;
|
||||
import pro.taskana.common.internal.TaskanaEngineProxyForTest;
|
||||
|
@ -54,11 +49,13 @@ class CreateTaskAccTest extends AbstractAccTest {
|
|||
|
||||
private TaskService taskService;
|
||||
private ClassificationService classificationService;
|
||||
private WorkingDaysToDaysConverter converter;
|
||||
|
||||
@BeforeEach
|
||||
void setup() {
|
||||
taskService = taskanaEngine.getTaskService();
|
||||
classificationService = taskanaEngine.getClassificationService();
|
||||
converter = WorkingDaysToDaysConverter.initialize();
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
|
@ -151,83 +148,6 @@ class CreateTaskAccTest extends AbstractAccTest {
|
|||
assertThat(createdTask.getCreator()).isEqualTo(CurrentUserContext.getUserid());
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void testCreateTaskWithPlanned()
|
||||
throws NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException,
|
||||
WorkbasketNotFoundException, TaskAlreadyExistException {
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", "DOMAIN_A");
|
||||
Instant instantPlanned = Instant.now().plus(2, ChronoUnit.HOURS);
|
||||
newTask.setClassificationKey("T2100");
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
newTask.setOwner("user_1_1");
|
||||
newTask.setPlanned(instantPlanned);
|
||||
Task createdTask = taskService.createTask(newTask);
|
||||
|
||||
assertThat(createdTask).isNotNull();
|
||||
assertThat(createdTask.getPlanned()).isEqualTo(instantPlanned);
|
||||
assertThat(createdTask.getCreated()).isBefore(createdTask.getPlanned());
|
||||
|
||||
// verify that planned takes place 2 hours after creation (+- 5 seconds)
|
||||
Instant plannedAdjusted = createdTask.getPlanned().minus(2, ChronoUnit.HOURS);
|
||||
assertThat(plannedAdjusted)
|
||||
.isCloseTo(createdTask.getCreated(), new TemporalUnitWithinOffset(5L, ChronoUnit.SECONDS));
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void testCreateTaskWithInvalidPlannedAndDue() {
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", "DOMAIN_A");
|
||||
Instant instantPlanned = Instant.now().plus(2, ChronoUnit.HOURS);
|
||||
newTask.setClassificationKey("T2100");
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
newTask.setOwner("user_1_1");
|
||||
|
||||
newTask.setPlanned(instantPlanned);
|
||||
newTask.setDue(instantPlanned); // due date not according to service level
|
||||
ThrowingCallable call =
|
||||
() -> {
|
||||
taskService.createTask(newTask);
|
||||
};
|
||||
assertThatThrownBy(call).isInstanceOf(InvalidArgumentException.class);
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void testCreateTaskWithValidPlannedAndDue()
|
||||
throws ClassificationNotFoundException, InvalidArgumentException {
|
||||
|
||||
Classification classification = classificationService.getClassification("T2100", "DOMAIN_A");
|
||||
long serviceLevelDays = Duration.parse(classification.getServiceLevel()).toDays();
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", "DOMAIN_A");
|
||||
Instant instantPlanned = Instant.now();
|
||||
newTask.setClassificationKey(classification.getKey());
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
newTask.setOwner("user_1_1");
|
||||
|
||||
WorkingDaysToDaysConverter converter = WorkingDaysToDaysConverter.initialize();
|
||||
// TODO: this is a temporal bug fix because we did not define what happens when a task is
|
||||
// planned on the weekend.
|
||||
long i = converter.convertWorkingDaysToDays(instantPlanned, 0);
|
||||
newTask.setPlanned(instantPlanned.plus(Duration.ofDays(i)));
|
||||
// due date according to service level
|
||||
long calendarDays = converter.convertWorkingDaysToDays(newTask.getPlanned(), serviceLevelDays);
|
||||
Instant shouldBeDueDate = newTask.getPlanned().plus(Duration.ofDays(calendarDays));
|
||||
|
||||
newTask.setDue(shouldBeDueDate);
|
||||
ThrowingCallable call =
|
||||
() -> {
|
||||
taskService.createTask(newTask);
|
||||
};
|
||||
assertThatCode(call).doesNotThrowAnyException();
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void testIdempotencyOfTaskCreation()
|
||||
|
@ -477,74 +397,6 @@ class CreateTaskAccTest extends AbstractAccTest {
|
|||
assertThat(readTask.getAttachments().get(0).getObjectReference()).isNotNull();
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void testCalculationOfDueDateAtCreate()
|
||||
throws NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException,
|
||||
WorkbasketNotFoundException, TaskAlreadyExistException, TaskNotFoundException {
|
||||
|
||||
// SL P16D
|
||||
Classification classification = classificationService.getClassification("L110105", "DOMAIN_A");
|
||||
long serviceLevelDays = Duration.parse(classification.getServiceLevel()).toDays();
|
||||
assertThat(serviceLevelDays > 5).isTrue();
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", classification.getDomain());
|
||||
newTask.setClassificationKey(classification.getKey());
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
|
||||
Instant planned = getInstant("2020-05-25T07:00:00");
|
||||
newTask.setPlanned(planned);
|
||||
Task createdTask = taskService.createTask(newTask);
|
||||
assertThat(createdTask.getId()).isNotNull();
|
||||
|
||||
Task readTask = taskService.getTask(createdTask.getId());
|
||||
assertThat(readTask).isNotNull();
|
||||
assertThat(readTask.getPlanned()).isEqualTo(planned);
|
||||
|
||||
long calendarDays =
|
||||
WorkingDaysToDaysConverter.initialize()
|
||||
.convertWorkingDaysToDays(readTask.getPlanned(), serviceLevelDays);
|
||||
|
||||
Instant shouldBeDueDate = readTask.getPlanned().plus(Duration.ofDays(calendarDays));
|
||||
assertThat(shouldBeDueDate).isEqualTo(readTask.getDue());
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void testCalculationOfPlannedDateAtCreate()
|
||||
throws NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException,
|
||||
WorkbasketNotFoundException, TaskAlreadyExistException, TaskNotFoundException {
|
||||
|
||||
// SL P16D
|
||||
Classification classification = classificationService.getClassification("L110105", "DOMAIN_A");
|
||||
long serviceLevelDays = Duration.parse(classification.getServiceLevel()).toDays();
|
||||
assertThat(serviceLevelDays > 5).isTrue();
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", classification.getDomain());
|
||||
newTask.setClassificationKey(classification.getKey());
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
|
||||
Instant due = Instant.now().plus(40, ChronoUnit.DAYS);
|
||||
newTask.setDue(due);
|
||||
Task createdTask = taskService.createTask(newTask);
|
||||
assertThat(createdTask.getId()).isNotNull();
|
||||
|
||||
Task readTask = taskService.getTask(createdTask.getId());
|
||||
assertThat(readTask).isNotNull();
|
||||
assertThat(readTask.getDue()).isEqualTo(due);
|
||||
|
||||
long calendarDaysToSubstract =
|
||||
WorkingDaysToDaysConverter.initialize().convertWorkingDaysToDays(due, -serviceLevelDays);
|
||||
|
||||
assertThat(calendarDaysToSubstract < 0).isTrue();
|
||||
assertThat(calendarDaysToSubstract <= -serviceLevelDays).isTrue();
|
||||
|
||||
Instant shouldBePlannedDate = due.plus(Duration.ofDays(calendarDaysToSubstract));
|
||||
assertThat(shouldBePlannedDate).isEqualTo(readTask.getPlanned());
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void testPrioDurationOfTaskFromAttachmentsAtCreate()
|
||||
|
@ -599,7 +451,6 @@ class CreateTaskAccTest extends AbstractAccTest {
|
|||
|
||||
assertThat(readTask.getPriority()).isEqualTo(99);
|
||||
|
||||
WorkingDaysToDaysConverter converter = WorkingDaysToDaysConverter.initialize(Instant.now());
|
||||
long calendarDays = converter.convertWorkingDaysToDays(readTask.getPlanned(), 1);
|
||||
|
||||
assertThat(readTask.getPlanned().plus(Duration.ofDays(calendarDays)))
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package acceptance.task;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
import static org.assertj.core.util.IterableUtil.toArray;
|
||||
|
||||
|
@ -12,10 +13,14 @@ import java.util.ArrayList;
|
|||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
|
||||
import org.assertj.core.data.TemporalUnitWithinOffset;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
|
||||
import pro.taskana.classification.api.ClassificationService;
|
||||
import pro.taskana.classification.api.exceptions.ClassificationNotFoundException;
|
||||
import pro.taskana.classification.api.models.Classification;
|
||||
import pro.taskana.common.api.BulkOperationResults;
|
||||
import pro.taskana.common.api.exceptions.ConcurrencyException;
|
||||
import pro.taskana.common.api.exceptions.InvalidArgumentException;
|
||||
|
@ -27,8 +32,10 @@ import pro.taskana.common.internal.util.WorkingDaysToDaysConverter;
|
|||
import pro.taskana.task.api.TaskService;
|
||||
import pro.taskana.task.api.exceptions.AttachmentPersistenceException;
|
||||
import pro.taskana.task.api.exceptions.InvalidStateException;
|
||||
import pro.taskana.task.api.exceptions.TaskAlreadyExistException;
|
||||
import pro.taskana.task.api.exceptions.TaskNotFoundException;
|
||||
import pro.taskana.task.api.models.Task;
|
||||
import pro.taskana.workbasket.api.exceptions.WorkbasketNotFoundException;
|
||||
|
||||
/** Acceptance test for all "create task" scenarios. */
|
||||
@ExtendWith(JaasExtension.class)
|
||||
|
@ -36,13 +43,161 @@ import pro.taskana.task.api.models.Task;
|
|||
public class ServiceLevelPriorityAccTest extends AbstractAccTest {
|
||||
|
||||
private TaskService taskService;
|
||||
private ClassificationService classificationService;
|
||||
private WorkingDaysToDaysConverter converter;
|
||||
|
||||
ServiceLevelPriorityAccTest() {
|
||||
super();
|
||||
WorkingDaysToDaysConverter.setGermanPublicHolidaysEnabled(true);
|
||||
taskService = taskanaEngine.getTaskService();
|
||||
classificationService = taskanaEngine.getClassificationService();
|
||||
converter = WorkingDaysToDaysConverter.initialize();
|
||||
}
|
||||
|
||||
/* CREATE TASK */
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void should_CalculatePlannedDateAtCreate()
|
||||
throws NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException,
|
||||
WorkbasketNotFoundException, TaskAlreadyExistException, TaskNotFoundException {
|
||||
|
||||
// P16D
|
||||
Classification classification = classificationService.getClassification("L110105", "DOMAIN_A");
|
||||
long serviceLevelDays = Duration.parse(classification.getServiceLevel()).toDays();
|
||||
assertThat(serviceLevelDays).isEqualTo(16);
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", classification.getDomain());
|
||||
newTask.setClassificationKey(classification.getKey());
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
|
||||
Instant due = moveBackToWorkingDay(Instant.now().plus(40, ChronoUnit.DAYS));
|
||||
newTask.setDue(due);
|
||||
Task createdTask = taskService.createTask(newTask);
|
||||
assertThat(createdTask.getId()).isNotNull();
|
||||
|
||||
Task readTask = taskService.getTask(createdTask.getId());
|
||||
assertThat(readTask).isNotNull();
|
||||
assertThat(readTask.getDue()).isEqualTo(due);
|
||||
|
||||
long calendarDaysToSubtract = converter.convertWorkingDaysToDays(due, -serviceLevelDays);
|
||||
|
||||
assertThat(calendarDaysToSubtract < 0).isTrue();
|
||||
assertThat(calendarDaysToSubtract <= serviceLevelDays).isTrue();
|
||||
|
||||
Instant expectedPlanned =
|
||||
moveBackToWorkingDay(due.plus(Duration.ofDays(calendarDaysToSubtract)));
|
||||
assertThat(expectedPlanned).isEqualTo(readTask.getPlanned());
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void should_calculateDueDateAtCreate()
|
||||
throws NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException,
|
||||
WorkbasketNotFoundException, TaskAlreadyExistException, TaskNotFoundException {
|
||||
|
||||
// P16D
|
||||
Classification classification = classificationService.getClassification("L110105", "DOMAIN_A");
|
||||
long serviceLevelDays = Duration.parse(classification.getServiceLevel()).toDays();
|
||||
assertThat(serviceLevelDays).isEqualTo(16);
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", classification.getDomain());
|
||||
newTask.setClassificationKey(classification.getKey());
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
|
||||
Instant planned = moveForwardToWorkingDay(Instant.now());
|
||||
newTask.setPlanned(planned);
|
||||
Task createdTask = taskService.createTask(newTask);
|
||||
assertThat(createdTask.getId()).isNotNull();
|
||||
|
||||
Task readTask = taskService.getTask(createdTask.getId());
|
||||
assertThat(readTask).isNotNull();
|
||||
assertThat(readTask.getPlanned()).isEqualTo(planned);
|
||||
|
||||
long calendarDays = converter.convertWorkingDaysToDays(readTask.getPlanned(), serviceLevelDays);
|
||||
|
||||
Instant expectedDue =
|
||||
moveForwardToWorkingDay(readTask.getPlanned().plus(Duration.ofDays(calendarDays)));
|
||||
assertThat(expectedDue).isEqualTo(readTask.getDue());
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void should_NotThrowException_When_DueAndPlannedAreConsistent()
|
||||
throws ClassificationNotFoundException, InvalidArgumentException {
|
||||
|
||||
Classification classification = classificationService.getClassification("T2100", "DOMAIN_A");
|
||||
long duration = Duration.parse(classification.getServiceLevel()).toDays();
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", "DOMAIN_A");
|
||||
newTask.setPlanned(moveForwardToWorkingDay(Instant.now()));
|
||||
newTask.setClassificationKey(classification.getKey());
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
newTask.setOwner("user_1_1");
|
||||
|
||||
// due date according to service level
|
||||
long daysToDue = converter.convertWorkingDaysToDays(newTask.getPlanned(), duration);
|
||||
Instant expectedDue =
|
||||
moveForwardToWorkingDay(newTask.getPlanned().plus(Duration.ofDays(daysToDue)));
|
||||
|
||||
newTask.setDue(expectedDue);
|
||||
ThrowingCallable call =
|
||||
() -> {
|
||||
taskService.createTask(newTask);
|
||||
};
|
||||
assertThatCode(call).doesNotThrowAnyException();
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void should_ThrowException_When_DueAndPlannedAreInconsistent() {
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", "DOMAIN_A");
|
||||
Instant planned = moveForwardToWorkingDay(Instant.now().plus(2, ChronoUnit.HOURS));
|
||||
newTask.setClassificationKey("T2100"); // P10D
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
newTask.setOwner("user_1_1");
|
||||
|
||||
newTask.setPlanned(planned);
|
||||
newTask.setDue(planned); // due date not according to service level
|
||||
ThrowingCallable call =
|
||||
() -> {
|
||||
taskService.createTask(newTask);
|
||||
};
|
||||
assertThatThrownBy(call).isInstanceOf(InvalidArgumentException.class);
|
||||
}
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
void should_VerifyThatCreateAndPlannedAreClose()
|
||||
throws NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException,
|
||||
WorkbasketNotFoundException, TaskAlreadyExistException {
|
||||
|
||||
Task newTask = taskService.newTask("USER_1_1", "DOMAIN_A");
|
||||
Instant planned = moveForwardToWorkingDay(Instant.now().plus(2, ChronoUnit.HOURS));
|
||||
newTask.setClassificationKey("T2100");
|
||||
newTask.setPrimaryObjRef(
|
||||
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"));
|
||||
newTask.setOwner("user_1_1");
|
||||
newTask.setPlanned(planned);
|
||||
Task createdTask = taskService.createTask(newTask);
|
||||
|
||||
assertThat(createdTask).isNotNull();
|
||||
assertThat(createdTask.getPlanned()).isEqualTo(planned);
|
||||
assertThat(createdTask.getCreated()).isBefore(createdTask.getPlanned());
|
||||
|
||||
// verify that planned takes place 2 hours after creation (+- 5 seconds)
|
||||
Instant plannedAdjusted = createdTask.getPlanned().minus(2, ChronoUnit.HOURS);
|
||||
assertThat(plannedAdjusted)
|
||||
.isCloseTo(createdTask.getCreated(), new TemporalUnitWithinOffset(5L, ChronoUnit.SECONDS));
|
||||
}
|
||||
|
||||
/* UPDATE TASK */
|
||||
|
||||
@WithAccessId(user = "user_1_1", groups = "group_1")
|
||||
@Test
|
||||
public void should_ThrowException_When_DueAndPlannedAreChangedInconsistently() throws Exception {
|
||||
|
@ -500,4 +655,12 @@ public class ServiceLevelPriorityAccTest extends AbstractAccTest {
|
|||
assertThat(task.getDue()).isEqualTo(getInstant("2020-04-14T07:00:00")); // Tuesday
|
||||
assertThat(task.getPlanned()).isEqualTo(getInstant("2020-04-09T07:00:00")); // Thursday
|
||||
}
|
||||
|
||||
protected Instant moveForwardToWorkingDay(Instant date) {
|
||||
return converter.addWorkingDaysToInstant(date, Duration.ofDays(0));
|
||||
}
|
||||
|
||||
protected Instant moveBackToWorkingDay(Instant date) {
|
||||
return converter.subtractWorkingDaysFromInstant(date, Duration.ofDays(0));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue