diff options
| author | Martin <martin.weick@outlook.com> | 2018-05-04 15:30:58 +0200 | 
|---|---|---|
| committer | Tharre <tharre3@gmail.com> | 2018-05-04 20:37:04 +0200 | 
| commit | c92959c3fe2d82be997d54581139c8c9ee7e946b (patch) | |
| tree | 2aea6d5af7961b44f12d8d671efaee5408d545fb /src/test | |
| parent | a62919d43debaa0c6baf32de9658740dc929cba6 (diff) | |
| download | sepm-groupproject-c92959c3fe2d82be997d54581139c8c9ee7e946b.tar.gz sepm-groupproject-c92959c3fe2d82be997d54581139c8c9ee7e946b.tar.xz sepm-groupproject-c92959c3fe2d82be997d54581139c8c9ee7e946b.zip  | |
UI Tests
Diffstat (limited to 'src/test')
4 files changed, 195 insertions, 0 deletions
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()); +    } +}  | 
