package de.ks.idnadrev.task.view; import de.ks.Condition; import de.ks.LauncherRunner; import de.ks.activity.ActivityCfg; import de.ks.idnadrev.ActivityTest; import de.ks.idnadrev.entity.Task; import de.ks.idnadrev.entity.WorkUnit; import de.ks.persistence.PersistentWork; import de.ks.util.FXPlatform; import de.ks.validation.ValidationRegistry; import javafx.collections.ObservableList; import org.hamcrest.Matchers; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import javax.inject.Inject; import javax.persistence.EntityManager; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Comparator; import java.util.List; import static org.junit.Assert.*; @RunWith(LauncherRunner.class) public class WorkUnitControllerTest extends ActivityTest { private LocalDateTime start1; private LocalDateTime end1; private LocalDateTime start2; private LocalDateTime end2; private WorkUnitController controller; @Inject ValidationRegistry validation; @Override protected Class<? extends ActivityCfg> getActivityClass() { return ViewTasksActvity.class; } @Override protected void createTestData(EntityManager em) { Task task = new Task("task"); LocalDateTime time = LocalDateTime.of(2014, 10, 1, 8, 0); start1 = time.minusDays(1); end1 = start1.plusHours(1); start2 = time.minusHours(1); end2 = time.minusMinutes(1); WorkUnit workUnit1 = new WorkUnit(task).setStart(start1).setEnd(end1); WorkUnit workUnit2 = new WorkUnit(task).setStart(start2).setEnd(end2); task.getWorkUnits().add(workUnit1); task.getWorkUnits().add(workUnit2); em.persist(task); } @Before public void setUp() throws Exception { controller = activityController.getControllerInstance(WorkUnitController.class); FXPlatform.invokeLater(() -> controller.setTask(PersistentWork.from(Task.class).get(0))); } @Test public void testWorkunitView() throws Exception { ObservableList<WorkUnit> items = controller.workUnitTable.getItems(); assertEquals(2, items.size()); assertEquals(start1, items.get(0).getStart()); assertEquals(start2, items.get(1).getStart()); } @Test public void testWorkUnitEditing() throws Exception { FXPlatform.invokeLater(() -> controller.workUnitTable.getSelectionModel().select(0)); assertNotNull(controller.start.getText()); assertThat(controller.start.getText(), Matchers.containsString(String.valueOf(start1.getHour()))); assertNotNull(controller.end.getText()); assertThat(controller.end.getText(), Matchers.containsString(String.valueOf(end1.getHour()))); assertEquals(start1.toLocalDate(), controller.date.getValue()); FXPlatform.invokeLater(() -> { controller.end.setText(controller.hoursMinutesFormatter.format(end1.plusMinutes(1))); controller.onEdit(); }); activityController.waitForDataSource(); List<WorkUnit> from = PersistentWork.from(WorkUnit.class); from.sort(Comparator.comparing(u -> u.getStart())); assertEquals(end1.plusMinutes(1), from.get(0).getEnd()); } @Test public void testWorkUnitCreation() throws Exception { FXPlatform.invokeLater(() -> controller.workUnitTable.getSelectionModel().select(0)); assertEquals(start1.toLocalDate(), controller.date.getValue()); FXPlatform.invokeLater(() -> { controller.date.setValue(controller.date.getValue().minusDays(7)); controller.onCreateNew(); }); activityController.waitForDataSource(); FXPlatform.waitForFX(); List<WorkUnit> from = PersistentWork.from(WorkUnit.class); assertEquals(3, from.size()); } @Test public void testValidation() throws Exception { FXPlatform.invokeLater(() -> controller.workUnitTable.getSelectionModel().select(0)); FXPlatform.invokeLater(() -> controller.start.setText("bla")); FXPlatform.waitForFX(); Condition.waitFor1s("should be disabled ", () -> controller.edit.isDisabled()); FXPlatform.invokeLater(() -> { controller.start.setText("11:30"); controller.end.setText("blubb"); }); FXPlatform.waitForFX(); assertTrue(controller.edit.isDisabled()); FXPlatform.invokeLater(() -> { controller.start.setText("11:30"); controller.end.setText("11:25"); }); FXPlatform.waitForFX(); assertTrue(controller.edit.isDisabled()); FXPlatform.invokeLater(() -> { controller.start.setText("11:30"); controller.end.setText("11:35"); }); FXPlatform.waitForFX(); assertFalse(controller.edit.isDisabled()); } @Test public void testNewStartTimePossible() throws Exception { WorkUnit workunit1 = new WorkUnit(null).setStart(LocalDateTime.of(2014, 10, 1, 12, 00, 13, 10)).setEnd(LocalDateTime.of(2014, 10, 1, 12, 13)); WorkUnit workunit2 = new WorkUnit(null).setStart(LocalDateTime.of(2014, 10, 1, 13, 00)).setEnd(LocalDateTime.of(2014, 10, 1, 14, 00)); List<WorkUnit> workUnits = Arrays.asList(workunit1, workunit2); LocalDateTime time = LocalDateTime.of(2014, 10, 1, 12, 0); assertFalse(controller.checkNewStartTimePossible(time, time.plusMinutes(1), workUnits)); time = LocalDateTime.of(2014, 10, 1, 12, 13); assertFalse(controller.checkNewStartTimePossible(time, time.plusMinutes(1), workUnits)); time = LocalDateTime.of(2014, 10, 1, 13, 13); assertFalse(controller.checkNewStartTimePossible(time, time.plusMinutes(1), workUnits)); time = LocalDateTime.of(2014, 10, 1, 12, 14); assertTrue(controller.checkNewStartTimePossible(time, time.plusMinutes(1), workUnits)); time = LocalDateTime.of(2014, 10, 1, 12, 59); assertFalse(controller.checkNewStartTimePossible(time, time.plusHours(2), workUnits)); } @Test public void testWorkUnitDelete() throws Exception { assertTrue(controller.delete.isDisabled()); FXPlatform.invokeLater(() -> controller.workUnitTable.getSelectionModel().select(0)); assertFalse(controller.delete.isDisabled()); FXPlatform.invokeLater(() -> controller.onDelete()); activityController.waitForDataSource(); List<WorkUnit> workUnits = PersistentWork.from(WorkUnit.class); assertEquals(1, workUnits.size()); Condition.waitFor1s(() -> controller.workUnitTable.getItems(), Matchers.hasSize(1)); } }