diff --git a/domiSMP-ui-tests/pom.xml b/domiSMP-ui-tests/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e72072c7d093fba031917a4344224a7f9c15f06 --- /dev/null +++ b/domiSMP-ui-tests/pom.xml @@ -0,0 +1,241 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.example</groupId> + <artifactId>domiSMP-ui-tests</artifactId> + <version>1.0-SNAPSHOT</version> + + <properties> + <slf4j_version>2.0.0-alpha0</slf4j_version> + <commons-csv_version>1.5</commons-csv_version> + <selenium-chrome-driver_version>4.8.3</selenium-chrome-driver_version> + <selenium-java_version>4.8.3</selenium-java_version> + <poi-ooxml_version>5.2.3</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>20230227</json_version> + <jackson_version>2.15.0-rc3</jackson_version> + <javax.ws.rs-api_version>2.1.1</javax.ws.rs-api_version> + </properties> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.10.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M7</version> + <configuration> + <failIfNoTests>true</failIfNoTests> + <systemPropertyVariables> + <runBrowser>chrome</runBrowser> + <propertiesFile>./src/main/resources/myLocal.properties</propertiesFile> + </systemPropertyVariables> + <properties> + <property> + <name>surefire.testng.verbose</name> + <value>0</value> + </property> + </properties> + </configuration> + </plugin> + </plugins> + </build> + + <profiles> + + <profile> + <id>selenium_local</id> + <build> + <plugins> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <systemPropertyVariables> + <propertiesFile>./src/main/resources/myLocal.properties</propertiesFile> + </systemPropertyVariables> + <suiteXmlFiles> + <suiteXmlFile>testng.xml</suiteXmlFile> + </suiteXmlFiles> + </configuration> + </plugin> + </plugins> + </build> + </profile> + + <profile> + <id>bamboo-remote</id> + <build> + <plugins> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <systemPropertyVariables> + <propertiesFile>./src/main/resources/bambooE2.properties</propertiesFile> + </systemPropertyVariables> + <suiteXmlFiles> + <suiteXmlFile>testng.xml</suiteXmlFile> + </suiteXmlFiles> + </configuration> + </plugin> + </plugins> + </build> + </profile> + + </profiles> + + <dependencies> + <!-- USED FOR ENHANCED REPORTS--> + <dependency> + <groupId>com.aventstack</groupId> + <artifactId>extentreports</artifactId> + <version>5.0.9</version> + </dependency> + + <!--**************************************--> + <!--FOR DATA DRIVEN TESTS--> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-csv</artifactId> + <version>${commons-csv_version}</version> + </dependency> + + <!--**************************************--> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>1.2.11</version> + </dependency> + + <!--**************************************--> + + + <dependency> + <groupId>org.seleniumhq.selenium</groupId> + <artifactId>selenium-chrome-driver</artifactId> + <version>${selenium-chrome-driver_version}</version> + </dependency> + <dependency> + <groupId>org.seleniumhq.selenium</groupId> + <artifactId>selenium-java</artifactId> + <version>${selenium-java_version}</version> + </dependency> + + <dependency> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + <version>7.4.0</version> + </dependency> + + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-ooxml</artifactId> + <version>${poi-ooxml_version}</version> + </dependency> + + <dependency> + <groupId>org.reflections</groupId> + <artifactId>reflections</artifactId> + <version>0.9.12</version> + </dependency> + + + <dependency> + <groupId>com.sun.jersey</groupId> + <artifactId>jersey-client</artifactId> + <version>${jersey-client_version}</version> + </dependency> + + <dependency> + <groupId>com.sun.jersey.contribs</groupId> + <artifactId>jersey-multipart</artifactId> + <version>${jersey-multipart_version}</version> + </dependency> + + <dependency> + <groupId>org.json</groupId> + <artifactId>json</artifactId> + <version>${json_version}</version> + </dependency> + + + <!-- *********************************************************************************** --> + + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-core</artifactId> + <version>${jackson_version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.jaxrs</groupId> + <artifactId>jackson-jaxrs-json-provider</artifactId> + <version>${jackson_version}</version> + </dependency> + <!-- *********************************************************************************** --> + + + <dependency> + <groupId>javax.ws.rs</groupId> + <artifactId>javax.ws.rs-api</artifactId> + <version>${javax.ws.rs-api_version}</version> + </dependency> + + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-collections4</artifactId> + <version>4.4</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.12.0</version> + </dependency> + <dependency> + <groupId>commons-configuration</groupId> + <artifactId>commons-configuration</artifactId> + <version>1.10</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.11.0</version> + </dependency> + <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>8.0.32</version> + </dependency> + <!-- https://mvnrepository.com/artifact/xmlunit/xmlunit --> + <dependency> + <groupId>xmlunit</groupId> + <artifactId>xmlunit</artifactId> + <version>1.6</version> + </dependency> + + <dependency> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M7</version> + </dependency> + <dependency> + <groupId>org.jetbrains</groupId> + <artifactId>annotations</artifactId> + <version>RELEASE</version> + <scope>compile</scope> + </dependency> + + </dependencies> + +</project> diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/AlertComponent.java b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/AlertComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..e9fbd067029b145fdf4f4042ca6e5ca3e6e1d84b --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/AlertComponent.java @@ -0,0 +1,48 @@ +package ddsl.dcomponents; + +import ddsl.dobjects.DObject; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AlertComponent extends DComponent { + private final static Logger LOG = LoggerFactory.getLogger(AlertComponent.class); + + @FindBy(id = "alertmessage_id") + public WebElement alertToaster; + @FindBy(css = "#alertmessage_id > span.closebtn") + public WebElement closeButton; + + public AlertComponent(WebDriver driver) { + super(driver); + } + + public void closeAlert() throws Exception { + weToDButton(closeButton).click(); + } + + public String getAlertMessage() { + try { + wait.forElementToBeVisible(alertToaster, true); + + LOG.error(closeButton.getText()); + } catch (Exception e) { + } + DObject alertObject = new DObject(driver, alertToaster); + + if (!alertObject.isPresent()) { + LOG.debug("No messages displayed."); + return null; + } + + String messageTxt = alertToaster.getText().replace(closeButton.getText(), "").replaceAll("\n", "").trim(); + + LOG.debug("messageTxt = " + messageTxt); + + LOG.debug("Getting alert message ..."); + return messageTxt.trim(); + } + +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/BreadcrumpComponent.java b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/BreadcrumpComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..117b03067762f40d709fd6a951fb76387c28ea95 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/BreadcrumpComponent.java @@ -0,0 +1,26 @@ +package ddsl.dcomponents; + + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import java.util.List; + +public class BreadcrumpComponent extends DomiSMPPage { + + @FindBy(xpath = "//smp-breadcrumb/div/smp-breadcrumb-item/a/div[3]/span") + public List<WebElement> BreadcrumpItems; + + public BreadcrumpComponent(WebDriver driver) { + super(driver); + } + + public String getCurrentPage() { + int numOflinks = BreadcrumpItems.size(); + + return BreadcrumpItems.get(numOflinks - 1).getText(); + } + + +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DComponent.java b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..5b1e6203dccf2c080b30705e353a410c7c4fae38 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DComponent.java @@ -0,0 +1,36 @@ +package ddsl.dcomponents; + +import ddsl.dobjects.DButton; +import ddsl.dobjects.DInput; +import ddsl.dobjects.DSelect; +import ddsl.dobjects.DWait; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import utils.TestRunData; + +public class DComponent { + + private final static Logger LOG = LoggerFactory.getLogger(DComponent.class); + public DWait wait; + protected WebDriver driver; + protected TestRunData data = new TestRunData(); + + public DComponent(WebDriver driver) { + this.driver = driver; + this.wait = new DWait(driver); + } + + protected DButton weToDButton(WebElement element) { + return new DButton(driver, element); + } + + protected DInput weToDInput(WebElement element) { + return new DInput(driver, element); + } + + protected DSelect weToDSelect(WebElement element) { + return new DSelect(driver, element); + } +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DomiSMPPage.java b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DomiSMPPage.java new file mode 100644 index 0000000000000000000000000000000000000000..62c88f5864af2a582fc529ba846b082c3442b790 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DomiSMPPage.java @@ -0,0 +1,68 @@ +package ddsl.dcomponents; + + +import ddsl.dobjects.DButton; +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 pages.LoginPage; + +public class DomiSMPPage extends DComponent { + + /** + * Page object for the common components from Domismp like navigation, right menu. This contains the locators of the page and the methods for the behaviour of the page + */ + + @FindBy(css = "page-header > h1") + protected WebElement pageTitle; + @FindBy(id = "login_id") + private WebElement loginBtnTop; + @FindBy(id = "settingsmenu_id") + private WebElement rightMenuBtn; + @FindBy(id = "logout_id") + private WebElement logoutMenuBtn; + @FindBy(className = "smp-expired-password-dialog") + private WebElement expiredPasswordDialog; + + @FindBy(css = "#okbuttondialog_id ") + private WebElement dialogOKbutton; + + + public DomiSMPPage(WebDriver driver) { + super(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getTIMEOUT()), this); + } + + public SideNavigationComponent getSidebar() { + return new SideNavigationComponent(driver); + } + + public BreadcrumpComponent getBreadcrump() { + return new BreadcrumpComponent(driver); + } + + public LoginPage goToLoginPage() { + loginBtnTop.click(); + return new LoginPage(driver); + } + + public LoginPage logout() { + rightMenuBtn.click(); + logoutMenuBtn.click(); + return new LoginPage(driver); + } + + public void refreshPage() { + driver.navigate().refresh(); + } + + public AlertComponent getAlertArea() { + return new AlertComponent(driver); + } + + public DButton getExpiredDialoginbutton() { + return weToDButton(dialogOKbutton); + } +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/SideNavigationComponent.java b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/SideNavigationComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..d35c7e7b66bc2ff5f861add7806e3f940963a355 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/SideNavigationComponent.java @@ -0,0 +1,197 @@ +package ddsl.dcomponents; + +import ddsl.enums.Pages; +import org.openqa.selenium.ElementNotInteractableException; +import org.openqa.selenium.NoSuchElementException; +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.ProfilePage; + +import java.util.Objects; + +public class SideNavigationComponent extends DomiSMPPage { + private final static Logger LOG = LoggerFactory.getLogger(SideNavigationComponent.class); + + @FindBy(id = "window-sidenav-panel") + public WebElement sideBar; + + // --------------------Search------------------------- + @FindBy(id = "search-resourcesButton") + private WebElement resourcesLnk; + + @FindBy(id = "search-toolsButton") + private WebElement resourcesExpandLnk; + // ---------------------------------------------------- + + // --------------Administration--------------------------- + @FindBy(id = "edit-domainButton") + private WebElement editDomainsLnk; + + @FindBy(id = "edit-groupButton") + private WebElement editGroupsLnk; + + @FindBy(id = "edit-resourceButton") + private WebElement editResourcesLnk; + + @FindBy(id = "editButton") + private WebElement administrationExpand; + // ---------------------------------------------------- + + // --------------System Settings --------------------------- + @FindBy(id = "system-admin-userButton") + private WebElement usersLnk; + + @FindBy(id = "system-admin-domainButton") + private WebElement domainsLnk; + + @FindBy(id = "system-admin-keystoreButton") + private WebElement keystoreLnk; + @FindBy(id = "system-admin-truststoreButton") + private WebElement truststoreLnk; + + @FindBy(id = "system-admin-extensionButton") + private WebElement extensionsLnk; + + @FindBy(id = "system-admin-propertiesButton") + private WebElement propertiesLnk; + + @FindBy(id = "system-admin-alertButton") + private WebElement alersLnk; + + @FindBy(id = "system-settingsButton") + private WebElement systemSettingsExpand; + // ---------------------------------------------------- + + // --------------User Settings--------------------------- + @FindBy(id = "user-data-profileButton") + private WebElement profileLnk; + + @FindBy(id = "user-data-access-tokenButton") + private WebElement accessTokensLnk; + + @FindBy(id = "user-data-certificatesButton") + private WebElement certificatesLnk; + + @FindBy(id = "user-dataButton") + private WebElement userSettingsExpand; + // ---------------------------------------------------- + + public SideNavigationComponent(WebDriver driver) { + super(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, 1), this); + } + + private MenuNavigation getNavigationLinks(Pages pages) { + if (Objects.requireNonNull(pages) == Pages.USER_SETTINGS_PROFILE) { + return new MenuNavigation(userSettingsExpand, profileLnk); + } + return null; + } + + public DomiSMPPage navigateTo(Pages page) { + + wait.forElementToHaveText(sideBar); + + LOG.debug("Get link to " + page.name()); + // case SEARCH_RESOURCES: + // expandSection(resourcesExpandLnk); + // return new DLink(driver, resourcesLnk); + // case ADMINISTRATION_EDIT_DOMAINS: + // expandSection(administrationExpand); + // return new DLink(driver, editDomainsLnk); + // case ADMINISTRATION_EDIT_GROUPS: + // expandSection(administrationExpand); + // return new DLink(driver, editGroupsLnk); + // case ADMINISTRATION_EDIT_RESOURCES: + // expandSection(administrationExpand); + // return new DLink(driver, editResourcesLnk); + // case SYSTEM_SETTINGS_USERS: + // expandSection(systemSettingsExpand); + // return new DLink(driver, usersLnk); + // case SYSTEM_SETTINGS_DOMAINS: + // expandSection(systemSettingsExpand); + // return new DLink(driver, domainsLnk); + // case SYSTEM_SETTINGS_KEYSTORE: + // expandSection(systemSettingsExpand); + // return new DLink(driver, keystoreLnk); + // case SYSTEM_SETTINGS_TRUSTSTORE: + // expandSection(systemSettingsExpand); + // return new DLink(driver, truststoreLnk); + // case SYSTEM_SETTINGS_EXTENSIONS: + // expandSection(systemSettingsExpand); + // return new DLink(driver, extensionsLnk); + // case SYSTEM_SETTINGS_PROPERTIES: + // expandSection(systemSettingsExpand); + // return new DLink(driver, propertiesLnk); + // case SYSTEM_SETTINGS_ALERS: + // expandSection(systemSettingsExpand); + // return new DLink(driver, alersLnk); + if (page == Pages.USER_SETTINGS_PROFILE) { + openSubmenu(userSettingsExpand, profileLnk); + return new ProfilePage(driver); +// case USER_SETTINGS_ACCESS_TOKEN: +// //expandSection(userSettingsExpand); +// //accessTokensLnk.click(); +// return new ProfilePage(driver); +// case USER_SETTINGS_CERTIFICATES: +// expandSection(userSettingsExpand); +// return new DLink(driver, certificatesLnk); + } + return null; + } + + public Boolean isMenuAvailable(Pages page) { + MenuNavigation navigationLinks = getNavigationLinks(page); + try { + if (navigationLinks.menuLink.isEnabled()) { + navigationLinks.menuLink.click(); + return navigationLinks.submenuLink.isEnabled(); + } + return false; + } catch (NoSuchElementException e) { + return false; + } + } + + private void openSubmenu(WebElement menu, WebElement submenu) { + try { + submenu.click(); + if (submenu.getText().contains(getBreadcrump().getCurrentPage())) { + LOG.info("Current page is " + getBreadcrump().getCurrentPage()); + + } else { + LOG.error("Current page is not as expected. EXPECTED: [{}] but ACTUAL PAGE [{}]", submenu.getText().toString(), getBreadcrump().getCurrentPage().toString()); + throw new RuntimeException(); + } + + } catch (ElementNotInteractableException exception) { + menu.click(); + submenu.click(); + if (submenu.getText().contains(getBreadcrump().getCurrentPage())) { + LOG.info("Current page is " + getBreadcrump().getCurrentPage()); + + } else { + LOG.error("Current page is not as expected. EXPECTED: " + submenu.getText() + "but ACTUAL PAGE: " + getBreadcrump().getCurrentPage()); + throw new RuntimeException(); + } + } + } + + public class MenuNavigation { + WebElement menuLink; + WebElement submenuLink; + + public MenuNavigation(WebElement menuLink, WebElement submenuLink) { + this.menuLink = menuLink; + this.submenuLink = submenuLink; + } + } +} + + + diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DButton.java b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DButton.java new file mode 100644 index 0000000000000000000000000000000000000000..fd7926f7323b78cc13c5632e39ff8d769dc2cf9a --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DButton.java @@ -0,0 +1,17 @@ +package ddsl.dobjects; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class DButton extends DObject { + public DButton(WebDriver driver, WebElement element) { + super(driver, element); + } + + + @Override + public String getText() { + return element.findElement(By.cssSelector("span > span")).getText().trim(); + } +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DInput.java b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DInput.java new file mode 100644 index 0000000000000000000000000000000000000000..ab600b12eb040ded023dcc1adb385186a64741cc --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DInput.java @@ -0,0 +1,41 @@ +package ddsl.dobjects; + +import org.openqa.selenium.ElementNotInteractableException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class DInput extends DObject { + public DInput(WebDriver driver, WebElement element) { + super(driver, element); + } + + public void fill(String value) throws Exception { + if (null == value) { + return; + } + if (isEnabled()) { + element.clear(); + element.sendKeys(value); + } else { + throw new ElementNotInteractableException("Cannot type disabled field"); + } + } + + public void clear() throws Exception { + if (isEnabled()) { + element.clear(); + } else { + throw new Exception("Cannot type disabled field"); + } + } + + @Override + public String getText() { + if (isPresent()) { + return element.getAttribute("value").trim(); + } + return null; + } + + +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DLink.java b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DLink.java new file mode 100644 index 0000000000000000000000000000000000000000..05abd0bfc5ee292a876abe1a0e6a715919f40e62 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DLink.java @@ -0,0 +1,20 @@ +package ddsl.dobjects; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class DLink extends DObject { + + + public DLink(WebDriver driver, WebElement element) { + super(driver, element); + } + + public String getLinkText() throws Exception { + if (isPresent()) { + return super.getText(); + } + throw new Exception(); + } + +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DObject.java b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DObject.java new file mode 100644 index 0000000000000000000000000000000000000000..93f1cd6ff03af626f03b2e57e15e9627fcc3b47f --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DObject.java @@ -0,0 +1,89 @@ +package ddsl.dobjects; + +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DObject { + protected final Logger log = LoggerFactory.getLogger(this.getClass()); + public WebElement element; + protected WebDriver driver; + protected DWait wait; + + public DObject(WebDriver driver, WebElement element) { + wait = new DWait(driver); + this.driver = driver; + this.element = element; + } + + public boolean isPresent() { + try { + wait.forElementToBe(element); + scrollIntoView(); + } catch (Exception e) { + return false; + } + return true; + } + + public boolean isEnabled() throws Exception { + if (isPresent()) { + wait.forElementToBeEnabled(element); + return element.isEnabled(); + } + throw new Exception(); + } + + public boolean isDisabled() throws Exception { + if (isPresent()) { + wait.forElementToBeDisabled(element); + return !element.isEnabled(); + } + throw new Exception(); + } + + public boolean isVisible() throws Exception { + if (isPresent()) { + wait.forElementToBeEnabled(element); + return element.isDisplayed(); + } + throw new Exception(); + } + + public String getText() throws Exception { + if (!isPresent()) { + throw new Exception(); + } + scrollIntoView(); + String text = ((JavascriptExecutor) driver).executeScript("return arguments[0].innerText;", element).toString(); + return text.trim(); + } + + public void scrollIntoView() { + ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element); + } + + public void click() throws Exception { + if (isEnabled()) { + wait.forElementToBeClickable(element).click(); + } else { + throw new Exception("Not enabled"); + } + } + + public String getAttribute(String attributeName) throws Exception { + if (isPresent()) { + String attr = element.getAttribute(attributeName); + if (attr == null) { + log.debug("Attribute " + attributeName + " not found"); + return null; + } + return attr.trim(); + } + throw new RuntimeException(); + } + + +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DSelect.java b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DSelect.java new file mode 100644 index 0000000000000000000000000000000000000000..52423540cbfab0106b3fc331ea368e7d9738c1b6 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DSelect.java @@ -0,0 +1,25 @@ +package ddsl.dobjects; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.Select; + + +public class DSelect extends DObject { + + Select select = new Select(element); + + public DSelect(WebDriver driver, WebElement element) { + super(driver, element); + } + + public void selectValue(String value) { + select.selectByVisibleText(value); + } + + public String getCurrentValue() { + return select.getAllSelectedOptions().get(0).getText(); + } + + +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DWait.java b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DWait.java new file mode 100644 index 0000000000000000000000000000000000000000..9e235b5bac87c317635c83ffadc2b733fa30b9af --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DWait.java @@ -0,0 +1,153 @@ +package ddsl.dobjects; + +import org.openqa.selenium.By; +import org.openqa.selenium.StaleElementReferenceException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import utils.TestRunData; + +import java.time.Duration; + +public class DWait { + public final WebDriverWait defaultWait; + public final WebDriverWait longWait; + public final WebDriverWait shortWait; + protected final Logger log = LoggerFactory.getLogger(this.getClass()); + private final TestRunData data = new TestRunData(); + private final WebDriver driver; + + public DWait(WebDriver driver) { + this.defaultWait = new WebDriverWait(driver, data.getTIMEOUTinDuration()); + this.longWait = new WebDriverWait(driver, data.getLongWaitInDuration()); + this.shortWait = new WebDriverWait(driver, Duration.ofMinutes(1)); + this.driver = driver; + } + + public void forXMillis(Integer millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + log.error("EXCEPTION: ", e); + } + } + + public WebElement forElementToBeClickable(WebElement element) { + return defaultWait.until(ExpectedConditions.elementToBeClickable(element)); + } + + public WebElement forElementToBeVisible(WebElement element) { + return defaultWait.until(ExpectedConditions.visibilityOf(element)); + } + + public WebElement forElementToBeVisible(WebElement element, boolean waitLonger) { + if (waitLonger) { + return longWait.until(ExpectedConditions.visibilityOf(element)); + } + log.error(String.valueOf(element.isDisplayed())); + return defaultWait.until(ExpectedConditions.visibilityOf(element)); + } + + public void forElementToBeEnabled(WebElement element) { + int maxTimeout = data.getTIMEOUT() * 1000; + int waitedSoFar = 0; + + while ((null != element.getAttribute("disabled")) && (waitedSoFar < maxTimeout)) { + waitedSoFar += 300; + forXMillis(300); + } + } + + public void forElementToBeDisabled(WebElement element) { + int maxTimeout = data.getTIMEOUT() * 1000; + int waitedSoFar = 0; + + while ((null == element.getAttribute("disabled")) && (waitedSoFar < maxTimeout)) { + waitedSoFar += 300; + forXMillis(300); + } + } + + public void forAttributeNotEmpty(WebElement element, String attributeName) { + defaultWait.until(ExpectedConditions.attributeToBeNotEmpty(element, attributeName)); + } + + public void forElementToBeGone(WebElement element) { + defaultWait.until((ExpectedConditions.invisibilityOf(element))); + + forXMillis(500); + } + + public void forInvisibilityofLocator(By locator) { + defaultWait.until((ExpectedConditions.invisibilityOfElementLocated(locator))); + } + + public void forElementToBeGone(By selector) { + + log.debug("Waiting for element to be gone: " + selector.toString()); + int c = 0; + + while (c < 50) { + try { + driver.findElement(selector); + } catch (Exception e) { + break; + } + forXMillis(100); + c++; + } + + } + + public void forElementToBe(WebElement element) { + + defaultWait.until(new ExpectedCondition<Boolean>() { + @Override + public Boolean apply(WebDriver driver) { + return element.getLocation() != null; + } + }); + + } + + public void forAttributeToContain(WebElement element, String attributeName, String value) { + defaultWait.until(ExpectedConditions.attributeContains(element, attributeName, value)); + } + + public void forAttributeToNOTContain(WebElement element, String attributeName, String value) { + defaultWait.until(new ExpectedCondition<Boolean>() { + @Override + public Boolean apply(WebDriver driver) { + return !element.getAttribute(attributeName).contains(value); + } + }); + } + + public void forAttributeToContain(WebElement element, String attributeName, String value, boolean waitLonger) { + + WebDriverWait myWait = defaultWait; + if (waitLonger) { + myWait = longWait; + } + myWait.until(ExpectedConditions.attributeContains(element, attributeName, value)); + } + + public void forElementToHaveText(WebElement element) { + defaultWait.until(new ExpectedCondition<Boolean>() { + @Override + public Boolean apply(WebDriver driver) { + return !element.getText().trim().isEmpty(); + } + }); + } + + public void forElementToContainText(WebElement element, String text) { + defaultWait.ignoring(StaleElementReferenceException.class) + .until(ExpectedConditions.textToBePresentInElement(element, text)); + + } +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/enums/ApplicationRoles.java b/domiSMP-ui-tests/src/main/java/ddsl/enums/ApplicationRoles.java new file mode 100644 index 0000000000000000000000000000000000000000..b7ea548b39887cd9b17d09114ca72be8333abbd4 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/enums/ApplicationRoles.java @@ -0,0 +1,6 @@ +package ddsl.enums; + +public class ApplicationRoles { + public static final String SYSTEM_ADMIN = "SYSTEM_ADMIN"; + public static final String USER = "USER"; +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/enums/Pages.java b/domiSMP-ui-tests/src/main/java/ddsl/enums/Pages.java new file mode 100644 index 0000000000000000000000000000000000000000..88ecd432fdd8440b270b10c387dae28336647610 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/enums/Pages.java @@ -0,0 +1,18 @@ +package ddsl.enums; + +public enum Pages { + SEARCH_RESOURCES, + ADMINISTRATION_EDIT_DOMAINS, + ADMINISTRATION_EDIT_GROUPS, + ADMINISTRATION_EDIT_RESOURCES, + SYSTEM_SETTINGS_USERS, + SYSTEM_SETTINGS_DOMAINS, + SYSTEM_SETTINGS_KEYSTORE, + SYSTEM_SETTINGS_TRUSTSTORE, + SYSTEM_SETTINGS_EXTENSIONS, + SYSTEM_SETTINGS_PROPERTIES, + SYSTEM_SETTINGS_ALERS, + USER_SETTINGS_PROFILE, + USER_SETTINGS_ACCESS_TOKEN, + USER_SETTINGS_CERTIFICATES +} diff --git a/domiSMP-ui-tests/src/main/java/ddsl/enums/SMPThemes.java b/domiSMP-ui-tests/src/main/java/ddsl/enums/SMPThemes.java new file mode 100644 index 0000000000000000000000000000000000000000..80067b3ea6713fd5de4fe7b77087827278daad46 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/enums/SMPThemes.java @@ -0,0 +1,26 @@ +package ddsl.enums; + +import java.util.Random; + +public enum SMPThemes { + Default_theme("SMP default theme"), + Blue_theme("Blue theme"), + Indigo_Pink_theme("Indigo & Pink theme"), + Pink_Blue_grey_theme("Pink & Blue grey"), + Purple_Green_theme("Purple & Green theme"); + + + private final String name; + + SMPThemes(String name) { + this.name = name; + } + + public static String getRandomTheme() { + SMPThemes[] themes = values(); + int size = themes.length; + Random random = new Random(); + int index = random.nextInt(size); + return themes[index].name; + } +} diff --git a/domiSMP-ui-tests/src/main/java/pages/LoginPage.java b/domiSMP-ui-tests/src/main/java/pages/LoginPage.java new file mode 100644 index 0000000000000000000000000000000000000000..41ad9a1767435f71479c77ff58ac7fe5edfd073e --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/pages/LoginPage.java @@ -0,0 +1,57 @@ +package pages; + +import ddsl.dcomponents.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 java.util.HashMap; + +public class LoginPage extends DomiSMPPage { + + /** + * Page object for the Login page. This contains the locators of the page and the methods for the behaviour of the page + */ + + private final static Logger LOG = LoggerFactory.getLogger(LoginPage.class); + + @FindBy(id = "username_id") + private WebElement username; + @FindBy(id = "password_id") + private WebElement password; + @FindBy(id = "loginbutton_id") + private WebElement loginBtn; + + public LoginPage(WebDriver driver) { + super(driver); + LOG.debug(".... init"); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getTIMEOUT()), this); + } + + public DomiSMPPage login(String user, String pass) throws Exception { + HashMap<String, String> usr = new HashMap<>(); + usr.put("username", user); + usr.put("pass", pass); + LOG.debug("Login started " + usr.get("username") + " / " + usr.get("pass")); + + goToLoginPage(); + weToDInput(username).fill(usr.get("username")); + weToDInput(password).fill(usr.get("pass")); + weToDButton(loginBtn).click(); + + if (getExpiredDialoginbutton().isPresent()) { + LOG.info("Expired password dialog is present."); + getExpiredDialoginbutton().click(); + } + + + return new DomiSMPPage(driver); + + } + +} + diff --git a/domiSMP-ui-tests/src/main/java/pages/ProfilePage.java b/domiSMP-ui-tests/src/main/java/pages/ProfilePage.java new file mode 100644 index 0000000000000000000000000000000000000000..af7aa8f30a89d9be7184fe91508f03f92d409aa4 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/pages/ProfilePage.java @@ -0,0 +1,87 @@ +package pages; + +import ddsl.dcomponents.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; + +public class ProfilePage extends DomiSMPPage { + /** + * Page object for the Profile page. This contains the locators of the page and the methods for the behaviour of the page + */ + + private final static Logger LOG = LoggerFactory.getLogger(ProfilePage.class); + + @FindBy(id = "smpTheme_id") + private WebElement themeSel; + @FindBy(id = "moment-locale") + private WebElement localeSel; + @FindBy(id = "saveButton") + private WebElement saveBtn; + @FindBy(id = "emailAddress_id") + private WebElement emailAddressInput; + @FindBy(id = "fullName_id") + private WebElement fullNameInput; + + public ProfilePage(WebDriver driver) { + super(driver); + LOG.debug(".... init"); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getTIMEOUT()), this); + } + + public void changeUserProfileData(String emailValue, String fullNameValue, String selectThemeValue, String localeValue) throws Exception { + try { + if (!emailValue.isEmpty()) { + weToDInput(emailAddressInput).fill(emailValue); + } + if (!emailValue.isEmpty()) { + weToDInput(fullNameInput).fill(fullNameValue); + } + if (!(selectThemeValue == null)) { + weToDSelect(themeSel).selectValue(selectThemeValue); + } + if (!localeValue.isEmpty()) { + weToDSelect(localeSel).selectValue(localeValue); + } + + } catch (Exception e) { + LOG.error("Cannot change User Profile Data ", e); + } + + if (saveBtn.isEnabled()) { + saveBtn.click(); + } else { + LOG.debug("Save button enable is " + saveBtn.isEnabled()); + } + + try { + getAlertArea().getAlertMessage(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + + public String getSelectedTheme() { + return weToDSelect(themeSel).getCurrentValue(); + } + + public String getSelectedLocale() { + return weToDSelect(localeSel).getCurrentValue(); + } + + public String getEmailAddress() { + return weToDInput(emailAddressInput).getText(); + } + + public String getFullName() { + return weToDInput(fullNameInput).getText(); + } + + +} \ No newline at end of file diff --git a/domiSMP-ui-tests/src/main/java/rest/BaseRestClient.java b/domiSMP-ui-tests/src/main/java/rest/BaseRestClient.java new file mode 100644 index 0000000000000000000000000000000000000000..2f30da5f1a477f0a8e09c30ea309f67e36aad4f0 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/rest/BaseRestClient.java @@ -0,0 +1,163 @@ +package rest; + + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.WebResource; +import org.apache.commons.lang3.StringUtils; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import utils.TestRunData; + +import javax.ws.rs.core.Cookie; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.NewCookie; +import java.util.HashMap; +import java.util.List; + +public class BaseRestClient { + protected final Logger log = LoggerFactory.getLogger(this.getClass()); + protected TestRunData data = new TestRunData(); + + protected Client client = Client.create(); + public WebResource resource = client.resource(data.getUiBaseUrl()); + + protected List<NewCookie> cookies; + protected String token; + protected String username; + protected String password; + protected String newPassword; + + public BaseRestClient(String username, String password) { + this.username = username; + this.password = password; + } + + + public BaseRestClient() { + this.username = data.getAdminUser().get("username"); + this.password = data.getAdminUser().get("pass"); + } + + // ---------------------------------------Default request methods ------------------------------------------------- + protected ClientResponse requestPUT(WebResource resource, String params, String type) { + + if (!isLoggedIn()) { + try { + refreshCookies(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + WebResource.Builder builder = decorateBuilder(resource); + + return builder.type(type).put(ClientResponse.class, params); + } + + protected ClientResponse requestPUT(WebResource resource, JSONObject body, String type) { + + if (!isLoggedIn()) { + log.info("User is not loggedin"); + try { + refreshCookies(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + WebResource.Builder builder = decorateBuilder(resource); + + return builder.type(type).put(ClientResponse.class, body.toString()); + } + + + protected ClientResponse jsonPUT(WebResource resource, String params) { + return requestPUT(resource, params, MediaType.APPLICATION_JSON); + } + + protected ClientResponse jsonPUT(WebResource resource, JSONObject body) { + return requestPUT(resource, body, MediaType.APPLICATION_JSON); + } + + protected ClientResponse requestPOST(WebResource resource, String params, String type) { + + + WebResource.Builder builder = decorateBuilder(resource); + + return builder.type(type).post(ClientResponse.class, params); + } + + // -------------------------------------------- Login -------------------------------------------------------------- + + protected WebResource.Builder decorateBuilder(WebResource resource) { + + WebResource.Builder builder = resource.getRequestBuilder(); + + if (null != cookies) { + log.debug(""); + for (NewCookie cookie : cookies) { + builder = builder.cookie(new Cookie(cookie.getName(), cookie.getValue(), "/", "")); + log.debug("cookie " + cookie + " is added to the builder"); + } + } + if (null != token) { + builder = builder.header("X-XSRF-TOKEN", token); + } + + return builder; + } + public List<NewCookie> login() throws SMPRestException { + log.debug("Rest client using to login: " + this.username); + HashMap<String, String> params = new HashMap<>(); + params.put("username", this.username); + params.put("password", this.password); + + ClientResponse response = resource.path(RestServicePaths.LOGIN).type(MediaType.APPLICATION_JSON).post(ClientResponse.class, new JSONObject(params).toString()); + + JSONObject responseBody = new JSONObject(response.getEntity(String.class)); + // extract userId to be used in the Paths of the requests + + data.setUserId((String) responseBody.get("userId")); + log.debug("Last Userid is " + data.getUserId()); + + if (response.getStatus() == 200) { + return response.getCookies(); + } + throw new SMPRestException("Login failed", response); + + } + private String extractToken() { + String mytoken = null; + for (NewCookie cookie : cookies) { + if (StringUtils.equalsIgnoreCase(cookie.getName(), "XSRF-TOKEN")) { + mytoken = cookie.getValue(); + } + } + return mytoken; + } + public void refreshCookies() throws Exception { + if (isLoggedIn()) { + return; + } + cookies = login(); + if (null != cookies) { + token = extractToken(); + } else { + throw new Exception("Could not login, tests will not be able to generate necessary data!"); + } + + if (null == token) { + throw new Exception("Could not obtain XSRF token, tests will not be able to generate necessary data!"); + } + } + public boolean isLoggedIn() { + WebResource.Builder builder = decorateBuilder(resource.path(RestServicePaths.CONNECTED)); + int response = builder.get(ClientResponse.class).getStatus(); + log.debug("Connected endpoint returns: " + response); + log.debug("UserID is: " + data.getUserId()); + return (!(response == 401) && !data.getUserId().isEmpty()); + } + +} diff --git a/domiSMP-ui-tests/src/main/java/rest/DomiSMPRestClient.java b/domiSMP-ui-tests/src/main/java/rest/DomiSMPRestClient.java new file mode 100644 index 0000000000000000000000000000000000000000..cbbb65d919eeaaca29bbcba65bb63426f3cfeef0 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/rest/DomiSMPRestClient.java @@ -0,0 +1,13 @@ +package rest; + +public class DomiSMPRestClient extends BaseRestClient { + public DomiSMPRestClient() { + super(); + } + + // -------------------------------------------- get clients ----------------------------------------------------------- + public UserClient users() { + return new UserClient(username, password); + } +} + diff --git a/domiSMP-ui-tests/src/main/java/rest/RestServicePaths.java b/domiSMP-ui-tests/src/main/java/rest/RestServicePaths.java new file mode 100644 index 0000000000000000000000000000000000000000..bcbe59ef187b43328adb50894b2800e6fa34e19d --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/rest/RestServicePaths.java @@ -0,0 +1,22 @@ +package rest; + +public class RestServicePaths { + private RestServicePaths() { + } + + public static final String LOGIN = "/public/rest/security/authentication"; + public static final String CONNECTED = "/public/rest/security/user"; + + + public static String getUsersPath(String currentUserId) { + + return "/internal/rest/user/" + currentUserId + "/create"; + } + + public static String getChangePasswordPath(String currentUserId, String forUserId) { + + return "/internal/rest/user/" + currentUserId + "/change-password-for/" + forUserId; + } + + +} diff --git a/domiSMP-ui-tests/src/main/java/rest/SMPRestException.java b/domiSMP-ui-tests/src/main/java/rest/SMPRestException.java new file mode 100644 index 0000000000000000000000000000000000000000..1e353813cc90d2db102650f8e21ddc34b6907327 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/rest/SMPRestException.java @@ -0,0 +1,16 @@ +package rest; + +import com.sun.jersey.api.client.ClientResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SMPRestException extends Exception { + protected final Logger log = LoggerFactory.getLogger(this.getClass()); + + public SMPRestException(String message, ClientResponse response) { + super(String.format("%s \n %s \n %s \n", + message, + "STATUS = " + response.getStatus(), + "CONTENT = " + response.getEntity(String.class))); + } +} diff --git a/domiSMP-ui-tests/src/main/java/rest/UserClient.java b/domiSMP-ui-tests/src/main/java/rest/UserClient.java new file mode 100644 index 0000000000000000000000000000000000000000..7dcd9a7896865ec5fb713a8b4871cb779d496a29 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/rest/UserClient.java @@ -0,0 +1,62 @@ +package rest; + +import com.sun.jersey.api.client.ClientResponse; +import org.json.JSONObject; +import rest.models.UserModel; + +public class UserClient extends BaseRestClient { + + public UserClient(String username, String password) { + super(username, password); + } + + public JSONObject createUser(UserModel user) { + + JSONObject usrObj = new JSONObject(user); + + if (!isLoggedIn()) { + try { + refreshCookies(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + String usersPath = RestServicePaths.getUsersPath(data.userId); + + ClientResponse response = jsonPUT(resource.path(usersPath), usrObj); + JSONObject responseBody = new JSONObject(response.getEntity(String.class)); + // extract userId to be used in the Paths of the requests + + String forUserId = (String) responseBody.get("userId"); + + //Set password for user + changePassword(forUserId, data.getNewPassword()); + + if (response.getStatus() != 200) { + try { + throw new SMPRestException("Could not create user", response); + } catch (SMPRestException e) { + throw new RuntimeException(e); + } + } + log.debug("User: " + user.getUsername() + " has been created successfully!"); + return responseBody; + + } + + public JSONObject changePassword(String forUserId, String newPassword) { + + + String changePasswordPath = RestServicePaths.getChangePasswordPath(data.userId, forUserId); + JSONObject passwordChangeBody = new JSONObject(); + passwordChangeBody.put("currentPassword", password); + passwordChangeBody.put("newPassword", newPassword); + + + ClientResponse response = jsonPUT(resource.path(changePasswordPath), passwordChangeBody); + return new JSONObject(response.getEntity(String.class)); + } + + +} diff --git a/domiSMP-ui-tests/src/main/java/rest/models/UserModel.java b/domiSMP-ui-tests/src/main/java/rest/models/UserModel.java new file mode 100644 index 0000000000000000000000000000000000000000..838f30c4b90450583306011bf4b430571e1a55d3 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/rest/models/UserModel.java @@ -0,0 +1,131 @@ +package rest.models; + + +import ddsl.enums.ApplicationRoles; +import ddsl.enums.SMPThemes; +import utils.Generator; + +public class UserModel { + + private String userId; + private String username; + private boolean active; + private String role; + private String emailAddress; + private String fullName; + private String smpTheme; + private String smpLocale; + + public UserModel(String username, boolean active, String role, String emailAddress, String fullName, String smpTheme, String smpLocale) { + this.username = username; + this.active = active; + this.role = role; + this.emailAddress = emailAddress; + this.fullName = fullName; + this.smpTheme = smpTheme; + this.smpLocale = smpLocale; + } + + public UserModel() { + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getEmailAddress() { + return emailAddress; + } + + public void setEmailAddress(String email) { + this.emailAddress = email; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getSmpTheme() { + return smpTheme; + } + + public void setSmpTheme(String smpTheme) { + this.smpTheme = smpTheme; + } + + + public String getSmpLocale() { + return smpLocale; + } + + public void setSmpLocale(String smpLocale) { + this.smpLocale = smpLocale; + } + + public static UserModel createUserWithUSERrole() { + UserModel userModel = new UserModel(); + userModel.username = ("AUT_username_" + Generator.randomAlphaNumeric(4)).toLowerCase(); + userModel.active = true; + userModel.role = ApplicationRoles.USER; + userModel.emailAddress = "AUT_email_" + Generator.randomAlphaNumeric(4) + "@automation.com"; + userModel.fullName = "AUT_fullname_" + Generator.randomAlphaNumeric(4); + userModel.smpTheme = SMPThemes.getRandomTheme(); + userModel.smpLocale = "English"; + return userModel; + } + + public static UserModel createUserWithADMINrole() { + UserModel userModel = new UserModel(); + userModel.username = ("AUT_username_" + Generator.randomAlphaNumeric(4)).toLowerCase(); + userModel.active = true; + userModel.role = ApplicationRoles.SYSTEM_ADMIN; + userModel.emailAddress = "AUT_email_" + Generator.randomAlphaNumeric(4) + "@automation.com"; + userModel.fullName = "AUT_fullname_" + Generator.randomAlphaNumeric(4); + userModel.smpTheme = SMPThemes.getRandomTheme(); + userModel.smpLocale = "English"; + return userModel; + } + + public static UserModel generateUserProfileData() { + UserModel userModel = new UserModel(); + userModel.emailAddress = "AUT_email_" + Generator.randomAlphaNumeric(4) + "@automation.com"; + userModel.fullName = "AUT_fullname_" + Generator.randomAlphaNumeric(4); + userModel.smpTheme = SMPThemes.getRandomTheme(); + userModel.smpLocale = "Dutch"; + return userModel; + } + +} + diff --git a/domiSMP-ui-tests/src/main/java/utils/DriverManager.java b/domiSMP-ui-tests/src/main/java/utils/DriverManager.java new file mode 100644 index 0000000000000000000000000000000000000000..2ac4c7a7e3a90fad4a3d44f5b989560650aba740 --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/utils/DriverManager.java @@ -0,0 +1,64 @@ +package utils; + +import org.apache.commons.lang3.StringUtils; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxOptions; + +import java.util.HashMap; +import java.util.concurrent.TimeUnit; + +public class DriverManager { + static TestRunData data = new TestRunData(); + + + public static WebDriver getDriver() { + + WebDriver driver; + if ( StringUtils.equalsIgnoreCase(data.getRunBrowser(), "firefox")) { + driver = getFirefoxDriver(); + } else { + driver = getChromeDriver(); + } + driver.manage().window().setSize(new Dimension(1920, 1080)); + driver.manage().window().maximize(); + driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); + return driver; + } + + private static WebDriver getChromeDriver() { + System.setProperty("webdriver.chrome.driver", data.getChromeDriverPath()); + + + //Code added for auto download + HashMap<String, Object> prefs = new HashMap<>(); + prefs.put("profile.default_content_settings.popups", 0); + prefs.put("download.default_directory", data.downloadFolderPath()); + prefs.put("safebrowsing.enabled", "true"); + + ChromeOptions options = new ChromeOptions(); + options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems + options.addArguments("--disable-popup-blocking"); + + options.setExperimentalOption("prefs", prefs); + return new ChromeDriver(options); + } + + private static WebDriver getFirefoxDriver() { + System.setProperty("webdriver.gecko.driver", data.getFirefoxDriverPath()); + + FirefoxOptions options = new FirefoxOptions(); + options.setHeadless(data.isHeadless()); + //code added for auto download + options.addPreference("browser.download.folderList", 2); + options.addPreference("browser.download.manager.showWhenStarting", false); + options.addPreference("browser.download.dir", data.downloadFolderPath()); + options.addPreference("browser.helperApps.neverAsk.openFile", "application/ms-excel text/xml application/zip"); + options.addPreference("browser.helperApps.neverAsk.saveToDisk", "application/ms-excel text/xml application/zip"); + return new FirefoxDriver(options); + } + +} diff --git a/domiSMP-ui-tests/src/main/java/utils/Generator.java b/domiSMP-ui-tests/src/main/java/utils/Generator.java new file mode 100644 index 0000000000000000000000000000000000000000..dcfbc6ec22b7473964d41df6031973a87c6f964f --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/utils/Generator.java @@ -0,0 +1,15 @@ +package utils; + +public class Generator { + private static final String ALPHA_NUMERIC_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + + public static String randomAlphaNumeric(int count) { + StringBuilder builder = new StringBuilder(); + while (count-- != 0) { + int character = (int) (Math.random() * ALPHA_NUMERIC_STRING.length()); + builder.append(ALPHA_NUMERIC_STRING.charAt(character)); + } + return builder.toString(); + } + +} diff --git a/domiSMP-ui-tests/src/main/java/utils/TestRunData.java b/domiSMP-ui-tests/src/main/java/utils/TestRunData.java new file mode 100644 index 0000000000000000000000000000000000000000..2deb4c502532b7dc1c89699e829fb7ffc596619b --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/utils/TestRunData.java @@ -0,0 +1,125 @@ +package utils; + +import ddsl.enums.ApplicationRoles; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileInputStream; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.util.HashMap; +import java.util.Properties; + + +public class TestRunData { + public static SimpleDateFormat UI_DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); + public static SimpleDateFormat UI_DATE_FORMAT2 = new SimpleDateFormat("dd-MM-yyyy HH:mm:ssz"); + public static SimpleDateFormat CSV_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + public static SimpleDateFormat REST_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + public static SimpleDateFormat REST_JMS_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + public String userId; + static Properties prop = new Properties(); + protected final Logger log = LoggerFactory.getLogger(this.getClass()); + + public TestRunData() { + if (prop.isEmpty()) { + loadTestData(); + } + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + private void loadTestData() { + try { + String filename = System.getProperty("propertiesFile"); + FileInputStream stream = new FileInputStream(filename); + prop.load(stream); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public HashMap<String, String> getUser(String role) { + + HashMap<String, String> toReturn = new HashMap<>(); + + toReturn.put("username", prop.getProperty(role + ".username")); + toReturn.put("pass", prop.getProperty(role + ".password")); + + return toReturn; + } + + + public HashMap<String, String> getAdminUser() { + return getUser(ApplicationRoles.SYSTEM_ADMIN); + } + + public String getNewPassword() { + return prop.getProperty("new.password"); + } + + public String getUiBaseUrl() { + String url = prop.getProperty("UI_BASE_URL"); + log.debug(url); + return url; + } + + public Integer getTIMEOUT() { + return Integer.valueOf(prop.getProperty("SHORT_TIMEOUT_SECONDS")); + } + + public Duration getTIMEOUTinDuration() { + return Duration.ofMinutes(Long.parseLong((prop.getProperty("SHORT_TIMEOUT_SECONDS")))); + } + + public Integer getLongWait() { + return Integer.valueOf(prop.getProperty("LONG_TIMEOUT_SECONDS")); + } + + public Duration getLongWaitInDuration() { + return Duration.ofMinutes(Long.parseLong(prop.getProperty("LONG_TIMEOUT_SECONDS"))); + } + + + public String getReportsFolder() { + return prop.getProperty("reports.folder"); + } + + public boolean isHeadless() { + try { + return Boolean.parseBoolean(prop.getProperty("headless")); + } catch (Exception e) { + log.debug("e = " + e); + return false; + } + } + + public String getProxyAddress() { + return prop.getProperty("proxyAddress"); + } + + public String getChromeDriverPath() { + return prop.getProperty("webdriver.chrome.driver"); + } + + public String getFirefoxDriverPath() { + return prop.getProperty("webdriver.gecko.driver"); + } + + public String getRunBrowser() { + return System.getProperty("runBrowser"); + } + + + public String downloadFolderPath() { + return System.getProperty("user.dir") + File.separator + "downloadFiles"; + } + +} diff --git a/domiSMP-ui-tests/src/main/resources/bambooE2.properties b/domiSMP-ui-tests/src/main/resources/bambooE2.properties new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/domiSMP-ui-tests/src/main/resources/myLocal.properties b/domiSMP-ui-tests/src/main/resources/myLocal.properties new file mode 100644 index 0000000000000000000000000000000000000000..4cb63757445890c4008d31682ebfbbddf9e5a084 --- /dev/null +++ b/domiSMP-ui-tests/src/main/resources/myLocal.properties @@ -0,0 +1,20 @@ +# Local runner, Edeltest2 target, Single tenancy +# Test runner properties +webdriver.ie.driver=MicrosoftWebDriver.exe +webdriver.chrome.driver=./chromedriver.exe +webdriver.gecko.driver=./geckodriver.exe +reports.folder=./reports/ +LONG_TIMEOUT_SECONDS=15 +SHORT_TIMEOUT_SECONDS=5 +headless=false +# Test system properties +UI_BASE_URL=http://eulogin.protected.smp.local:8982/smp/ui +#UI_BASE_URL=http://localhost:8080/smp/ui +SYSTEM_ADMIN.username=system +SYSTEM_ADMIN.password=123456 +ROLE_ADMIN.username=admin +ROLE_ADMIN.password=123456 +ROLE_USER.username=user +ROLE_USER.password=123456 +default.password=QW!@QW!@qw12qw12 +new.password=Test1234!Test1234! diff --git a/domiSMP-ui-tests/src/test/java/domiSMPTests/SeleniumTest.java b/domiSMP-ui-tests/src/test/java/domiSMPTests/SeleniumTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6b01911f70cf449531bb216cf6ff994a7f69ea35 --- /dev/null +++ b/domiSMP-ui-tests/src/test/java/domiSMPTests/SeleniumTest.java @@ -0,0 +1,77 @@ +package domiSMPTests; + +import org.openqa.selenium.WebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.testng.annotations.*; +import rest.DomiSMPRestClient; +import utils.DriverManager; +import utils.TestRunData; + +import java.lang.reflect.Method; + +public class SeleniumTest { + + /** + * This class is extending all the test classes to have access to the Base tests methods. + */ + protected static final Logger LOG = LoggerFactory.getLogger(SeleniumTest.class); + static int methodCount = 1; + public String logFilename; + + public static TestRunData data = new TestRunData(); + public static DomiSMPRestClient rest = new DomiSMPRestClient(); + public WebDriver driver; + + + @BeforeSuite(alwaysRun = true) + public void beforeSuite() { + + LOG.info("Log file name is " + logFilename); + LOG.info("-------- Starting -------"); + } + + + @AfterSuite(alwaysRun = true) + public void afterSuite() { + } + + @BeforeClass(alwaysRun = true) + public void beforeClass() { + LOG.info("--------Initialize test class-------"); + driver = DriverManager.getDriver(); + + } + + @BeforeMethod(alwaysRun = true) + protected void beforeMethod(Method method) { + + MDC.put("logFileName", method.getDeclaringClass().getSimpleName()); + + LOG.info("--------------------------- Running test number: " + methodCount); + LOG.info("--------------------------- Running test method: " + method.getDeclaringClass().getSimpleName() + "." + method.getName()); + methodCount++; + + try { + driver.get(data.getUiBaseUrl()); + } catch (Exception e) { + driver = DriverManager.getDriver(); + driver.get(data.getUiBaseUrl()); + } + } + + + @AfterClass(alwaysRun = true) + protected void afterClass() { + + LOG.info("-------- Quitting driver after test class-------"); + try { + driver.quit(); + } catch (Exception e) { + LOG.warn("Closing the driver failed"); + LOG.error("EXCEPTION: ", e); + } + } + +} diff --git a/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/ProfilePgTests.java b/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/ProfilePgTests.java new file mode 100644 index 0000000000000000000000000000000000000000..05bf203afccef57ac08f5361e75669151e11a829 --- /dev/null +++ b/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/ProfilePgTests.java @@ -0,0 +1,104 @@ +package domiSMPTests.ui; + +import ddsl.dcomponents.DomiSMPPage; +import ddsl.enums.Pages; +import domiSMPTests.SeleniumTest; +import org.testng.Assert; +import org.testng.annotations.Test; +import pages.LoginPage; +import pages.ProfilePage; +import rest.models.UserModel; + + +public class ProfilePgTests extends SeleniumTest { + + /** + * This class has the tests against Profile Page + */ + @Test(description = "PROF-01") + public void AllLoggedUsersAreAbleToSeeProfilePage() throws Exception { + UserModel normalUser = UserModel.createUserWithUSERrole(); + + rest.users().createUser(normalUser); + + DomiSMPPage homePage = new DomiSMPPage(driver); + LoginPage loginPage = homePage.goToLoginPage(); + loginPage.login(normalUser.getUsername(), data.getNewPassword()); + + //Check if menu is available + Assert.assertTrue(homePage.getSidebar().isMenuAvailable(Pages.USER_SETTINGS_PROFILE)); + + //Navigate to page + homePage.getSidebar().navigateTo(Pages.USER_SETTINGS_PROFILE); + + homePage.logout(); + + //Check if page is avaiable for Admin users + UserModel adminUser = UserModel.createUserWithUSERrole(); + rest.users().createUser(adminUser); + + loginPage = homePage.goToLoginPage(); + loginPage.login(adminUser.getUsername(), data.getNewPassword()); + + //Check if menu is available + Assert.assertTrue(homePage.getSidebar().isMenuAvailable(Pages.USER_SETTINGS_PROFILE)); + + //Navigate to page + homePage.getSidebar().navigateTo(Pages.USER_SETTINGS_PROFILE); + + //Check if ProfilePage is not available for anonymous users + homePage.logout(); + Assert.assertFalse(homePage.getSidebar().isMenuAvailable(Pages.USER_SETTINGS_PROFILE)); + } + + @Test(description = "PROF-02") + public void AllLoggedUsersAreAbleToUpdateProfilePage() throws Exception { + UserModel normalUser = UserModel.createUserWithUSERrole(); + + rest.users().createUser(normalUser); + + DomiSMPPage homePage = new DomiSMPPage(driver); + LoginPage loginPage = homePage.goToLoginPage(); + loginPage.login(normalUser.getUsername(), data.getNewPassword()); + + //Navigate to page + ProfilePage profilePage = (ProfilePage) homePage.getSidebar().navigateTo(Pages.USER_SETTINGS_PROFILE); + UserModel userNewProfileData = UserModel.generateUserProfileData(); + profilePage.changeUserProfileData(userNewProfileData.getEmailAddress(), userNewProfileData.getFullName(), userNewProfileData.getSmpTheme(), userNewProfileData.getSmpLocale()); + + profilePage.refreshPage(); + + //Verify if data is changed + + Assert.assertEquals(profilePage.getEmailAddress(), userNewProfileData.getEmailAddress()); + Assert.assertEquals(profilePage.getFullName(), userNewProfileData.getFullName()); + Assert.assertEquals(profilePage.getSelectedTheme(), userNewProfileData.getSmpTheme()); + Assert.assertEquals(profilePage.getSelectedLocale(), userNewProfileData.getSmpLocale()); + + homePage.logout(); + + + UserModel adminUser = UserModel.createUserWithUSERrole(); + + rest.users().createUser(adminUser); + + homePage = new DomiSMPPage(driver); + loginPage = homePage.goToLoginPage(); + loginPage.login(adminUser.getUsername(), data.getNewPassword()); + + //Navigate to page + profilePage = (ProfilePage) homePage.getSidebar().navigateTo(Pages.USER_SETTINGS_PROFILE); + UserModel adminNewProfileData = UserModel.generateUserProfileData(); + profilePage.changeUserProfileData(adminNewProfileData.getEmailAddress(), adminNewProfileData.getFullName(), adminNewProfileData.getSmpTheme(), adminNewProfileData.getSmpLocale()); + + profilePage.refreshPage(); + + //Verify if data is changed + Assert.assertEquals(profilePage.getEmailAddress(), adminNewProfileData.getEmailAddress()); + Assert.assertEquals(profilePage.getFullName(), adminNewProfileData.getFullName()); + Assert.assertEquals(profilePage.getSelectedTheme(), adminNewProfileData.getSmpTheme()); + Assert.assertEquals(profilePage.getSelectedLocale(), adminNewProfileData.getSmpLocale()); + + + } +} diff --git a/domiSMP-ui-tests/testng.xml b/domiSMP-ui-tests/testng.xml new file mode 100644 index 0000000000000000000000000000000000000000..90ae71527e06ba13940657dcd27c22eb524ee265 --- /dev/null +++ b/domiSMP-ui-tests/testng.xml @@ -0,0 +1,8 @@ +<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > +<suite name="SELENIUM" parallel="classes" thread-count="1"> + <groups> + <run> + </run> + </groups> + +</suite> \ No newline at end of file diff --git a/smp-ui-tests/src/main/java/utils/rest/SMPRestClient.java b/smp-ui-tests/src/main/java/utils/rest/SMPRestClient.java index 68b8e3de2af2c7fb02b7eb27ed7939fcbed79cdc..a3bd15e287f1d4ba2e6694160cfb8fff7fa69a23 100644 --- a/smp-ui-tests/src/main/java/utils/rest/SMPRestClient.java +++ b/smp-ui-tests/src/main/java/utils/rest/SMPRestClient.java @@ -180,6 +180,7 @@ public class SMPRestClient { HashMap<String, String> map = getCookies(cookies); String xsrf = map.get("XSRF-TOKEN"); String jsessionID = map.get("JSESSIONID"); + log.info("Creating domain template whose xsrf :" + xsrf + " and session id: " + jsessionID); log.info("Creating domain template whose value is :" + template); log.info("Creating the doamainpoststring" + domainPostStr); try {