diff --git a/domismp-tests/domismp-tests-ui/pom.xml b/domismp-tests/domismp-tests-ui/pom.xml index 67ff57bd4f1f79754d961d49ad30018cda726d01..efc070b0f1f405780496b789dc86ee08fbf509cf 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 ef81d2d368bd4917a876d75b477ad75d53532436..9ff6f9e2ea15c34ad166b758b08cd6d70815ff4d 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/ddsl/dcomponents/DComponent.java b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/DComponent.java index 1211e6fd633bf6a6a471954cb06359978f779d2a..fae21b8251bd3fc9160d6ce5d3e2876e88e6e08f 100644 --- a/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/DComponent.java +++ b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/DComponent.java @@ -1,10 +1,7 @@ package ddsl.dcomponents; import ddsl.dcomponents.mat.MatSelect; -import ddsl.dobjects.DButton; -import ddsl.dobjects.DInput; -import ddsl.dobjects.DSelect; -import ddsl.dobjects.DWait; +import ddsl.dobjects.*; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import utils.TestRunData; @@ -24,6 +21,10 @@ public class DComponent { return new DButton(driver, element); } + protected DCheckbox weToDChecked(WebElement element) { + return new DCheckbox(driver, element); + } + protected DInput weToDInput(WebElement element) { return new DInput(driver, element); } diff --git a/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/Grid/GridWithoutPagination.java b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/Grid/GridWithoutPagination.java new file mode 100644 index 0000000000000000000000000000000000000000..034ca5bfbb3e32fcec7d9b482503c5f5907bb71e --- /dev/null +++ b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/Grid/GridWithoutPagination.java @@ -0,0 +1,130 @@ +package ddsl.dcomponents.Grid; + +import ddsl.dcomponents.DComponent; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.PageFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.NoSuchElementException; + +public class GridWithoutPagination extends DComponent { + + protected static final By gridHeadersLocator = By.cssSelector("table thead th"); + protected static final By gridRowsLocator = By.cssSelector("table tbody tr"); + private final static Logger LOG = LoggerFactory.getLogger(GridWithoutPagination.class); + private final WebElement parentElement; + + + public GridWithoutPagination(WebDriver driver, WebElement parentElement) { + super(driver); + PageFactory.initElements(driver, this); + this.parentElement = parentElement; + wait.forXMillis(200); + } + + public List<WebElement> getGridHeaders() { + return parentElement.findElements(gridHeadersLocator); + } + + public List<WebElement> getRows() { + return parentElement.findElements(gridRowsLocator); + } + + public List<WebElement> getCells(WebElement row) { + return row.findElements(By.cssSelector("td")); + } + + public void searchAndDoubleClickElementInColumn(String columnName, String value) { + + wait.forXMillis(100); + List<WebElement> rowHeaders = getGridHeaders(); + int columnIndex = -1; + for (int i = 0; i < rowHeaders.size(); i++) { + if (rowHeaders.get(i).getText().equals(columnName)) { + columnIndex = i; + break; + } + } + if (columnIndex == -1) { + LOG.error("No element found"); + throw new NoSuchElementException("Column not found"); + } + + + List<WebElement> rows = getRows(); + for (WebElement row : rows) { + List<WebElement> cells = getCells(row); + WebElement currentCell = cells.get(columnIndex); + if (currentCell.getText().equalsIgnoreCase(value)) { + LOG.debug("Value: " + value + " has been found"); + //Double Click on top right corner of element to prevent clicking on tooltip + Actions act = new Actions(driver); + act.moveToElement(currentCell, currentCell.getSize().getWidth() - 1, 0) + .doubleClick() + .perform(); + + + return; + } + } + LOG.error("Value " + value + " has not been found in the grid"); + } + + public WebElement searchAndGetPrecedentSiblingElementInColumn(String columnName, String value) { + + wait.forXMillis(100); + List<WebElement> rowHeaders = getGridHeaders(); + int columnIndex = -1; + for (int i = 0; i < rowHeaders.size(); i++) { + if (rowHeaders.get(i).getText().equals(columnName)) { + columnIndex = i; + break; + } + } + if (columnIndex == -1) { + return null; + } + List<WebElement> rows = getRows(); + for (WebElement row : rows) { + List<WebElement> cells = getCells(row); + WebElement currentCell = cells.get(columnIndex); + if (currentCell.getText().equals(value)) { + LOG.debug("[{}] found", value); + return currentCell.findElement(By.xpath("preceding-sibling::*")); + } + } + return null; + } + + public WebElement searchAndGetFollowingSiblingElementInColumn(String columnName, String value) { + + wait.forXMillis(100); + List<WebElement> rowHeaders = getGridHeaders(); + int columnIndex = -1; + for (int i = 0; i < rowHeaders.size(); i++) { + if (rowHeaders.get(i).getText().equals(columnName)) { + columnIndex = i; + break; + } + } + if (columnIndex == -1) { + return null; + } + List<WebElement> rows = getRows(); + for (WebElement row : rows) { + List<WebElement> cells = getCells(row); + WebElement currentCell = cells.get(columnIndex); + if (currentCell.getText().equals(value)) { + LOG.debug("[{}] found", value); + return currentCell.findElement(By.xpath("following-sibling::*")); + } + } + return null; + } + +} diff --git a/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/commonComponents/domanPropertyEditDialog/DomainPropertyEditDialog.java b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/commonComponents/domanPropertyEditDialog/DomainPropertyEditDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..948d9a38d023f410ce83be15f96271fb1257f05b --- /dev/null +++ b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dcomponents/commonComponents/domanPropertyEditDialog/DomainPropertyEditDialog.java @@ -0,0 +1,73 @@ +package ddsl.dcomponents.commonComponents.domanPropertyEditDialog; + +import ddsl.dcomponents.DComponent; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class DomainPropertyEditDialog extends DComponent { + + @FindBy(css = "#mat-expansion-panel-header-1") + private WebElement propertyNameExpand; + @FindBy(css = "mat-card-content mat-checkbox:nth-of-type(1)") + private WebElement useDefaultValueCheckBox; + @FindBy(css = "mat-card-content mat-form-field div div input") + private WebElement domainValueInput; + @FindBy(css = "mat-card-content mat-checkbox:nth-of-type(2)") + private WebElement domainValueCheckbox; + @FindBy(id = "updatePropertyButton") + private WebElement okBtn; + @FindBy(css = ".mat-mdc-dialog-actions > button:nth-child(2)") + private WebElement cancelBtn; + + public DomainPropertyEditDialog(WebDriver driver) { + super(driver); + PageFactory.initElements(driver, this); + wait.forElementToBeVisible(cancelBtn); + } + + public void setDomainValue(String domainValue) throws Exception { + if (weToDChecked(useDefaultValueCheckBox).isChecked()) { + weToDChecked(useDefaultValueCheckBox).uncheck(); + } + if (weToDInput(domainValueInput).isEnabled()) { + weToDInput(domainValueInput).fill(domainValue); + } + } + + public void setDomainValue(boolean isEnabled) throws Exception { + if (weToDChecked(useDefaultValueCheckBox).isChecked()) { + weToDChecked(useDefaultValueCheckBox).uncheck(); + } + + if (isEnabled) { + if (!weToDChecked(domainValueCheckbox).isChecked()) { + weToDChecked(domainValueCheckbox).check(); + } + } else { + if (weToDChecked(domainValueCheckbox).isChecked()) { + weToDChecked(domainValueCheckbox).uncheck(); + } + } + } + + public void enableSystemValue() throws Exception { + if (!weToDChecked(useDefaultValueCheckBox).isChecked()) { + weToDChecked(useDefaultValueCheckBox).check(); + } + } + + public void disableSystemValue() throws Exception { + if (weToDChecked(useDefaultValueCheckBox).isChecked()) { + weToDChecked(useDefaultValueCheckBox).uncheck(); + } + } + + public void pressOk() { + if (weToDButton(okBtn).isEnabled()) { + weToDButton(okBtn).click(); + } + } + +} diff --git a/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dobjects/DCheckbox.java b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dobjects/DCheckbox.java new file mode 100644 index 0000000000000000000000000000000000000000..5eb7e86ac3c4e3f6d123101f61d7ad5c6032fb37 --- /dev/null +++ b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dobjects/DCheckbox.java @@ -0,0 +1,65 @@ +package ddsl.dobjects; + +import org.openqa.selenium.By; +import org.openqa.selenium.ElementNotInteractableException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.List; + +public class DCheckbox extends DObject { + WebElement labelElement; + WebElement input; + + public DCheckbox(WebDriver driver, WebElement element) { + this(driver, element, null); + input = element.findElement(By.cssSelector("input[type='checkbox']")); + } + + public DCheckbox(WebDriver driver, WebElement element, WebElement labelElement) { + super(driver, element); + + this.labelElement = labelElement; + } + + public boolean isChecked() throws Exception { + if (isPresent()) { + if (null != input.getAttribute("checked")) { + return true; + } + List<WebElement> input = element.findElements(By.cssSelector("input[type='checkbox']")); + return !input.isEmpty() && null != input.get(0).getAttribute("checked"); + } + throw new DObjectNotPresentException(); + } + + public void check() throws Exception { + if (isChecked()) return; + if (isEnabled()) { + clickCheckbox(); + wait.forAttributeToContain(element, "class", "checkbox-checked"); + return; + } + throw new Exception("Checkbox is not enabled"); + } + + public void uncheck() throws Exception { + if (!isChecked()) return; + if (isEnabled()) { + clickCheckbox(); + wait.forAttributeToNOTContain(this.element, "class", "checkbox-checked"); + return; + } + throw new Exception("Checkbox is not enabled"); + } + + private void clickCheckbox() { + try { + input.click(); + } catch (ElementNotInteractableException ex) { + // in mat-checkbox the input is actually hidden, and the user has to click on the label to interact with it + if (this.labelElement != null) + this.labelElement.click(); + } + } +} diff --git a/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dobjects/DObjectNotPresentException.java b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dobjects/DObjectNotPresentException.java new file mode 100644 index 0000000000000000000000000000000000000000..a4fa880193b5a3f42406c3475b0eba5927375c20 --- /dev/null +++ b/domismp-tests/domismp-tests-ui/src/main/java/ddsl/dobjects/DObjectNotPresentException.java @@ -0,0 +1,4 @@ +package ddsl.dobjects; + +public class DObjectNotPresentException extends Exception { +} 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 881ee4cc94439c8faca222ed0ee771d31ca73ea2..09094bbb3899702207d770aa33ba700a84fe4647 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 0000000000000000000000000000000000000000..b5b5367a323a58a2f738cbdc649f5b612c79d8fc --- /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/pages/administration/editDomainsPage/EditDomainsPage.java b/domismp-tests/domismp-tests-ui/src/main/java/pages/administration/editDomainsPage/EditDomainsPage.java index 0e50e00bd975998e4eed058b94f05067b7b665d7..6da79d384077db65236b2448d1a3555426b1e395 100644 --- a/domismp-tests/domismp-tests-ui/src/main/java/pages/administration/editDomainsPage/EditDomainsPage.java +++ b/domismp-tests/domismp-tests-ui/src/main/java/pages/administration/editDomainsPage/EditDomainsPage.java @@ -4,6 +4,8 @@ import ddsl.CommonPageWithTabsAndGrid; import org.openqa.selenium.WebDriver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import pages.systemSettings.domainsPage.ConfigurationTab.ConfigurationTab; + /** * Page object for the Edit domains page. This contains the locators of the page and the methods for the behaviour of the page */ @@ -20,6 +22,12 @@ public class EditDomainsPage extends CommonPageWithTabsAndGrid { return new DomainMembersTab(driver); } + public ConfigurationTab getConfigurationTab() { + + return new ConfigurationTab(driver); + } + + public GroupTab getGroupTab() { return new GroupTab(driver); diff --git a/domismp-tests/domismp-tests-ui/src/main/java/pages/administration/editGroupsPage/CreateResourceDetailsDialog.java b/domismp-tests/domismp-tests-ui/src/main/java/pages/administration/editGroupsPage/CreateResourceDetailsDialog.java index 01972941a72add59ff6ed56b915e422368fabb9c..6986c20a10106c3c60a22e52b77d6f41ccef9879 100644 --- a/domismp-tests/domismp-tests-ui/src/main/java/pages/administration/editGroupsPage/CreateResourceDetailsDialog.java +++ b/domismp-tests/domismp-tests-ui/src/main/java/pages/administration/editGroupsPage/CreateResourceDetailsDialog.java @@ -46,12 +46,17 @@ public class CreateResourceDetailsDialog extends DComponent { } public Boolean tryClickOnSave() { - wait.forElementToBeClickable(saveBtn); - if (weToDButton(saveBtn).isEnabled()) { - weToDButton(saveBtn).click(); - return true; - } else { + try { + wait.forElementToBeClickable(saveBtn); + if (weToDButton(saveBtn).isEnabled()) { + weToDButton(saveBtn).click(); + return true; + } else { + return false; + } + } catch (Exception e) { return false; } } + } diff --git a/domismp-tests/domismp-tests-ui/src/main/java/pages/systemSettings/domainsPage/ConfigurationTab/ConfigurationTab.java b/domismp-tests/domismp-tests-ui/src/main/java/pages/systemSettings/domainsPage/ConfigurationTab/ConfigurationTab.java new file mode 100644 index 0000000000000000000000000000000000000000..499666615934c1cf097f4514c749f290e9c025ef --- /dev/null +++ b/domismp-tests/domismp-tests-ui/src/main/java/pages/systemSettings/domainsPage/ConfigurationTab/ConfigurationTab.java @@ -0,0 +1,62 @@ +package pages.systemSettings.domainsPage.ConfigurationTab; + +import ddsl.dcomponents.DComponent; +import ddsl.dcomponents.Grid.GridWithoutPagination; +import ddsl.dcomponents.commonComponents.domanPropertyEditDialog.DomainPropertyEditDialog; +import org.openqa.selenium.By; +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; + +/** + * Page object for the Configuration tab of Domains/Edit Domains page. This contains the locators of the page and the methods for the behaviour of the page + */ +public class ConfigurationTab extends DComponent { + private final static Logger LOG = LoggerFactory.getLogger(ConfigurationTab.class); + + @FindBy(css = "[class~=smp-column-data]") + public WebElement rightPanel; + @FindBy(id = "saveButton") + public WebElement saveBtn; + + + public ConfigurationTab(WebDriver driver) { + super(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getWaitTimeShort()), this); + } + + private GridWithoutPagination getConfigurationGrid() { + return new GridWithoutPagination(driver, rightPanel); + } + + public DomainPropertyEditDialog openProperty(String propertyName) { + getConfigurationGrid().searchAndDoubleClickElementInColumn("Domain property", propertyName); + return new DomainPropertyEditDialog(driver); + } + + public void saveChanges() { + try { + weToDButton(saveBtn).click(); + } catch (Exception e) { + LOG.error("Could not save changes on Configuration tab!"); + } + } + + public Boolean isSystemValueUsed(String propertyName) { + WebElement currentCell = getConfigurationGrid().searchAndGetPrecedentSiblingElementInColumn("Domain property", propertyName); + //check if previous sibling is checked + return currentCell.findElement(By.cssSelector("mat-checkbox")).getAttribute("class").contains("checkbox-checked"); + } + + public String getCurrentPropertyValue(String propertyName) { + WebElement currentCell = getConfigurationGrid().searchAndGetFollowingSiblingElementInColumn("Domain property", propertyName); + //check if previous sibling is checked + return currentCell.getText(); + } + + +} diff --git a/domismp-tests/domismp-tests-ui/src/main/java/pages/systemSettings/domainsPage/DomainsPage.java b/domismp-tests/domismp-tests-ui/src/main/java/pages/systemSettings/domainsPage/DomainsPage.java index 9c95a1c4a9b44a06e332455794dcdb0e79b564f6..0d4837592d59396697c6bd8721100dd127c775b7 100644 --- a/domismp-tests/domismp-tests-ui/src/main/java/pages/systemSettings/domainsPage/DomainsPage.java +++ b/domismp-tests/domismp-tests-ui/src/main/java/pages/systemSettings/domainsPage/DomainsPage.java @@ -7,14 +7,17 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import pages.systemSettings.domainsPage.ConfigurationTab.ConfigurationTab; /** * Page object for the Users page. This contains the locators of the page and the methods for the behaviour of the page */ public class DomainsPage extends CommonPageWithTabsAndGrid { private final static Logger LOG = LoggerFactory.getLogger(DomainsPage.class); + @FindBy(css = "smp-warning-panel span") private WebElement warningLabel; + public DomainsPage(WebDriver driver) { super(driver); LOG.debug("Loading Domains page."); @@ -24,11 +27,6 @@ public class DomainsPage extends CommonPageWithTabsAndGrid { return new DButton(driver, addBtn); } - public ResourceTab getResourceTab() { - - return new ResourceTab(driver); - } - public DomainTab getDomainTab() { return new DomainTab(driver); @@ -44,6 +42,11 @@ public class DomainsPage extends CommonPageWithTabsAndGrid { return new MembersTab(driver); } + public ConfigurationTab getConfigurationTab() { + + return new ConfigurationTab(driver); + } + public String getDomainWarningMessage() { return warningLabel.getText(); } diff --git a/domismp-tests/domismp-tests-ui/src/main/java/rest/DomainClient.java b/domismp-tests/domismp-tests-ui/src/main/java/rest/DomainClient.java index 5381669def0680176c8490273202b4ac8559f1af..c4e1161aff8ab5c0f3798ef7c2c9d6c73df4a8bd 100644 --- a/domismp-tests/domismp-tests-ui/src/main/java/rest/DomainClient.java +++ b/domismp-tests/domismp-tests-ui/src/main/java/rest/DomainClient.java @@ -30,11 +30,12 @@ public class DomainClient extends BaseRestClient { public DomainModel createDomain(DomainModel domainModel) { JSONObject domainJson = new JSONObject(domainModel); + startSession(); String createDomainPath = RestServicePaths.getCreateDomainPath(TestRunData.getInstance().getUserId()); ClientResponse response = jsonPUT(resource.path(createDomainPath), domainJson); if (response.getStatus() != 200) { try { - throw new SMPRestException("Could not create domain", response); + throw new SMPRestException("Could not create domain", response.getStatus(), response.getEntity(String.class)); } catch (SMPRestException e) { throw new RuntimeException(e); } @@ -51,7 +52,7 @@ public class DomainClient extends BaseRestClient { ClientResponse response = jsonPUT(resource.path(addMemberPath), membersJson); if (response.getStatus() != 200) { try { - throw new SMPRestException("Could not create domain", response); + throw new SMPRestException("Could not create domain", response.getStatus(), response.getEntity(String.class)); } catch (SMPRestException e) { throw new RuntimeException(e); } @@ -72,7 +73,7 @@ public class DomainClient extends BaseRestClient { ClientResponse response = requestPOST(resource.path(addMemberPath), resourceTypes); if (response.getStatus() != 200) { try { - throw new SMPRestException("Could not add resource!", response); + throw new SMPRestException("Could not add resource!", response.getStatus(), response.getEntity(String.class)); } catch (SMPRestException e) { throw new RuntimeException(e); } @@ -87,7 +88,7 @@ public class DomainClient extends BaseRestClient { ClientResponse response = jsonPUT(resource.path(createGroupPath), groupJson); if (response.getStatus() != 200) { try { - throw new SMPRestException("Could not create group!", response); + throw new SMPRestException("Could not create group!", response.getStatus(), response.getEntity(String.class)); } catch (SMPRestException e) { throw new RuntimeException(e); } 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 0000000000000000000000000000000000000000..9c72b1140fd91c18b01a91f1d0b212b184b0d8c5 --- /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/rest/SMPRestException.java b/domismp-tests/domismp-tests-ui/src/main/java/rest/SMPRestException.java index b4b70374fb0295a44241819d490abf494c6ebf17..84cb1cf4607fac674afe4a325467f62343b8b234 100644 --- a/domismp-tests/domismp-tests-ui/src/main/java/rest/SMPRestException.java +++ b/domismp-tests/domismp-tests-ui/src/main/java/rest/SMPRestException.java @@ -18,4 +18,15 @@ public class SMPRestException extends Exception { "CONTENT = " + response.getEntity(String.class))); } + public SMPRestException(String message, int responseStatus, String responseContent) { + super(String.format("%s \n %s \n %s \n", + message, + "STATUS = " + responseStatus, + "CONTENT = " + responseContent)); + log.error(String.format("%s \n %s \n %s \n", + message, + "STATUS = " + responseStatus, + "CONTENT = " + responseContent)); + } + } 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 70c7ad78fee218f2ab9eac44e550bfcc5828836d..ec1b8b3e1cbd090f7178ca194ae9584a59dd3b54 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 91ecbb1a2a4469166b90b7c561e58ed6e3c89360..39f6ea0c174591df02fb7859c62c08da55d4ad39 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/DomainsPgTests.java b/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/DomainsPgTests.java index 782e0272cdd97512f33f4d020667abf9150eb2be..e7dde0bd0c4d018e032c69b7031de2f19099e139 100644 --- a/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/DomainsPgTests.java +++ b/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/DomainsPgTests.java @@ -1,7 +1,9 @@ package domiSMPTests.ui; import ddsl.DomiSMPPage; +import ddsl.dcomponents.commonComponents.domanPropertyEditDialog.DomainPropertyEditDialog; import ddsl.enums.Pages; +import ddsl.enums.ResourceTypes; import ddsl.enums.ResponseCertificates; import domiSMPTests.SeleniumTest; import org.openqa.selenium.WebElement; @@ -13,7 +15,12 @@ import pages.SmlPage; import pages.administration.editDomainsPage.EditDomainsPage; import pages.systemSettings.domainsPage.DomainsPage; import rest.models.DomainModel; +import rest.models.MemberModel; import rest.models.UserModel; +import utils.TestRunData; + +import java.util.Arrays; +import java.util.List; /** * This class has the tests against Domains Page @@ -173,4 +180,79 @@ public class DomainsPgTests extends SeleniumTest { soft.assertAll(); } + + @Test(description = "DOM-19 - Domain admins are able to change default properties for domains") + public void systemAdminsAreAbleToChangeDefaultPropertiesForDomains() throws Exception { + DomainModel domainModel = DomainModel.generatePublicDomainModelWithSML(); + + MemberModel superMember = new MemberModel(); + superMember.setUsername(TestRunData.getInstance().getAdminUsername()); + superMember.setRoleType("ADMIN"); + + //create domain + domainModel = rest.domains().createDomain(domainModel); + + // rest.domains().addMembersToDomain(domainModel, adminMember); + rest.domains().addMembersToDomain(domainModel, superMember); + + //add resources to domain + List<ResourceTypes> resourcesToBeAdded = Arrays.asList(ResourceTypes.OASIS1, ResourceTypes.OASIS3, ResourceTypes.OASIS2); + domainModel = rest.domains().addResourcesToDomain(domainModel, resourcesToBeAdded); + + domainsPage.refreshPage(); + domainsPage + .getLeftSideGrid().searchAndClickElementInColumn("Domain code", domainModel.getDomainCode()); + domainsPage.goToTab("Configuration"); + + //Check is modifying boolean values + String boolPropertyName = "identifiersBehaviour.scheme.mandatory"; + DomainPropertyEditDialog domainPropertyEditDialog = domainsPage.getConfigurationTab().openProperty(boolPropertyName); + domainPropertyEditDialog.setDomainValue(false); + domainPropertyEditDialog.pressOk(); + domainsPage.getConfigurationTab().saveChanges(); + + //verify changes + soft.assertFalse(domainsPage.getConfigurationTab().isSystemValueUsed(boolPropertyName), "Property is marked as it's using system value"); + soft.assertEquals("false", domainsPage.getConfigurationTab().getCurrentPropertyValue(boolPropertyName)); + + + //Verify disabling system property + String useDomainProperty = "identifiersBehaviour.ParticipantIdentifierScheme.validationRegex"; + domainPropertyEditDialog = domainsPage.getConfigurationTab().openProperty(useDomainProperty); + domainPropertyEditDialog.disableSystemValue(); + domainPropertyEditDialog.pressOk(); + domainsPage.getConfigurationTab().saveChanges(); + //verify changes + soft.assertFalse(domainsPage.getConfigurationTab().isSystemValueUsed(useDomainProperty), "Property is marked as it's using system value"); + + //Verify change to enabling system property + domainPropertyEditDialog = domainsPage.getConfigurationTab().openProperty(useDomainProperty); + domainPropertyEditDialog.enableSystemValue(); + domainPropertyEditDialog.pressOk(); + domainsPage.getConfigurationTab().saveChanges(); + //verify changes + soft.assertTrue(domainsPage.getConfigurationTab().isSystemValueUsed(useDomainProperty)); + + // String property value + String stringProperty = "identifiersBehaviour.caseSensitive.DocumentIdentifierSchemes"; + String defaultPropertyValue = domainsPage.getConfigurationTab().getCurrentPropertyValue(stringProperty); + + domainPropertyEditDialog = domainsPage.getConfigurationTab().openProperty(stringProperty); + domainPropertyEditDialog.setDomainValue("${identifier}${identifier}"); + domainPropertyEditDialog.pressOk(); + domainsPage.getConfigurationTab().saveChanges(); + + soft.assertFalse(domainsPage.getConfigurationTab().isSystemValueUsed(stringProperty), "Property is marked as it's using system value"); + soft.assertTrue(domainsPage.getConfigurationTab().getCurrentPropertyValue(stringProperty).equalsIgnoreCase("${identifier}${identifier}"), "Configuration table is not showing updated value"); + + //Check if the property value is updated with system value after use system value is enabled + domainPropertyEditDialog = domainsPage.getConfigurationTab().openProperty(stringProperty); + domainPropertyEditDialog.enableSystemValue(); + domainPropertyEditDialog.pressOk(); + domainsPage.getConfigurationTab().saveChanges(); + soft.assertTrue(domainsPage.getConfigurationTab().getCurrentPropertyValue(stringProperty).equalsIgnoreCase(defaultPropertyValue), "Configuration table is not showing system value"); + + soft.assertAll(); + } + } diff --git a/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/EditDomainsPgTests.java b/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/EditDomainsPgTests.java index 4a3e9b535bacc133f21e69f8bcbcc5118062151f..65b6252bf99be7085b387795e08323419acb8e32 100644 --- a/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/EditDomainsPgTests.java +++ b/domismp-tests/domismp-tests-ui/src/test/java/domiSMPTests/ui/EditDomainsPgTests.java @@ -1,8 +1,10 @@ package domiSMPTests.ui; import ddsl.DomiSMPPage; +import ddsl.dcomponents.commonComponents.domanPropertyEditDialog.DomainPropertyEditDialog; import ddsl.dcomponents.commonComponents.members.InviteMembersWithGridPopup; import ddsl.enums.Pages; +import ddsl.enums.ResourceTypes; import domiSMPTests.SeleniumTest; import org.openqa.selenium.WebElement; import org.testng.annotations.BeforeMethod; @@ -11,11 +13,13 @@ import org.testng.asserts.SoftAssert; import pages.LoginPage; import pages.administration.editDomainsPage.CreateGroupDetailsDialog; import pages.administration.editDomainsPage.EditDomainsPage; +import pages.administration.editGroupsPage.CreateResourceDetailsDialog; import pages.administration.editGroupsPage.EditGroupsPage; -import rest.models.DomainModel; -import rest.models.GroupModel; -import rest.models.MemberModel; -import rest.models.UserModel; +import rest.models.*; +import utils.TestRunData; + +import java.util.Arrays; +import java.util.List; /** * Test class for Edit domains page tests. @@ -28,6 +32,10 @@ public class EditDomainsPgTests extends SeleniumTest { EditDomainsPage editDomainPage; DomainModel domainModel; UserModel adminUser; + UserModel normalUser; + MemberModel memberAdmin; + MemberModel memberUser; + SoftAssert soft; @BeforeMethod(alwaysRun = true) @@ -35,14 +43,24 @@ public class EditDomainsPgTests extends SeleniumTest { soft = new SoftAssert(); domainModel = DomainModel.generatePublicDomainModelWithSML(); adminUser = UserModel.generateUserWithADMINrole(); + normalUser = UserModel.generateUserWithUSERrole(); + + memberAdmin = new MemberModel(); + memberAdmin.setUsername(adminUser.getUsername()); + memberAdmin.setRoleType("ADMIN"); - MemberModel domainMember = new MemberModel(); - domainMember.setUsername(adminUser.getUsername()); - domainMember.setRoleType("ADMIN"); + memberUser = new MemberModel(); + memberUser.setUsername(normalUser.getUsername()); + memberUser.setRoleType("ADMIN"); rest.users().createUser(adminUser); + rest.users().createUser(normalUser); + domainModel = rest.domains().createDomain(domainModel); - rest.domains().addMembersToDomain(domainModel, domainMember); + + rest.domains().addMembersToDomain(domainModel, memberAdmin); + rest.domains().addMembersToDomain(domainModel, memberUser); + homePage = new DomiSMPPage(driver); loginPage = homePage.goToLoginPage(); @@ -134,4 +152,161 @@ public class EditDomainsPgTests extends SeleniumTest { soft.assertEquals(deleteMessage, String.format("Domain group [%s] deleted", groupToBeDeleted.getGroupName())); soft.assertAll(); } + + @Test(description = "EDTDOM-09 Domain admins are able to change default properties for domains") + public void domainAdminsAreAbleToChangeDefaultPropertiesForDomains() throws Exception { + DomainModel currentDomainModel = DomainModel.generatePublicDomainModelWithSML(); + //create domain + currentDomainModel = rest.domains().createDomain(currentDomainModel); + // rest.domains().addMembersToDomain(domainModel, adminMember); + rest.domains().addMembersToDomain(currentDomainModel, memberUser); + //add resources to domain + List<ResourceTypes> resourcesToBeAdded = Arrays.asList(ResourceTypes.OASIS1, ResourceTypes.OASIS3, ResourceTypes.OASIS2); + currentDomainModel = rest.domains().addResourcesToDomain(currentDomainModel, resourcesToBeAdded); + + editDomainPage.logout(); + //Login with user role which is domain admin + loginPage.login(normalUser.getUsername(), data.getNewPassword()); + editDomainPage = homePage.getSidebar().navigateTo(Pages.ADMINISTRATION_EDIT_DOMAINS); + editDomainPage + .getLeftSideGrid().searchAndClickElementInColumn("Domain code", currentDomainModel.getDomainCode()); + editDomainPage.goToTab("Configuration"); + + //Check is modifying boolean values + String boolPropertyName = "identifiersBehaviour.scheme.mandatory"; + DomainPropertyEditDialog domainPropertyEditDialog = editDomainPage.getConfigurationTab().openProperty(boolPropertyName); + domainPropertyEditDialog.setDomainValue(false); + domainPropertyEditDialog.pressOk(); + editDomainPage.getConfigurationTab().saveChanges(); + + //verify changes + soft.assertFalse(editDomainPage.getConfigurationTab().isSystemValueUsed(boolPropertyName), "Property is marked as it's using system value"); + soft.assertEquals("false", editDomainPage.getConfigurationTab().getCurrentPropertyValue(boolPropertyName)); + + + //Verify disabling system property + String useDomainProperty = "identifiersBehaviour.ParticipantIdentifierScheme.validationRegex"; + domainPropertyEditDialog = editDomainPage.getConfigurationTab().openProperty(useDomainProperty); + domainPropertyEditDialog.disableSystemValue(); + domainPropertyEditDialog.pressOk(); + editDomainPage.getConfigurationTab().saveChanges(); + //verify changes + soft.assertFalse(editDomainPage.getConfigurationTab().isSystemValueUsed(useDomainProperty), "Property is marked as it's using system value"); + + //Verify change to enabling system property + domainPropertyEditDialog = editDomainPage.getConfigurationTab().openProperty(useDomainProperty); + domainPropertyEditDialog.enableSystemValue(); + domainPropertyEditDialog.pressOk(); + editDomainPage.getConfigurationTab().saveChanges(); + //verify changes + soft.assertTrue(editDomainPage.getConfigurationTab().isSystemValueUsed(useDomainProperty)); + + // String property value + String stringProperty = "identifiersBehaviour.caseSensitive.DocumentIdentifierSchemes"; + String defaultPropertyValue = editDomainPage.getConfigurationTab().getCurrentPropertyValue(stringProperty); + + domainPropertyEditDialog = editDomainPage.getConfigurationTab().openProperty(stringProperty); + domainPropertyEditDialog.setDomainValue("${identifier}${identifier}"); + domainPropertyEditDialog.pressOk(); + editDomainPage.getConfigurationTab().saveChanges(); + + soft.assertFalse(editDomainPage.getConfigurationTab().isSystemValueUsed(stringProperty), "Property is marked as it's using system value"); + soft.assertTrue(editDomainPage.getConfigurationTab().getCurrentPropertyValue(stringProperty).equalsIgnoreCase("${identifier}${identifier}"), "Configuration table is not showing updated value"); + + //Check if the property value is updated with system value after use system value is enabled + domainPropertyEditDialog = editDomainPage.getConfigurationTab().openProperty(stringProperty); + domainPropertyEditDialog.enableSystemValue(); + domainPropertyEditDialog.pressOk(); + editDomainPage.getConfigurationTab().saveChanges(); + soft.assertTrue(editDomainPage.getConfigurationTab().getCurrentPropertyValue(stringProperty).equalsIgnoreCase(defaultPropertyValue), "Configuration table is not showing system value"); + + soft.assertAll(); + } + + @Test(description = "EDTDOM-11 Domain properties values are applied") + public void domanPropertiesAreApplied() throws Exception { + DomainModel currentDomainModel = DomainModel.generatePublicDomainModelWithSML(); + GroupModel currentGroupModel = GroupModel.generatePublicGroup(); + MemberModel superMember = new MemberModel(); + superMember.setUsername(TestRunData.getInstance().getAdminUsername()); + superMember.setRoleType("ADMIN"); + + + //create domain + currentDomainModel = rest.domains().createDomain(currentDomainModel); + rest.domains().addMembersToDomain(currentDomainModel, memberUser); + rest.domains().addMembersToDomain(currentDomainModel, superMember); + + //add resources to domain + List<ResourceTypes> resourcesToBeAdded = Arrays.asList(ResourceTypes.OASIS1, ResourceTypes.OASIS3, ResourceTypes.OASIS2); + currentDomainModel = rest.domains().addResourcesToDomain(currentDomainModel, resourcesToBeAdded); + + //create group for domain + currentGroupModel = rest.domains().createGroupForDomain(currentDomainModel, currentGroupModel); + + //add users to groups + rest.groups().addMembersToGroup(currentDomainModel, currentGroupModel, memberUser); + + editDomainPage.logout(); + //Login with user role which is domain admin + loginPage.login(normalUser.getUsername(), data.getNewPassword()); + editDomainPage = homePage.getSidebar().navigateTo(Pages.ADMINISTRATION_EDIT_DOMAINS); + editDomainPage + .getLeftSideGrid().searchAndClickElementInColumn("Domain code", currentDomainModel.getDomainCode()); + editDomainPage.goToTab("Configuration"); + + //Remove resource schema mandatory + String boolPropertyName = "identifiersBehaviour.scheme.mandatory"; + DomainPropertyEditDialog domainPropertyEditDialog = editDomainPage.getConfigurationTab().openProperty(boolPropertyName); + domainPropertyEditDialog.setDomainValue(false); + domainPropertyEditDialog.pressOk(); + editDomainPage.getConfigurationTab().saveChanges(); + + + EditGroupsPage editGroupsPage = editDomainPage.getSidebar().navigateTo(Pages.ADMINISTRATION_EDIT_GROUPS); + editGroupsPage.selectDomain(currentDomainModel, currentGroupModel); + editGroupsPage.goToTab("Resources"); + CreateResourceDetailsDialog createResourceDetailsDialog = editGroupsPage.getResourceTab().clickOnCreateNewResource(); + + //create resource without Resource schema field + ResourceModel resourceModel = ResourceModel.generatePublicResource(); + resourceModel.setIdentifierScheme(""); + + + createResourceDetailsDialog.fillResourceDetails(resourceModel); + createResourceDetailsDialog.tryClickOnSave(); + soft.assertTrue(editGroupsPage.getResourceTab().getGrid().isValuePresentInColumn("Identifier", resourceModel.getIdentifierValue()), "Resource was not found in the grid"); + + //Enable resource schema mandatory + editGroupsPage.getSidebar().navigateTo(Pages.ADMINISTRATION_EDIT_DOMAINS); + editDomainPage + .getLeftSideGrid().searchAndClickElementInColumn("Domain code", currentDomainModel.getDomainCode()); + editDomainPage.goToTab("Configuration"); + + domainPropertyEditDialog = editDomainPage.getConfigurationTab().openProperty(boolPropertyName); + domainPropertyEditDialog.enableSystemValue(); + domainPropertyEditDialog.pressOk(); + editDomainPage.getConfigurationTab().saveChanges(); + + //verify is schema is mandatory - using system property value + editGroupsPage.getSidebar().navigateTo(Pages.ADMINISTRATION_EDIT_GROUPS); + editGroupsPage.selectDomain(currentDomainModel, currentGroupModel); + editGroupsPage.goToTab("Resources"); + createResourceDetailsDialog = editGroupsPage.getResourceTab().clickOnCreateNewResource(); + + //create resource without Resource schema field + ResourceModel resourceModel2 = ResourceModel.generatePublicResource(); + resourceModel2.setIdentifierScheme(""); + + + createResourceDetailsDialog.fillResourceDetails(resourceModel2); + Boolean saveisDisabled = createResourceDetailsDialog.tryClickOnSave(); + soft.assertFalse(saveisDisabled, "Save action didn't worked"); + soft.assertFalse(editGroupsPage.getResourceTab().getGrid().isValuePresentInColumn("Identifier", resourceModel2.getIdentifierValue()), "Resource is present in the grid"); + + + soft.assertAll(); + } + + } 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 b95cc9a3263938e634cb5fada311b550085a2a3f..1f3a86eca16022c9b25b4923b5537748b2af9b27 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,186 @@ 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 + 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 + 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