Browse Source

add ui tests

pull/7746/head
Serafym Tuhai 4 years ago
parent
commit
be1acd219b
  1. 24
      msa/black-box-tests/pom.xml
  2. 129
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractBasePage.java
  3. 74
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDiverBaseTest.java
  4. 20
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/listeners/RetryAnalyzer.java
  5. 18
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/listeners/RetryTestListener.java
  6. 62
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/listeners/TestListener.java
  7. 262
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageElements.java
  8. 161
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageHelper.java
  9. 38
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DashboardPageElements.java
  10. 25
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DashboardPageHelper.java
  11. 28
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/LoginPageElements.java
  12. 16
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/LoginPageHelper.java
  13. 33
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OpenRuleChainPageElements.java
  14. 23
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OpenRuleChainPageHelper.java
  15. 228
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OtherPageElements.java
  16. 98
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OtherPageElementsHelper.java
  17. 113
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/RuleChainsPageElements.java
  18. 180
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/RuleChainsPageHelper.java
  19. 27
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java
  20. 164
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/CreateCustomerTest.java
  21. 270
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/CustomerEditMenuTest.java
  22. 83
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/DeleteCustomerTest.java
  23. 81
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/DeleteSeveralCustomerTest.java
  24. 54
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersAssetsTest.java
  25. 53
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersDashboardsTest.java
  26. 53
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersDevicesTest.java
  27. 54
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersEdgesTest.java
  28. 54
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersUsersTest.java
  29. 56
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/SearchCustomerTest.java
  30. 121
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/SortByNameTest.java
  31. 110
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/CreateRuleChainImportTest.java
  32. 139
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/CreateRuleChainTest.java
  33. 148
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/DeleteRuleChainTest.java
  34. 92
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/DeleteSeveralRuleChainsTest.java
  35. 75
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/MakeRuleChainRootTest.java
  36. 71
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/OpenRuleChainTest.java
  37. 130
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/RuleChainEditMenuTest.java
  38. 52
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/SearchRuleChainTest.java
  39. 122
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/SortByNameTest.java
  40. 70
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/SortByTimeTest.java
  41. 21
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/Const.java
  42. 62
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/DataProviderCredential.java
  43. 19
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/EntityPrototypes.java
  44. 0
      msa/black-box-tests/src/test/resources/connectivity.xml
  45. 20
      msa/black-box-tests/src/test/resources/forImport.json
  46. 0
      msa/black-box-tests/src/test/resources/forImport.txt
  47. 26
      msa/black-box-tests/src/test/resources/smokeTests.xml
  48. 137
      msa/black-box-tests/src/test/resources/smokesCustomer.xml
  49. 138
      msa/black-box-tests/src/test/resources/smokesRuleChain.xml

24
msa/black-box-tests/pom.xml

@ -160,7 +160,31 @@
<artifactId>snmp</artifactId>
<type>docker-info</type>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-testng</artifactId>
<version>2.19.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>

129
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractBasePage.java

@ -0,0 +1,129 @@
package org.thingsboard.server.msa.ui.base;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.thingsboard.rest.client.RestClient;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.msa.ui.utils.Const;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
@Slf4j
abstract public class BasePage extends Base {
protected WebDriver driver;
protected WebDriverWait wait;
protected Actions actions;
protected RestClient client;
protected PageLink pageLink;
public BasePage(WebDriver driver) {
this.driver = driver;
this.wait = new WebDriverWait(driver, Duration.ofMillis(5000));
this.actions = new Actions(driver);
try {
client = new RestClient(Const.URL);
client.login(Const.TENANT_EMAIL, Const.TENANT_PASSWORD);
pageLink = new PageLink(10);
} catch (Exception e) {
log.info("Can't login");
}
}
@SneakyThrows
protected static void sleep(double second) {
Thread.sleep((long) (second * 1000L));
}
protected WebElement waitUntilVisibilityOfElementLocated(String locator) {
try {
return wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator)));
} catch (WebDriverException e) {
log.error("No visibility element: " + locator);
return null;
}
}
protected WebElement waitUntilElementToBeClickable(String locator) {
try {
return wait.until(ExpectedConditions.elementToBeClickable(By.xpath(locator)));
} catch (WebDriverException e) {
log.error("No clickable element: " + locator);
return null;
}
}
protected List<WebElement> waitUntilVisibilityOfElementsLocated(String locator) {
try {
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator)));
return driver.findElements(By.xpath(locator));
} catch (WebDriverException e) {
log.error("No visibility elements: " + locator);
return null;
}
}
protected List<WebElement> waitUntilElementsToBeClickable(String locator) {
try {
wait.until(ExpectedConditions.elementToBeClickable(By.xpath(locator)));
return driver.findElements(By.xpath(locator));
} catch (WebDriverException e) {
log.error("No clickable elements: " + locator);
return null;
}
}
public void waitUntilUrlContainsText(String urlPath) {
try {
wait.until(ExpectedConditions.urlContains(urlPath));
} catch (WebDriverException e) {
log.error("This URL path is missing");
}
}
protected void moveCursor(WebElement element) {
actions.moveToElement(element).perform();
}
protected void doubleClick(WebElement element) {
actions.doubleClick(element).build().perform();
}
public boolean elementIsNotPresent(String locator) {
try {
return wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator))));
} catch (WebDriverException e) {
throw new AssertionError("Element is present");
}
}
public boolean elementsIsNotPresent(String locator) {
try {
return wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath(locator))));
} catch (WebDriverException e) {
throw new AssertionError("Elements is present");
}
}
public void waitUntilNumberOfTabToBe(int tabNumber) {
try {
wait.until(ExpectedConditions.numberOfWindowsToBe(tabNumber));
} catch (WebDriverException e) {
log.error("No tabs with this number");
}
}
public void goToNextTab(int tabNumber) {
waitUntilNumberOfTabToBe(tabNumber);
ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(tabNumber - 1));
}
}

74
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDiverBaseTest.java

@ -0,0 +1,74 @@
package org.thingsboard.server.msa.ui.base;
import io.github.bonigarcia.wdm.WebDriverManager;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Listeners;
import org.thingsboard.server.msa.TestListener;
import org.thingsboard.server.msa.ui.listeners.RetryTestListener;
import java.time.Duration;
@Slf4j
@Listeners({TestListener.class, RetryTestListener.class})
abstract public class DiverBaseTest extends Base {
protected WebDriver driver;
private final Dimension dimension = new Dimension(WIDTH, HEIGHT);
private static final int WIDTH = 1680;
private static final int HEIGHT = 1050;
private static final boolean HEADLESS = false;
@BeforeMethod
public void openBrowser() {
log.info("*----------------------* Setup driver *----------------------*");
if (HEADLESS == true) {
ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--headless");
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver(options);
} else {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
driver.manage().window().setSize(dimension);
}
@AfterMethod
public void closeBrowser() {
log.info("*----------------------* Teardown *----------------------*");
driver.quit();
}
public void openUrl(String url) {
driver.get(url);
}
public String getUrl() {
return driver.getCurrentUrl();
}
public WebDriver getDriver() {
return driver;
}
protected boolean urlContains(String urlPath) {
WebDriverWait wait = new WebDriverWait(driver, Duration.ofMillis(10000));
try {
wait.until(ExpectedConditions.urlContains(urlPath));
} catch (WebDriverException e) {
log.error("This URL path is missing");
}
return driver.getCurrentUrl().contains(urlPath);
}
}

20
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/listeners/RetryAnalyzer.java

@ -0,0 +1,20 @@
package listeners;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class RetryAnalyzer implements IRetryAnalyzer {
private int retryCount = 0;
private static final int MAX_RETRY_COUNT = 2;
@Override
public boolean retry(ITestResult result) {
if (retryCount < MAX_RETRY_COUNT) {
System.out.printf("Retrying test %s for the %d time(s).%n", result.getName(), retryCount + 1);
retryCount++;
return true;
}
return false;
}
}

18
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/listeners/RetryTestListener.java

@ -0,0 +1,18 @@
package listeners;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class RetryTestListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation,
Class testClass,
Constructor testConstructor,
Method testMethod) {
annotation.setRetryAnalyzer(RetryAnalyzer.class);
}
}

62
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/listeners/TestListener.java

@ -0,0 +1,62 @@
package listeners;
import base.Base;
import base.TestInit;
import io.qameta.allure.Allure;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
@Slf4j
public class TestListener extends Base implements ITestListener {
WebDriver driver;
public void onTestSuccess(ITestResult tr) {
String str = "Test " + tr.getMethod().getMethodName() + " success";
log.info("*----------------------* " + str + " *----------------------*");
Allure.getLifecycle().updateTestCase((t) -> {
t.setStatusDetails(t.getStatusDetails().setMessage(str));
});
driver = ((TestInit) tr.getInstance()).getDriver();
captureScreen(driver, "success");
}
public void onTestFailure(ITestResult tr) {
String str = "Test " + tr.getMethod().getMethodName() + " failure";
String str1 = "Failed because of - " + tr.getThrowable();
log.info("*----------------------* " + str + " *----------------------*");
log.info("*----------------------* " + str1 + " *----------------------*");
Allure.getLifecycle().updateTestCase((t) -> {
t.setStatusDetails(t.getStatusDetails().setMessage(str));
t.setStatusDetails(t.getStatusDetails().setMessage(str1));
});
driver = ((TestInit) tr.getInstance()).getDriver();
captureScreen(driver, "failure");
}
public void onTestSkipped(ITestResult tr) {
String str = "Test " + tr.getMethod().getMethodName() + " skipped";
String str1 = "Skipped because of - " + tr.getThrowable();
log.info("*----------------------* " + str + " *----------------------*");
log.info("*----------------------* " + str1 + " *----------------------*");
Allure.getLifecycle().updateTestCase((t) -> {
t.setStatusDetails(t.getStatusDetails().setMessage(str));
t.setStatusDetails(t.getStatusDetails().setMessage(str1));
});
driver = ((TestInit) tr.getInstance()).getDriver();
captureScreen(driver, "skipped");
}
public void onStart(ITestContext testContext) {
String str = "Test " + testContext.getCurrentXmlTest().getName() + " start";
log.info("*----------------------* " + str + " *----------------------*");
}
public void onFinish(ITestContext testContext) {
String str = "Test " + testContext.getCurrentXmlTest().getName() + " finish";
log.info("*----------------------* " + str + " *----------------------*");
}
}

262
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageElements.java

@ -0,0 +1,262 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import java.util.List;
public class CustomerPageElementsAbstract extends OtherPageElementsHelperAbstract {
public CustomerPageElementsAbstract(WebDriver driver) {
super(driver);
}
private static final String CUSTOMER = "//mat-row//span[contains(text(),'%s')]";
private static final String EMAIL = ENTITY + "/../..//mat-cell[contains(@class,'email')]/span";
private static final String COUNTRY = ENTITY + "/../..//mat-cell[contains(@class,'country')]/span";
private static final String CITY = ENTITY + "/../..//mat-cell[contains(@class,'city')]/span";
private static final String TITLES = "//mat-cell[contains(@class,'cdk-column-title')]/span";
protected static final String EDIT_MENU_DASHBOARD_FIELD = "//input[@formcontrolname='dashboard']";
private static final String EDIT_MENU_DASHBOARD = "//div[@class='cdk-overlay-pane']//span/span";
private static final String MANAGE_CUSTOMERS_USERS_BTN = ENTITY + "/../..//mat-icon[contains(text(),' account_circle')]/../..";
private static final String MANAGE_CUSTOMERS_ASSETS_BTN = ENTITY + "/../..//mat-icon[contains(text(),' domain')]/../..";
private static final String MANAGE_CUSTOMERS_DEVICES_BTN = ENTITY + "/../..//mat-icon[contains(text(),' devices_other')]/../..";
private static final String MANAGE_CUSTOMERS_DASHBOARDS_BTN = ENTITY + "/../..//mat-icon[contains(text(),' dashboard')]/../..";
private static final String MANAGE_CUSTOMERS_EDGE_BTN = ENTITY + "/../..//mat-icon[contains(text(),' router')]/../..";
private static final String ADD_USER_EMAIL = "//tb-add-user-dialog//input[@formcontrolname='email']";
private static final String ACTIVATE_WINDOW_OK_BTN = "//span[contains(text(),'OK')]";
private static final String USER_LOGIN_BTN = "//mat-icon[@data-mat-icon-name='login']";
private static final String USERS_WIDGET = "//tb-widget";
private static final String SELECT_COUNTRY_MENU = "//mat-form-field//mat-select[@formcontrolname='country']";
private static final String COUNTRIES = "//span[@class='mat-option-text']";
protected static final String INPUT_FIELD = "//input[@formcontrolname='%s']";
protected static final String INPUT_FIELD_NAME_TITLE = "title";
private static final String INPUT_FIELD_NAME_CITY = "city";
private static final String INPUT_FIELD_NAME_STATE = "state";
private static final String INPUT_FIELD_NAME_ZIP = "zip";
private static final String INPUT_FIELD_NAME_ADDRESS = "address";
private static final String INPUT_FIELD_NAME_ADDRESS2 = "address2";
private static final String INPUT_FIELD_NAME_EMAIL = "email";
private static final String INPUT_FIELD_NAME_NUMBER = "phoneNumber";
private static final String INPUT_FIELD_NAME_ASSIGNED_LIST = "entity";
private static final String ASSIGNED_BTN = "//button[@type='submit']";
private static final String HIDE_HOME_DASHBOARD_TOOLBAR = "//mat-checkbox[@formcontrolname='homeDashboardHideToolbar']/label";
private static final String FILTER_BTN = "//tb-filters-edit";
private static final String TIME_BTN = "//tb-timewindow";
private static final String CUSTOMER_ICON_HEADER = "//tb-breadcrumb//span[contains(text(),'Customer %s')]";
private static final String CUSTOMER_USER_ICON_HEADER = "Users";
private static final String CUSTOMER_ASSETS_ICON_HEADER = "Assets";
private static final String CUSTOMER_DEVICES_ICON_HEADER = "Devices";
private static final String CUSTOMER_DASHBOARD_ICON_HEADER = "Dashboards";
private static final String CUSTOMER_EDGE_ICON_HEADER = "edge instances";
private static final String CUSTOMER_USER_ICON_HEAD = "(//mat-drawer-content//span[contains(@class,'tb-entity-table')])[1]";
private static final String MANAGE_BTN_VIEW = "//span[contains(text(),'%s')]";
private static final String MANAGE_CUSTOMERS_USERS_BTN_VIEW = "Manage users";
private static final String MANAGE_CUSTOMERS_ASSETS_BTN_VIEW = "Manage assets";
private static final String MANAGE_CUSTOMERS_DEVICE_BTN_VIEW = "Manage devices";
private static final String MANAGE_CUSTOMERS_DASHBOARD_BTN_VIEW = "Manage dashboards";
private static final String MANAGE_CUSTOMERS_EDGE_BTN_VIEW = "Manage edges ";
public WebElement titleFieldAddEntityView() {
return waitUntilElementToBeClickable(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_TITLE));
}
public WebElement titleFieldEntityView() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_TITLE));
}
public WebElement customer(String entityName) {
return waitUntilElementToBeClickable(String.format(CUSTOMER, entityName));
}
public WebElement email(String entityName) {
return waitUntilVisibilityOfElementLocated(String.format(EMAIL, entityName));
}
public WebElement country(String entityName) {
return waitUntilVisibilityOfElementLocated(String.format(COUNTRY, entityName));
}
public WebElement city(String entityName) {
return waitUntilVisibilityOfElementLocated(String.format(CITY, entityName));
}
public List<WebElement> entityTitles() {
return waitUntilVisibilityOfElementsLocated(TITLES);
}
public WebElement editMenuDashboardField() {
return waitUntilVisibilityOfElementLocated(EDIT_MENU_DASHBOARD_FIELD);
}
public WebElement editMenuDashboard() {
return waitUntilElementToBeClickable(EDIT_MENU_DASHBOARD);
}
public WebElement phoneNumberEntityView() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_NUMBER));
}
public WebElement phoneNumberAddEntityView() {
return waitUntilVisibilityOfElementLocated(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_NUMBER));
}
public WebElement manageCustomersUserBtn(String title) {
return waitUntilElementToBeClickable(String.format(MANAGE_CUSTOMERS_USERS_BTN, title));
}
public WebElement manageCustomersAssetsBtn(String title) {
return waitUntilElementToBeClickable(String.format(MANAGE_CUSTOMERS_ASSETS_BTN, title));
}
public WebElement manageCustomersDevicesBtn(String title) {
return waitUntilElementToBeClickable(String.format(MANAGE_CUSTOMERS_DEVICES_BTN, title));
}
public WebElement manageCustomersDashboardsBtn(String title) {
return waitUntilElementToBeClickable(String.format(MANAGE_CUSTOMERS_DASHBOARDS_BTN, title));
}
public WebElement manageCustomersEdgeBtn(String title) {
return waitUntilElementToBeClickable(String.format(MANAGE_CUSTOMERS_EDGE_BTN, title));
}
public WebElement addUserEmailField() {
return waitUntilElementToBeClickable(ADD_USER_EMAIL);
}
public WebElement activateWindowOkBtn() {
return waitUntilElementToBeClickable(ACTIVATE_WINDOW_OK_BTN);
}
public WebElement userLoginBtn() {
return waitUntilElementToBeClickable(USER_LOGIN_BTN);
}
public WebElement usersWidget() {
return waitUntilVisibilityOfElementLocated(USERS_WIDGET);
}
public WebElement countrySelectMenuEntityView() {
return waitUntilElementToBeClickable(SELECT_COUNTRY_MENU);
}
public WebElement countrySelectMenuAddEntityView() {
return waitUntilElementToBeClickable(ADD_ENTITY_VIEW + SELECT_COUNTRY_MENU);
}
public List<WebElement> countries() {
return waitUntilElementsToBeClickable(COUNTRIES);
}
public WebElement cityEntityView() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_CITY));
}
public WebElement cityAddEntityView() {
return waitUntilVisibilityOfElementLocated(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_CITY));
}
public WebElement stateEntityView() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_STATE));
}
public WebElement stateAddEntityView() {
return waitUntilVisibilityOfElementLocated(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_STATE));
}
public WebElement zipEntityView() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_ZIP));
}
public WebElement zipAddEntityView() {
return waitUntilVisibilityOfElementLocated(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_ZIP));
}
public WebElement addressEntityView() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_ADDRESS));
}
public WebElement addressAddEntityView() {
return waitUntilVisibilityOfElementLocated(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_ADDRESS));
}
public WebElement address2EntityView() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_ADDRESS2));
}
public WebElement address2AddEntityView() {
return waitUntilVisibilityOfElementLocated(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_ADDRESS2));
}
public WebElement emailEntityView() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_EMAIL));
}
public WebElement emailAddEntityView() {
return waitUntilVisibilityOfElementLocated(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_EMAIL));
}
public WebElement assignedField() {
return waitUntilVisibilityOfElementLocated(String.format(INPUT_FIELD, INPUT_FIELD_NAME_ASSIGNED_LIST));
}
public WebElement submitAssignedBtn() {
return waitUntilElementToBeClickable(ASSIGNED_BTN);
}
public WebElement hideHomeDashboardToolbarCheckbox() {
return waitUntilElementToBeClickable(HIDE_HOME_DASHBOARD_TOOLBAR);
}
public WebElement filterBtn() {
return waitUntilVisibilityOfElementLocated(FILTER_BTN);
}
public WebElement timeBtn() {
return waitUntilVisibilityOfElementLocated(TIME_BTN);
}
public WebElement customerUserIconHeader() {
return waitUntilVisibilityOfElementLocated(String.format(CUSTOMER_ICON_HEADER, CUSTOMER_USER_ICON_HEADER));
}
public WebElement customerAssetsIconHeader() {
return waitUntilVisibilityOfElementLocated(String.format(CUSTOMER_ICON_HEADER, CUSTOMER_ASSETS_ICON_HEADER));
}
public WebElement customerDevicesIconHeader() {
return waitUntilVisibilityOfElementLocated(String.format(CUSTOMER_ICON_HEADER, CUSTOMER_DEVICES_ICON_HEADER));
}
public WebElement customerDashboardIconHeader() {
return waitUntilVisibilityOfElementLocated(String.format(CUSTOMER_ICON_HEADER, CUSTOMER_DASHBOARD_ICON_HEADER));
}
public WebElement customerEdgeIconHeader() {
return waitUntilVisibilityOfElementLocated(String.format(CUSTOMER_ICON_HEADER, CUSTOMER_EDGE_ICON_HEADER));
}
public WebElement customerManageWindowIconHead() {
return waitUntilVisibilityOfElementLocated(CUSTOMER_USER_ICON_HEAD);
}
public WebElement manageCustomersUserBtnView() {
return waitUntilElementToBeClickable(String.format(MANAGE_BTN_VIEW, MANAGE_CUSTOMERS_USERS_BTN_VIEW));
}
public WebElement manageCustomersAssetsBtnView() {
return waitUntilElementToBeClickable(String.format(MANAGE_BTN_VIEW, MANAGE_CUSTOMERS_ASSETS_BTN_VIEW));
}
public WebElement manageCustomersDeviceBtnView() {
return waitUntilElementToBeClickable(String.format(MANAGE_BTN_VIEW, MANAGE_CUSTOMERS_DEVICE_BTN_VIEW));
}
public WebElement manageCustomersDashboardsBtnView() {
return waitUntilElementToBeClickable(String.format(MANAGE_BTN_VIEW, MANAGE_CUSTOMERS_DASHBOARD_BTN_VIEW));
}
public WebElement manageCustomersEdgeBtnView() {
return waitUntilElementToBeClickable(String.format(MANAGE_BTN_VIEW, MANAGE_CUSTOMERS_EDGE_BTN_VIEW));
}
}

161
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageHelper.java

@ -0,0 +1,161 @@
package org.thingsboard.server.msa.ui.pages;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.page.PageData;
import java.util.stream.Collectors;
@Slf4j
public class CustomerPageHelperAbstract extends CustomerPageElementsAbstract {
public CustomerPageHelperAbstract(WebDriver driver) {
super(driver);
}
private String customerName;
private String country;
private String dashboard;
private String dashboardFromView;
private String customerEmail;
private String customerCountry;
private String customerCity;
public void setCustomerName() {
this.customerName = entityTitles().get(0).getText();
}
public void setCustomerName(int number) {
this.customerName = entityTitles().get(number).getText();
}
public String getCustomerName() {
return customerName;
}
public void setCountry() {
this.country = countries().get(0).getText();
}
public String getCountry() {
return country;
}
public void setDashboard() {
this.dashboard = listOfEntity().get(0).getText();
}
public void setDashboardFromView() {
this.dashboardFromView = editMenuDashboardField().getAttribute("value");
}
public String getDashboard() {
return dashboard;
}
public String getDashboardFromView() {
return dashboardFromView;
}
public void setCustomerEmail(String title) {
this.customerEmail = email(title).getText();
}
public String getCustomerEmail() {
return customerEmail;
}
public void setCustomerCountry(String title) {
this.customerCountry = country(title).getText();
}
public String getCustomerCountry() {
return customerCountry;
}
public void setCustomerCity(String title) {
this.customerCity = city(title).getText();
}
public String getCustomerCity() {
return customerCity;
}
public void createCustomer(String entityName) {
try {
PageData<Customer> tenantCustomer;
tenantCustomer = client.getCustomers(pageLink);
Customer customer = new Customer();
customer.setTitle(entityName);
client.saveCustomer(customer);
tenantCustomer.getData().add(customer);
} catch (Exception e) {
log.info("Can't create!");
}
}
public void deleteCustomer(String entityName) {
try {
PageData<Customer> tenantRuleChains;
tenantRuleChains = client.getCustomers(pageLink);
try {
client.deleteCustomer(tenantRuleChains.getData().stream().filter(s -> s.getName().equals(entityName)).collect(Collectors.toList()).get(0).getId());
} catch (Exception e) {
client.deleteCustomer(tenantRuleChains.getData().stream().filter(s -> s.getName().equals(entityName)).collect(Collectors.toList()).get(1).getId());
}
} catch (Exception e) {
log.info("Can't delete!");
}
}
public void changeTitleEditMenu(String newTitle) {
titleFieldEntityView().clear();
wait.until(ExpectedConditions.textToBe(By.xpath(String.format(INPUT_FIELD, INPUT_FIELD_NAME_TITLE)), ""));
titleFieldEntityView().sendKeys(newTitle);
}
public void chooseDashboard() {
editMenuDashboardField().click();
sleep(0.5);
editMenuDashboard().click();
sleep(0.5);
}
public void createCustomersUser() {
plusBtn().click();
addUserEmailField().sendKeys(getRandomNumber() + "@gmail.com");
addBtnC().click();
activateWindowOkBtn().click();
}
public void selectCountryEntityView() {
countrySelectMenuEntityView().click();
setCountry();
countries().get(0).click();
}
public void selectCountryAddEntityView() {
countrySelectMenuAddEntityView().click();
setCountry();
countries().get(0).click();
}
public void assignedDashboard() {
plusBtn().click();
assignedField().click();
setDashboard();
listOfEntity().get(0).click();
submitAssignedBtn().click();
}
public boolean customerIsNotPresent(String title) {
return elementsIsNotPresent(getEntity(title));
}
public void sortByNameDown() {
doubleClick(sortByTitleBtn());
}
}

38
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DashboardPageElements.java

@ -0,0 +1,38 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import java.util.List;
public class DashboardPageElementsAbstract extends OtherPageElementsHelperAbstract {
public DashboardPageElementsAbstract(WebDriver driver) {
super(driver);
}
private static final String TITLES = "//mat-cell[contains(@class,'cdk-column-title')]/span";
private static final String ASSIGNED_BTN = ENTITY + "/../..//mat-icon[contains(text(),' assignment_ind')]/../..";
private static final String MANAGE_ASSIGNED_ENTITY_LIST_FIELD = "//input[@formcontrolname='entity']";
private static final String MANAGE_ASSIGNED_ENTITY = "//mat-option//span[contains(text(),'%s')]";
private static final String MANAGE_ASSIGNED_UPDATE_BTN = "//button[@type='submit']";
public List<WebElement> entityTitles() {
return waitUntilVisibilityOfElementsLocated(TITLES);
}
public WebElement assignedBtn(String title) {
return waitUntilElementToBeClickable(String.format(ASSIGNED_BTN, title));
}
public WebElement manageAssignedEntityListField() {
return waitUntilElementToBeClickable(MANAGE_ASSIGNED_ENTITY_LIST_FIELD);
}
public WebElement manageAssignedEntity(String title) {
return waitUntilElementToBeClickable(String.format(MANAGE_ASSIGNED_ENTITY, title));
}
public WebElement manageAssignedUpdateBtn() {
return waitUntilElementToBeClickable(MANAGE_ASSIGNED_UPDATE_BTN);
}
}

25
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DashboardPageHelper.java

@ -0,0 +1,25 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver;
public class DashboardPageHelperAbstract extends DashboardPageElementsAbstract {
public DashboardPageHelperAbstract(WebDriver driver) {
super(driver);
}
private String dashboardTitle;
public void setDashboardTitle() {
this.dashboardTitle = entityTitles().get(0).getText();
}
public String getDashboardTitle() {
return dashboardTitle;
}
public void assignedCustomer(String title) {
manageAssignedEntityListField().click();
manageAssignedEntity(title).click();
manageAssignedUpdateBtn().click();
}
}

28
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/LoginPageElements.java

@ -0,0 +1,28 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.thingsboard.server.msa.ui.base.AbstractBasePage;
public class LoginPageElementsAbstract extends AbstractBasePage {
public LoginPageElementsAbstract(WebDriver driver) {
super(driver);
}
private static final String EMAIL_FIELD = "//input[@id='username-input']";
private static final String PASSWORD_FIELD = "//input[@id='password-input']";
private static final String SUBMIT_BTN = "//button[@type='submit']";
public WebElement emailField() {
return waitUntilElementToBeClickable(EMAIL_FIELD);
}
public WebElement passwordField() {
return waitUntilElementToBeClickable(PASSWORD_FIELD);
}
public WebElement submitBtn() {
return waitUntilElementToBeClickable(SUBMIT_BTN);
}
}

16
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/LoginPageHelper.java

@ -0,0 +1,16 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver;
import org.thingsboard.server.msa.ui.utils.Const;
public class LoginPageHelperAbstract extends LoginPageElementsAbstract {
public LoginPageHelperAbstract(WebDriver driver) {
super(driver);
}
public void authorizationTenant() {
emailField().sendKeys(Const.TENANT_EMAIL);
passwordField().sendKeys(Const.TENANT_PASSWORD);
submitBtn().click();
}
}

33
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OpenRuleChainPageElements.java

@ -0,0 +1,33 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.thingsboard.server.msa.ui.base.AbstractBasePage;
public class OpenRuleChainPageElementsAbstract extends AbstractBasePage {
public OpenRuleChainPageElementsAbstract(WebDriver driver) {
super(driver);
}
private static final String DONE_BTN = "//mat-icon[contains(text(),'done')]/../..";
private static final String DONE_BTN_DISABLE = "//mat-icon[contains(text(),'done')]/../parent::button[@disabled='true']";
private static final String INPUT_NODE = "//div[@class='tb-rule-node tb-input-type']";
private static final String HEAD_RULE_CHAIN_NAME = "//div[@class='tb-breadcrumb']/span[2]";
public WebElement inputNode() {
return waitUntilVisibilityOfElementLocated(INPUT_NODE);
}
public WebElement headRuleChainName() {
return waitUntilVisibilityOfElementLocated(HEAD_RULE_CHAIN_NAME);
}
public String getDoneBtnDisable() {
return DONE_BTN_DISABLE;
}
public WebElement doneBtn() {
return waitUntilElementToBeClickable(DONE_BTN);
}
}

23
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OpenRuleChainPageHelper.java

@ -0,0 +1,23 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver;
public class OpenRuleChainPageHelperAbstract extends OpenRuleChainPageElementsAbstract {
public OpenRuleChainPageHelperAbstract(WebDriver driver) {
super(driver);
}
private String headName;
public void setHeadName() {
this.headName = headRuleChainName().getText().split(" ")[1];
}
public String getHeadName() {
return headName;
}
public void waitUntilDoneBtnDisable() {
waitUntilVisibilityOfElementLocated(getDoneBtnDisable());
}
}

228
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OtherPageElements.java

@ -0,0 +1,228 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.thingsboard.server.msa.ui.base.AbstractBasePage;
import java.util.List;
public class OtherPageElementsAbstract extends AbstractBasePage {
public OtherPageElementsAbstract(WebDriver driver) {
super(driver);
}
protected static final String ENTITY = "//mat-row//span[contains(text(),'%s')]";
protected static final String DELETE_BTN = ENTITY + "/../..//mat-icon[contains(text(),' delete')]/../..";
private static final String ENTITY_COUNT = "//div[@class='mat-paginator-range-label']";
private static final String WARNING_DELETE_POPUP_YES = "//tb-confirm-dialog//button[2]";
private static final String WARNING_DELETE_POPUP_TITLE = "//tb-confirm-dialog/h2";
private static final String REFRESH_BTN = "//mat-icon[contains(text(),'refresh')]/..";
private static final String HELP_BTN = "//mat-icon[contains(text(),'help')]/..";
private static final String CHECKBOX = "//mat-row//span[contains(text(),'%s')]/../..//mat-checkbox";
private static final String CHECKBOXES = "//tbody//mat-checkbox";
private static final String DELETE_SELECTED_BTN = "//span[contains(text(),'selected')]//..//mat-icon/../..";
private static final String DELETE_BTNS = "//mat-icon[contains(text(),' delete')]/../..";
private static final String MARKS_CHECKBOX = "//mat-row[contains (@class,'mat-selected')]//mat-checkbox[contains(@class, 'checked')]";
private static final String SELECT_ALL_CHECKBOX = "//thead//mat-checkbox";
private static final String ALL_ENTITY = "//mat-row[@class='mat-row cdk-row mat-row-select ng-star-inserted']";
private static final String EDIT_PENCIL_BTN = "//mat-icon[contains(text(),'edit')]/ancestor::button";
private static final String NAME_FIELD_EDIT_VIEW = "//input[@formcontrolname='name']";
private static final String HEADER_NAME_VIEW = "//header//div[@class='tb-details-title']/span";
private static final String DONE_BTN_EDIT_VIEW = "//mat-icon[contains(text(),'done')]/ancestor::button";
private static final String DESCRIPTION_ENTITY_VIEW = "//textarea";
private static final String DESCRIPTION_ADD_ENTITY_VIEW = "//tb-add-entity-dialog//textarea";
private static final String DEBUG_CHECKBOX_EDIT = "//mat-checkbox[@formcontrolname='debugMode']";
private static final String DEBUG_CHECKBOX_VIEW = "//mat-checkbox[@formcontrolname='debugMode']//input";
private static final String CLOSE_ENTITY_VIEW_BTN = "//header//mat-icon[contains(text(),'close')]/../..";
private static final String SEARCH_BTN = "//mat-toolbar//mat-icon[contains(text(),'search')]/.." +
"/parent::button[@class='mat-focus-indicator mat-tooltip-trigger mat-icon-button mat-button-base ng-star-inserted']";
private static final String SORT_BY_NAME_BTN = "//div[contains(text(),'Name')]";
private static final String SORT_BY_TITLE_BTN = "//div[contains(text(),'Title')]";
private static final String SORT_BY_TIME_BTN = "//div[contains(text(),'Created time')]/..";
private static final String CREATED_TIME = "//tbody[@role='rowgroup']//mat-cell[2]/span";
private static final String PLUS_BTN = "//mat-icon[contains(text(),'add')]/../parent::button";
private static final String CREATE_VIEW_ADD_BTN = "//span[contains(text(),'Add')]/..";
private static final String WARNING_MESSAGE = "//tb-snack-bar-component/div/div";
private static final String ERROR_MESSAGE = "//mat-error";
private static final String ENTITY_VIEW_TITLE = "//div[@class='tb-details-title']//span";
private static final String LIST_OF_ENTITY = "//div[@role='listbox']/mat-option";
protected static final String ADD_ENTITY_VIEW = "//tb-add-entity-dialog";
protected static final String STATE_CONTROLLER = "//tb-entity-state-controller";
private static final String SEARCH_FIELD = "//input[contains (@data-placeholder,'Search')]";
public String getEntity(String entityName) {
return String.format(ENTITY, entityName);
}
public String getWarningMessage() {
return WARNING_MESSAGE;
}
public String getDeleteBtns() {
return DELETE_BTNS;
}
public String getCheckbox(String entityName) {
return String.format(CHECKBOX, entityName);
}
public String getCheckboxes() {
return String.format(CHECKBOXES);
}
public WebElement warningPopUpYesBtn() {
return waitUntilElementToBeClickable(WARNING_DELETE_POPUP_YES);
}
public WebElement warningPopUpTitle() {
return waitUntilElementToBeClickable(WARNING_DELETE_POPUP_TITLE);
}
public WebElement entityCount() {
return waitUntilVisibilityOfElementLocated(ENTITY_COUNT);
}
public WebElement refreshBtn() {
return waitUntilElementToBeClickable(REFRESH_BTN);
}
public WebElement helpBtn() {
return waitUntilElementToBeClickable(HELP_BTN);
}
public WebElement checkBox(String entityName) {
return waitUntilElementToBeClickable(String.format(CHECKBOX, entityName));
}
public WebElement deleteSelectedBtn() {
return waitUntilElementToBeClickable(DELETE_SELECTED_BTN);
}
public WebElement selectAllCheckBox() {
return waitUntilElementToBeClickable(SELECT_ALL_CHECKBOX);
}
public WebElement editPencilBtn() {
return waitUntilElementToBeClickable(EDIT_PENCIL_BTN);
}
public WebElement nameFieldEditMenu() {
return waitUntilElementToBeClickable(NAME_FIELD_EDIT_VIEW);
}
public WebElement headerNameView() {
return waitUntilVisibilityOfElementLocated(HEADER_NAME_VIEW);
}
public WebElement doneBtnEditView() {
return waitUntilElementToBeClickable(DONE_BTN_EDIT_VIEW);
}
public WebElement descriptionEntityView() {
return waitUntilVisibilityOfElementLocated(DESCRIPTION_ENTITY_VIEW);
}
public WebElement descriptionAddEntityView() {
return waitUntilVisibilityOfElementLocated(DESCRIPTION_ADD_ENTITY_VIEW);
}
public WebElement debugCheckboxEdit() {
return waitUntilElementToBeClickable(DEBUG_CHECKBOX_EDIT);
}
public WebElement debugCheckboxView() {
return waitUntilVisibilityOfElementLocated(DEBUG_CHECKBOX_VIEW);
}
public WebElement closeEntityViewBtn() {
return waitUntilElementToBeClickable(CLOSE_ENTITY_VIEW_BTN);
}
public WebElement searchBtn() {
return waitUntilElementToBeClickable(SEARCH_BTN);
}
public List<WebElement> deleteBtns() {
return waitUntilVisibilityOfElementsLocated(DELETE_BTNS);
}
public List<WebElement> checkBoxes() {
return waitUntilElementsToBeClickable(CHECKBOXES);
}
public List<WebElement> markCheckbox() {
return waitUntilVisibilityOfElementsLocated(MARKS_CHECKBOX);
}
public List<WebElement> allEntity() {
return waitUntilVisibilityOfElementsLocated(ALL_ENTITY);
}
public WebElement doneBtnEditViewVisible() {
return waitUntilVisibilityOfElementLocated(DONE_BTN_EDIT_VIEW);
}
public WebElement sortByNameBtn() {
return waitUntilElementToBeClickable(SORT_BY_NAME_BTN);
}
public WebElement sortByTitleBtn() {
return waitUntilElementToBeClickable(SORT_BY_TITLE_BTN);
}
public WebElement sortByTimeBtn() {
return waitUntilElementToBeClickable(SORT_BY_TIME_BTN);
}
public List<WebElement> createdTime() {
return waitUntilVisibilityOfElementsLocated(CREATED_TIME);
}
public WebElement plusBtn() {
return waitUntilElementToBeClickable(PLUS_BTN);
}
public WebElement addBtnC() {
return waitUntilElementToBeClickable(CREATE_VIEW_ADD_BTN);
}
public WebElement addBtnV() {
return waitUntilVisibilityOfElementLocated(CREATE_VIEW_ADD_BTN);
}
public WebElement warningMessage() {
return waitUntilVisibilityOfElementLocated(WARNING_MESSAGE);
}
public WebElement deleteBtn(String entityName) {
return waitUntilVisibilityOfElementLocated(String.format(DELETE_BTN, entityName));
}
public WebElement entity(String entityName) {
return waitUntilElementToBeClickable(String.format(ENTITY, entityName));
}
public WebElement errorMessage() {
return waitUntilVisibilityOfElementLocated(ERROR_MESSAGE);
}
public WebElement entityViewTitle() {
return waitUntilVisibilityOfElementLocated(ENTITY_VIEW_TITLE);
}
public List<WebElement> listOfEntity() {
return waitUntilElementsToBeClickable(LIST_OF_ENTITY);
}
public WebElement addEntityView() {
return waitUntilVisibilityOfElementLocated(ADD_ENTITY_VIEW);
}
public WebElement stateController() {
return waitUntilVisibilityOfElementLocated(STATE_CONTROLLER);
}
public WebElement searchField() {
return waitUntilElementToBeClickable(SEARCH_FIELD);
}
}

98
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OtherPageElementsHelper.java

@ -0,0 +1,98 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
public class OtherPageElementsHelperAbstract extends OtherPageElementsAbstract {
public OtherPageElementsHelperAbstract(WebDriver driver) {
super(driver);
}
private String headerName;
public void setHeaderName() {
this.headerName = headerNameView().getText();
}
public String getHeaderName() {
return headerName;
}
public boolean entityIsNotPresent(String entityName) {
return elementIsNotPresent(getEntity(entityName));
}
public void goToHelpPage() {
helpBtn().click();
goToNextTab(2);
}
public void clickOnCheckBoxes(int count) {
for (int i = 0; i < count; i++) {
checkBoxes().get(i).click();
}
}
public void changeNameEditMenu(String newName) {
nameFieldEditMenu().sendKeys(Keys.CONTROL + "a" + Keys.BACK_SPACE);
nameFieldEditMenu().sendKeys(newName);
}
public void changeDescription(String newDescription) {
descriptionEntityView().sendKeys(Keys.CONTROL + "a" + Keys.BACK_SPACE);
descriptionEntityView().sendKeys(newDescription);
}
public String deleteRuleChainTrash(String entityName) {
String s = "";
if (deleteBtn(entityName) != null) {
deleteBtn(entityName).click();
warningPopUpYesBtn().click();
return entityName;
} else {
for (int i = 0; i < deleteBtns().size(); i++) {
if (deleteBtns().get(i).isEnabled()) {
deleteBtns().get(i).click();
warningPopUpYesBtn().click();
if (elementIsNotPresent(getWarningMessage())) {
s = driver.findElements(By.xpath(getDeleteBtns()
+ "/../../../mat-cell/following-sibling::mat-cell/following-sibling::mat-cell[contains(@class,'cdk-column-name')]/span")).get(i).getText();
break;
}
}
}
return s;
}
}
public String deleteSelected(String entityName) {
String s = "";
if (deleteBtn(entityName) != null) {
checkBox(entityName).click();
deleteSelectedBtn().click();
warningPopUpYesBtn().click();
return entityName;
} else {
for (int i = 0; i < checkBoxes().size(); i++) {
if (checkBoxes().get(i).isDisplayed()) {
s = driver.findElements(By.xpath(getCheckboxes() + "/../../mat-cell/following-sibling::mat-cell/following-sibling::mat-cell[contains(@class,'cdk-column-name')]/span")).get(i).getText();
checkBox(s).click();
deleteSelectedBtn().click();
warningPopUpYesBtn().click();
if (elementIsNotPresent(getWarningMessage())) {
break;
}
}
}
return s;
}
}
public void searchEntity(String namePath) {
searchBtn().click();
searchField().sendKeys(namePath);
sleep(0.5);
}
}

113
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/RuleChainsPageElements.java

@ -0,0 +1,113 @@
package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import java.util.List;
public class RuleChainsPageElementsAbstract extends OtherPageElementsHelperAbstract {
public RuleChainsPageElementsAbstract(WebDriver driver) {
super(driver);
}
private static final String MAKE_ROOT_BTN = ENTITY + "/../..//mat-icon[contains(text(),' flag')]/../..";
private static final String ROOT = ENTITY + "/../..//mat-icon[text() = 'check_box']";
private static final String ROOT_DISABLE = ENTITY + "/../..//mat-icon[text() = 'check_box_outline_blank']";
private static final String CREATED_TIME = ENTITY + "/../..//mat-cell/span[contains(text(),'%s')]";
private static final String CREATE_RULE_CHAIN_BTN = "//span[contains(text(),'Create new rule chain')]";
private static final String CREATE_RULE_CHAIN_NAME_FIELD = "//form[@class='ng-untouched ng-pristine ng-invalid']//input[@formcontrolname='name']";
private static final String RULE_CHAINS_NAMES_WITHOUT_ROOT = "//mat-icon[contains(text(),'check_box_outline_blank')]/../../../mat-cell[contains(@class,'name')]/span";
private static final String DELETE_RULE_CHAIN_FROM_VIEW_BTN = "//span[contains(text(),' Delete')]";
private static final String IMPORT_RULE_CHAIN_BTN = "//span[contains(text(),'Import rule chain')]";
private static final String BROWSE_FILE = "//input[@class='file-input']";
private static final String IMPORT_BROWSE_FILE = "//mat-dialog-container//span[contains(text(),'Import')]/..";
private static final String IMPORTING_FILE = "//div[contains(text(),'%s')]";
private static final String CLEAR_IMPORT_FILE_BTN = "//div[@class='tb-file-clear-container']//button";
private static final String OPEN_RULE_CHAIN = ENTITY + "/../..//mat-icon[contains(text(),' settings_ethernet')]";
private static final String OPEN_RULE_CHAIN_FROM_VIEW = "//span[contains(text(),'Open rule chain')]";
private static final String MAKE_ROOT_FROM_VIEW = "(//span[contains(text(),' Make rule chain root ')]/..)[1]";
private static final String ROOT_ACTIVE_CHECKBOXES = "//mat-icon[text() = 'check_box']";
private static final String ALL_NAMES = "//mat-icon[contains(text(),'check')]/../../../mat-cell[contains(@class,'name')]/span";
public String getDeleteRuleChainFromViewBtn() {
return DELETE_RULE_CHAIN_FROM_VIEW_BTN;
}
public WebElement makeRootBtn(String entityName) {
return waitUntilElementToBeClickable(String.format(MAKE_ROOT_BTN, entityName));
}
public List<WebElement> rootCheckBoxesEnable() {
return waitUntilVisibilityOfElementsLocated(ROOT_ACTIVE_CHECKBOXES);
}
public WebElement rootCheckBoxEnable(String entityName) {
return waitUntilVisibilityOfElementLocated(String.format(ROOT, entityName));
}
public WebElement rootCheckBoxDisable(String entityName) {
return waitUntilVisibilityOfElementLocated(String.format(ROOT_DISABLE, entityName));
}
public WebElement createRuleChainBtn() {
return waitUntilElementToBeClickable(CREATE_RULE_CHAIN_BTN);
}
public WebElement importRuleChainBtn() {
return waitUntilElementToBeClickable(IMPORT_RULE_CHAIN_BTN);
}
public WebElement nameField() {
return waitUntilElementToBeClickable(CREATE_RULE_CHAIN_NAME_FIELD);
}
public List<WebElement> notRootRuleChainsNames() {
return waitUntilVisibilityOfElementsLocated(RULE_CHAINS_NAMES_WITHOUT_ROOT);
}
public WebElement deleteBtnFromView() {
return waitUntilElementToBeClickable(DELETE_RULE_CHAIN_FROM_VIEW_BTN);
}
public WebElement browseFile() {
waitUntilElementToBeClickable(BROWSE_FILE + "/preceding-sibling::button");
return driver.findElement(By.xpath(BROWSE_FILE));
}
public WebElement importBrowseFileBtn() {
return waitUntilElementToBeClickable(IMPORT_BROWSE_FILE);
}
public WebElement importingFile(String fileName) {
return waitUntilVisibilityOfElementLocated(String.format(IMPORTING_FILE, fileName));
}
public WebElement clearImportFileBtn() {
return waitUntilElementToBeClickable(CLEAR_IMPORT_FILE_BTN);
}
public WebElement openRuleChainFromViewBtn() {
return waitUntilElementToBeClickable(OPEN_RULE_CHAIN_FROM_VIEW);
}
public WebElement openRuleChainBtn(String name) {
return waitUntilElementToBeClickable(String.format(OPEN_RULE_CHAIN, name));
}
public List<WebElement> entities(String name) {
return waitUntilVisibilityOfElementsLocated(String.format(ENTITY, name));
}
public WebElement makeRootFromViewBtn() {
return waitUntilElementToBeClickable(MAKE_ROOT_FROM_VIEW);
}
public List<WebElement> allNames() {
return waitUntilVisibilityOfElementsLocated(ALL_NAMES);
}
public WebElement createdTimeEntity(String name, String time) {
return waitUntilElementToBeClickable(String.format(CREATED_TIME, name, time));
}
}

180
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/RuleChainsPageHelper.java

@ -0,0 +1,180 @@
package org.thingsboard.server.msa.ui.pages;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.testng.Assert;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.rule.RuleChain;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.stream.Collectors;
@Slf4j
public class RuleChainsPageHelperAbstract extends RuleChainsPageElementsAbstract {
public RuleChainsPageHelperAbstract(WebDriver driver) {
super(driver);
}
public void openCreateRuleChainView() {
plusBtn().click();
createRuleChainBtn().click();
}
public void openImportRuleChainView() {
plusBtn().click();
importRuleChainBtn().click();
}
private int getRandomNumberFromRuleChainsCount() {
Random random = new Random();
return random.nextInt(notRootRuleChainsNames().size());
}
private String ruleChainName;
public void setRuleChainNameWithoutRoot() {
this.ruleChainName = notRootRuleChainsNames().get(getRandomNumberFromRuleChainsCount()).getText();
}
public void setRuleChainNameWithoutRoot(int number) {
this.ruleChainName = notRootRuleChainsNames().get(number).getText();
}
public void setRuleChainName(int number) {
this.ruleChainName = allNames().get(number).getText();
}
public String getRuleChainName() {
return this.ruleChainName;
}
public String getRuleChainId(String entityName) {
PageData<RuleChain> tenantRuleChains;
tenantRuleChains = client.getRuleChains(pageLink);
return String.valueOf(tenantRuleChains.getData().stream().filter(s -> s.getName().equals(entityName)).collect(Collectors.toList()).get(0).getId());
}
public void deleteRuleChain(String entityName) {
try {
PageData<RuleChain> tenantRuleChains;
tenantRuleChains = client.getRuleChains(pageLink);
try {
client.deleteRuleChain(tenantRuleChains.getData().stream().filter(s -> s.getName().equals(entityName)).collect(Collectors.toList()).get(0).getId());
} catch (Exception e) {
client.deleteRuleChain(tenantRuleChains.getData().stream().filter(s -> s.getName().equals(entityName)).collect(Collectors.toList()).get(1).getId());
}
} catch (Exception e) {
log.info("Can't delete!");
}
}
public void deleteAllRuleChain(String entityName) {
try {
PageData<RuleChain> tenantRuleChains;
tenantRuleChains = client.getRuleChains(pageLink);
tenantRuleChains.getData().stream().filter(s -> s.getName().equals(entityName)).collect(Collectors.toList()).forEach(x -> client.deleteRuleChain(x.getId()));
} catch (Exception e) {
log.info("Can't delete!");
}
}
public void createRuleChain(String entityName) {
try {
PageData<RuleChain> tenantRuleChains;
tenantRuleChains = client.getRuleChains(pageLink);
RuleChain ruleChain = new RuleChain();
ruleChain.setName(entityName);
client.saveRuleChain(ruleChain);
tenantRuleChains.getData().add(ruleChain);
} catch (Exception e) {
log.info("Can't create!");
}
}
public void makeRoot() {
try {
PageData<RuleChain> tenantRuleChains;
tenantRuleChains = client.getRuleChains(pageLink);
tenantRuleChains.getData().stream().filter(s -> s.getName().equals("Root Rule Chain")).collect(Collectors.toList()).forEach(x -> client.setRootRuleChain(x.getId()));
} catch (Exception e) {
log.info("Can't make root!");
}
}
public void createRuleChains(String entityName, int count) {
try {
PageData<RuleChain> tenantRuleChains;
tenantRuleChains = client.getRuleChains(pageLink);
RuleChain ruleChain = new RuleChain();
for (int i = 0; i < count; i++) {
ruleChain.setName(entityName);
client.saveRuleChain(ruleChain);
tenantRuleChains.getData().add(ruleChain);
}
} catch (Exception e) {
log.info("Can't create!");
}
}
public String deleteRuleChainFromView(String ruleChainName) {
String s = "";
if (deleteBtnFromView() != null) {
deleteBtnFromView().click();
warningPopUpYesBtn().click();
if (elementIsNotPresent(getWarningMessage())) {
return getEntity(ruleChainName);
}
} else {
for (int i = 0; i < notRootRuleChainsNames().size(); i++) {
notRootRuleChainsNames().get(i).click();
if (deleteBtnFromView() != null) {
deleteBtnFromView().click();
warningPopUpYesBtn().click();
if (elementIsNotPresent(getWarningMessage())) {
s = notRootRuleChainsNames().get(i).getText();
break;
}
}
}
}
return s;
}
public void assertCheckBoxIsNotDisplayed(String entityName) {
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//mat-checkbox)[2]")));
Assert.assertFalse(driver.findElement(By.xpath(getCheckbox(entityName))).isDisplayed());
}
public void assertDeleteBtnInRootRuleChainIsNotDisplayed() {
Assert.assertFalse(driver.findElement(By.xpath(getDeleteRuleChainFromViewBtn())).isDisplayed());
}
public boolean ruleChainsIsNotPresent(String ruleChainName) {
return elementsIsNotPresent(getEntity(ruleChainName));
}
public void doubleClickOnRuleChain(String ruleChainName) {
doubleClick(entity(ruleChainName));
}
public void sortByNameDown() {
doubleClick(sortByNameBtn());
}
ArrayList<String> sort;
public void setSort() {
ArrayList<String> createdTime = new ArrayList<>();
createdTime().forEach(x -> createdTime.add(x.getText()));
Collections.sort(createdTime);
sort = createdTime;
}
public ArrayList<String> getSort() {
return sort;
}
}

27
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java

@ -0,0 +1,27 @@
package pages;
import base.BasePage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class SideBarMenuViewElements extends BasePage {
public SideBarMenuViewElements(WebDriver driver) {
super(driver);
}
private static final String RULE_CHAINS_BTN = "//mat-toolbar//a[@href='/ruleChains']";
private static final String CUSTOMER_BTN = "//mat-toolbar//a[@href='/customers']";
private static final String DASHBOARD_BTN = "//mat-toolbar//a[@href='/dashboards']";
public WebElement ruleChainsBtn() {
return waitUntilElementToBeClickable(RULE_CHAINS_BTN);
}
public WebElement customerBtn() {
return waitUntilElementToBeClickable(CUSTOMER_BTN);
}
public WebElement dashboardBtn() {
return waitUntilElementToBeClickable(DASHBOARD_BTN);
}
}

164
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/CreateCustomerTest.java

@ -0,0 +1,164 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.*;
public class CreateCustomerAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private String customerName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@AfterMethod
public void delete() {
if (customerName != null) {
customerPage.deleteCustomer(customerName);
customerName = null;
}
}
@Test(priority = 10, groups = "smoke")
@Description("Can click on Add after specifying the name (text/numbers /special characters)")
public void createCustomer() {
String customerName = ENTITY_NAME;
sideBarMenuView.customerBtn().click();
customerPage.plusBtn().click();
customerPage.titleFieldAddEntityView().sendKeys(customerName);
customerPage.addBtnC().click();
customerPage.refreshBtn().click();
this.customerName = customerName;
Assert.assertNotNull(customerPage.customer(customerName));
Assert.assertTrue(customerPage.customer(customerName).isDisplayed());
}
@Test(priority = 20, groups = "smoke")
public void createCustomerWithFullInformation() {
String customerName = ENTITY_NAME;
String text = "Text";
String email = "email@mail.com";
String number = "2015550123";
sideBarMenuView.customerBtn().click();
customerPage.plusBtn().click();
customerPage.titleFieldAddEntityView().sendKeys(customerName);
customerPage.selectCountryAddEntityView();
customerPage.descriptionAddEntityView().sendKeys(text);
customerPage.cityAddEntityView().sendKeys(text);
customerPage.stateAddEntityView().sendKeys(text);
customerPage.zipAddEntityView().sendKeys(text);
customerPage.addressAddEntityView().sendKeys(text);
customerPage.address2AddEntityView().sendKeys(text);
customerPage.phoneNumberAddEntityView().sendKeys(number);
customerPage.emailAddEntityView().sendKeys(email);
customerPage.addBtnC().click();
customerPage.setCustomerEmail(customerName);
customerPage.setCustomerCountry(customerName);
customerPage.setCustomerCity(customerName);
customerPage.entity(customerName).click();
this.customerName = customerName;
Assert.assertNotNull(customerPage.customer(customerName));
Assert.assertEquals(customerPage.entityViewTitle().getText(), customerName);
Assert.assertEquals(customerPage.titleFieldEntityView().getAttribute("value"), customerName);
Assert.assertEquals(customerPage.countrySelectMenuEntityView().getText(), customerPage.getCountry());
Assert.assertEquals(customerPage.descriptionEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.cityEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.stateEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.zipEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.addressEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.address2EntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.phoneNumberEntityView().getAttribute("value"), "+1" + number);
Assert.assertEquals(customerPage.emailEntityView().getAttribute("value"), email);
Assert.assertEquals(customerPage.getCustomerEmail(), email);
Assert.assertEquals(customerPage.getCustomerCountry(), customerPage.getCountry());
Assert.assertEquals(customerPage.getCustomerCity(), text);
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t add customer without the name (empty field or just space)")
public void createCustomerWithoutName() {
sideBarMenuView.customerBtn().click();
customerPage.plusBtn().click();
Assert.assertFalse(customerPage.addBtnV().isEnabled());
}
@Test(priority = 20, groups = "smoke")
@Description()
public void createCustomerWithOnlySpace() {
sideBarMenuView.customerBtn().click();
customerPage.plusBtn().click();
customerPage.titleFieldAddEntityView().sendKeys(" ");
customerPage.addBtnC().click();
Assert.assertNotNull(customerPage.warningMessage());
Assert.assertTrue(customerPage.warningMessage().isDisplayed());
Assert.assertEquals(customerPage.warningMessage().getText(), EMPTY_CUSTOMER_MESSAGE);
Assert.assertNotNull(customerPage.addEntityView());
Assert.assertTrue(customerPage.addEntityView().isDisplayed());
}
@Test(priority = 20, groups = "smoke")
@Description("Can't create a customer with the same name")
public void createCustomerSameName() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
String customerName = customerPage.getCustomerName();
customerPage.plusBtn().click();
customerPage.titleFieldAddEntityView().sendKeys(customerName);
customerPage.addBtnC().click();
Assert.assertNotNull(customerPage.warningMessage());
Assert.assertTrue(customerPage.warningMessage().isDisplayed());
Assert.assertEquals(customerPage.warningMessage().getText(), SAME_NAME_WARNING_CUSTOMER_MESSAGE);
Assert.assertNotNull(customerPage.addEntityView());
Assert.assertTrue(customerPage.addEntityView().isDisplayed());
}
@Test(priority = 20, groups = "smoke")
@Description("Can click on Add after specifying the name (text/numbers /special characters)")
public void createCustomerWithoutRefresh() {
String customerName = ENTITY_NAME;
sideBarMenuView.customerBtn().click();
customerPage.plusBtn().click();
customerPage.titleFieldAddEntityView().sendKeys(customerName);
customerPage.addBtnC().click();
this.customerName = customerName;
Assert.assertNotNull(customerPage.customer(customerName));
Assert.assertTrue(customerPage.customer(customerName).isDisplayed());
}
@Test(priority = 40, groups = "smoke")
@Description("Question mark icon leads to rule chain documentation (PE)")
public void documentation() {
String urlPath = "docs/user-guide/ui/customers/";
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.customer(customerPage.getCustomerName()).click();
customerPage.goToHelpPage();
Assert.assertTrue(urlContains(urlPath));
}
}

270
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/CustomerEditMenuTest.java

@ -0,0 +1,270 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.DashboardPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import org.thingsboard.server.msa.ui.utils.DataProviderCredential;
import static org.thingsboard.server.msa.ui.base.AbstractBasePage.getRandomNumber;
import static org.thingsboard.server.msa.ui.utils.Const.*;
public class CustomerEditMenuAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private DashboardPageHelperAbstract dashboardPage;
private String customerName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
dashboardPage = new DashboardPageHelperAbstract(driver);
}
@AfterMethod
public void delete() {
if (customerName != null) {
customerPage.deleteCustomer(customerName);
customerName = null;
}
}
@Test(priority = 10, groups = "smoke")
@Description("Can click by pencil icon and edit the title (change the title) and save the changes. All changes have been applied")
public void changeTitle() {
customerPage.createCustomer(ENTITY_NAME);
String title = "Changed" + getRandomNumber();
sideBarMenuView.customerBtn().click();
customerPage.entityTitles().get(0).click();
customerPage.setHeaderName();
String titleBefore = customerPage.getHeaderName();
customerPage.editPencilBtn().click();
customerPage.changeTitleEditMenu(title);
customerPage.doneBtnEditView().click();
customerPage.setHeaderName();
String titleAfter = customerPage.getHeaderName();
customerName = title;
Assert.assertNotEquals(titleBefore, titleAfter);
Assert.assertEquals(titleAfter, title);
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t delete the title and save changes")
public void deleteTitle() {
sideBarMenuView.customerBtn().click();
customerPage.entityTitles().get(0).click();
customerPage.editPencilBtn().click();
customerPage.titleFieldEntityView().clear();
Assert.assertFalse(customerPage.doneBtnEditViewVisible().isEnabled());
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t save just a space in the title")
public void saveOnlyWithSpace() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.entityTitles().get(0).click();
customerPage.editPencilBtn().click();
customerPage.changeTitleEditMenu(" ");
customerPage.doneBtnEditView().click();
customerPage.setHeaderName();
Assert.assertNotNull(customerPage.warningMessage());
Assert.assertTrue(customerPage.warningMessage().isDisplayed());
Assert.assertEquals(customerPage.warningMessage().getText(), EMPTY_CUSTOMER_MESSAGE);
Assert.assertEquals(customerPage.getCustomerName(), customerPage.getHeaderName());
}
@Test(priority = 20, groups = "smoke")
@Description("Can write/change/delete the descriptionEntityView and save the changes. All changes have been applied")
public void editDescription() {
String title = ENTITY_NAME;
customerPage.createCustomer(title);
String description = "Description";
sideBarMenuView.customerBtn().click();
customerPage.entityTitles().get(0).click();
customerPage.editPencilBtn().click();
customerPage.descriptionEntityView().sendKeys(description);
customerPage.doneBtnEditView().click();
String description1 = customerPage.descriptionEntityView().getAttribute("value");
customerPage.editPencilBtn().click();
customerPage.descriptionEntityView().sendKeys(description);
customerPage.doneBtnEditView().click();
String description2 = customerPage.descriptionEntityView().getAttribute("value");
customerPage.editPencilBtn().click();
customerPage.changeDescription("");
customerPage.doneBtnEditView().click();
customerName = title;
Assert.assertEquals(description, description1);
Assert.assertEquals(description + description, description2);
Assert.assertTrue(customerPage.descriptionEntityView().getAttribute("value").isEmpty());
}
@Test(priority = 20, groups = "smoke")
@Description
public void assignedDashboardFromDashboard() {
String title = ENTITY_NAME;
customerPage.createCustomer(title);
sideBarMenuView.dashboardBtn().click();
dashboardPage.setDashboardTitle();
dashboardPage.assignedBtn(dashboardPage.getDashboardTitle()).click();
dashboardPage.assignedCustomer(title);
sideBarMenuView.customerBtn().click();
customerPage.entity(title).click();
customerPage.editPencilBtn().click();
customerPage.chooseDashboard();
customerPage.doneBtnEditView().click();
customerPage.setDashboardFromView();
customerPage.closeEntityViewBtn().click();
customerPage.manageCustomersUserBtn(title).click();
customerPage.createCustomersUser();
customerPage.userLoginBtn().click();
customerName = title;
Assert.assertNotNull(customerPage.usersWidget());
Assert.assertTrue(customerPage.usersWidget().isDisplayed());
Assert.assertEquals(customerPage.getDashboardFromView(), dashboardPage.getDashboardTitle());
}
@Test(priority = 20, groups = "smoke")
@Description
public void assignedDashboard() {
String title = ENTITY_NAME;
customerPage.createCustomer(title);
sideBarMenuView.customerBtn().click();
customerPage.manageCustomersDashboardsBtn(title).click();
customerPage.assignedDashboard();
sideBarMenuView.customerBtn().click();
customerPage.entity(title).click();
customerPage.editPencilBtn().click();
customerPage.chooseDashboard();
customerPage.doneBtnEditView().click();
customerPage.setDashboardFromView();
customerPage.closeEntityViewBtn().click();
customerPage.manageCustomersUserBtn(title).click();
customerPage.createCustomersUser();
customerPage.userLoginBtn().click();
customerName = title;
Assert.assertNotNull(customerPage.usersWidget());
Assert.assertTrue(customerPage.usersWidget().isDisplayed());
Assert.assertEquals(customerPage.getDashboard(), customerPage.getDashboardFromView());
}
@Test(priority = 20, groups = "smoke")
@Description
public void assignedDashboardWithoutHide() {
String title = ENTITY_NAME;
customerPage.createCustomer(title);
sideBarMenuView.customerBtn().click();
customerPage.manageCustomersDashboardsBtn(title).click();
customerPage.assignedDashboard();
sideBarMenuView.customerBtn().click();
customerPage.entity(title).click();
customerPage.editPencilBtn().click();
customerPage.chooseDashboard();
customerPage.hideHomeDashboardToolbarCheckbox().click();
customerPage.doneBtnEditView().click();
customerPage.setDashboardFromView();
customerPage.closeEntityViewBtn().click();
customerPage.manageCustomersUserBtn(title).click();
customerPage.createCustomersUser();
customerPage.userLoginBtn().click();
customerName = title;
Assert.assertNotNull(customerPage.usersWidget());
Assert.assertTrue(customerPage.usersWidget().isDisplayed());
Assert.assertEquals(customerPage.getDashboard(), customerPage.getDashboardFromView());
Assert.assertNotNull(customerPage.stateController());
Assert.assertNotNull(customerPage.filterBtn());
Assert.assertNotNull(customerPage.timeBtn());
Assert.assertTrue(customerPage.stateController().isDisplayed());
Assert.assertTrue(customerPage.filterBtn().isDisplayed());
Assert.assertTrue(customerPage.timeBtn().isDisplayed());
}
@Test(priority = 20, groups = "smoke")
@Description
public void addPhoneNumber() {
String title = ENTITY_NAME;
customerPage.createCustomer(title);
String number = "2015550123";
sideBarMenuView.customerBtn().click();
customerPage.entityTitles().get(0).click();
customerPage.editPencilBtn().click();
customerPage.phoneNumberEntityView().sendKeys(number);
customerPage.doneBtnEditView().click();
customerName = title;
Assert.assertTrue(customerPage.phoneNumberEntityView().getAttribute("value").contains(number));
}
@Test(priority = 20, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "incorrectPhoneNumber")
@Description
public void addIncorrectPhoneNumber(String number) {
sideBarMenuView.customerBtn().click();
customerPage.entityTitles().get(0).click();
customerPage.editPencilBtn().click();
customerPage.phoneNumberEntityView().sendKeys(number);
boolean doneBtnIsEnable = customerPage.doneBtnEditViewVisible().isEnabled();
customerPage.doneBtnEditViewVisible().click();
Assert.assertFalse(doneBtnIsEnable);
Assert.assertNotNull(customerPage.errorMessage());
Assert.assertTrue(customerPage.errorMessage().isDisplayed());
Assert.assertEquals(customerPage.errorMessage().getText(), PHONE_NUMBER_ERROR_MESSAGE);
}
@Test(priority = 30, groups = "smoke")
public void addAllInformation() {
String title = ENTITY_NAME;
customerPage.createCustomer(title);
String text = "Text";
String email = "email@mail.com";
String number = "2015550123";
sideBarMenuView.customerBtn().click();
customerPage.entityTitles().get(0).click();
customerPage.editPencilBtn().click();
customerPage.selectCountryEntityView();
customerPage.descriptionEntityView().sendKeys(text);
customerPage.cityEntityView().sendKeys(text);
customerPage.stateEntityView().sendKeys(text);
customerPage.zipEntityView().sendKeys(text);
customerPage.addressEntityView().sendKeys(text);
customerPage.address2EntityView().sendKeys(text);
customerPage.phoneNumberEntityView().sendKeys(number);
customerPage.emailEntityView().sendKeys(email);
customerPage.doneBtnEditView().click();
customerName = title;
Assert.assertEquals(customerPage.countrySelectMenuEntityView().getText(), customerPage.getCountry());
Assert.assertEquals(customerPage.descriptionEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.cityEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.stateEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.zipEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.addressEntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.address2EntityView().getAttribute("value"), text);
Assert.assertEquals(customerPage.phoneNumberEntityView().getAttribute("value"), "+1" + number);
Assert.assertEquals(customerPage.emailEntityView().getAttribute("value"), email);
}
}

83
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/DeleteCustomerTest.java

@ -0,0 +1,83 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.ENTITY_NAME;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class DeleteCustomerAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private RuleChainsPageHelperAbstract ruleChainsPage;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@Test(priority = 10, groups = "smoke")
@Description("Can remove the customer by clicking on the trash can icon in the right corner")
public void removeCustomerByRightSideBtn() {
String customer = ENTITY_NAME;
customerPage.createCustomer(customer);
sideBarMenuView.customerBtn().click();
String deletedCustomer = customerPage.deleteRuleChainTrash(customer);
customerPage.refreshBtn().click();
Assert.assertTrue(customerPage.entityIsNotPresent(deletedCustomer));
}
@Test(priority = 20, groups = "smoke")
@Description("Can mark the customer in the checkbox and then click on the trash can icon in the menu that appears at the top")
public void removeSelectedCustomer() {
String customerName = ENTITY_NAME;
customerPage.createCustomer(customerName);
sideBarMenuView.customerBtn().click();
String deletedCustomer = customerPage.deleteSelected(customerName);
ruleChainsPage.refreshBtn().click();
Assert.assertTrue(ruleChainsPage.entityIsNotPresent(deletedCustomer));
}
@Test(priority = 20, groups = "smoke")
@Description("Can click on the name of the rule chain and click on the 'Delete customer' button")
public void removeFromCustomerView() {
String customerName = ENTITY_NAME;
customerPage.createCustomer(customerName);
sideBarMenuView.customerBtn().click();
customerPage.entity(customerName).click();
String deletedCustomer = ruleChainsPage.deleteRuleChainFromView(customerName);
ruleChainsPage.refreshBtn().click();
Assert.assertTrue(ruleChainsPage.entityIsNotPresent(deletedCustomer));
}
@Test(priority = 20, groups = "smoke")
@Description("The rule chain is deleted immediately after clicking remove (no need to refresh the page)")
public void removeCustomerByRightSideBtnWithoutRefresh() {
String customer = ENTITY_NAME;
customerPage.createCustomer(customer);
sideBarMenuView.customerBtn().click();
String deletedCustomer = customerPage.deleteRuleChainTrash(customer);
customerPage.refreshBtn().click();
Assert.assertTrue(customerPage.entityIsNotPresent(deletedCustomer));
}
}

81
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/DeleteSeveralCustomerTest.java

@ -0,0 +1,81 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.ENTITY_NAME;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class DeleteSeveralCustomerAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@Test(priority = 10, groups = "smoke")
@Description("Can mark several customers in the checkbox near the names and then click on the trash can icon in the menu that appears at the top")
public void canDeleteSeveralCustomersByTopBtn() {
String title1 = ENTITY_NAME + "1";
String title2 = ENTITY_NAME + "2";
int count = 2;
customerPage.createCustomer(title1);
customerPage.createCustomer(title2);
sideBarMenuView.customerBtn().click();
customerPage.clickOnCheckBoxes(count);
Assert.assertEquals(customerPage.markCheckbox().size(), count);
customerPage.markCheckbox().forEach(x -> Assert.assertTrue(x.isDisplayed()));
customerPage.deleteSelectedBtn().click();
customerPage.warningPopUpYesBtn().click();
customerPage.refreshBtn().click();
Assert.assertTrue(customerPage.customerIsNotPresent(title1));
Assert.assertTrue(customerPage.customerIsNotPresent(title2));
}
@Test(priority = 10, groups = "smoke")
@Description("Can mark several rule chains in the checkbox near the names and then click on the trash can icon in the menu that appears at the top")
public void selectAllCustomers() {
sideBarMenuView.customerBtn().click();
customerPage.selectAllCheckBox().click();
customerPage.deleteSelectedBtn().click();
Assert.assertNotNull(customerPage.warningPopUpTitle());
Assert.assertTrue(customerPage.warningPopUpTitle().isDisplayed());
Assert.assertTrue(customerPage.warningPopUpTitle().getText().contains(String.valueOf(customerPage.markCheckbox().size())));
}
@Test(priority = 30, groups = "smoke")
@Description("The rule chains are deleted immediately after clicking remove (no need to refresh the page)")
public void deleteSeveralCustomersByTopBtnWithoutRefresh() {
String title1 = ENTITY_NAME + "1";
String title2 = ENTITY_NAME + "2";
int count = 2;
customerPage.createCustomer(title1);
customerPage.createCustomer(title2);
sideBarMenuView.customerBtn().click();
customerPage.clickOnCheckBoxes(count);
customerPage.deleteSelectedBtn().click();
customerPage.warningPopUpYesBtn().click();
Assert.assertTrue(customerPage.customerIsNotPresent(title1));
Assert.assertTrue(customerPage.customerIsNotPresent(title2));
}
}

54
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersAssetsTest.java

@ -0,0 +1,54 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class ManageCustomersAssetsAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private final String manage = "Assets";
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer assets' window by clicking on the 'Manage customer users' icon in the right corner")
public void openWindowByRightCornerBtn() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.manageCustomersAssetsBtn(customerPage.getCustomerName()).click();
Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerAssetsIconHeader());
Assert.assertTrue(customerPage.customerAssetsIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(manage));
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Assets' window by clicking on the name/row of the customer and click on the 'Manage users' button")
public void openWindowByView() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersAssetsBtnView().click();
Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerAssetsIconHeader());
Assert.assertTrue(customerPage.customerAssetsIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(manage));
}
}

53
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersDashboardsTest.java

@ -0,0 +1,53 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class ManageCustomersDashboardsAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private final String manage = "Dashboards";
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Dashboards' window by clicking on the 'Manage customer users' icon in the right corner")
public void openWindowByRightCornerBtn() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.manageCustomersDashboardsBtn(customerPage.getCustomerName()).click();
Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerDashboardIconHeader());
Assert.assertTrue(customerPage.customerDashboardIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(manage));
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Dashboards' window by clicking on the name/row of the customer and click on the 'Manage users' button")
public void openWindowByView() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersDashboardsBtnView().click();
Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerDashboardIconHeader());
Assert.assertTrue(customerPage.customerDashboardIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(manage));
}
}

53
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersDevicesTest.java

@ -0,0 +1,53 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class ManageCustomersDevicesAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private final String manage = "Devices";
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Devices' window by clicking on the 'Manage customer users' icon in the right corner")
public void openWindowByRightCornerBtn() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.manageCustomersDevicesBtn(customerPage.getCustomerName()).click();
Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerDevicesIconHeader());
Assert.assertTrue(customerPage.customerDevicesIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(manage));
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Devices' window by clicking on the name/row of the customer and click on the 'Manage users' button")
public void openWindowByView() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersDeviceBtnView().click();
Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerDevicesIconHeader());
Assert.assertTrue(customerPage.customerDevicesIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(manage));
}
}

54
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersEdgesTest.java

@ -0,0 +1,54 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class ManageCustomersEdgesAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private String iconText = "Edge instances";
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Edges' window by clicking on the 'Manage customer users' icon in the right corner")
public void openWindowByRightCornerBtn() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.manageCustomersEdgeBtn(customerPage.getCustomerName()).click();
Assert.assertTrue(urlContains("edgeInstances"));
Assert.assertNotNull(customerPage.customerEdgeIconHeader());
Assert.assertTrue(customerPage.customerEdgeIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(iconText));
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Edges' window by clicking on the name/row of the customer and click on the 'Manage users' button")
public void openWindowByView() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersEdgeBtnView().click();
Assert.assertTrue(urlContains("edgeInstances"));
Assert.assertNotNull(customerPage.customerEdgeIconHeader());
Assert.assertTrue(customerPage.customerEdgeIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(iconText));
}
}

54
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersUsersTest.java

@ -0,0 +1,54 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class ManageCustomersUsersAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private String iconText = "Customer Users";
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Users' window by clicking on the 'Manage customer users' icon in the right corner")
public void openWindowByRightCornerBtn() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.manageCustomersUserBtn(customerPage.getCustomerName()).click();
Assert.assertTrue(urlContains("user"));
Assert.assertNotNull(customerPage.customerUserIconHeader());
Assert.assertTrue(customerPage.customerUserIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(iconText));
}
@Test(groups = "smoke")
@Description("Can go to the 'Customer Users' window by clicking on the name/row of the customer and click on the 'Manage users' button")
public void openWindowByView() {
sideBarMenuView.customerBtn().click();
customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersUserBtnView().click();
Assert.assertTrue(urlContains("user"));
Assert.assertNotNull(customerPage.customerUserIconHeader());
Assert.assertTrue(customerPage.customerUserIconHeader().isDisplayed());
Assert.assertTrue(customerPage.customerManageWindowIconHead().getText().contains(iconText));
}
}

56
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/SearchCustomerTest.java

@ -0,0 +1,56 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import org.thingsboard.server.msa.ui.utils.DataProviderCredential;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class SearchCustomerAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private String entityName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@AfterMethod
public void deleteCustomer() {
customerPage.deleteCustomer(entityName);
}
@Test(priority = 10, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "customerNameForSearchByFirstAndSecondWord")
@Description("Can search by the first/second word of the name")
public void searchFirstWord(String namePath) {
sideBarMenuView.customerBtn().click();
customerPage.searchEntity(namePath);
customerPage.allEntity().forEach(x -> Assert.assertTrue(x.getText().contains(namePath)));
}
@Test(priority = 10, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForSearchBySymbolAndNumber")
@Description("Can search by number/symbol")
public void searchNumber(String name, String namePath) {
customerPage.createCustomer(name);
sideBarMenuView.customerBtn().click();
customerPage.searchEntity(namePath);
customerPage.setCustomerName();
entityName = name;
Assert.assertTrue(customerPage.getCustomerName().contains(namePath));
}
}

121
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/SortByNameTest.java

@ -0,0 +1,121 @@
package org.thingsboard.server.msa.ui.tests.customerSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.CustomerPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import org.thingsboard.server.msa.ui.utils.DataProviderCredential;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class SortByNameAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private CustomerPageHelperAbstract customerPage;
private String customerName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
customerPage = new CustomerPageHelperAbstract(driver);
}
@AfterMethod
public void delete() {
if (customerName != null) {
customerPage.deleteCustomer(customerName);
customerName = null;
}
}
@Test(priority = 10, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForSort")
@Description
public void specialCharacterUp(String title) {
customerPage.createCustomer(title);
sideBarMenuView.customerBtn().click();
customerPage.sortByTitleBtn().click();
customerPage.setCustomerName();
customerName = title;
Assert.assertEquals(customerPage.getCustomerName(), title);
}
@Test(priority = 20, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForAllSort")
@Description
public void allSortUp(String customer, String customerSymbol, String customerNumber) {
customerPage.createCustomer(customerSymbol);
customerPage.createCustomer(customer);
customerPage.createCustomer(customerNumber);
sideBarMenuView.customerBtn().click();
customerPage.sortByTitleBtn().click();
customerPage.setCustomerName(0);
String firstCustomer = customerPage.getCustomerName();
customerPage.setCustomerName(1);
String secondCustomer = customerPage.getCustomerName();
customerPage.setCustomerName(2);
String thirdCustomer = customerPage.getCustomerName();
boolean firstEquals = firstCustomer.equals(customerSymbol);
boolean secondEquals = secondCustomer.equals(customerNumber);
boolean thirdEquals = thirdCustomer.equals(customer);
customerPage.deleteCustomer(customer);
customerPage.deleteCustomer(customerNumber);
customerPage.deleteCustomer(customerSymbol);
Assert.assertTrue(firstEquals);
Assert.assertTrue(secondEquals);
Assert.assertTrue(thirdEquals);
}
@Test(priority = 10, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForSort")
@Description
public void specialCharacterDown(String title) {
customerPage.createCustomer(title);
sideBarMenuView.customerBtn().click();
customerPage.sortByNameDown();
customerPage.setCustomerName(customerPage.allEntity().size() - 1);
customerName = title;
Assert.assertEquals(customerPage.getCustomerName(), title);
}
@Test(priority = 20, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForAllSort")
@Description
public void allSortDown(String customer, String customerSymbol, String customerNumber) {
customerPage.createCustomer(customerSymbol);
customerPage.createCustomer(customer);
customerPage.createCustomer(customerNumber);
sideBarMenuView.customerBtn().click();
int lastIndex = customerPage.allEntity().size() - 1;
customerPage.sortByNameDown();
customerPage.setCustomerName(lastIndex);
String firstCustomer = customerPage.getCustomerName();
customerPage.setCustomerName(lastIndex - 1);
String secondCustomer = customerPage.getCustomerName();
customerPage.setCustomerName(lastIndex - 2);
String thirdCustomer = customerPage.getCustomerName();
boolean firstEquals = firstCustomer.equals(customerSymbol);
boolean secondEquals = secondCustomer.equals(customerNumber);
boolean thirdEquals = thirdCustomer.equals(customer);
customerPage.deleteCustomer(customer);
customerPage.deleteCustomer(customerNumber);
customerPage.deleteCustomer(customerSymbol);
Assert.assertTrue(firstEquals);
Assert.assertTrue(secondEquals);
Assert.assertTrue(thirdEquals);
}
}

110
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/CreateRuleChainImportTest.java

@ -0,0 +1,110 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.OpenRuleChainPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.*;
public class CreateRuleChainImportAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
private OpenRuleChainPageHelperAbstract openRuleChainPage;
private final String absolutePathToFileImportRuleChain = getClass().getClassLoader().getResource(IMPORT_RULE_CHAIN_FILE_NAME).getPath();
private final String absolutePathToFileImportTxt = getClass().getClassLoader().getResource(IMPORT_TXT_FILE_NAME).getPath();
private String ruleChainName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
openRuleChainPage = new OpenRuleChainPageHelperAbstract(driver);
}
@AfterMethod
public void delete() {
if (ruleChainName != null) {
ruleChainsPage.deleteRuleChain(ruleChainName);
ruleChainName = null;
}
}
@Test(priority = 10, groups = "smoke")
@Description("Can drop a JSON file and import it")
public void importRuleChain() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openImportRuleChainView();
ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportRuleChain);
Assert.assertNotNull(ruleChainsPage.importingFile(IMPORT_RULE_CHAIN_FILE_NAME));
Assert.assertTrue(ruleChainsPage.importingFile(IMPORT_RULE_CHAIN_FILE_NAME).isDisplayed());
}
@Test(priority = 20, groups = "smoke")
@Description("Can delete a file by clicking on the icon Remove")
public void importRuleChainAndDeleteFile() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openImportRuleChainView();
ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportRuleChain);
ruleChainsPage.clearImportFileBtn().click();
Assert.assertNotNull(ruleChainsPage.importingFile(EMPTY_IMPORT_MESSAGE));
Assert.assertTrue(ruleChainsPage.importingFile(EMPTY_IMPORT_MESSAGE).isDisplayed());
Assert.assertTrue(ruleChainsPage.entityIsNotPresent(IMPORT_TXT_FILE_NAME));
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t Select / drop a file of a different format than JSON")
public void importTxtFile() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openImportRuleChainView();
ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportTxt);
Assert.assertNotNull(ruleChainsPage.importingFile(EMPTY_IMPORT_MESSAGE));
Assert.assertTrue(ruleChainsPage.importingFile(EMPTY_IMPORT_MESSAGE).isDisplayed());
}
@Test(priority = 30, groups = "smoke")
@Description("After clicking on Import - imported rule chain opens (need to save by clicking on the Apply changes icon)")
public void importRuleChainAndSave() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openImportRuleChainView();
ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportRuleChain);
ruleChainsPage.importBrowseFileBtn().click();
openRuleChainPage.doneBtn().click();
openRuleChainPage.waitUntilDoneBtnDisable();
sideBarMenuView.ruleChainsBtn().click();
ruleChainName = IMPORT_RULE_CHAIN_NAME;
Assert.assertNotNull(ruleChainsPage.entity(IMPORT_RULE_CHAIN_NAME));
Assert.assertTrue(ruleChainsPage.entity(IMPORT_RULE_CHAIN_NAME).isDisplayed());
}
@Test(priority = 40, groups = "smoke")
@Description("Can create a rule chain with the same name")
public void importRuleChainAndSaveWithSameName() {
ruleChainsPage.createRuleChain(IMPORT_RULE_CHAIN_NAME);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openImportRuleChainView();
ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportRuleChain);
ruleChainsPage.importBrowseFileBtn().click();
openRuleChainPage.doneBtn().click();
openRuleChainPage.waitUntilDoneBtnDisable();
sideBarMenuView.ruleChainsBtn().click();
boolean sizeBigger1 = ruleChainsPage.entities(IMPORT_RULE_CHAIN_NAME).size() > 1;
ruleChainsPage.deleteAllRuleChain(IMPORT_RULE_CHAIN_NAME);
Assert.assertTrue(sizeBigger1);
}
}

139
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/CreateRuleChainTest.java

@ -0,0 +1,139 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.*;
public class CreateRuleChainAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
private String ruleChainName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@AfterMethod
public void delete() {
if (ruleChainName != null) {
ruleChainsPage.deleteRuleChain(ruleChainName);
ruleChainName = null;
}
}
@Test(priority = 10, groups = "smoke")
@Description("Can click on Add after specifying the name (text/numbers /special characters)")
public void createRuleChain() {
String ruleChainName = ENTITY_NAME;
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openCreateRuleChainView();
ruleChainsPage.nameField().sendKeys(ruleChainName);
ruleChainsPage.addBtnC().click();
ruleChainsPage.refreshBtn().click();
this.ruleChainName = ruleChainName;
Assert.assertNotNull(ruleChainsPage.entity(ruleChainName));
Assert.assertTrue(ruleChainsPage.entity(ruleChainName).isDisplayed());
}
@Test(priority = 10, groups = "smoke")
@Description()
public void createRuleChainWithDescription() {
String ruleChainName = ENTITY_NAME;
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openCreateRuleChainView();
ruleChainsPage.nameField().sendKeys(ruleChainName);
ruleChainsPage.descriptionAddEntityView().sendKeys(ENTITY_NAME);
ruleChainsPage.addBtnC().click();
ruleChainsPage.refreshBtn().click();
ruleChainsPage.entity(ENTITY_NAME).click();
ruleChainsPage.setHeaderName();
this.ruleChainName = ruleChainName;
Assert.assertEquals(ruleChainsPage.getHeaderName(), ruleChainName);
Assert.assertEquals(ruleChainsPage.descriptionEntityView().getAttribute("value"), ruleChainName);
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t add rule chain without the name (empty field or just space)")
public void createRuleChainWithoutName() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openCreateRuleChainView();
Assert.assertFalse(ruleChainsPage.addBtnV().isEnabled());
}
@Test(priority = 20, groups = "smoke")
@Description()
public void createRuleChainWithOnlySpace() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openCreateRuleChainView();
ruleChainsPage.nameField().sendKeys(" ");
ruleChainsPage.addBtnC().click();
Assert.assertNotNull(ruleChainsPage.warningMessage());
Assert.assertTrue(ruleChainsPage.warningMessage().isDisplayed());
Assert.assertEquals(ruleChainsPage.warningMessage().getText(), EMPTY_RULE_CHAIN_MESSAGE);
Assert.assertNotNull(ruleChainsPage.addEntityView());
Assert.assertTrue(ruleChainsPage.addEntityView().isDisplayed());
}
@Test(priority = 20, groups = "smoke")
@Description("Can create a rule chain with the same name")
public void createRuleChainWithSameName() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setRuleChainNameWithoutRoot();
ruleChainsPage.openCreateRuleChainView();
String ruleChainName = ruleChainsPage.getRuleChainName();
ruleChainsPage.nameField().sendKeys(ruleChainName);
ruleChainsPage.addBtnC().click();
ruleChainsPage.refreshBtn().click();
this.ruleChainName = ruleChainName;
Assert.assertNotNull(ruleChainsPage.entity(ruleChainName));
Assert.assertTrue(ruleChainsPage.entities(ruleChainName).size() > 1);
}
@Test(priority = 30, groups = "smoke")
@Description("After clicking on Add - appears immediately in the list (no need to refresh the page)")
public void createRuleChainWithoutRefresh() {
String ruleChainName = ENTITY_NAME;
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.openCreateRuleChainView();
ruleChainsPage.nameField().sendKeys(ruleChainName);
ruleChainsPage.addBtnC().click();
this.ruleChainName = ruleChainName;
Assert.assertNotNull(ruleChainsPage.entity(ruleChainName));
Assert.assertTrue(ruleChainsPage.entity(ruleChainName).isDisplayed());
}
@Test(priority = 40, groups = "smoke")
@Description("Question mark icon leads to rule chain documentation (PE)")
public void documentation() {
String urlPath = "docs/user-guide/ui/rule-chains/";
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setRuleChainNameWithoutRoot();
ruleChainsPage.entity(ruleChainsPage.getRuleChainName()).click();
ruleChainsPage.goToHelpPage();
Assert.assertTrue(urlContains(urlPath));
}
}

148
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/DeleteRuleChainTest.java

@ -0,0 +1,148 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.*;
public class DeleteRuleChainAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@Test(priority = 10, groups = "smoke")
@Description("Can remove the rule chain by clicking on the trash can icon in the right corner")
public void removeRuleChainByRightSideBtn() {
ruleChainsPage.createRuleChain(ENTITY_NAME);
sideBarMenuView.ruleChainsBtn().click();
String deletedRuleChain = ruleChainsPage.deleteRuleChainTrash(ENTITY_NAME);
ruleChainsPage.refreshBtn().click();
Assert.assertTrue(ruleChainsPage.entityIsNotPresent(deletedRuleChain));
}
@Test(priority = 20, groups = "smoke")
@Description("Can mark the rule chain in the checkbox and then click on the trash can icon in the menu that appears at the top")
public void removeSelectedRuleChain() {
String ruleChainName = ENTITY_NAME;
ruleChainsPage.createRuleChain(ruleChainName);
sideBarMenuView.ruleChainsBtn().click();
String deletedRuleChain = ruleChainsPage.deleteSelected(ruleChainName);
ruleChainsPage.refreshBtn().click();
Assert.assertTrue(ruleChainsPage.entityIsNotPresent(deletedRuleChain));
}
@Test(priority = 20, groups = "smoke")
@Description("Can click on the name of the rule chain and click on the 'Delete rule chain' button")
public void removeFromRuleChainView() {
ruleChainsPage.createRuleChain(ENTITY_NAME);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.entity(ENTITY_NAME).click();
String deletedRuleChain = ruleChainsPage.deleteRuleChainFromView(ENTITY_NAME);
ruleChainsPage.refreshBtn().click();
Assert.assertTrue(ruleChainsPage.entityIsNotPresent(deletedRuleChain));
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t remove Root Rule Chain (the trash can is disabled in the right corner)")
public void removeRootRuleChain() {
sideBarMenuView.ruleChainsBtn().click();
Assert.assertFalse(ruleChainsPage.deleteBtn(ROOT_RULE_CHAIN_NAME).isEnabled());
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t remove Root Rule Chain (can`t mark the rule chain in the checkbox )")
public void removeSelectedRootRuleChain() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.assertCheckBoxIsNotDisplayed(ROOT_RULE_CHAIN_NAME);
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t remove Root Rule Chain (missing delete button)")
public void removeFromRootRuleChainView() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.entity(ROOT_RULE_CHAIN_NAME).click();
ruleChainsPage.deleteBtnFromView();
ruleChainsPage.assertDeleteBtnInRootRuleChainIsNotDisplayed();
}
@Test(priority = 10, groups = "smoke")
@Description("Can remove the rule chain by clicking on the trash can icon in the right corner")
public void removeProfileRuleChainByRightSideBtn() {
String deletedRuleChain = "Thermostat";
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.deleteBtn(deletedRuleChain).click();
ruleChainsPage.warningPopUpYesBtn().click();
ruleChainsPage.refreshBtn().click();
Assert.assertNotNull(ruleChainsPage.entity(deletedRuleChain));
Assert.assertTrue(ruleChainsPage.entity(deletedRuleChain).isDisplayed());
Assert.assertNotNull(ruleChainsPage.warningMessage());
Assert.assertTrue(ruleChainsPage.warningMessage().isDisplayed());
Assert.assertEquals(ruleChainsPage.warningMessage().getText(), DELETE_RULE_CHAIN_WITH_PROFILE_MESSAGE);
}
@Test(priority = 20, groups = "smoke")
@Description("Can mark the rule chain in the checkbox and then click on the trash can icon in the menu that appears at the top")
public void removeSelectedProfileRuleChain() {
sideBarMenuView.ruleChainsBtn().click();
String deletedRuleChain = ruleChainsPage.deleteSelected("Thermostat");
ruleChainsPage.refreshBtn().click();
Assert.assertNotNull(ruleChainsPage.entity(deletedRuleChain));
Assert.assertTrue(ruleChainsPage.entity(deletedRuleChain).isDisplayed());
Assert.assertNotNull(ruleChainsPage.warningMessage());
Assert.assertTrue(ruleChainsPage.warningMessage().isDisplayed());
Assert.assertEquals(ruleChainsPage.warningMessage().getText(), DELETE_RULE_CHAIN_WITH_PROFILE_MESSAGE);
}
@Test(priority = 20, groups = "smoke")
@Description("Can click on the name of the rule chain and click on the 'Delete rule chain' button")
public void removeFromProfileRuleChainView() {
String deletedRuleChain = "Thermostat";
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.entity(deletedRuleChain).click();
ruleChainsPage.deleteBtnFromView().click();
ruleChainsPage.warningPopUpYesBtn().click();
Assert.assertNotNull(ruleChainsPage.entity(deletedRuleChain));
Assert.assertNotNull(ruleChainsPage.warningMessage());
Assert.assertTrue(ruleChainsPage.warningMessage().isDisplayed());
Assert.assertEquals(ruleChainsPage.warningMessage().getText(), DELETE_RULE_CHAIN_WITH_PROFILE_MESSAGE);
}
@Test(priority = 30, groups = "smoke")
@Description("The rule chain is deleted immediately after clicking remove (no need to refresh the page)")
public void removeRuleChainByRightSideBtnWithoutRefresh() {
String ruleChainName = ENTITY_NAME;
ruleChainsPage.createRuleChain(ruleChainName);
sideBarMenuView.ruleChainsBtn().click();
String deletedRuleChain = ruleChainsPage.deleteRuleChainTrash(ruleChainName);
Assert.assertTrue(ruleChainsPage.entityIsNotPresent(deletedRuleChain));
}
}

92
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/DeleteSeveralRuleChainsTest.java

@ -0,0 +1,92 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.*;
public class DeleteSeveralRuleChainsAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@Test(priority = 10, groups = "smoke")
@Description("Can mark several rule chains in the checkbox near the names and then click on the trash can icon in the menu that appears at the top")
public void canDeleteSeveralRuleChainsByTopBtn() {
String ruleChainName = ENTITY_NAME;
int count = 2;
ruleChainsPage.createRuleChains(ruleChainName, count);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.clickOnCheckBoxes(count);
ruleChainsPage.deleteSelectedBtn().click();
ruleChainsPage.warningPopUpYesBtn().click();
ruleChainsPage.refreshBtn().click();
Assert.assertTrue(ruleChainsPage.ruleChainsIsNotPresent(ruleChainName));
}
@Test(priority = 10, groups = "smoke")
@Description("Can mark several rule chains in the checkbox near the names and then click on the trash can icon in the menu that appears at the top")
public void selectAllRuleChain() {
String ruleChainName = ENTITY_NAME;
int count = 2;
ruleChainsPage.createRuleChains(ruleChainName, count);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.selectAllCheckBox().click();
ruleChainsPage.deleteSelectedBtn().click();
ruleChainsPage.warningPopUpYesBtn().click();
ruleChainsPage.refreshBtn().click();
Assert.assertTrue(ruleChainsPage.ruleChainsIsNotPresent(ruleChainName));
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t remove Root Rule Chain (the trash can is disabled in the right corner)")
public void removeRootRuleChain() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.selectAllCheckBox().click();
Assert.assertFalse(ruleChainsPage.deleteBtn(ROOT_RULE_CHAIN_NAME).isEnabled());
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t remove Root Rule Chain (can`t mark the rule chain in the checkbox )")
public void removeSelectedRootRuleChain() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.selectAllCheckBox().click();
ruleChainsPage.assertCheckBoxIsNotDisplayed(ROOT_RULE_CHAIN_NAME);
}
@Test(priority = 30, groups = "smoke")
@Description("The rule chains are deleted immediately after clicking remove (no need to refresh the page)")
public void deleteSeveralRuleChainsByTopBtnWithoutRefresh() {
String ruleChainName = ENTITY_NAME;
int count = 2;
ruleChainsPage.createRuleChains(ruleChainName, count);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.clickOnCheckBoxes(count);
ruleChainsPage.deleteSelectedBtn().click();
ruleChainsPage.warningPopUpYesBtn().click();
Assert.assertTrue(ruleChainsPage.ruleChainsIsNotPresent(ruleChainName));
}
}

75
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/MakeRuleChainRootTest.java

@ -0,0 +1,75 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class MakeRuleChainRootAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@AfterMethod
public void makeRoot() {
ruleChainsPage.makeRoot();
}
@Test(priority = 10, groups = "smoke")
@Description("Can make rule chain root by clicking on the 'Make rule chain root' icon in the right corner")
public void makeRuleChainRootByRightCornerBtn() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setRuleChainNameWithoutRoot(0);
String ruleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.makeRootBtn(ruleChain).click();
ruleChainsPage.warningPopUpYesBtn().click();
Assert.assertTrue(ruleChainsPage.rootCheckBoxEnable(ruleChain).isDisplayed());
}
@Test(priority = 20, groups = "smoke")
@Description("Can make rule chain by clicking on the name/row of the rule chain and click on the 'make rule chain root' button")
public void makeRuleChainRootFromView() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setRuleChainNameWithoutRoot(0);
String ruleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.entity(ruleChain).click();
ruleChainsPage.makeRootFromViewBtn().click();
ruleChainsPage.warningPopUpYesBtn().click();
ruleChainsPage.closeEntityViewBtn().click();
Assert.assertTrue(ruleChainsPage.rootCheckBoxEnable(ruleChain).isDisplayed());
}
@Test(priority = 30, groups = "smoke")
@Description("Can't make multiple root rule chains (only one rule chain can be root)")
public void multiplyRoot() {
SideBarMenuViewElements sideBarMenuView = new SideBarMenuViewElements(driver);
RuleChainsPageHelperAbstract ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setRuleChainNameWithoutRoot(0);
String ruleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.entity(ruleChain).click();
ruleChainsPage.makeRootFromViewBtn().click();
ruleChainsPage.warningPopUpYesBtn().click();
ruleChainsPage.closeEntityViewBtn().click();
Assert.assertEquals(ruleChainsPage.rootCheckBoxesEnable().size(), 1);
}
}

71
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/OpenRuleChainTest.java

@ -0,0 +1,71 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.OpenRuleChainPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class OpenRuleChainAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
private OpenRuleChainPageHelperAbstract openRuleChainPage;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
openRuleChainPage = new OpenRuleChainPageHelperAbstract(driver);
}
@Test(priority = 10, groups = "smoke")
@Description("Can open the rule chain by clicking on the 'Open rule chain' icon in the right corner")
public void openRuleChainByRightCornerBtn() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setRuleChainNameWithoutRoot(0);
String ruleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.openRuleChainBtn(ruleChain).click();
openRuleChainPage.setHeadName();
Assert.assertTrue(urlContains(ruleChainsPage.getRuleChainId(ruleChainsPage.getRuleChainName())));
Assert.assertTrue(openRuleChainPage.headRuleChainName().isDisplayed());
Assert.assertTrue(openRuleChainPage.inputNode().isDisplayed());
Assert.assertEquals(ruleChainsPage.getRuleChainName(), openRuleChainPage.getHeadName());
}
@Test(priority = 10, groups = "smoke")
@Description("Can open the rule chain by clicking on the name/row of the rule chain and click on the 'Open rule chain' button")
public void openRuleChainByViewBtn() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setRuleChainNameWithoutRoot(0);
String ruleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.entity(ruleChain).click();
ruleChainsPage.openRuleChainFromViewBtn().click();
openRuleChainPage.setHeadName();
Assert.assertTrue(urlContains(ruleChainsPage.getRuleChainId(ruleChain)));
Assert.assertTrue(openRuleChainPage.headRuleChainName().isDisplayed());
Assert.assertTrue(openRuleChainPage.inputNode().isDisplayed());
Assert.assertEquals(ruleChain, openRuleChainPage.getHeadName());
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t open the rule chain by clicking twice on the row/name")
public void openRuleChainDoubleClick() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setRuleChainNameWithoutRoot(0);
String ruleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.doubleClickOnRuleChain(ruleChain);
Assert.assertEquals(getUrl(), URL + "ruleChains");
}
}

130
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/RuleChainEditMenuTest.java

@ -0,0 +1,130 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.*;
public class RuleChainEditMenuAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
private String ruleChainName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@AfterMethod
public void delete() {
if (ruleChainName != null) {
ruleChainsPage.deleteRuleChain(ruleChainName);
ruleChainName = null;
}
}
@Test(priority = 10, groups = "smoke")
@Description("Can click by pencil icon and edit the name (change the name) and save the changes. All changes have been applied")
public void changeName() {
ruleChainsPage.createRuleChain(ENTITY_NAME);
String name = "Changed";
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.notRootRuleChainsNames().get(0).click();
ruleChainsPage.setHeaderName();
String nameBefore = ruleChainsPage.getHeaderName();
ruleChainsPage.editPencilBtn().click();
ruleChainsPage.changeNameEditMenu(name);
ruleChainsPage.doneBtnEditView().click();
ruleChainsPage.setHeaderName();
String nameAfter = ruleChainsPage.getHeaderName();
ruleChainName = name;
Assert.assertNotEquals(nameBefore, nameAfter);
Assert.assertEquals(name, nameAfter);
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t delete the name and save changes")
public void deleteName() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.notRootRuleChainsNames().get(0).click();
ruleChainsPage.editPencilBtn().click();
ruleChainsPage.changeNameEditMenu("");
Assert.assertFalse(ruleChainsPage.doneBtnEditViewVisible().isEnabled());
}
@Test(priority = 20, groups = "smoke")
@Description("Can`t save just a space in the name")
public void saveOnlyWithSpace() {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.notRootRuleChainsNames().get(0).click();
ruleChainsPage.editPencilBtn().click();
ruleChainsPage.changeNameEditMenu(" ");
ruleChainsPage.doneBtnEditView().click();
Assert.assertNotNull(ruleChainsPage.warningMessage());
Assert.assertTrue(ruleChainsPage.warningMessage().isDisplayed());
Assert.assertEquals(ruleChainsPage.warningMessage().getText(), EMPTY_RULE_CHAIN_MESSAGE);
}
@Test(priority = 20, groups = "smoke")
@Description("Can write/change/delete the descriptionEntityView and save the changes. All changes have been applied")
public void editDescription() {
String name = ENTITY_NAME;
ruleChainsPage.createRuleChain(name);
String description = "Description";
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.notRootRuleChainsNames().get(0).click();
ruleChainsPage.editPencilBtn().click();
ruleChainsPage.descriptionEntityView().sendKeys(description);
ruleChainsPage.doneBtnEditView().click();
String description1 = ruleChainsPage.descriptionEntityView().getAttribute("value");
ruleChainsPage.editPencilBtn().click();
ruleChainsPage.descriptionEntityView().sendKeys(description);
ruleChainsPage.doneBtnEditView().click();
String description2 = ruleChainsPage.descriptionEntityView().getAttribute("value");
ruleChainsPage.editPencilBtn().click();
ruleChainsPage.changeDescription("");
ruleChainsPage.doneBtnEditView().click();
ruleChainName = name;
Assert.assertTrue(ruleChainsPage.descriptionEntityView().getAttribute("value").isEmpty());
Assert.assertEquals(description, description1);
Assert.assertEquals(description + description, description2);
}
@Test(priority = 20, groups = "smoke")
@Description("Can enable / disable debug and save changes. All changes have been applied")
public void debugMode() {
String name = ENTITY_NAME;
ruleChainsPage.createRuleChain(name);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.notRootRuleChainsNames().get(0).click();
ruleChainsPage.editPencilBtn().click();
ruleChainsPage.debugCheckboxEdit().click();
ruleChainsPage.doneBtnEditView().click();
boolean debugMode = Boolean.parseBoolean(ruleChainsPage.debugCheckboxView().getAttribute("aria-checked"));
ruleChainsPage.editPencilBtn().click();
ruleChainsPage.debugCheckboxEdit().click();
ruleChainsPage.doneBtnEditView().click();
ruleChainName = name;
Assert.assertFalse(Boolean.parseBoolean(ruleChainsPage.debugCheckboxView().getAttribute("aria-checked")));
Assert.assertTrue(debugMode);
}
}

52
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/SearchRuleChainTest.java

@ -0,0 +1,52 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import org.thingsboard.server.msa.ui.utils.DataProviderCredential;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class SearchRuleChainAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@Test(priority = 10, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "ruleChainNameForSearchByFirstAndSecondWord")
@Description("Can search by the first/second word of the name")
public void searchFirstWord(String namePath) {
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.searchEntity(namePath);
ruleChainsPage.setRuleChainName(0);
Assert.assertTrue(ruleChainsPage.getRuleChainName().contains(namePath));
}
@Test(priority = 10, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForSearchBySymbolAndNumber")
@Description("Can search by number/symbol")
public void searchNumber(String name, String namePath) {
ruleChainsPage.createRuleChain(name);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.searchEntity(namePath);
ruleChainsPage.setRuleChainName(0);
boolean ruleChainContainsNamePath = ruleChainsPage.getRuleChainName().contains(namePath);
ruleChainsPage.deleteRuleChain(name);
Assert.assertTrue(ruleChainContainsNamePath);
}
}

122
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/SortByNameTest.java

@ -0,0 +1,122 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import org.thingsboard.server.msa.ui.utils.DataProviderCredential;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class SortByNameAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
private String ruleChainName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@AfterMethod
public void delete() {
if (ruleChainName != null) {
ruleChainsPage.deleteRuleChain(ruleChainName);
ruleChainName = null;
}
}
@Test(priority = 10, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForSort")
@Description
public void specialCharacterUp(String ruleChainName) {
ruleChainsPage.createRuleChain(ruleChainName);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.sortByNameBtn().click();
ruleChainsPage.setRuleChainName(0);
this.ruleChainName = ruleChainName;
Assert.assertEquals(ruleChainsPage.getRuleChainName(), ruleChainName);
}
@Test(priority = 20, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForAllSort")
@Description
public void allSortUp(String ruleChain, String ruleChainSymbol, String ruleChainNumber) {
ruleChainsPage.createRuleChain(ruleChainSymbol);
ruleChainsPage.createRuleChain(ruleChain);
ruleChainsPage.createRuleChain(ruleChainNumber);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.sortByNameBtn().click();
ruleChainsPage.setRuleChainName(0);
String firstRuleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.setRuleChainName(1);
String secondRuleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.setRuleChainName(2);
String thirdRuleChain = ruleChainsPage.getRuleChainName();
boolean firstEquals = firstRuleChain.equals(ruleChainSymbol);
boolean secondEquals = secondRuleChain.equals(ruleChainNumber);
boolean thirdEquals = thirdRuleChain.equals(ruleChain);
ruleChainsPage.deleteRuleChain(ruleChain);
ruleChainsPage.deleteRuleChain(ruleChainNumber);
ruleChainsPage.deleteRuleChain(ruleChainSymbol);
Assert.assertTrue(firstEquals);
Assert.assertTrue(secondEquals);
Assert.assertTrue(thirdEquals);
}
@Test(priority = 10, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForSort")
@Description
public void specialCharacterDown(String ruleChainName) {
ruleChainsPage.createRuleChain(ruleChainName);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.sortByNameDown();
ruleChainsPage.setRuleChainName(ruleChainsPage.allNames().size() - 1);
this.ruleChainName = ruleChainName;
Assert.assertEquals(ruleChainsPage.getRuleChainName(), ruleChainName);
}
@Test(priority = 20, groups = "smoke", dataProviderClass = DataProviderCredential.class, dataProvider = "nameForAllSort")
@Description
public void allSortDown(String ruleChain, String ruleChainSymbol, String ruleChainNumber) {
ruleChainsPage.createRuleChain(ruleChainSymbol);
ruleChainsPage.createRuleChain(ruleChain);
ruleChainsPage.createRuleChain(ruleChainNumber);
sideBarMenuView.ruleChainsBtn().click();
int lastIndex = ruleChainsPage.allNames().size() - 1;
ruleChainsPage.sortByNameDown();
ruleChainsPage.setRuleChainName(lastIndex);
String firstRuleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.setRuleChainName(lastIndex - 1);
String secondRuleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.setRuleChainName(lastIndex - 2);
String thirdRuleChain = ruleChainsPage.getRuleChainName();
boolean firstEquals = firstRuleChain.equals(ruleChainSymbol);
boolean secondEquals = secondRuleChain.equals(ruleChainNumber);
boolean thirdEquals = thirdRuleChain.equals(ruleChain);
ruleChainsPage.deleteRuleChain(ruleChain);
ruleChainsPage.deleteRuleChain(ruleChainNumber);
ruleChainsPage.deleteRuleChain(ruleChainSymbol);
Assert.assertTrue(firstEquals);
Assert.assertTrue(secondEquals);
Assert.assertTrue(thirdEquals);
}
}

70
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/SortByTimeTest.java

@ -0,0 +1,70 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.thingsboard.server.msa.ui.base.AbstractDiverBaseTest;
import org.thingsboard.server.msa.ui.pages.LoginPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.RuleChainsPageHelperAbstract;
import org.thingsboard.server.msa.ui.pages.SideBarMenuViewElements;
import static org.thingsboard.server.msa.ui.utils.Const.ENTITY_NAME;
import static org.thingsboard.server.msa.ui.utils.Const.URL;
public class SortByTimeAbstractDiverBaseTest extends AbstractDiverBaseTest {
private SideBarMenuViewElements sideBarMenuView;
private RuleChainsPageHelperAbstract ruleChainsPage;
private String ruleChainName;
@BeforeMethod
public void login() {
openUrl(URL);
new LoginPageHelperAbstract(driver).authorizationTenant();
sideBarMenuView = new SideBarMenuViewElements(driver);
ruleChainsPage = new RuleChainsPageHelperAbstract(driver);
}
@AfterMethod
public void delete() {
if (ruleChainName != null) {
ruleChainsPage.deleteRuleChain(ruleChainName);
ruleChainName = null;
}
}
@Test(priority = 10, groups = "smoke")
@Description
public void sortByTimeDown() {
String ruleChain = ENTITY_NAME;
ruleChainsPage.createRuleChain(ruleChain);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.setSort();
String firstListElement = ruleChainsPage.getSort().get(ruleChainsPage.getSort().size() - 1);
String lastCreated = ruleChainsPage.createdTime().get(0).getText();
ruleChainName = ruleChain;
Assert.assertEquals(firstListElement, lastCreated);
Assert.assertNotNull(ruleChainsPage.createdTimeEntity(ruleChain, lastCreated));
}
@Test(priority = 10, groups = "smoke")
@Description
public void sortByTimeUp() {
String ruleChain = ENTITY_NAME;
ruleChainsPage.createRuleChain(ruleChain);
sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.sortByTimeBtn().click();
ruleChainsPage.setSort();
String firstListElement = ruleChainsPage.getSort().get(ruleChainsPage.getSort().size() - 1);
String lastCreated = ruleChainsPage.createdTime().get(ruleChainsPage.createdTime().size() - 1).getText();
ruleChainName = ruleChain;
Assert.assertEquals(firstListElement, lastCreated);
Assert.assertNotNull(ruleChainsPage.createdTimeEntity(ruleChain, lastCreated));
}
}

21
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/Const.java

@ -0,0 +1,21 @@
package utils;
import base.Base;
public class Const extends Base {
public static final String URL = "http://localhost:8080/";
public static final String TENANT_EMAIL = "tenant@thingsboard.org";
public static final String TENANT_PASSWORD = "tenant";
public static final String ENTITY_NAME = "Az!@#$%^&*()_-+=~`" + getRandomNumber();
public static final String ROOT_RULE_CHAIN_NAME = "Root Rule Chain";
public static final String IMPORT_RULE_CHAIN_NAME = "Rule Chain from Import";
public static final String IMPORT_RULE_CHAIN_FILE_NAME = "forImport.json";
public static final String IMPORT_TXT_FILE_NAME = "forImport.txt";
public static final String EMPTY_IMPORT_MESSAGE = "No file selected";
public static final String EMPTY_RULE_CHAIN_MESSAGE = "Rule chain name should be specified!";
public static final String EMPTY_CUSTOMER_MESSAGE = "Customer title should be specified!";
public static final String DELETE_RULE_CHAIN_WITH_PROFILE_MESSAGE = "The rule chain referenced by the device profiles cannot be deleted!";
public static final String SAME_NAME_WARNING_CUSTOMER_MESSAGE = "Customer with such title already exists!";
public static final String PHONE_NUMBER_ERROR_MESSAGE = "Phone number is invalid or not possible";
}

62
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/DataProviderCredential.java

@ -0,0 +1,62 @@
package utils;
import org.testng.annotations.DataProvider;
import static base.Base.getRandomSymbol;
import static utils.Const.ENTITY_NAME;
public class DataProviderCredential {
private static final String SYMBOL = String.valueOf(getRandomSymbol());
private static final String NAME = ENTITY_NAME;
private static final String NUMBER = "1";
private static final String LONG_PHONE_NUMBER = "20155501231";
private static final String SHORT_PHONE_NUMBER = "201555011";
private static final String RULE_CHAIN_SECOND_WORD_NAME_PATH = "Rule";
private static final String CUSTOMER_SECOND_WORD_NAME_PATH = "Customer";
private static final String RULE_CHAIN_FIRST_WORD_NAME_PATH = "Root";
private static final String CUSTOMER_FIRST_WORD_NAME_PATH = "A";
@DataProvider
public static Object[][] ruleChainNameForSearchByFirstAndSecondWord() {
return new Object[][]{
{RULE_CHAIN_SECOND_WORD_NAME_PATH},
{RULE_CHAIN_FIRST_WORD_NAME_PATH}};
}
@DataProvider
public static Object[][] nameForSearchBySymbolAndNumber() {
return new Object[][]{
{NAME, ENTITY_NAME.split("`")[1]},
{NAME, String.valueOf(getRandomSymbol())}};
}
@DataProvider
public static Object[][] nameForSort() {
return new Object[][]{
{NAME},
{SYMBOL},
{NUMBER}};
}
@DataProvider
public static Object[][] nameForAllSort() {
return new Object[][]{
{NAME, SYMBOL, NUMBER}};
}
@DataProvider
public static Object[][] incorrectPhoneNumber() {
return new Object[][]{
{LONG_PHONE_NUMBER},
{SHORT_PHONE_NUMBER},
{ENTITY_NAME}};
}
@DataProvider
public static Object[][] customerNameForSearchByFirstAndSecondWord() {
return new Object[][]{
{CUSTOMER_FIRST_WORD_NAME_PATH},
{CUSTOMER_SECOND_WORD_NAME_PATH}};
}
}

19
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/EntityPrototypes.java

@ -0,0 +1,19 @@
package org.thingsboard.server.msa.ui.utils;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.rule.RuleChain;
public class CustomerPrototypes {
public static Customer defaultCustomerPrototype(String entityName){
Customer customer = new Customer();
customer.setTitle(entityName);
return customer;
}
public static RuleChain defaultRuleChainPrototype(String entityName){
RuleChain ruleChain = new RuleChain();
ruleChain.setName(entityName);
return ruleChain;
}
}

0
msa/black-box-tests/src/test/resources/connectivity.xml

20
msa/black-box-tests/src/test/resources/forImport.json

@ -0,0 +1,20 @@
{
"ruleChain": {
"additionalInfo": {
"description": ""
},
"name": "Rule Chain from Import",
"type": "CORE",
"firstRuleNodeId": null,
"root": false,
"debugMode": false,
"configuration": null,
"externalId": null
},
"metadata": {
"firstNodeIndex": null,
"nodes": [],
"connections": null,
"ruleChainConnections": null
}
}

0
msa/black-box-tests/src/test/resources/forImport.txt

26
msa/black-box-tests/src/test/resources/smokeTests.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Copyright © 2016-2022 The Thingsboard Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Smoke tests">
<suite-files>
<suite-file path="SmokesRuleChain.xml"/>
<suite-file path="SmokesCustomer.xml"/>
</suite-files>
</suite>

137
msa/black-box-tests/src/test/resources/smokesCustomer.xml

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Copyright © 2016-2022 The Thingsboard Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Customer Smoke Tests">
<listeners>
<listener class-name="org.thingsboard.server.msa.ui.listeners.RetryTestListener"/>
</listeners>
<test name="Create customer smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.CreateCustomerTest"/>
</classes>
</test>
<test name="Delete customer smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.DeleteCustomerTest"/>
</classes>
</test>
<test name="Delete several customers smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.DeleteSeveralCustomerTest"/>
</classes>
</test>
<test name="Edit menu customer smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.CustomerEditMenuTest"/>
</classes>
</test>
<test name="Manage customer users smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.ManageCustomersUsersTest"/>
</classes>
</test>
<test name="Manage customer assets smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.ManageCustomersAssetsTest"/>
</classes>
</test>
<test name="Manage customer devices smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.ManageCustomersDevicesTest"/>
</classes>
</test>
<test name="Manage customer dashboards smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.ManageCustomersDashboardsTest"/>
</classes>
</test>
<test name="Sort by name">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.SortByNameTest"/>
</classes>
</test>
<test name="Search customer">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.customerSmoke.SearchCustomerTest"/>
</classes>
</test>
</suite>

138
msa/black-box-tests/src/test/resources/smokesRuleChain.xml

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Copyright © 2016-2022 The Thingsboard Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Rule Chain Smoke Tests">
<listeners>
<listener class-name="org.thingsboard.server.msa.ui.listeners.RetryTestListener"/>
</listeners>
<test name="Create rule chains">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.CreateRuleChainTest"/>
</classes>
</test>
<test name="Create rule chains import">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.CreateRuleChainImportTest"/>
</classes>
</test>
<test name="Delete rule chains">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.DeleteRuleChainTest"/>
</classes>
</test>
<test name="Delete several rule chain smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.DeleteSeveralRuleChainsTest"/>
</classes>
</test>
<test name="Make root">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.MakeRuleChainRootTest"/>
</classes>
</test>
<test name="Open rule chain smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.OpenRuleChainTest"/>
</classes>
</test>
<test name="Edit menu rule chain smoke">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.RuleChainEditMenuTest"/>
</classes>
</test>
<test name="Search rule chain">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.SearchRuleChainTest"/>
</classes>
</test>
<test name="Sort rule chain by name">
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.SortByNameTest"/>
</classes>
</test>
<test name="Sort rule chain by time">
<parameter name="browser" value="chrome"/>
<groups>
<run>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="org.thingsboard.server.msa.ui.tests.ruleChainsSmoke.SortByTimeTest"/>
</classes>
</test>
</suite>
Loading…
Cancel
Save