From c92959c3fe2d82be997d54581139c8c9ee7e946b Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 4 May 2018 15:30:58 +0200 Subject: UI Tests --- .../sepm/assignment/groupphase/CarAddApp.java | 49 ++++++++++++ .../sepm/assignment/groupphase/CarAddContTest.java | 92 ++++++++++++++++++++++ .../groupphase/HighDpiAwareApplicationTest.java | 24 ++++++ .../sepm/assignment/groupphase/ScaledBounds.java | 30 +++++++ 4 files changed, 195 insertions(+) create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/CarAddApp.java create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/CarAddContTest.java create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/HighDpiAwareApplicationTest.java create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/ScaledBounds.java (limited to 'src/test/java/at') 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 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()); + } +} -- cgit v1.2.3-70-g09d2