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