From 9ca5b384b4143529a3c9bc80bff39dab635aee1c Mon Sep 17 00:00:00 2001
From: Tharre <tharre3@gmail.com>
Date: Sat, 12 May 2018 00:00:59 +0200
Subject: Implement requestVehicles() in service+DAO #25953

---
 .../einsatzverwaltung/dao/OperationDAOTest.java    |  81 ++++++++++
 .../service/OperationServiceComponentTest.java     |  16 +-
 .../service/OperationServiceTest.java              | 175 +++++++++++++++++++++
 .../service/OperationServiceUnitTest.java          |   5 +-
 4 files changed, 273 insertions(+), 4 deletions(-)
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceTest.java

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
new file mode 100644
index 0000000..726735d
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -0,0 +1,81 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import java.time.Instant;
+import java.util.Collections;
+import java.util.Set;
+import org.dbunit.dataset.DataSetException;
+import org.dbunit.dataset.IDataSet;
+import org.junit.Test;
+
+public class OperationDAOTest extends JdbcTestCase {
+
+    private static final String[] COMPARE_TABLES =
+            new String[] {"VehicleOperation", "Operation", "Vehicle", "VehicleVersion"};
+
+    private OperationDAO operationDAO;
+
+    private final Operation o;
+
+    public OperationDAOTest() {
+        this.operationDAO = new DBOperationDAO(getJdbcConnectionManager());
+
+        Vehicle v1 =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.RTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(true)
+                        .build();
+
+        Vehicle v2 = v1.toBuilder().id(2).build();
+        Vehicle v3 = v1.toBuilder().id(3).build();
+
+        o =
+                Operation.builder()
+                        .id(1)
+                        .opCode("RD-2B0M")
+                        .severity(Severity.B)
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(v1, v2, v3))
+                        .created(Instant.now())
+                        .destination("New description")
+                        .additionalInfo("Test")
+                        .build();
+    }
+
+    @Override
+    protected IDataSet getDataSet() throws DataSetException {
+        return getDataSet("operationDAOUpdateSetup.xml");
+    }
+
+    @Test
+    public void testUpdateNormal() throws Exception {
+        operationDAO.update(o);
+
+        compareWith("operationDAOUpdateNormal.xml", COMPARE_TABLES);
+    }
+
+    @Test(expected = ElementNotFoundException.class)
+    public void testUpdateMissing() throws Exception {
+        Operation op = o.toBuilder().id(73).build();
+
+        operationDAO.update(op);
+    }
+
+    @Test
+    public void testUpdateRemoveVehicles() throws Exception {
+        Operation op = o.toBuilder().vehicles(Collections.emptySet()).build();
+
+        operationDAO.update(op);
+
+        compareWith("operationDAOUpdateRemoveVehicles.xml", COMPARE_TABLES);
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceComponentTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceComponentTest.java
index 8e13d0e..9754b2d 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceComponentTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceComponentTest.java
@@ -5,6 +5,7 @@ import static org.hamcrest.CoreMatchers.is;
 
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.DBOperationDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDatabaseDao;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
@@ -21,9 +22,18 @@ import org.junit.Test;
 
 public class OperationServiceComponentTest {
 
-    private final OperationDAO operationDAO =
-            new DBOperationDAO(new JDBCConnectionManager("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"));
-    private final OperationService operationService = new OperationServiceImpl(operationDAO);
+    // TODO: dependency injection
+
+    private final JDBCConnectionManager jdbcConnectionManager =
+            new JDBCConnectionManager("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
+
+    private final OperationDAO operationDAO = new DBOperationDAO(jdbcConnectionManager);
+
+    private final VehicleDatabaseDao vehicleDatabaseDao =
+            new VehicleDatabaseDao(jdbcConnectionManager);
+
+    private final OperationService operationService =
+            new OperationServiceImpl(operationDAO, vehicleDatabaseDao);
 
     /*@Test
     public void testaddOperationTest() {
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceTest.java
new file mode 100644
index 0000000..70185d3
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceTest.java
@@ -0,0 +1,175 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
+
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import java.time.Instant;
+import java.util.Collections;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class OperationServiceTest {
+
+    @Mock private OperationDAO operationDAO;
+
+    @Mock private VehicleDAO vehicleDAO;
+
+    @InjectMocks private OperationServiceImpl operationService;
+
+    private Set<Vehicle> vehicles;
+    private Vehicle v1, v2, v3, v4, v5;
+
+    @Before
+    public void setUp() throws ElementNotFoundException, PersistenceException {
+        v1 =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.RTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(true)
+                        .build();
+
+        v2 =
+                Vehicle.builder()
+                        .id(2)
+                        .name("KTW-1")
+                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.KTW)
+                        .status(Vehicle.Status.FREI_WACHE)
+                        .hasNef(true)
+                        .build();
+
+        v3 =
+                Vehicle.builder()
+                        .id(3)
+                        .name("KTW-2")
+                        .constructionType(Vehicle.ConstructionType.MITTELHOCHDACH)
+                        .type(Vehicle.VehicleType.KTW_B)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(false)
+                        .build();
+
+        v4 =
+                Vehicle.builder()
+                        .id(4)
+                        .name("BKTW-2")
+                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.BKTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(false)
+                        .build();
+
+        v5 =
+                Vehicle.builder()
+                        .id(5)
+                        .name("NEF-1")
+                        .constructionType(Vehicle.ConstructionType.NORMAL)
+                        .type(Vehicle.VehicleType.NEF)
+                        .status(Vehicle.Status.FREI_WACHE)
+                        .hasNef(true)
+                        .build();
+
+        Vehicle v6 =
+                Vehicle.builder()
+                        .id(6)
+                        .name("NAH-1")
+                        .constructionType(Vehicle.ConstructionType.MITTELHOCHDACH)
+                        .type(Vehicle.VehicleType.NAH)
+                        .status(Vehicle.Status.ABGEMELDET)
+                        .hasNef(true)
+                        .build();
+
+        vehicles = Set.of(v1, v2, v3, v4, v5, v6);
+
+        Operation o =
+                Operation.builder()
+                        .id(1)
+                        .opCode("ALP-95E7")
+                        .severity(Severity.E)
+                        .status(Status.ACTIVE)
+                        .vehicles(Collections.singleton(v1))
+                        .created(Instant.now())
+                        .destination("Wiedner Hauptstraße 35, Wien")
+                        .build();
+
+        Operation o2 = o.toBuilder().status(Status.CANCELLED).build();
+
+        when(operationDAO.get(anyLong()))
+                .thenAnswer(
+                        ans -> {
+                            long arg = ans.getArgument(0);
+                            if (arg == 1L) return o;
+                            else if (arg == 5L) return o2;
+                            else throw new ElementNotFoundException("");
+                        });
+
+        when(vehicleDAO.get(anyLong()))
+                .thenAnswer(
+                        ans -> {
+                            int arg = ((Long) ans.getArgument(0)).intValue();
+                            return vehicles.stream()
+                                    .filter(v -> v.id() == arg)
+                                    .findFirst()
+                                    .orElseThrow(() -> new ElementNotFoundException(""));
+                        });
+    }
+
+    @Test
+    public void requestNormal() throws Exception {
+        Set<Long> vehicleIds = Set.of(2L, 3L, 4L, 5L);
+        operationService.requestVehicles(1, vehicleIds);
+
+        Operation result =
+                operationDAO.get(1).toBuilder().vehicles(Set.of(v1, v2, v3, v4, v5)).build();
+        verify(operationDAO, times(1)).update(result);
+        verify(operationDAO, times(0)).get(6L);
+    }
+
+    @Test
+    public void requestExistingVehicle() throws Exception {
+        operationService.requestVehicles(1, Set.of(1L));
+
+        Operation result = operationDAO.get(1);
+        verify(operationDAO, times(0)).update(result);
+    }
+
+    @Test(expected = InvalidVehicleException.class)
+    public void requestInvalidVehicle() throws Exception {
+        operationService.requestVehicles(1, Set.of(5L, 6L));
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void requestInvalidOperation() throws Exception {
+        operationService.requestVehicles(2, Set.of(1L));
+    }
+
+    @Test(expected = InvalidVehicleException.class)
+    public void requestInactiveVehicle() throws Exception {
+        operationService.requestVehicles(1, Set.of(6L));
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void requestInactiveOperation() throws Exception {
+        operationService.requestVehicles(5, Set.of(1L));
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceUnitTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceUnitTest.java
index 29a840b..7b574a1 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceUnitTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceUnitTest.java
@@ -7,6 +7,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
@@ -23,7 +24,9 @@ import org.junit.Test;
 
 public class OperationServiceUnitTest {
     private final OperationDAO operationDAO = mock(OperationDAO.class);
-    private final OperationService operationService = new OperationServiceImpl(operationDAO);
+    private final VehicleDAO vehicleDAO = mock(VehicleDAO.class);
+    private final OperationService operationService =
+            new OperationServiceImpl(operationDAO, vehicleDAO);
 
     @Test
     public void addOperationTest() {
-- 
cgit v1.2.3-70-g09d2