diff --git a/Bachelor_application.iml b/Bachelor_application.iml index f8154df5a6a0bb9048b52fc21433f278efd739cf..b94cb914ec5ad223d705dca95552625827a51c34 100644 --- a/Bachelor_application.iml +++ b/Bachelor_application.iml @@ -6,6 +6,7 @@ <content url="file://$MODULE_DIR$"> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/test" isTestSource="true" /> <excludeFolder url="file://$MODULE_DIR$/target" /> </content> <orderEntry type="inheritedJdk" /> @@ -55,5 +56,15 @@ <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" /> <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.14" level="project" /> <orderEntry type="library" name="Maven: org.jblas:jblas:1.2.4" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.2" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.8.2" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.8.2" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.8.2" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.2" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.8.2" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.8.2" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.8.2" level="project" /> </component> </module> \ No newline at end of file diff --git a/pom.xml b/pom.xml index e6c30632be74fa49f90a30a1c7e6dfa33c7d6844..3c4734f99a5c9efa149b22a301fdc4202bb2bbcc 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,34 @@ <version>1.2.4</version> </dependency> + <!-- https://mvnrepository.com/artifact/org.openjfx/javafx --> + + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx</artifactId> + <version>11</version> + <type>pom</type> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>RELEASE</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>RELEASE</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <version>RELEASE</version> + <scope>test</scope> + </dependency> + + </dependencies> <properties> diff --git a/src/main/java/com/application/DB/Account_handler.java b/src/main/java/com/application/DB/AccountHandler.java similarity index 80% rename from src/main/java/com/application/DB/Account_handler.java rename to src/main/java/com/application/DB/AccountHandler.java index e5a7cf0596f74fd80208b9d2355f3e8f405afa32..fa9c06a45a13ab4284524b3de6a5d8a205319098 100644 --- a/src/main/java/com/application/DB/Account_handler.java +++ b/src/main/java/com/application/DB/AccountHandler.java @@ -8,9 +8,8 @@ import com.google.cloud.bigquery.TableResult; import static com.application.DB.Constants.*; import static com.application.DB.Settings.*; import static com.application.GUI.PopUpWindows.LoginPopup.getPasswordTextField; -import static java.lang.System.err; -public class Account_handler { +public class AccountHandler { public static void getAccountInformation(String username, String password) throws Exception { @@ -64,21 +63,28 @@ public class Account_handler { "FROM " + PROJECT_ID + "." + LOCATION_ID + "." + USERS_TABLE_NAME + " " + "WHERE Username = " + '"' + username + '"'; + System.out.println(sqlStatement); // Retrieves the results from the queryjob return HelpingFunctions.createQueryJob(sqlStatement); } - public static void addUser(String firstName, String lastName, String phoneNo, String username, String password, boolean isAdmin) throws Exception { + public static boolean addUser(String firstName, String lastName, String phoneNo, String username, String password, boolean isAdmin) throws Exception { + + if(getAccount(username).getTotalRows() == 0) { // Sqlstatement final String sqlStatement = - "INSERT INTO " + PROJECT_ID + "." + LOCATION_ID + "." + USERS_TABLE_NAME + "(First_name, Last_name, Phone_no, Username, Password, Admin) " + - "VALUES("+'"'+firstName+'"'+","+'"'+lastName+'"'+","+'"'+phoneNo+'"'+","+'"'+username+'"'+","+'"'+password+'"'+","+ isAdmin+") "; + "INSERT INTO " + PROJECT_ID + "." + LOCATION_ID + "." + USERS_TABLE_NAME + "(First_name, Last_name, Phone_no, Username, Password, Admin) " + + "VALUES(" + '"' + firstName + '"' + "," + '"' + lastName + '"' + "," + '"' + phoneNo + '"' + "," + '"' + username + '"' + "," + '"' + password + '"' + "," + isAdmin + ") "; - System.out.println(sqlStatement); + System.out.println(sqlStatement); - HelpingFunctions.createQueryJob(sqlStatement); + HelpingFunctions.createQueryJob(sqlStatement); + return true; + } else { + return false; + } } public static boolean deleteUser(String username) throws Exception { diff --git a/src/main/java/com/application/DB/Constants.java b/src/main/java/com/application/DB/Constants.java index 75ae0f2f28778d262908484973934d77e058c6d5..17b4ae5e84ada6a3c938ee416973f071d2dc797d 100644 --- a/src/main/java/com/application/DB/Constants.java +++ b/src/main/java/com/application/DB/Constants.java @@ -41,9 +41,7 @@ public class Constants { private static String userName; private static String phoneNo; - public static String getUserName() { - return userName; - } + public static String getUserName() { return userName;} public static void setUserName(String userName) { Constants.userName = userName; diff --git a/src/main/java/com/application/DB/HelpingFunctions.java b/src/main/java/com/application/DB/HelpingFunctions.java index cdeeafa3bb95313fe9289e3b84df3a3d89e94db1..4ab13f7cb94537fbb09bf5d3d2cddf8690c81e49 100644 --- a/src/main/java/com/application/DB/HelpingFunctions.java +++ b/src/main/java/com/application/DB/HelpingFunctions.java @@ -1,8 +1,10 @@ package com.application.DB; +import com.application.GUI.PopUpWindows.NotificationPopUp; import com.google.auth.oauth2.GoogleCredentials; import com.google.auth.oauth2.ServiceAccountCredentials; import com.google.cloud.bigquery.*; +import io.opencensus.internal.StringUtils; import java.io.File; import java.io.FileInputStream; @@ -12,8 +14,10 @@ import java.util.Map; import java.util.TimeZone; import static com.application.DB.Constants.KEY_FILE_NAME; +import static com.application.DB.Constants.MAX_USER_INPUT_CHARACTERS; import static com.application.DB.Settings.*; + public class HelpingFunctions { @@ -178,4 +182,22 @@ public class HelpingFunctions { public static void setLoadedData(boolean loadedData) { Constants.LOADED_DATA = loadedData; } + + +public static boolean isValidInput (String input){ + if(input.length() > Constants.MAX_USER_INPUT_CHARACTERS) { + NotificationPopUp.displayNotificationWindow("A maximum of "+MAX_USER_INPUT_CHARACTERS+" characters is allowed!"); + return true; + } + else if(input.contains("UNION")){ + NotificationPopUp.displayNotificationWindow("Keyword: 'UNION' is not allowed"); + return true; + } + else return false; +} + + + + + } diff --git a/src/main/java/com/application/DB/Settings.java b/src/main/java/com/application/DB/Settings.java index 57bc2427efbd5a356dc07958933a43e0b3a73c2b..04028a69333ac4fac359749a89ef9121e2a086e9 100644 --- a/src/main/java/com/application/DB/Settings.java +++ b/src/main/java/com/application/DB/Settings.java @@ -29,7 +29,7 @@ public final class Settings { public static final int LOCATION_ID = 124; public static final String MAN_MOISTURE_TABLE = "int_dk_manMoisture"; public static final String KWH_TABLE_NAME = "int_sd_winccsensordata"; - public static final String USERS_TABLE_NAME = "users"; + public static String USERS_TABLE_NAME = "users"; public static final String KWH_NAME_PARAMETER = "VariantValue"; public static final String KWH_TIMESTAMP_NAME_PARAMETER = "Timestamp"; public static final String KWH_VALUE_ID_NAME_PARAMETER = "ValueID"; diff --git a/src/main/java/com/application/GUI/PopUpWindows/InputPopup.java b/src/main/java/com/application/GUI/PopUpWindows/InputPopup.java index 1259d2762d1f963348cb2cbf1abbc4d5bb211e6f..e96015ba4592ddac1de67180f8ace1b381551399 100644 --- a/src/main/java/com/application/GUI/PopUpWindows/InputPopup.java +++ b/src/main/java/com/application/GUI/PopUpWindows/InputPopup.java @@ -14,6 +14,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Map; +import static com.application.DB.HelpingFunctions.isValidInput; import static com.application.DB.Settings.*; import static com.application.DB.DB.getCurrentDrying; import static com.application.DB.Constants.MAX_USER_INPUT_CHARACTERS; @@ -127,13 +128,14 @@ public class InputPopup { Constants.MOISTURE_GOAL = moistureList.getValue(); } + + boolean err = false; // If the input is null, sets the value to be empty if (treeSpeciesList.getValue() == null) { Constants.TREE_SPECIES = ""; - } else if (treeSpeciesList.getValue().length() > MAX_USER_INPUT_CHARACTERS) { - NotificationPopUp.displayNotificationWindow("A maximum of "+MAX_USER_INPUT_CHARACTERS+" characters is allowed!"); + } else if (isValidInput(treeSpeciesList.getValue())) { treeSpeciesList.setValue(""); err = true; } diff --git a/src/main/java/com/application/GUI/PopUpWindows/LoginPopup.java b/src/main/java/com/application/GUI/PopUpWindows/LoginPopup.java index 878fba65da35b5725f2cea85d8767e1b059cd2c3..a2218c8e0f5eb6bec120d1c2d8b818882e0adaa0 100644 --- a/src/main/java/com/application/GUI/PopUpWindows/LoginPopup.java +++ b/src/main/java/com/application/GUI/PopUpWindows/LoginPopup.java @@ -10,7 +10,7 @@ import javafx.stage.Stage; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; -import static com.application.DB.Account_handler.*; +import static com.application.DB.AccountHandler.*; import static com.application.DB.Constants.*; import static com.application.GUI.Panes.LogoBar.getLogin; @@ -140,10 +140,11 @@ public class LoginPopup { // Tries to add the user try { - addUser(firstNameTextField.getText(), lastNameTextField.getText(), phoneNoTextField.getText(), - usernameTextField.getText(), hashedPassword, isAdminBox.isSelected()); - NotificationPopUp.displayNotificationWindow("Successfully added user!"); - window.close(); + if(addUser(firstNameTextField.getText(), lastNameTextField.getText(), phoneNoTextField.getText(), + usernameTextField.getText(), hashedPassword, isAdminBox.isSelected())){ + NotificationPopUp.displayNotificationWindow("Successfully added user!"); + window.close(); + } else NotificationPopUp.displayNotificationWindow("That username already exist in the database!"); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/test/com/application/DB/AccountHandlerTest.java b/src/test/com/application/DB/AccountHandlerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1c890044a234827a637a5002c6dfe4eb0db328fd --- /dev/null +++ b/src/test/com/application/DB/AccountHandlerTest.java @@ -0,0 +1,65 @@ +package com.application.DB; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static com.application.DB.Settings.USERS_TABLE_NAME; + +class AccountHandlerTest { + + AccountHandlerTest(){ + USERS_TABLE_NAME = "users_testing"; + } + + @Test + void logIn() throws Exception { + AccountHandler.deleteUser("loginTestAccount"); + AccountHandler.addUser("test","test","+4712345678","loginTestAccount","test",false); + Assertions.assertEquals(1, AccountHandler.logIn("loginTestAccount","test").getTotalRows()); + AccountHandler.deleteUser("loginTestAccount"); + } + + @Test + void logInFailed() throws Exception { + Assertions.assertEquals(0, AccountHandler.logIn("qefjdnweflkweoihde","test").getTotalRows()); + } + + @Test + void getAccount() throws Exception { + AccountHandler.deleteUser("testAccount"); + AccountHandler.addUser("test","test","+4712345678","testAccount","test",false); + Assertions.assertEquals(1, AccountHandler.getAccount("testAccount").getTotalRows()); + AccountHandler.deleteUser("testAccount"); + } + + //The test checks if the user is added + @Test + void addUser() throws Exception { + AccountHandler.deleteUser("testAccount"); + AccountHandler.addUser("test","test","+4712345678","testAccount","test",false); + Assertions.assertEquals(1, AccountHandler.getAccount("testAccount").getTotalRows()); + AccountHandler.deleteUser("testAccount"); + } + + //The test checks if the user is added + @Test + void addAlreadyExistingUser() throws Exception { + AccountHandler.deleteUser("testAccountAlready"); + AccountHandler.addUser("test","test","+4712345678","testAccountAlready","test",false); + Assertions.assertFalse(AccountHandler.addUser("test","test","+4712345678","testAccountAlready","test",false)); + AccountHandler.deleteUser("testAccountAlready"); + } + + @Test + void deleteUser() throws Exception { + AccountHandler.deleteUser("deleteTestAccount"); + AccountHandler.addUser("test","test","+4712345678","deleteTestAccount","test",false); + AccountHandler.deleteUser("deleteTestAccount"); + Assertions.assertEquals(0, AccountHandler.getAccount("deleteTestAccount").getTotalRows()); + } + + @Test + void deleteUserNonExistingUser() throws Exception { + Assertions.assertFalse(AccountHandler.deleteUser("erjfnerjkfwefbaekrørebf")); + } +} \ No newline at end of file diff --git a/target/classes/com/application/DB/Account_handler.class b/target/classes/com/application/DB/Account_handler.class deleted file mode 100644 index c09f8ced6631474642158218a0c1f8833b6ff76f..0000000000000000000000000000000000000000 Binary files a/target/classes/com/application/DB/Account_handler.class and /dev/null differ diff --git a/target/classes/com/application/DB/Constants.class b/target/classes/com/application/DB/Constants.class index f9229ec0ebccb95510e2f7694f75caeb87e56e94..b1d3fc3702ed1019a1d6296da0a1b093a81acaa1 100644 Binary files a/target/classes/com/application/DB/Constants.class and b/target/classes/com/application/DB/Constants.class differ diff --git a/target/classes/com/application/DB/HelpingFunctions.class b/target/classes/com/application/DB/HelpingFunctions.class index 7166717be98c08b21717c8005665d8fe9bd7c817..20e3d6c5e0490d9ddbe6094ea05e11c3be6765fe 100644 Binary files a/target/classes/com/application/DB/HelpingFunctions.class and b/target/classes/com/application/DB/HelpingFunctions.class differ diff --git a/target/classes/com/application/DB/Settings.class b/target/classes/com/application/DB/Settings.class index 3cc7d0b40907c69485096f5fd430ff9206db126c..c10b0728d7fa140d9da7a00434929e80fbf5f2ea 100644 Binary files a/target/classes/com/application/DB/Settings.class and b/target/classes/com/application/DB/Settings.class differ diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class index 30bd0f2183c54ab6bccf4cc5eda99118dc7ac9f9..b21e073b2ce26efcaa49a9f1501d31ead5c17834 100644 Binary files a/target/classes/com/application/GUI/LineChartFunctionality.class and b/target/classes/com/application/GUI/LineChartFunctionality.class differ diff --git a/target/classes/com/application/GUI/PopUpWindows/InputPopup.class b/target/classes/com/application/GUI/PopUpWindows/InputPopup.class index 8d31307c5d5c7a14c5f4fb19efcad444cd5ba67f..347ac9d24189f21a827c7d1ad4ed22d1523084af 100644 Binary files a/target/classes/com/application/GUI/PopUpWindows/InputPopup.class and b/target/classes/com/application/GUI/PopUpWindows/InputPopup.class differ diff --git a/target/classes/com/application/GUI/PopUpWindows/LoginPopup.class b/target/classes/com/application/GUI/PopUpWindows/LoginPopup.class index d48a380678cdbcd7de915ccbd1bfb5ac516a2e67..c94b2f85d508e5f666aed9e7f81ececd4e584974 100644 Binary files a/target/classes/com/application/GUI/PopUpWindows/LoginPopup.class and b/target/classes/com/application/GUI/PopUpWindows/LoginPopup.class differ