diff options
6 files changed, 208 insertions, 6 deletions
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDBDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDBDAO.java index 66045a5..65933bd 100644 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDBDAO.java +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDBDAO.java @@ -6,6 +6,7 @@ import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundExceptio import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager; import java.sql.PreparedStatement; + import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; @@ -30,7 +31,7 @@ public class VehicleDBDAO implements VehicleDAO { String name = ""; int id = -1; try { - p1 = jdbcConnectionManager.getConnection().prepareStatement(query1); + p1 = jdbcConnectionManager.getConnection().prepareStatement(query1,PreparedStatement.RETURN_GENERATED_KEYS); p1.setString(1, name); p1.setString(2, vehicle.constructionType().name()); if (vehicle.type() == VehicleType.KTW_B) { @@ -39,12 +40,14 @@ public class VehicleDBDAO implements VehicleDAO { p1.setString(3, vehicle.type().name()); } p1.executeUpdate(); - query1 = "UPDATE VehicleVersion SET name=? WHERE id=?"; - try (ResultSet keyResultSet = p1.getGeneratedKeys()) { - if (keyResultSet.next()) { - id = keyResultSet.getInt(1); - } + + + ResultSet keyResultSet = p1.getGeneratedKeys(); + + if (keyResultSet.next()) { + id = keyResultSet.getInt(1); } + name = vehicle.type().name() + "-" + id; } catch (SQLException e) { @@ -58,6 +61,7 @@ public class VehicleDBDAO implements VehicleDAO { } } try { + query1 = "UPDATE VehicleVersion SET name=? WHERE id=?"; p3 = jdbcConnectionManager.getConnection().prepareStatement(query1); p3.setString(1, name); p3.setInt(2, id); diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uicontroller/CreateCarController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uicontroller/CreateCarController.java index 721cf6d..f826837 100644 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uicontroller/CreateCarController.java +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uicontroller/CreateCarController.java @@ -2,6 +2,7 @@ package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.uicontroller; import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle; import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status; import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType; import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService; import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException; @@ -74,6 +75,8 @@ public class CreateCarController { Vehicle.builder() .constructionType(parseConstructionType()) .type(parseType()) + .name("") + .status(Status.ABGEMELDET) .hasNef(cbx_NEF.isSelected()) .build(); try { diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/CarAddApp.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/CarAddApp.java new file mode 100644 index 0000000..eac5e07 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/CarAddApp.java @@ -0,0 +1,49 @@ +package at.ac.tuwien.sepm.assignment.groupphase; + +import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader; +import java.lang.invoke.MethodHandles; +import javafx.application.Application; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.stereotype.Component; + +@Component +@ComponentScan("at.ac.tuwien.sepm.assignment.groupphase") +public class CarAddApp extends Application { + + private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + public static AnnotationConfigApplicationContext context; + @Override + public void start(Stage primaryStage) throws Exception { + // setup application + primaryStage.setTitle("Fahrzeug anlegen"); + primaryStage.setWidth(1366); + primaryStage.setHeight(768); + primaryStage.centerOnScreen(); + primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated")); + context = new AnnotationConfigApplicationContext(CarAddApp.class); + final var fxmlLoader = context.getBean(SpringFXMLLoader.class); + primaryStage.setScene( + new Scene( + (Parent) + fxmlLoader.load( + getClass() + .getResourceAsStream( + "/controller/createCar.fxml")))); + // show application + primaryStage.show(); + primaryStage.toFront(); + LOG.debug("Application startup complete"); + } + + @Override + public void stop() { + LOG.debug("Stopping application"); + context.close(); + } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/CarAddContTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/CarAddContTest.java new file mode 100644 index 0000000..a4c7d07 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/CarAddContTest.java @@ -0,0 +1,92 @@ +package at.ac.tuwien.sepm.assignment.groupphase; + + + + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService; +import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javafx.scene.control.DialogPane; +import javafx.scene.input.MouseButton; +import javafx.stage.Modality; +import javafx.stage.Stage; +import javafx.stage.Window; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.testfx.api.FxToolkit; +import org.testfx.robot.Motion; + +public class CarAddContTest extends HighDpiAwareApplicationTest{ + private VehicleService vehicleService; + @Before + public void setup() throws Exception { + // TODO: check if testfx can be run in headless mode on Jenkins + FxToolkit.registerPrimaryStage(); + FxToolkit.setupApplication(CarAddApp.class); + vehicleService = CarAddApp.context.getBean(VehicleService.class); + } + @After + public void cleanup() throws Exception { + FxToolkit.cleanupStages(); + } + @Test + public void testClickAddValidEmployee() throws InvalidVehicleException, ServiceException { + when(vehicleService.add(any())).thenReturn(1L); + //clickOn("#cmb_Ctype", Motion.DIRECT, MouseButton.PRIMARY); + + + clickOn("#btn_create", Motion.DIRECT, MouseButton.PRIMARY); + Stage alertDialog = getTopModalStage(); + Assert.assertNotNull(alertDialog); + DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); + Assert.assertEquals("Erfolgreich angelegt", dialogPane.getHeaderText()); + } + @Test + public void testClickAddInvalidEmployee() + throws InvalidVehicleException, ServiceException { + when(vehicleService.add(any())).thenThrow(InvalidEmployeeException.class); + moveTo("#inputName"); + clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY); + Stage alertDialog = getTopModalStage(); + Assert.assertNotNull(alertDialog); + DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); + Assert.assertEquals("Ungültige Eingabe", dialogPane.getHeaderText()); + } + @Test + public void testClickAddEmployeeWithPersistenceException() + throws InvalidVehicleException, ServiceException{ + when(vehicleService.add(any())).thenThrow(PersistenceException.class); + clickOn("#inputName", Motion.DIRECT, MouseButton.PRIMARY); + write("Test"); + clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY); + Stage alertDialog = getTopModalStage(); + Assert.assertNotNull(alertDialog); + DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); + Assert.assertEquals("Speicherfehler", dialogPane.getHeaderText()); + } + private Stage getTopModalStage() { + List<Window> allWindows = new ArrayList<>(robotContext().getWindowFinder().listWindows()); + Collections.reverse(allWindows); + return (Stage) + allWindows + .stream() + .filter(window -> window instanceof Stage) + .filter( + window -> + ((Stage) window).getModality() + == Modality.APPLICATION_MODAL) + .findFirst() + .orElse(null); + } + +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/HighDpiAwareApplicationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/HighDpiAwareApplicationTest.java new file mode 100644 index 0000000..b9b0605 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/HighDpiAwareApplicationTest.java @@ -0,0 +1,24 @@ +package at.ac.tuwien.sepm.assignment.groupphase; + + +import javafx.geometry.Bounds; +import javafx.scene.Node; +import org.testfx.api.FxRobotContext; +import org.testfx.framework.junit.ApplicationTest; +import org.testfx.service.locator.impl.BoundsLocatorImpl; +import org.testfx.service.locator.impl.PointLocatorImpl; + +public class HighDpiAwareApplicationTest extends ApplicationTest { + public HighDpiAwareApplicationTest() { + FxRobotContext context = robotContext(); + context.setBoundsLocator( + new BoundsLocatorImpl() { + @Override + public Bounds boundsOnScreenFor(Node node) { + Bounds bounds = super.boundsOnScreenFor(node); + return ScaledBounds.wrap(bounds); + } + }); + robotContext().setPointLocator(new PointLocatorImpl(context.getBoundsLocator())); + } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/ScaledBounds.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/ScaledBounds.java new file mode 100644 index 0000000..adf029e --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/ScaledBounds.java @@ -0,0 +1,30 @@ +package at.ac.tuwien.sepm.assignment.groupphase; + +import java.awt.GraphicsEnvironment; +import javafx.geometry.BoundingBox; +import javafx.geometry.Bounds; + +public class ScaledBounds extends BoundingBox { + private static final double scale; + static { + scale = + 1 + / GraphicsEnvironment.getLocalGraphicsEnvironment() + .getDefaultScreenDevice() + .getDefaultConfiguration() + .getDefaultTransform() + .getScaleX(); + } + public static ScaledBounds wrap(Bounds bounds) { + return new ScaledBounds(bounds); + } + private ScaledBounds(Bounds wrapped) { + super( + wrapped.getMinX() * scale, + wrapped.getMinY() * scale, + wrapped.getMinZ() * scale, + wrapped.getWidth() * scale, + wrapped.getHeight() * scale, + wrapped.getDepth()); + } +} |