From 7a434e97bb838993c93b874805c767b983fa8c88 Mon Sep 17 00:00:00 2001
From: bozmiha <Mihai.BOZ@ext.ec.europa.eu>
Date: Wed, 9 Oct 2024 22:27:39 +0300
Subject: [PATCH] added tests for reset password functionality.

---
 domismp-tests/domismp-tests-ui/pom.xml        |  26 +--
 .../src/main/java/ddsl/DomiSMPPage.java       |   2 +
 .../src/main/java/pages/LoginPage.java        |  23 ++-
 .../main/java/pages/ResetCredentialsPage.java |  62 ++++++
 .../main/java/rest/InbucketRestClient.java    |  73 +++++++
 .../src/main/java/utils/TestRunData.java      |  13 +-
 .../src/main/resources/myLocal.properties     |   1 +
 .../java/domiSMPTests/ui/UsersPgTests.java    | 192 ++++++++++++++++++
 8 files changed, 368 insertions(+), 24 deletions(-)
 create mode 100644 domismp-tests/domismp-tests-ui/src/main/java/pages/ResetCredentialsPage.java
 create mode 100644 domismp-tests/domismp-tests-ui/src/main/java/rest/InbucketRestClient.java

diff --git a/domismp-tests/domismp-tests-ui/pom.xml b/domismp-tests/domismp-tests-ui/pom.xml
index 67ff57bd4..efc070b0f 100644
--- a/domismp-tests/domismp-tests-ui/pom.xml
+++ b/domismp-tests/domismp-tests-ui/pom.xml
@@ -17,25 +17,25 @@
         <!-- Only selected modules are deployed -->
         <maven.deploy.skip>false</maven.deploy.skip>
         <!-- dependencies versions-->
-        <commons-csv_version>1.10.0</commons-csv_version>
-        <selenium-chrome-driver_version>4.16.1</selenium-chrome-driver_version>
-        <selenium-java_version>4.16.1</selenium-java_version>
-        <poi-ooxml_version>5.2.4</poi-ooxml_version>
+        <commons-csv_version>1.12.0</commons-csv_version>
+        <selenium-chrome-driver_version>4.25.0</selenium-chrome-driver_version>
+        <selenium-java_version>4.25.0</selenium-java_version>
+        <poi-ooxml_version>5.3.0</poi-ooxml_version>
         <reflections_version>0.10.2</reflections_version>
         <jersey-client_version>1.19.4</jersey-client_version>
         <jersey-multipart_version>1.19.4</jersey-multipart_version>
-        <json_version>20231013</json_version>
-        <jackson_version>2.15.2</jackson_version>
+        <json_version>20240303</json_version>
+        <jackson_version>2.18.0</jackson_version>
         <javax.ws.rs-api_version>2.1.1</javax.ws.rs-api_version>
         <javax.ws.rs-api_version>2.1.1</javax.ws.rs-api_version>
         <xmlunit_version>1.6</xmlunit_version>
-        <testng_version>7.8.0</testng_version>
-        <logback-classic_version>1.4.11</logback-classic_version>
-        <extentreports_version>5.1.1</extentreports_version>
-        <commons-lang3_version>3.13.0</commons-lang3_version>
-        <commons-io_version>2.15.0</commons-io_version>
+        <testng_version>7.10.2</testng_version>
+        <logback-classic_version>1.5.8</logback-classic_version>
+        <extentreports_version>5.1.2</extentreports_version>
+        <commons-lang3_version>3.17.0</commons-lang3_version>
+        <commons-io_version>2.17.0</commons-io_version>
         <!-- plugin versions-->
-        <maven-surefire-plugin_version>3.2.2</maven-surefire-plugin_version>
+        <maven-surefire-plugin_version>3.5.1</maven-surefire-plugin_version>
         <plugin.dependency-check-maven.version>9.0.7</plugin.dependency-check-maven.version>
         <maven-compiler-plugin>3.11.0</maven-compiler-plugin>
 
@@ -174,7 +174,7 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-collections4</artifactId>
-            <version>4.4</version>
+            <version>4.5.0-M2</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
diff --git a/domismp-tests/domismp-tests-ui/src/main/java/ddsl/DomiSMPPage.java b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/DomiSMPPage.java
index ef81d2d36..9ff6f9e2e 100644
--- a/domismp-tests/domismp-tests-ui/src/main/java/ddsl/DomiSMPPage.java
+++ b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/DomiSMPPage.java
@@ -61,6 +61,8 @@ public class DomiSMPPage extends DComponent {
         actions.moveToElement(logoutMenuBtn);
         actions.perform();
         logoutMenuBtn.click();
+        data.getCookies().clear();
+        data.setXSRFToken("");
     }
 
     public void refreshPage() {
diff --git a/domismp-tests/domismp-tests-ui/src/main/java/pages/LoginPage.java b/domismp-tests/domismp-tests-ui/src/main/java/pages/LoginPage.java
index 881ee4cc9..09094bbb3 100644
--- a/domismp-tests/domismp-tests-ui/src/main/java/pages/LoginPage.java
+++ b/domismp-tests/domismp-tests-ui/src/main/java/pages/LoginPage.java
@@ -16,11 +16,17 @@ import java.util.HashMap;
 public class LoginPage extends DomiSMPPage {
     private final static Logger LOG = LoggerFactory.getLogger(LoginPage.class);
     @FindBy(id = "username_id")
-    private WebElement username;
+    private WebElement usernameInput;
     @FindBy(id = "password_id")
-    private WebElement password;
+    private WebElement passwordInput;
     @FindBy(id = "loginbutton_id")
     private WebElement loginBtn;
+    @FindBy(css = ".mat-mdc-tab-labels > div:nth-child(2)")
+    private WebElement goToResetPasswordTab;
+    @FindBy(id = "reset_username_id")
+    private WebElement resetUsernameInput;
+    @FindBy(id = "resetbutton_id")
+    private WebElement requestResetPasswordBtn;
 
     public LoginPage(WebDriver driver) {
         super(driver);
@@ -35,8 +41,8 @@ public class LoginPage extends DomiSMPPage {
         LOG.debug("Login started " + usr.get("username") + " / " + usr.get("pass"));
 
         goToLoginPage();
-        weToDInput(username).fill(usr.get("username"));
-        weToDInput(password).fill(usr.get("pass"));
+        weToDInput(usernameInput).fill(usr.get("username"));
+        weToDInput(passwordInput).fill(usr.get("pass"));
         weToDButton(loginBtn).click();
 
         try {
@@ -46,9 +52,16 @@ public class LoginPage extends DomiSMPPage {
         } catch (Exception e) {
             LOG.debug("Password expiration popup is not present");
         }
+    }
 
+    public String resetPassword(String user) {
+        LOG.debug("Resetting password for : " + user);
+        goToLoginPage();
 
+        weToDButton(goToResetPasswordTab).click();
+        weToDInput(resetUsernameInput).fill(user);
+        weToDButton(requestResetPasswordBtn).click();
+        return getAlertArea().getAlertMessage();
     }
-
 }
 
diff --git a/domismp-tests/domismp-tests-ui/src/main/java/pages/ResetCredentialsPage.java b/domismp-tests/domismp-tests-ui/src/main/java/pages/ResetCredentialsPage.java
new file mode 100644
index 000000000..b5b5367a3
--- /dev/null
+++ b/domismp-tests/domismp-tests-ui/src/main/java/pages/ResetCredentialsPage.java
@@ -0,0 +1,62 @@
+package pages;
+
+import ddsl.DomiSMPPage;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.PageFactory;
+import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import pages.systemSettings.UsersPage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ResetCredentialsPage extends DomiSMPPage {
+    private final static Logger LOG = LoggerFactory.getLogger(UsersPage.class);
+    @FindBy(id = "reset_username_id")
+    private WebElement usernameInput;
+    @FindBy(id = "np_id")
+    private WebElement newPasswordInput;
+    @FindBy(id = "cnp_id")
+    private WebElement confirmNewPasswordInput;
+    @FindBy(id = "closeDialogButton")
+    private WebElement canceBtn;
+    @FindBy(id = "changeCurrentUserPasswordButton")
+    private WebElement setNewPasswordBtn;
+    @FindBy(css = ".smp-field-error")
+    private List<WebElement> fieldsError;
+
+
+    public ResetCredentialsPage(WebDriver driver) {
+        super(driver);
+        PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getWaitTimeShort()), this);
+    }
+
+
+    public void fillChangePasswordFields(String username, String newPassword, String confirmNewPassword) {
+        weToDInput(usernameInput).fill(username, true);
+        weToDInput(newPasswordInput).fill(newPassword, true);
+        weToDInput(confirmNewPasswordInput).fill(confirmNewPassword);
+    }
+
+    public void clickSetChangePasswordButton() {
+        if (weToDButton(setNewPasswordBtn).isEnabled()) {
+            weToDButton(setNewPasswordBtn).click();
+        } else {
+            LOG.error("Set/Change password button is disabled");
+        }
+    }
+
+    public List<String> getFieldErrorMessage() {
+        ArrayList<String> fieldErrors = new ArrayList<>();
+        if (!fieldsError.isEmpty()) {
+            fieldsError.forEach(error -> {
+                fieldErrors.add(error.getText());
+            });
+        }
+        return fieldErrors;
+    }
+
+}
diff --git a/domismp-tests/domismp-tests-ui/src/main/java/rest/InbucketRestClient.java b/domismp-tests/domismp-tests-ui/src/main/java/rest/InbucketRestClient.java
new file mode 100644
index 000000000..9c72b1140
--- /dev/null
+++ b/domismp-tests/domismp-tests-ui/src/main/java/rest/InbucketRestClient.java
@@ -0,0 +1,73 @@
+package rest;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import utils.TestRunData;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.testng.AssertJUnit.fail;
+
+public class InbucketRestClient {
+    private final static Logger LOG = LoggerFactory.getLogger(InbucketRestClient.class);
+
+    protected TestRunData data = TestRunData.getInstance();
+    protected Client client = Client.create();
+    public WebResource resource = client.resource(TestRunData.getInstance().getPropertyValue(TestRunData.TestEnvironmentProperty.MAIL_URL));
+
+    private JSONArray getAllMessagesOfUser(String userName) {
+        try {
+            Thread.sleep(100);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+        WebResource.Builder builder = resource.path("api/v1/mailbox/" + userName).getRequestBuilder();
+        String rawStringResponse = builder.get(String.class);
+        JSONArray jsonArray = new JSONArray(rawStringResponse);
+
+        LOG.debug("All messages of users have been retrieved!");
+        return jsonArray;
+    }
+
+    public JsonObject getlastmessageOfUser(String userName) {
+        JSONArray getAllMessagesOfUser = getAllMessagesOfUser(userName);
+        JSONObject lastmessage = (JSONObject) getAllMessagesOfUser.get(getAllMessagesOfUser.length() - 1);
+        String lastmessageId = lastmessage.get("id").toString();
+        WebResource.Builder builder = resource.path("serve/mailbox/" + userName + "/" + lastmessageId).getRequestBuilder();
+        String rawStringResponse = builder.get(String.class);
+        JsonObject jsonArray = JsonParser.parseString(rawStringResponse).getAsJsonObject();
+        LOG.debug("Last email of user has been retrieved!");
+        return jsonArray;
+    }
+
+
+    public String getResetPasswordTokenFromLastEmailOfUser(String userName) {
+        JsonObject lastMessageArray = getlastmessageOfUser(userName);
+        if (lastMessageArray.isEmpty()) {
+            LOG.error("Last email of user is empty!");
+            fail();
+        }
+
+        String subject = lastMessageArray.get("subject").toString();
+        if (subject.contains("Request for reset of the Credential")) {
+            String text = lastMessageArray.get("text").toString();
+            String regex = "http://[^\\s\"<>]+(?=\\s|<|$)";
+            Pattern pattern = Pattern.compile(regex);
+            Matcher matcher = pattern.matcher(text);
+            while (matcher.find()) {
+                return matcher.group(0);
+            }
+            LOG.error("Reset URL found in the email: " + text);
+            throw new NullPointerException("Reset URL found in the email: " + text);
+        }
+        throw new NullPointerException("Last email is not a reset email. The current subject found is: " + subject);
+    }
+
+}
diff --git a/domismp-tests/domismp-tests-ui/src/main/java/utils/TestRunData.java b/domismp-tests/domismp-tests-ui/src/main/java/utils/TestRunData.java
index 70c7ad78f..ec1b8b3e1 100644
--- a/domismp-tests/domismp-tests-ui/src/main/java/utils/TestRunData.java
+++ b/domismp-tests/domismp-tests-ui/src/main/java/utils/TestRunData.java
@@ -41,6 +41,8 @@ public class TestRunData {
 
         TEST_DATA_PASSWORD_DEFAULT("test.data.password.default", "QW!@QW!@qw12qw12", "Default password when creating new users"),
         TEST_DATA_PASSWORD_NEW("test.data.password.new", "Test1234!Test1234!", "New Password when changing users password "),
+        MAIL_URL("test.mail.url", "http://localhost:9005/", "Webdriver type: chrome, gecko, edge"),
+
         ;
 
         String propertyName;
@@ -78,12 +80,11 @@ public class TestRunData {
 
         @Override
         public String toString() {
-            final StringBuffer sb = new StringBuffer("TestEnvironmentProperty {");
-            sb.append("propertyName='").append(propertyName).append('\'');
-            sb.append(", defaultValue='").append(defaultValue).append('\'');
-            sb.append(", description='").append(description).append('\'');
-            sb.append('}');
-            return sb.toString();
+            String sb = "TestEnvironmentProperty {" + "propertyName='" + propertyName + '\'' +
+                    ", defaultValue='" + defaultValue + '\'' +
+                    ", description='" + description + '\'' +
+                    '}';
+            return sb;
         }
     }
 
diff --git a/domismp-tests/domismp-tests-ui/src/main/resources/myLocal.properties b/domismp-tests/domismp-tests-ui/src/main/resources/myLocal.properties
index 91ecbb1a2..39f6ea0c1 100644
--- a/domismp-tests/domismp-tests-ui/src/main/resources/myLocal.properties
+++ b/domismp-tests/domismp-tests-ui/src/main/resources/myLocal.properties
@@ -8,6 +8,7 @@ test.webdriver.type=firefox
 test.webdriver.headless=false
 test.application.ui.url=http://eulogin.protected.smp.local:8982/smp/ui
 test.sml.url=http://localhost:8982/edelivery-sml/listDNS
+test.mail.url=http://localhost:9005/
 test.timeout.long=15
 test.timeout.short=5
 test.reports.folder=./reports/
diff --git a/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/UsersPgTests.java b/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/UsersPgTests.java
index b95cc9a32..290009d6c 100644
--- a/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/UsersPgTests.java
+++ b/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/UsersPgTests.java
@@ -1,6 +1,7 @@
 package domiSMPTests.ui;
 
 import ddsl.DomiSMPPage;
+import ddsl.dobjects.DWait;
 import ddsl.enums.Pages;
 import domiSMPTests.SeleniumTest;
 import org.openqa.selenium.WebElement;
@@ -8,13 +9,18 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import org.testng.asserts.SoftAssert;
 import pages.LoginPage;
+import pages.ResetCredentialsPage;
 import pages.systemSettings.UsersPage;
+import rest.InbucketRestClient;
 import rest.models.UserModel;
 
+import java.util.List;
+
 public class UsersPgTests extends SeleniumTest {
     SoftAssert soft;
     DomiSMPPage homePage;
     LoginPage loginPage;
+    InbucketRestClient restClient = new InbucketRestClient();
 
     @BeforeMethod(alwaysRun = true)
     public void beforeTest(){
@@ -67,4 +73,190 @@ public class UsersPgTests extends SeleniumTest {
         soft.assertEquals(alertMessage, "Invalid request [CreateUser]. Error: User with username [" + adminNewUserData.getUsername() + "] already exists!!");
         soft.assertAll();
     }
+
+    @Test(description = "LGN-32 - User is able to reset password")
+    public void userIsAbleToResetHisPassword() throws Exception {
+
+        UserModel newAdminUser = UserModel.generateUserWithADMINrole();
+        UserModel newNormalUser = UserModel.generateUserWithUSERrole();
+
+        String adminUserId = rest.users().createUser(newAdminUser).getString("userId");
+        String normalUserId = rest.users().createUser(newNormalUser).getString("userId");
+
+        rest.users().changePassword(adminUserId, data.getNewPassword());
+        rest.users().changePassword(normalUserId, data.getNewPassword());
+
+        loginPage.login(newAdminUser.getUsername(), data.getNewPassword());
+        try {
+            homePage.logout();
+
+        } catch (Exception e) {
+            soft.assertTrue(false, "User is not logged in!");
+        }
+        //Reset admin password
+        String message = loginPage.resetPassword(newAdminUser.getUsername());
+        soft.assertEquals(message, "A confirmation email has been sent to your registered email address for user [" + newAdminUser.getUsername() + "]. Please follow the instructions in the email to complete the account reset process. If you did not receive mail try later or contact administrator");
+        String emailUsername = newAdminUser.getEmailAddress().substring(0, 14);
+
+        //Retrieve reset URL
+        String resetURL = restClient.getResetPasswordTokenFromLastEmailOfUser(emailUsername);
+        driver.get(resetURL);
+
+        //Reset password for Admin
+        ResetCredentialsPage resetCredentialsPage = new ResetCredentialsPage(driver);
+        String newPasswordAfterReset = "Qwe!@#123412341234";
+        resetCredentialsPage.fillChangePasswordFields(newAdminUser.getUsername(), newPasswordAfterReset, newPasswordAfterReset);
+        resetCredentialsPage.clickSetChangePasswordButton();
+
+        //Login with new password for Admin
+        new DWait(driver).equals(loginPage.getAlertArea());
+        soft.assertTrue(loginPage.getAlertArea().getAlertMessage().contains("Password has been reset successfully. Please login with new password"), "Reset password message didn't appear");
+        loginPage.login(newAdminUser.getUsername(), newPasswordAfterReset);
+        try {
+            homePage.logout();
+
+        } catch (Exception e) {
+            soft.assertTrue(false, "User is not logged in!");
+        }
+
+        //Reset password User Role password
+        message = loginPage.resetPassword(newNormalUser.getUsername());
+        soft.assertEquals(message, "A confirmation email has been sent to your registered email address for user [" + newNormalUser.getUsername() + "]. Please follow the instructions in the email to complete the account reset process. If you did not receive mail try later or contact administrator");
+        String emailUserRoleUsername = newNormalUser.getEmailAddress().substring(0, 14);
+
+        //Retrieve reset URL
+        String resetURLUserRole = restClient.getResetPasswordTokenFromLastEmailOfUser(emailUserRoleUsername);
+        driver.get(resetURLUserRole);
+
+        //Reset password for User
+        resetCredentialsPage = new ResetCredentialsPage(driver);
+        newPasswordAfterReset = "Qwe!@#123412341234";
+        resetCredentialsPage.fillChangePasswordFields(newNormalUser.getUsername(), newPasswordAfterReset, newPasswordAfterReset);
+        resetCredentialsPage.clickSetChangePasswordButton();
+
+        //Login with new password for User
+        new DWait(driver).equals(loginPage.getAlertArea());
+        soft.assertTrue(loginPage.getAlertArea().getAlertMessage().contains("Password has been reset successfully. Please login with new password"), "Reset password message didn't appear");
+        loginPage.login(newNormalUser.getUsername(), newPasswordAfterReset);
+        try {
+            homePage.logout();
+
+        } catch (Exception e) {
+            soft.assertTrue(false, "User is not logged in!");
+        }
+
+
+        soft.assertAll();
+    }
+
+    @Test(description = "LGN-34 - Creating a new reset password token invalids previous tokens")
+    public void creatingANewResetPasswordTokenInvalidatesPreviousTokens() throws Exception {
+
+        UserModel newNormalUser = UserModel.generateUserWithUSERrole();
+        String normalUserId = rest.users().createUser(newNormalUser).getString("userId");
+        rest.users().changePassword(normalUserId, data.getNewPassword());
+
+
+        //Reset password User Role password
+        String message = loginPage.resetPassword(newNormalUser.getUsername());
+        soft.assertEquals(message, "A confirmation email has been sent to your registered email address for user [" + newNormalUser.getUsername() + "]. Please follow the instructions in the email to complete the account reset process. If you did not receive mail try later or contact administrator");
+        String emailUserRoleUsername = newNormalUser.getEmailAddress().substring(0, 14);
+
+        //Retrieve reset URL
+        String firstResetURL = restClient.getResetPasswordTokenFromLastEmailOfUser(emailUserRoleUsername);
+
+        //Reset password again
+        loginPage.resetPassword(newNormalUser.getUsername());
+        String secondResetUrl = restClient.getResetPasswordTokenFromLastEmailOfUser(emailUserRoleUsername);
+
+        //Check if 1st token is invalid
+        driver.get(firstResetURL);
+        soft.assertEquals(loginPage.getAlertArea().getAlertMessage(), "The reset token it is invalid or not active any more. Please try to reset your password again.", "Invalid token error message was not found");
+        soft.assertEquals(loginPage.getBreadcrump().getCurrentPage(), "Login");
+
+        //Check if 2nd token is invalid
+
+        driver.get(secondResetUrl);
+
+        ResetCredentialsPage resetCredentialsPage = new ResetCredentialsPage(driver);
+        String newPasswordAfterReset = "Qwe!@#123412341234";
+        resetCredentialsPage.fillChangePasswordFields(newNormalUser.getUsername(), newPasswordAfterReset, newPasswordAfterReset);
+        resetCredentialsPage.clickSetChangePasswordButton();
+
+        //Login with new password for User
+        new DWait(driver).equals(loginPage.getAlertArea());
+        soft.assertTrue(loginPage.getAlertArea().getAlertMessage().contains("Password has been reset successfully. Please login with new password"), "Reset password message didn't appear");
+        loginPage.login(newNormalUser.getUsername(), newPasswordAfterReset);
+        try {
+            homePage.logout();
+
+        } catch (Exception e) {
+            soft.assertTrue(false, "User is not logged in!");
+        }
+        soft.assertAll();
+    }
+
+    @Test(description = "LGN-35 - Reset password screen applies password complexity")
+    public void resetPasswordScreenAppliesPasswordComplexity() throws Exception {
+
+        UserModel user = UserModel.generateUserWithUSERrole();
+        String normalUserId = rest.users().createUser(user).getString("userId");
+        rest.users().changePassword(normalUserId, data.getNewPassword());
+
+
+        //Reset password User Role password
+        String message = loginPage.resetPassword(user.getUsername());
+        soft.assertEquals(message, "A confirmation email has been sent to your registered email address for user [" + user.getUsername() + "]. Please follow the instructions in the email to complete the account reset process. If you did not receive mail try later or contact administrator");
+        String emailUserRoleUsername = user.getEmailAddress().substring(0, 14);
+
+        //Retrieve reset URL
+        String resetUrl = restClient.getResetPasswordTokenFromLastEmailOfUser(emailUserRoleUsername);
+        driver.get(resetUrl);
+
+        ResetCredentialsPage resetCredentialsPage = new ResetCredentialsPage(driver);
+
+        //User is not able to set the same password again
+        resetCredentialsPage.fillChangePasswordFields(user.getUsername(), data.getNewPassword(), data.getNewPassword());
+        resetCredentialsPage.clickSetChangePasswordButton();
+        soft.assertEquals(loginPage.getAlertArea().getAlertMessage(), "Password change failed. Minimum length: 16 characters;Maximum length: 32 characters;At least one letter in lowercase;At least one letter in uppercase;At least one digit;At least one special character;Must not be same as existing password");
+
+        //Check minim length of password
+        driver.navigate().refresh();
+        String minLengthPassword = "!234sdfg*&&^";
+        resetCredentialsPage.fillChangePasswordFields(user.getUsername(), minLengthPassword, minLengthPassword);
+        List<String> errors = resetCredentialsPage.getFieldErrorMessage();
+        soft.assertEquals(errors.size(), 1);
+        soft.assertEquals(errors.get(0), "Minimum length: 16 characters;Maximum length: 32 characters;At least one letter in lowercase;At least one letter in uppercase;At least one digit;At least one special character;Must not be same as existing password");
+
+        //Check special character of password
+        driver.navigate().refresh();
+        String specialCharacterPassword = "QWSQWWqw12qw1212";
+        errors.clear();
+        resetCredentialsPage.fillChangePasswordFields(user.getUsername(), specialCharacterPassword, specialCharacterPassword);
+        errors = resetCredentialsPage.getFieldErrorMessage();
+        soft.assertEquals(errors.size(), 1, "Special character validation does not appear");
+        soft.assertEquals(errors.get(0), "Minimum length: 16 characters;Maximum length: 32 characters;At least one letter in lowercase;At least one letter in uppercase;At least one digit;At least one special character;Must not be same as existing password");
+
+        //Check lower character of password
+        driver.navigate().refresh();
+        String lowerCharacterPassword = "QA!@QA!@QW12QW12";
+        errors.clear();
+        resetCredentialsPage.fillChangePasswordFields(user.getUsername(), lowerCharacterPassword, lowerCharacterPassword);
+        errors = resetCredentialsPage.getFieldErrorMessage();
+        soft.assertEquals(errors.size(), 1, "Lower character validation does not appear");
+        soft.assertEquals(errors.get(0), "Minimum length: 16 characters;Maximum length: 32 characters;At least one letter in lowercase;At least one letter in uppercase;At least one digit;At least one special character;Must not be same as existing password");
+
+
+        //Check upper character of password
+        driver.navigate().refresh();
+        String upperCharacterPassword = "qw!@qw!@qw12qw12";
+        errors.clear();
+        resetCredentialsPage.fillChangePasswordFields(user.getUsername(), upperCharacterPassword, upperCharacterPassword);
+        errors = resetCredentialsPage.getFieldErrorMessage();
+        soft.assertEquals(errors.size(), 1, "Upper character validation does not appear");
+        soft.assertEquals(errors.get(0), "Minimum length: 16 characters;Maximum length: 32 characters;At least one letter in lowercase;At least one letter in uppercase;At least one digit;At least one special character;Must not be same as existing password");
+
+        soft.assertAll();
+    }
+
 }
\ No newline at end of file
-- 
GitLab