Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 7a434e97 authored by Mihai BOZ's avatar Mihai BOZ
Browse files

added tests for reset password functionality.

parent 0b56ed4d
No related branches found
No related tags found
No related merge requests found
......@@ -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>
......
......@@ -61,6 +61,8 @@ public class DomiSMPPage extends DComponent {
actions.moveToElement(logoutMenuBtn);
actions.perform();
logoutMenuBtn.click();
data.getCookies().clear();
data.setXSRFToken("");
}
public void refreshPage() {
......
......@@ -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();
}
}
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;
}
}
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);
}
}
......@@ -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;
}
}
......
......@@ -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/
......
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment