diff options
| author | Tharre <tharre3@gmail.com> | 2018-05-11 15:49:43 +0200 | 
|---|---|---|
| committer | Tharre <tharre3@gmail.com> | 2018-05-11 15:49:43 +0200 | 
| commit | f7d14a76123911f0bced08356a0c69e61147cb1b (patch) | |
| tree | a75b0baa891453a14046c78503603d21986126c5 /src/test/java/at/ac/tuwien/sepm/assignment | |
| parent | acd6b64e494192f7c73032240029bfa53dccb362 (diff) | |
| parent | 5298356db60cd971fed686d379130102843db819 (diff) | |
| download | sepm-groupproject-f7d14a76123911f0bced08356a0c69e61147cb1b.tar.gz sepm-groupproject-f7d14a76123911f0bced08356a0c69e61147cb1b.tar.xz sepm-groupproject-f7d14a76123911f0bced08356a0c69e61147cb1b.zip  | |
Merge branch 'develop'
Diffstat (limited to 'src/test/java/at/ac/tuwien/sepm/assignment')
18 files changed, 1661 insertions, 0 deletions
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowApplication.java new file mode 100644 index 0000000..3293ae9 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowApplication.java @@ -0,0 +1,53 @@ +package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; + +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 RegistrationWindowApplication 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("Person anlegen"); +        // primaryStage.setWidth(1366); +        // primaryStage.setHeight(768); +        primaryStage.centerOnScreen(); +        primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated")); + +        context = new AnnotationConfigApplicationContext(RegistrationWindowApplication.class); +        final var fxmlLoader = context.getBean(SpringFXMLLoader.class); +        primaryStage.setScene( +                new Scene( +                        (Parent) +                                fxmlLoader.load( +                                        getClass() +                                                .getResourceAsStream( +                                                        "/fxml/RegistrationWindow.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/einsatzverwaltung/dao/RegistrationDatabaseDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAOTest.java new file mode 100644 index 0000000..03059ff --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAOTest.java @@ -0,0 +1,168 @@ +package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao; + +import static org.junit.Assert.*; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration; +import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; +import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager; +import java.nio.charset.Charset; +import java.sql.SQLException; +import java.time.Instant; +import java.time.LocalDate; +import java.util.LinkedList; +import java.util.List; +import org.h2.tools.RunScript; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class RegistrationDatabaseDAOTest { + +    // Base taken from EmployeePersistenceTest + +    private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); +    private static final String JDBC_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; +    private static final String USER = ""; +    private static final String PASSWORD = ""; + +    private RegistrationDAO registrationDAO; + +    public RegistrationDatabaseDAOTest() throws PersistenceException { +        this.registrationDAO = new RegistrationDatabaseDAO(new JDBCConnectionManager(JDBC_URL)); +    } + +    @BeforeClass +    public static void setupDatabase() throws SQLException { +        RunScript.execute( +                JDBC_URL, +                USER, +                PASSWORD, +                "classpath:sql/database.sql", +                Charset.forName("UTF8"), +                false); +        RunScript.execute( +                JDBC_URL, +                USER, +                PASSWORD, +                "classpath:sql/H2RegistrationDAOTest_populate.sql", +                Charset.forName("UTF8"), +                false); +    } +    /* +        @Before +        public void setUp() throws SQLException { +            RunScript.execute( +                    JDBC_URL, +                    USER, +                    PASSWORD, +                    "classpath:sql/H2RegistrationDAOTest_populate.sql", +                    Charset.forName("UTF8"), +                    false); +        } +    */ +    @AfterClass +    public static void tearDown() throws SQLException { +        RunScript.execute( +                JDBC_URL, +                USER, +                PASSWORD, +                "classpath:sql/H2RegistrationDAOTest_depopulate.sql", +                Charset.forName("UTF8"), +                false); +    } + +    @Rule public ExpectedException thrown = ExpectedException.none(); + +    @Test +    public void addRegistrationsShouldSucceed() throws PersistenceException { +        List<Registration> registrations = new LinkedList<>(); +        /* +        Vehicle vehicle = Vehicle.builder() +                .id(1) +                .name("RTW-1") +                .constructionType(ConstructionType.HOCHDACH) +                .type(VehicleType.RTW) +                .status(Status.ABGEMELDET) +                .hasNef(true) +                .build(); +        */ +        Employee employee1 = +                Employee.builder() +                        .id(1) +                        .name("John Doe") +                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant +                        .educationLevel(EducationLevel.RS) +                        .isDriver(true) +                        .isPilot(true) +                        .build(); +        Employee employee2 = +                Employee.builder() +                        .id(2) +                        .name("Nick \"Kage\" Verily") +                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant +                        .educationLevel(EducationLevel.NKV) +                        .isDriver(true) +                        .isPilot(false) +                        .build(); +        Employee employee3 = +                Employee.builder() +                        .id(3) +                        .name("Nicht Arzt") +                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant +                        .educationLevel(EducationLevel.NA) +                        .isDriver(false) +                        .isPilot(false) +                        .build(); +        Registration registration1 = +                Registration.builder() +                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome +                        .end(Instant.now()) // same +                        .employee(employee1) +                        .build(); +        Registration registration2 = +                Registration.builder() +                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome +                        .end(Instant.now()) // same +                        .employee(employee2) +                        .build(); +        Registration registration3 = +                Registration.builder() +                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome +                        .end(Instant.now()) // same +                        .employee(employee3) +                        .build(); +        registrations.add(registration1); +        registrations.add(registration2); +        registrations.add(registration3); + +        List<Long> returnvalues = registrationDAO.add(1, registrations); +        assertFalse(returnvalues.isEmpty()); // can be improved... +    } + +    @Test +    public void addRegistrationToInexistentVehicleShouldFail() throws PersistenceException { +        thrown.expect(PersistenceException.class); +        List<Registration> registrations = new LinkedList<>(); +        Employee employee = +                Employee.builder() +                        .id(1) +                        .name("John Doe") +                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant +                        .educationLevel(EducationLevel.RS) +                        .isDriver(true) +                        .isPilot(true) +                        .build(); +        Registration registration = +                Registration.builder() +                        .start(Instant.MIN) +                        .end(Instant.MAX) +                        .employee(employee) +                        .build(); +        registrations.add(registration); +        registrationDAO.add(200, registrations); +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImplTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImplTest.java new file mode 100644 index 0000000..f3efbef --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImplTest.java @@ -0,0 +1,148 @@ +package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration; +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.exception.InvalidRegistrationException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; +import java.time.Instant; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +public class RegistrationServiceImplTest { + +    @Mock RegistrationDAO daoMock; + +    @Mock VehicleService vehicleService; + +    @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); + +    @Rule public ExpectedException thrown = ExpectedException.none(); + +    @Before +    public void setUp() throws ServiceException { +        MockitoAnnotations.initMocks(this); +        when(vehicleService.list(any())) +                .thenReturn( +                        Arrays.asList( +                                Vehicle.builder() +                                        .id(1) +                                        .name("RTW-1") +                                        .constructionType(ConstructionType.HOCHDACH) +                                        .status(Status.ABGEMELDET) +                                        .type(VehicleType.RTW) +                                        .hasNef(true) +                                        .build())); +    } + +    @Test +    public void addValidRegistrationsShouldSucceed() +            throws InvalidRegistrationException, ServiceException, InvalidVehicleException { +        RegistrationService registrationService = +                new RegistrationServiceImpl(daoMock, vehicleService); +        List<Registration> registrations = new LinkedList<>(); +        Vehicle vehicle = +                Vehicle.builder() +                        .id(1) +                        .name("RTW-1") +                        .constructionType(ConstructionType.HOCHDACH) +                        .type(VehicleType.RTW) +                        .status(Status.ABGEMELDET) +                        .hasNef(true) +                        .build(); +        Employee employee1 = +                Employee.builder() +                        .id(1) +                        .name("John Doe") +                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant +                        .educationLevel(EducationLevel.RS) +                        .isDriver(true) +                        .isPilot(true) +                        .build(); +        Employee employee2 = +                Employee.builder() +                        .id(2) +                        .name("Nick \"Kage\" Verily") +                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant +                        .educationLevel(EducationLevel.NKV) +                        .isDriver(true) +                        .isPilot(false) +                        .build(); +        Employee employee3 = +                Employee.builder() +                        .id(3) +                        .name("Nicht Arzt") +                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant +                        .educationLevel(EducationLevel.NA) +                        .isDriver(false) +                        .isPilot(false) +                        .build(); +        Instant start = Instant.now(); +        Instant end = start.plus(8, ChronoUnit.HOURS); +        Registration registration1 = +                Registration.builder().start(start).end(end).employee(employee1).build(); +        Registration registration2 = +                Registration.builder().start(start).end(end).employee(employee2).build(); +        Registration registration3 = +                Registration.builder().start(start).end(end).employee(employee3).build(); +        registrations.add(registration1); +        registrations.add(registration2); +        registrations.add(registration3); +        registrationService.add(vehicle.id(), registrations); +    } + +    @Test +    public void addOnlyOnePersonToRTWShouldFail() +            throws InvalidRegistrationException, ServiceException, InvalidVehicleException { +        thrown.expect(InvalidRegistrationException.class); +        RegistrationService registrationService = +                new RegistrationServiceImpl(daoMock, vehicleService); +        List<Registration> registrations = new LinkedList<>(); +        Vehicle vehicle = +                Vehicle.builder() +                        .id(1) +                        .name("RTW-1") +                        .constructionType(ConstructionType.HOCHDACH) +                        .type(VehicleType.RTW) +                        .status(Status.ABGEMELDET) +                        .hasNef(true) +                        .build(); +        Employee employee = +                Employee.builder() +                        .id(1) +                        .name("John Doe") +                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant +                        .educationLevel(EducationLevel.RS) +                        .isDriver(true) +                        .isPilot(true) +                        .build(); +        Registration registration = +                Registration.builder() +                        .start(Instant.MIN) +                        .end(Instant.MAX) +                        .employee(employee) +                        .build(); +        registrations.add(registration); +        registrationService.add(vehicle.id(), registrations); +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/CreateNewEmployeeApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/CreateNewEmployeeApplication.java new file mode 100644 index 0000000..e9f4801 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/CreateNewEmployeeApplication.java @@ -0,0 +1,53 @@ +package at.ac.tuwien.sepm.assignment.groupphase.employee; + +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 final class CreateNewEmployeeApplication 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("Person anlegen"); +        primaryStage.setWidth(1366); +        primaryStage.setHeight(768); +        primaryStage.centerOnScreen(); +        primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated")); + +        context = new AnnotationConfigApplicationContext(CreateNewEmployeeApplication.class); +        final var fxmlLoader = context.getBean(SpringFXMLLoader.class); +        primaryStage.setScene( +                new Scene( +                        (Parent) +                                fxmlLoader.load( +                                        getClass() +                                                .getResourceAsStream( +                                                        "/fxml/createNewEmployee.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/employee/CreateNewEmployeeControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/CreateNewEmployeeControllerTest.java new file mode 100644 index 0000000..eb1a728 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/CreateNewEmployeeControllerTest.java @@ -0,0 +1,85 @@ +package at.ac.tuwien.sepm.assignment.groupphase.employee; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService; +import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; +import at.ac.tuwien.sepm.assignment.groupphase.util.Helper; +import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest; +import javafx.scene.control.DialogPane; +import javafx.scene.input.MouseButton; +import javafx.stage.Stage; +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 CreateNewEmployeeControllerTest extends HighDpiAwareApplicationTest { + +    private EmployeeService employeeService; + +    @Before +    public void setup() throws Exception { +        // TODO: check if testfx can be run in headless mode on Jenkins +        FxToolkit.registerPrimaryStage(); +        FxToolkit.setupApplication(CreateNewEmployeeApplication.class); +        employeeService = CreateNewEmployeeApplication.context.getBean(EmployeeService.class); +    } + +    @After +    public void cleanup() throws Exception { +        FxToolkit.cleanupStages(); +    } + +    @Test +    public void testClickAddValidEmployee() throws InvalidEmployeeException, ServiceException { + +        when(employeeService.add(any())).thenReturn(1L); + +        clickOn("#inputName", Motion.DIRECT, MouseButton.PRIMARY); +        write("Name"); +        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY); + +        Stage alertDialog = Helper.getTopModalStage(robotContext()); +        Assert.assertNotNull(alertDialog); + +        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); +        Assert.assertEquals("Erfolgreich angelegt", dialogPane.getHeaderText()); +    } + +    @Test +    public void testClickAddInvalidEmployee() throws InvalidEmployeeException, ServiceException { + +        when(employeeService.add(any())).thenThrow(InvalidEmployeeException.class); + +        moveTo("#inputName"); +        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY); + +        Stage alertDialog = Helper.getTopModalStage(robotContext()); +        Assert.assertNotNull(alertDialog); + +        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); +        Assert.assertEquals("Ungültige Eingabe", dialogPane.getHeaderText()); +    } + +    @Test +    public void testClickAddEmployeeWithServiceException() +            throws InvalidEmployeeException, ServiceException { + +        when(employeeService.add(any())).thenThrow(ServiceException.class); + +        clickOn("#inputName", Motion.DIRECT, MouseButton.PRIMARY); +        write("Test"); +        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY); + +        Stage alertDialog = Helper.getTopModalStage(robotContext()); +        Assert.assertNotNull(alertDialog); + +        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); +        Assert.assertEquals("Speicherfehler", dialogPane.getHeaderText()); +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeePersistenceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeePersistenceTest.java new file mode 100644 index 0000000..f8fe0f3 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeePersistenceTest.java @@ -0,0 +1,155 @@ +package at.ac.tuwien.sepm.assignment.groupphase.employee; + +import static junit.framework.TestCase.fail; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDao; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel; +import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; +import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager; +import java.nio.charset.Charset; +import java.sql.SQLException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; +import org.dbunit.IDatabaseTester; +import org.dbunit.JdbcDatabaseTester; +import org.dbunit.dataset.DataSetException; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.dbunit.operation.DatabaseOperation; +import org.h2.tools.RunScript; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class EmployeePersistenceTest { + +    private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); +    private static final String JDBC_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; +    private static final String USER = ""; +    private static final String PASSWORD = ""; + +    private EmployeeDAO employeePersistence; + +    public EmployeePersistenceTest() throws PersistenceException { +        employeePersistence = new EmployeeDatabaseDao(new JDBCConnectionManager(JDBC_URL)); +    } + +    @BeforeClass +    public static void createSchema() throws SQLException { +        RunScript.execute( +                JDBC_URL, +                USER, +                PASSWORD, +                "classpath:sql/database.sql", +                Charset.forName("UTF8"), +                false); +    } + +    @Before +    public void importDataSet() throws Exception { +        IDataSet dataSet = readDataSet(); +        cleanlyInsert(dataSet); +    } + +    private IDataSet readDataSet() throws DataSetException { +        return new FlatXmlDataSetBuilder() +                .build( +                        getClass() +                                .getClassLoader() +                                .getResourceAsStream("employeeServiceTestData.xml")); +    } + +    private void cleanlyInsert(IDataSet dataSet) throws Exception { +        IDatabaseTester databaseTester = +                new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + +        databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT); +        databaseTester.setDataSet(dataSet); +        databaseTester.onSetup(); +    } + +    @Test +    public void testListEmployees() { + +        try { +            List<Employee> employees = employeePersistence.list(); + +            Employee empOne = +                    Employee.builder() +                            .id(1) +                            .name("Adam") +                            .birthday( +                                    LocalDate.parse( +                                            "10.10.2010", +                                            DateTimeFormatter.ofPattern("dd.MM.yyyy"))) +                            .educationLevel(EducationLevel.RS) +                            .isDriver(true) +                            .isPilot(false) +                            .build(); + +            Employee empTwo = +                    Employee.builder() +                            .id(2) +                            .name("Max") +                            .birthday( +                                    LocalDate.parse( +                                            "11.11.1990", +                                            DateTimeFormatter.ofPattern("dd.MM.yyyy"))) +                            .educationLevel(EducationLevel.NFS) +                            .isDriver(false) +                            .isPilot(false) +                            .build(); + +            Employee empThree = +                    Employee.builder() +                            .id(3) +                            .name("Lisa") +                            .birthday( +                                    LocalDate.parse( +                                            "16.10.1999", +                                            DateTimeFormatter.ofPattern("dd.MM.yyyy"))) +                            .educationLevel(EducationLevel.NKI) +                            .isDriver(true) +                            .isPilot(false) +                            .build(); + +            Assert.assertTrue(employees.contains(empOne)); +            Assert.assertTrue(employees.contains(empTwo)); +            Assert.assertTrue(employees.contains(empThree)); +            Assert.assertEquals(3, employees.size()); + +        } catch (PersistenceException e) { +            fail(); +        } +    } + +    @Test +    public void testEmployeeListNoElement() { + +        try { +            List<Employee> employees = employeePersistence.list(); + +            Employee empOne = +                    Employee.builder() +                            .id(10) +                            .name("Adam") +                            .birthday( +                                    LocalDate.parse( +                                            "10.10.2010", +                                            DateTimeFormatter.ofPattern("dd.MM.yyyy"))) +                            .educationLevel(EducationLevel.RS) +                            .isDriver(true) +                            .isPilot(false) +                            .build(); + +            Assert.assertFalse(employees.contains(empOne)); + +        } catch (PersistenceException e) { +            fail(); +        } +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeeServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeeServiceTest.java new file mode 100644 index 0000000..47328b3 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeeServiceTest.java @@ -0,0 +1,68 @@ +package at.ac.tuwien.sepm.assignment.groupphase.employee; + +import static junit.framework.TestCase.fail; +import static org.hamcrest.CoreMatchers.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDao; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeServiceImpl; +import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; +import java.time.LocalDate; +import org.junit.Assert; +import org.junit.Test; + +public class EmployeeServiceTest { + +    private final EmployeeDAO employeePersistence = mock(EmployeeDatabaseDao.class); +    private final EmployeeService employeeService = new EmployeeServiceImpl(employeePersistence); + +    public EmployeeServiceTest() throws PersistenceException { +        when(employeePersistence.add(any())).thenReturn(1L); +    } + +    @Test +    public void testAddValidEmployee() { + +        Employee employee = +                Employee.builder() +                        .name("Testperson") +                        .birthday(LocalDate.MIN) +                        .educationLevel(EducationLevel.NA) +                        .isDriver(true) +                        .isPilot(false) +                        .build(); + +        try { +            Assert.assertThat(employeeService.add(employee), is(1L)); +        } catch (InvalidEmployeeException | ServiceException e) { +            fail(); +        } +    } + +    @Test(expected = InvalidEmployeeException.class) +    public void testAddInvalidEmployee() throws InvalidEmployeeException { + +        Employee employee = +                Employee.builder() +                        .name("") +                        .birthday(LocalDate.MIN) +                        .educationLevel(EducationLevel.NA) +                        .isDriver(true) +                        .isPilot(false) +                        .build(); + +        try { +            employeeService.add(employee); +        } catch (ServiceException e) { +            fail(); +        } +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeeServiceTestConfiguration.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeeServiceTestConfiguration.java new file mode 100644 index 0000000..3668ef4 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeeServiceTestConfiguration.java @@ -0,0 +1,19 @@ +package at.ac.tuwien.sepm.assignment.groupphase.employee; + +import static org.mockito.Mockito.mock; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeServiceImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +@Configuration +public class EmployeeServiceTestConfiguration { + +    @Bean +    @Primary +    public EmployeeService employeeService() { +        return mock(EmployeeServiceImpl.class); +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationPersistenceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationPersistenceTest.java new file mode 100644 index 0000000..be612d0 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationPersistenceTest.java @@ -0,0 +1,109 @@ +package at.ac.tuwien.sepm.assignment.groupphase.operation; + +public class OperationPersistenceTest { + +    /*private final OperationDAO operationDAO = +            new DBOperationDAO(new JDBCConnectionManager("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1")); + +    @BeforeClass +    public static void createSchema() throws SQLException { +        RunScript.execute( +                "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", +                "", +                "", +                "classpath:sql/database.sql", +                Charset.forName("UTF8"), +                false); +    } + +    @Test +    public void addOperationTest() { +        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("Wiedner Hauptstraße 35, Wien") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of(vehicle)) +                        .build(); +        try { +            operationDAO.add(operation); +        } catch (PersistenceException e) { +            fail(); +        } +    } + +    /*@Test(expected = PersistenceException.class) +    public void addFaultyOperationTest() 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("") +                        .created(Instant.now()) +                        .destination("Wiedner Hauptstraße 35, Wien") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of(vehicle)) +                        .build(); +        operationDAO.add(operation); +    }*/ +    /* + +    @Test(expected = PersistenceException.class) +    public void addFaultyOperation1Test() throws PersistenceException { +        operationDAO.add(null); +    } + +    @Test(expected = PersistenceException.class) +    public void addFaultyOperation2Test() 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(List.of(vehicle)) +                        .build(); +        operationDAO.add(operation); +    } + +    @Test(expected = PersistenceException.class) +    public void addConnectionTest() throws PersistenceException { +        operationDAO.connectVehicleToOperation(-1, 0); +    } + +    // TODO: ADD CONNECTION TESTS +    // KOMMT ID ZURÜCK?*/ +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationServiceComponentTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationServiceComponentTest.java new file mode 100644 index 0000000..286ee07 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationServiceComponentTest.java @@ -0,0 +1,130 @@ +package at.ac.tuwien.sepm.assignment.groupphase.operation; + +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); + +    @Test +    public void addOperationTest() { +        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("Wiedner Hauptstraße 35, Wien") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of(vehicle)) +                        .build(); +        try { +            // TODO: OPERATION DOES NOT WORK +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (InvalidOperationException | ServiceException e) { +            fail(); +        } +    } + +    @Test(expected = InvalidOperationException.class) +    public void addFaultyOperationTest() throws InvalidOperationException { +        Vehicle vehicle = +                Vehicle.builder() +                        .status(Vehicle.Status.FREI_FUNK) +                        .constructionType(ConstructionType.HOCHDACH) +                        .name("BKTW_123") +                        .hasNef(true) +                        .type(VehicleType.BKTW) +                        .build(); +        Vehicle vehicle1 = +                Vehicle.builder() +                        .status(Vehicle.Status.ABGEMELDET) +                        .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("Wiedner Hauptstraße 35, Wien") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of(vehicle, vehicle1)) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (ServiceException e) { +            fail(); +        } +    } + +    @Test(expected = InvalidOperationException.class) +    public void addFaultyOperation2Test() throws InvalidOperationException { +        Operation operation = +                Operation.builder() +                        .status(Status.ACTIVE) +                        .opCode("ALP-95E7") +                        .created(Instant.now()) +                        .destination("Wiedner Hauptstraße 35, Wien") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of()) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (ServiceException e) { +            e.printStackTrace(); +        } +    } + +    @Test(expected = InvalidOperationException.class) +    public void addFaultyOperation3Test() throws InvalidOperationException { +        Operation operation = +                Operation.builder() +                        .status(Status.ACTIVE) +                        .opCode("ALP-95E7") +                        .created(Instant.now()) +                        .destination("") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of()) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (ServiceException e) { +            e.printStackTrace(); +        } +    } + +    @Test(expected = InvalidOperationException.class) +    public void addFaultyOperation4Test() throws InvalidOperationException { +        Operation operation = +                Operation.builder() +                        .status(Status.ACTIVE) +                        .opCode("") +                        .created(Instant.now()) +                        .destination("Römergasse 7, 2500 Baden") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of()) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (ServiceException e) { +            e.printStackTrace(); +        } +    }*/ +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationServiceUnitTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationServiceUnitTest.java new file mode 100644 index 0000000..fc10553 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/operation/OperationServiceUnitTest.java @@ -0,0 +1,155 @@ +package at.ac.tuwien.sepm.assignment.groupphase.operation; + +import static junit.framework.TestCase.fail; +import static org.hamcrest.CoreMatchers.is; +import static org.mockito.ArgumentMatchers.any; +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.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.einsatzverwaltung.dto.Vehicle.ConstructionType; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationServiceImpl; +import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; +import java.time.Instant; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +public class OperationServiceUnitTest { +    private final OperationDAO operationDAO = mock(OperationDAO.class); +    private final OperationService operationService = new OperationServiceImpl(operationDAO); + +    @Test +    public void addOperationTest() { +        try { +            when(operationDAO.add(any())).thenReturn(1L); +        } catch (PersistenceException e) { +            fail(); +        } +        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("Wiedner Hauptstraße 35, Wien") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of(vehicle)) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (InvalidOperationException | ServiceException e) { +            fail(); +        } +    } + +    @Test(expected = InvalidOperationException.class) +    public void addFaultyOperationTest() throws InvalidOperationException { +        Vehicle vehicle = +                Vehicle.builder() +                        .status(Vehicle.Status.FREI_FUNK) +                        .constructionType(ConstructionType.HOCHDACH) +                        .name("BKTW_123") +                        .hasNef(true) +                        .type(VehicleType.BKTW) +                        .build(); +        Vehicle vehicle1 = +                Vehicle.builder() +                        .status(Vehicle.Status.ABGEMELDET) +                        .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("Wiedner Hauptstraße 35, Wien") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of(vehicle, vehicle1)) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (ServiceException e) { +            fail(); +        } +    } + +    @Test(expected = InvalidOperationException.class) +    public void addFaultyOperation2Test() throws InvalidOperationException { +        Operation operation = +                Operation.builder() +                        .status(Status.ACTIVE) +                        .opCode("ALP-95E7") +                        .created(Instant.now()) +                        .destination("Wiedner Hauptstraße 35, Wien") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of()) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (ServiceException e) { +            e.printStackTrace(); +        } +    } + +    @Test(expected = InvalidOperationException.class) +    public void addFaultyOperation3Test() throws InvalidOperationException { +        Operation operation = +                Operation.builder() +                        .status(Status.ACTIVE) +                        .opCode("ALP-95E7") +                        .created(Instant.now()) +                        .destination("") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of()) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (ServiceException e) { +            e.printStackTrace(); +        } +    } + +    @Test(expected = InvalidOperationException.class) +    public void addFaultyOperation4Test() throws InvalidOperationException { +        Operation operation = +                Operation.builder() +                        .status(Status.ACTIVE) +                        .opCode("") +                        .created(Instant.now()) +                        .destination("Römergasse 7, 2500 Baden") +                        .additionalInfo("HTU Wien") +                        .severity(Severity.B) +                        .vehicles(List.of()) +                        .build(); +        try { +            Assert.assertThat(operationService.add(operation), is(1L)); +        } catch (ServiceException e) { +            e.printStackTrace(); +        } +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/Helper.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/Helper.java new file mode 100644 index 0000000..b808206 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/Helper.java @@ -0,0 +1,28 @@ +package at.ac.tuwien.sepm.assignment.groupphase.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javafx.stage.Modality; +import javafx.stage.Stage; +import javafx.stage.Window; +import org.testfx.api.FxRobotContext; + +public class Helper { + +    public static Stage getTopModalStage(FxRobotContext robotContext) { + +        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/util/HighDpiAwareApplicationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/HighDpiAwareApplicationTest.java new file mode 100644 index 0000000..c9816a1 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/HighDpiAwareApplicationTest.java @@ -0,0 +1,24 @@ +package at.ac.tuwien.sepm.assignment.groupphase.util; + +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/util/ScaledBounds.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/ScaledBounds.java new file mode 100644 index 0000000..02c15c4 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/ScaledBounds.java @@ -0,0 +1,34 @@ +package at.ac.tuwien.sepm.assignment.groupphase.util; + +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()); +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/CarAddTestService.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/CarAddTestService.java new file mode 100644 index 0000000..de7a26a --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/CarAddTestService.java @@ -0,0 +1,283 @@ +package at.ac.tuwien.sepm.assignment.groupphase.vehicle; + +import static junit.framework.TestCase.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDatabaseDao; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleServiceImpl; +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 org.junit.Test; + +public class CarAddTestService { +    private final VehicleDAO vehicleP = mock(VehicleDatabaseDao.class); +    private final VehicleService vehicleService = new VehicleServiceImpl(vehicleP); + +    public CarAddTestService() throws PersistenceException { +        when(vehicleP.add(any())).thenReturn(1L); +    } + +    @Test +    public void testValidVehicleH() { +        Vehicle vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.HOCHDACH) +                        .type(Vehicle.VehicleType.RTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.HOCHDACH) +                        .type(Vehicle.VehicleType.KTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.HOCHDACH) +                        .type(Vehicle.VehicleType.KTW_B) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.HOCHDACH) +                        .type(Vehicle.VehicleType.BKTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +    } + +    @Test +    public void testValidVehicleM() { +        Vehicle vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.MITTELHOCHDACH) +                        .type(Vehicle.VehicleType.KTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.MITTELHOCHDACH) +                        .type(Vehicle.VehicleType.KTW_B) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.MITTELHOCHDACH) +                        .type(Vehicle.VehicleType.BKTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +    } + +    @Test +    public void testValidVehicleN() { +        Vehicle vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.NORMAL) +                        .type(Vehicle.VehicleType.BKTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.NORMAL) +                        .type(Vehicle.VehicleType.NEF) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.NORMAL) +                        .type(Vehicle.VehicleType.NAH) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (InvalidVehicleException | ServiceException e) { +            fail(); +        } +    } + +    @Test(expected = InvalidVehicleException.class) +    public void testInvalidVehicleH() throws InvalidVehicleException { +        Vehicle vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.HOCHDACH) +                        .type(Vehicle.VehicleType.NEF) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.HOCHDACH) +                        .type(Vehicle.VehicleType.NAH) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (ServiceException e) { +            fail(); +        } +    } + +    @Test(expected = InvalidVehicleException.class) +    public void testInvalidVehicleM() throws InvalidVehicleException { +        Vehicle vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.MITTELHOCHDACH) +                        .type(Vehicle.VehicleType.NEF) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.MITTELHOCHDACH) +                        .type(Vehicle.VehicleType.NAH) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.MITTELHOCHDACH) +                        .type(Vehicle.VehicleType.RTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (ServiceException e) { +            fail(); +        } +    } + +    @Test(expected = InvalidVehicleException.class) +    public void testInvalidVehicleN() throws InvalidVehicleException { +        Vehicle vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.NORMAL) +                        .type(Vehicle.VehicleType.RTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.NORMAL) +                        .type(Vehicle.VehicleType.KTW_B) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (ServiceException e) { +            fail(); +        } +        vehicle = +                Vehicle.builder() +                        .constructionType(Vehicle.ConstructionType.NORMAL) +                        .type(Vehicle.VehicleType.KTW) +                        .hasNef(true) +                        .status(Vehicle.Status.ABGEMELDET) +                        .name("") +                        .build(); +        try { +            vehicleService.add(vehicle); +        } catch (ServiceException e) { +            fail(); +        } +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/CreateNewVehicleApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/CreateNewVehicleApplication.java new file mode 100644 index 0000000..dcd88ec --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/CreateNewVehicleApplication.java @@ -0,0 +1,51 @@ +package at.ac.tuwien.sepm.assignment.groupphase.vehicle; + +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 CreateNewVehicleApplication 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(CreateNewVehicleApplication.class); +        final var fxmlLoader = context.getBean(SpringFXMLLoader.class); +        primaryStage.setScene( +                new Scene( +                        (Parent) +                                fxmlLoader.load( +                                        getClass().getResourceAsStream("/fxml/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/vehicle/CreateNewVehicleControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/CreateNewVehicleControllerTest.java new file mode 100644 index 0000000..866ed74 --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/CreateNewVehicleControllerTest.java @@ -0,0 +1,79 @@ +package at.ac.tuwien.sepm.assignment.groupphase.vehicle; + +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.InvalidVehicleException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; +import at.ac.tuwien.sepm.assignment.groupphase.util.Helper; +import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest; +import javafx.scene.control.DialogPane; +import javafx.scene.input.MouseButton; +import javafx.stage.Stage; +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 CreateNewVehicleControllerTest 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(CreateNewVehicleApplication.class); +        vehicleService = CreateNewVehicleApplication.context.getBean(VehicleService.class); +    } + +    @After +    public void cleanup() throws Exception { +        FxToolkit.cleanupStages(); +    } + +    @Test +    public void testClickAddValidVehicle() throws ServiceException, InvalidVehicleException { + +        when(vehicleService.add(any())).thenReturn(1L); + +        clickOn("#btn_create", Motion.DIRECT, MouseButton.PRIMARY); + +        Stage alertDialog = Helper.getTopModalStage(robotContext()); +        Assert.assertNotNull(alertDialog); + +        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); +        Assert.assertEquals("Speichern Erfolgreich", dialogPane.getHeaderText()); +    } + +    @Test +    public void testClickInvalidVehicleEx() throws ServiceException, InvalidVehicleException { + +        when(vehicleService.add(any())).thenThrow(InvalidVehicleException.class); + +        clickOn("#btn_create", Motion.DIRECT, MouseButton.PRIMARY); + +        Stage alertDialog = Helper.getTopModalStage(robotContext()); +        Assert.assertNotNull(alertDialog); + +        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); +        Assert.assertEquals("Ungültige Eingabe", dialogPane.getHeaderText()); +    } + +    @Test +    public void testClickInvalidServiceEx() throws ServiceException, InvalidVehicleException { + +        when(vehicleService.add(any())).thenThrow(ServiceException.class); + +        clickOn("#btn_create", Motion.DIRECT, MouseButton.PRIMARY); + +        Stage alertDialog = Helper.getTopModalStage(robotContext()); +        Assert.assertNotNull(alertDialog); + +        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot(); +        Assert.assertEquals("Fehler", dialogPane.getHeaderText()); +    } +} diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/VehicleServiceTestConfiguration.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/VehicleServiceTestConfiguration.java new file mode 100644 index 0000000..ccd1e5d --- /dev/null +++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/vehicle/VehicleServiceTestConfiguration.java @@ -0,0 +1,19 @@ +package at.ac.tuwien.sepm.assignment.groupphase.vehicle; + +import static org.mockito.Mockito.mock; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleServiceImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +@Configuration +public class VehicleServiceTestConfiguration { + +    @Bean +    @Primary +    public VehicleService vehicleService() { +        return mock(VehicleServiceImpl.class); +    } +}  | 
