package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao; import static org.junit.Assert.assertEquals; import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException; import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Severity; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType; import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase; import java.time.Instant; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.LinkedList; import java.util.Set; import java.util.TimeZone; import org.dbunit.dataset.DataSetException; import org.dbunit.dataset.IDataSet; import org.junit.BeforeClass; import org.junit.Test; public class OperationDAOTest extends JdbcTestCase { private static final String[] COMPARE_TABLES = new String[] {"VehicleOperation", "Operation", "Vehicle", "VehicleVersion"}; private final OperationDAO operationDAO; private final Operation o; private final Operation originalOperation; public OperationDAOTest() throws PersistenceException { // TODO: fix once everything properly uses dependency injection EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager()); RegistrationDatabaseDAO registrationDatabaseDAO = new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO); VehicleDAO vehicleDAO = new VehicleDatabaseDAO(getJdbcConnectionManager(), registrationDatabaseDAO); this.operationDAO = new OperationDatabaseDAO( getJdbcConnectionManager(), vehicleDAO, registrationDatabaseDAO); 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.ofEpochSecond(1514764800)) // 2018-01-01 00:00:00.0 .destination("New destination") .additionalInfo("New information") .build(); Vehicle vehicle = Vehicle.builder() .id(4) .name("BKTW-4") .constructionType(ConstructionType.HOCHDACH) .type(VehicleType.BKTW) .hasNef(false) .status(Vehicle.Status.ZUM_BERUFUNGSORT) .registrations(new LinkedList<>()) .build(); originalOperation = Operation.builder() .id(1) .opCode("ALP-95E7") .severity(Severity.E) .created(Instant.parse("2000-01-01T00:00:00.0Z")) .destination("Wiedner Hauptstraße 35, Wien") .additionalInfo("Additional information") .status(Status.ACTIVE) .vehicles(Set.of(vehicle)) .build(); } @BeforeClass public static void before() { TimeZone.setDefault(TimeZone.getTimeZone("UTC")); } @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); } @Test public void testListOperations() throws Exception { Set operationSet = operationDAO.list(EnumSet.allOf(Status.class)); assertEquals(Set.of(originalOperation), operationSet); } @Test public void testGetOperations() throws Exception { Operation gotOperation = operationDAO.get(originalOperation.id()); assertEquals(originalOperation, gotOperation); } @Test public void testAddOperation() throws Exception { long id = operationDAO.add(o); assertEquals(2, id); compareWith("operationDAOAddOperation.xml", COMPARE_TABLES); } @Test(expected = PersistenceException.class) public void testAddFaultyOperation() throws PersistenceException { Vehicle vehicle = Vehicle.builder() .status(Vehicle.Status.FREI_FUNK) .constructionType(ConstructionType.HOCHDACH) .name("BKTW_123") .hasNef(true) .type(VehicleType.BKTW) .build(); Operation operation = Operation.builder() .status(Status.ACTIVE) .opCode(String.valueOf(Arrays.stream(new int[200]).map(i -> 'a'))) .created(Instant.now()) .destination("Wiedner Hauptstraße 35, Wien") .additionalInfo("HTU Wien") .severity(Severity.B) .vehicles(Set.of(vehicle)) .build(); operationDAO.add(operation); } @Test(expected = PersistenceException.class) public void testAddFaultyOperation2() throws PersistenceException { Vehicle vehicle = Vehicle.builder() .status(Vehicle.Status.FREI_FUNK) .constructionType(ConstructionType.HOCHDACH) .name("BKTW_123") .hasNef(true) .type(VehicleType.BKTW) .build(); Operation operation = Operation.builder() .status(Status.ACTIVE) .opCode("ALP-95E7") .created(Instant.now()) .destination( "Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien ") .additionalInfo("HTU Wien") .severity(Severity.B) .vehicles(Set.of(vehicle)) .build(); operationDAO.add(operation); } }