/* * Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com] * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.ks.idnadrev.task.create; import de.ks.LauncherRunner; import de.ks.activity.ActivityCfg; import de.ks.activity.ActivityController; import de.ks.activity.context.ActivityStore; import de.ks.idnadrev.ActivityTest; import de.ks.idnadrev.entity.*; import de.ks.persistence.PersistentWork; import de.ks.text.AsciiDocEditor; import de.ks.util.FXPlatform; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import javax.inject.Inject; import javax.persistence.EntityManager; import java.time.DayOfWeek; import java.time.Duration; import java.time.LocalDate; import java.time.LocalTime; import java.util.List; import java.util.function.Consumer; import static org.junit.Assert.*; @RunWith(LauncherRunner.class) public class CreateTaskTest extends ActivityTest { @Inject ActivityController activityController; @Inject ActivityStore store; private MainTaskInfo controller; private CreateTask createTask; private AsciiDocEditor expectedOutcomeEditor; private EffortInfo effortInfo; private TaskSchedule taskSchedule; @Override protected Class<? extends ActivityCfg> getActivityClass() { return CreateTaskActivity.class; } @Override protected void createTestData(EntityManager em) { em.persist(new Context("context")); } @Before public void setUp() throws Exception { createTask = activityController.<CreateTask>getCurrentController(); controller = createTask.mainInfoController; effortInfo = activityController.getControllerInstance(EffortInfo.class); taskSchedule = activityController.getControllerInstance(TaskSchedule.class); expectedOutcomeEditor = createTask.expectedOutcomeController.expectedOutcome; } @Test public void testTaskFromThought() throws Exception { Thought bla = new Thought("Bla").setDescription("description"); PersistentWork.persist(bla); @SuppressWarnings("unchecked") CreateTaskDS datasource = (CreateTaskDS) store.getDatasource(); datasource.fromThought = bla; activityController.reload(); activityController.waitForTasks(); FXPlatform.waitForFX(); assertEquals("Bla", controller.name.getText()); assertEquals("description", controller.description.getText()); activityController.save(); activityController.waitForTasks(); assertNull(datasource.fromThought); assertEquals(0, PersistentWork.from(Thought.class).size()); } @Test public void testProjectFromThought() throws Exception { Thought bla = new Thought("Bla").setDescription("description"); PersistentWork.persist(bla); @SuppressWarnings("unchecked") CreateTaskDS datasource = (CreateTaskDS) store.getDatasource(); datasource.fromThought = bla; activityController.reload(); activityController.waitForTasks(); FXPlatform.waitForFX(); assertEquals("Bla", controller.name.getText()); assertEquals("description", controller.description.getText()); FXPlatform.invokeLater(() -> controller.project.setSelected(true)); FXPlatform.invokeLater(() -> createTask.save()); activityController.waitForTasks(); assertEquals(CreateTaskActivity.class.getSimpleName(), activityController.getCurrentActivityId()); FXPlatform.invokeLater(() -> controller.name.setText("a real action")); FXPlatform.invokeLater(() -> createTask.save()); activityController.waitForTasks(); assertNull(datasource.fromThought); assertEquals(0, PersistentWork.from(Thought.class).size()); assertEquals(2, PersistentWork.count(Task.class)); } @Test public void testPersist() throws InterruptedException { FXPlatform.invokeLater(() -> { controller.name.setText("name"); controller.description.setText("description"); controller.contextController.getInput().setText("context"); controller.estimatedTimeDuration.setText("15min"); controller.state.setValue(TaskState.ASAP); effortInfo.funFactor.valueProperty().set(3); effortInfo.mentalEffort.valueProperty().set(5); effortInfo.physicalEffort.valueProperty().set(3); taskSchedule.dueDate.setValue(LocalDate.now()); taskSchedule.dueTime.setText("11:35"); expectedOutcomeEditor.setText("outcome123"); }); Thread.sleep(150); activityController.waitForTasks(); FXPlatform.waitForFX(); FXPlatform.invokeLater(() -> { createTask.save(); }); activityController.waitForTasks(); List<Task> tasks = PersistentWork.from(Task.class, (t) -> { t.getContext().getName(); if (t.getSchedule() != null) { t.getSchedule().getScheduledDate(); } }); assertEquals(1, tasks.size()); Task task = tasks.get(0); assertEquals("name", task.getName()); assertEquals(TaskState.ASAP, task.getState()); assertEquals("description", task.getDescription()); assertNotNull(task.getContext()); assertEquals("context", task.getContext().getName()); assertEquals(3, task.getPhysicalEffort().getAmount()); assertEquals(3, task.getFunFactor().getAmount()); assertEquals(5, task.getMentalEffort().getAmount()); assertEquals("outcome123", task.getOutcome().getExpectedOutcome()); assertNotNull(task.getSchedule()); assertEquals(LocalTime.of(11, 35), task.getSchedule().getScheduledTime()); assertEquals(LocalDate.now(), task.getSchedule().getScheduledDate()); Duration estimatedTime = task.getEstimatedTime(); assertNotNull(estimatedTime); assertEquals(Duration.ofMinutes(15), estimatedTime); } @Test public void testPersistProposedWeek() throws InterruptedException { FXPlatform.invokeLater(() -> { controller.name.setText("name"); taskSchedule.proposedWeek.setValue(LocalDate.of(2014, 1, 3)); taskSchedule.useProposedWeekDay.setSelected(true); }); activityController.waitForTasks(); FXPlatform.waitForFX(); FXPlatform.invokeLater(() -> { createTask.save(); }); activityController.waitForTasks(); List<Task> tasks = PersistentWork.from(Task.class, (t) -> { if (t.getSchedule() != null) { t.getSchedule().getScheduledDate(); } }); assertEquals(1, tasks.size()); Task task = tasks.get(0); assertEquals("name", task.getName()); assertNotNull(task.getSchedule()); assertEquals(1, task.getSchedule().getProposedWeek()); assertEquals(DayOfWeek.FRIDAY, task.getSchedule().getProposedWeekDay()); } @Test public void testSaveProject() throws InterruptedException { createTask("name", controller -> controller.project.setSelected(true)); List<Task> tasks = PersistentWork.from(Task.class); assertEquals(1, tasks.size()); Task task = tasks.get(0); assertEquals("name", task.getName()); assertTrue(task.isProject()); } protected void createTask(String name, Consumer<MainTaskInfo> consumer) throws InterruptedException { FXPlatform.waitForFX(); activityController.waitForDataSource(); FXPlatform.invokeLater(() -> { controller.name.setText(name); consumer.accept(controller); }); Thread.sleep(150); activityController.waitForTasks(); FXPlatform.waitForFX(); FXPlatform.invokeLater(() -> { createTask.save(); }); activityController.waitForDataSource(); } @Test public void testSaveWithParentProject() throws InterruptedException { createTask("parent", controller -> controller.project.setSelected(true)); createTask("child", controller -> controller.parentProjectController.getInput().setText("parent")); PersistentWork.wrap(() -> { List<Task> tasks = PersistentWork.from(Task.class); assertEquals(2, tasks.size()); for (Task task : tasks) { if (task.getName().equals("parent")) { assertTrue(task.isProject()); assertEquals(1, task.getChildren().size()); assertNull(task.getParent()); } else { assertFalse(task.isProject()); assertEquals(0, task.getChildren().size()); assertNotNull(task.getParent()); } } }); } @Test public void testTags() throws Exception { PersistentWork.persist(new Tag("tag1")); FXPlatform.invokeLater(() -> { controller.name.setText("name"); controller.tagAddController.getInput().setText("tag1"); controller.tagAddController.getOnAction().handle(null); }); activityController.getExecutorService().waitForAllTasksDone(); FXPlatform.invokeLater(() -> { controller.tagAddController.getInput().setText("tag2"); controller.tagAddController.getOnAction().handle(null); }); activityController.getExecutorService().waitForAllTasksDone(); FXPlatform.invokeLater(() -> { createTask.save(); }); activityController.waitForTasks(); List<Task> tasks = PersistentWork.from(Task.class, (t) -> { t.getTags().toString(); }); Task task = tasks.get(0); assertEquals(2, task.getTags().size()); } @Test public void testEditExisting() throws Exception { Task bla = new Task("Bla").setDescription("description"); PersistentWork.persist(bla); @SuppressWarnings("unchecked") CreateTaskDS datasource = (CreateTaskDS) store.getDatasource(); datasource.fromTask = bla; activityController.reload(); activityController.waitForTasks(); FXPlatform.waitForFX(); assertEquals("Bla", controller.name.getText()); assertEquals("description", controller.description.getText()); FXPlatform.invokeLater(() -> controller.name.setText("blubb")); FXPlatform.invokeLater(() -> controller.description.setText("hallo")); FXPlatform.waitForFX(); activityController.save(); activityController.waitForTasks(); assertNull(datasource.fromTask); List<Task> tasks = PersistentWork.from(Task.class); assertEquals(1, tasks.size()); assertEquals("hallo", tasks.get(0).getDescription()); assertEquals("blubb", tasks.get(0).getName()); } }