diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/TestRestClient.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/TestRestClient.java index a014dbee07..45829e7d1e 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/TestRestClient.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/TestRestClient.java @@ -29,6 +29,7 @@ import io.restassured.specification.RequestSpecification; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; +import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.asset.AssetProfile; @@ -432,4 +433,16 @@ public class TestRestClient { public String getRefreshToken() { return refreshToken; } + + public PageData getTenants(PageLink pageLink) { + Map params = new HashMap<>(); + addPageLinkToParam(params, pageLink); + return given().spec(requestSpec).queryParams(params) + .get("/api/tenants") + .then() + .statusCode(HTTP_OK) + .extract() + .as(new TypeRef>() { + }); + } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewElements.java new file mode 100644 index 0000000000..44f41aff2c --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewElements.java @@ -0,0 +1,32 @@ +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 AlarmDetailsViewElements extends AbstractBasePage { + public AlarmDetailsViewElements(WebDriver driver) { + super(driver); + } + + private static final String ASSIGN_FIELD = "//mat-label[contains(text(),'Assignee')]/parent::label/following-sibling::input"; + private static final String USER_FROM_DROP_DOWN = "//div[@class='user-display-name']/span[text() = '%s']"; + private static final String CLOSE_VIEW_BTN = "//mat-dialog-container//mat-icon[contains(text(),'close')]/parent::button"; + private static final String UNASSIGNED_BTN = "//div[@role='listbox']//mat-icon[text() = 'account_circle']/following-sibling::span"; + + public WebElement assignField() { + return waitUntilElementToBeClickable(ASSIGN_FIELD); + } + + public WebElement userFromAssignDropdown(String emailOrName) { + return waitUntilElementToBeClickable(String.format(USER_FROM_DROP_DOWN, emailOrName)); + } + + public WebElement closeViewBtn() { + return waitUntilElementToBeClickable(CLOSE_VIEW_BTN); + } + + public WebElement unassignedBtn() { + return waitUntilElementToBeClickable(UNASSIGNED_BTN); + } +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewHelper.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewHelper.java new file mode 100644 index 0000000000..b658164b37 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewHelper.java @@ -0,0 +1,19 @@ +package org.thingsboard.server.msa.ui.pages; + +import org.openqa.selenium.WebDriver; + +public class AlarmDetailsViewHelper extends AlarmDetailsViewElements{ + public AlarmDetailsViewHelper(WebDriver driver) { + super(driver); + } + + public void assignAlarmTo(String emailOrName) { + assignField().click(); + userFromAssignDropdown(emailOrName).click(); + } + + public void unassignedAlarm() { + assignField().click(); + unassignedBtn().click(); + } +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmElements.java index 48300429f6..ad3ccb748d 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmElements.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmElements.java @@ -1,3 +1,18 @@ +/** + * Copyright © 2016-2023 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. + */ package org.thingsboard.server.msa.ui.pages; import org.openqa.selenium.WebDriver; @@ -10,14 +25,17 @@ public class AlarmElements extends OtherPageElements{ super(driver); } - private static final String ASSIGN_BTN = "//mat-icon[contains(text(),'keyboard_arrow_down')]/parent::button"; - private static final String USER_ASSIGN_DROPDOWN = "//div[@class='user-display-name']/span[contains(text(),'%s')]"; - private static final String ASSIGN_USERS_DISPLAY_NAME = "//div[@class='user-display-name']/span"; + private static final String ASSIGN_BTN = "//span[text() = '%s']/ancestor::mat-row//mat-icon[contains(text(),'keyboard_arrow_down')]/parent::button"; + private static final String USER_ASSIGN_DROPDOWN = "//div[@class='user-display-name']/span[text() = '%s']"; + protected static final String ASSIGN_USERS_DISPLAY_NAME = "//div[@class='user-display-name']/span"; private static final String ASSIGN_USER_DISPLAY_NAME = "//span[@class='user-display-name'][contains(text(),'%s')]"; private static final String SEARCH_FIELD = "//input[@placeholder='Search users']"; + private static final String UNASSIGNED_BTN = "//div[@role='listbox']//mat-icon[text() = 'account_circle']/following-sibling::span"; + private static final String UNASSIGNED = "//span[text() = '%s']/ancestor::mat-row//span[@class='assignee-cell']/mat-icon[text() = 'account_circle']/following-sibling::span"; + private static final String ALARM_DETAILS_BTN = "//span[text() = '%s']/ancestor::mat-row//mat-icon[contains(text(),'more_horiz')]/parent::button"; - public WebElement assignBtn() { - return waitUntilElementToBeClickable(ASSIGN_BTN); + public WebElement assignBtn(String type) { + return waitUntilElementToBeClickable(String.format(ASSIGN_BTN, type)); } public WebElement userFromAssignDropDown(String userEmail) { @@ -35,4 +53,16 @@ public class AlarmElements extends OtherPageElements{ public WebElement searchUserField() { return waitUntilElementToBeClickable(SEARCH_FIELD); } + + public WebElement unassignedBtn() { + return waitUntilElementToBeClickable(UNASSIGNED_BTN); + } + + public WebElement unassigned(String alarmType) { + return waitUntilVisibilityOfElementLocated(String.format(UNASSIGNED, alarmType)); + } + + public WebElement alarmDetailsBtn(String alarmType) { + return waitUntilElementToBeClickable(String.format(ALARM_DETAILS_BTN, alarmType)); + } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmHelper.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmHelper.java index 4075a89ad1..7abb0006db 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmHelper.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmHelper.java @@ -1,9 +1,24 @@ +/** + * Copyright © 2016-2023 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. + */ package org.thingsboard.server.msa.ui.pages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.thingsboard.server.msa.ui.utils.Const; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -12,11 +27,21 @@ public class AlarmHelper extends AlarmElements { super(driver); } - public void assignTo(String user) { - jsClick(assignBtn()); + public void assignAlarmTo(String alarmType, String user) { + jsClick(assignBtn(alarmType)); userFromAssignDropDown(user).click(); } + public void unassignedAlarm(String alarmType) { + assignBtn(alarmType).click(); + unassignedBtn().click(); + } + + public void searchAlarm(String alarmType, String emailOrName) { + assignBtn(alarmType).click(); + searchUserField().sendKeys(emailOrName); + } + private List users; public void setUsers() { @@ -29,4 +54,9 @@ public class AlarmHelper extends AlarmElements { public List getUsers() { return users; } + + public void assertUsersForAssignIsNotPresent() { + sleep(1); + elementsIsNotPresent(ASSIGN_USERS_DISPLAY_NAME); + } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageElements.java index 1d69ddd5fc..90f51c4903 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageElements.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageElements.java @@ -32,14 +32,16 @@ public class CustomerPageElements extends OtherPageElementsHelper { 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[contains(text(),'%s')]"; - private static final String MANAGE_CUSTOMERS_USERS_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),' account_circle')]"; + private static final String MANAGE_CUSTOMERS_USERS_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),' account_circle')]/parent::button"; private static final String MANAGE_CUSTOMERS_ASSETS_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),' domain')]/parent::button"; private static final String MANAGE_CUSTOMERS_DEVICES_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),'devices_other')]/parent::button"; private static final String MANAGE_CUSTOMERS_DASHBOARDS_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),'dashboard')]/parent::button"; private static final String MANAGE_CUSTOMERS_EDGE_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),'router')]/parent::button"; 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 USER_LOGIN_BTN = "//mat-icon[@data-mat-icon-name='login']/parent::button"; + private static final String USER_LOGIN_BTN_BY_EMAIL = "//mat-cell[contains(@class,'email')]/span[contains(text(),'%s')]" + + "/ancestor::mat-row//mat-icon[@data-mat-icon-name='login']/parent::button"; 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='mdc-list-item__primary-text']"; @@ -148,6 +150,10 @@ public class CustomerPageElements extends OtherPageElementsHelper { return waitUntilElementToBeClickable(USER_LOGIN_BTN); } + public WebElement getUserLoginBtnByEmail(String email) { + return waitUntilElementToBeClickable(String.format(USER_LOGIN_BTN_BY_EMAIL, email)); + } + public WebElement usersWidget() { return waitUntilVisibilityOfElementLocated(USERS_WIDGET); } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageElements.java index ba766ef3fd..d8bb1b021e 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageElements.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageElements.java @@ -1,3 +1,18 @@ +/** + * Copyright © 2016-2023 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. + */ package org.thingsboard.server.msa.ui.pages; import org.openqa.selenium.WebDriver; diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageHelper.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageHelper.java index 19716d3fb6..12413641af 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageHelper.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageHelper.java @@ -1,3 +1,18 @@ +/** + * Copyright © 2016-2023 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. + */ package org.thingsboard.server.msa.ui.pages; import org.openqa.selenium.WebDriver; diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/LoginPageHelper.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/LoginPageHelper.java index 38a4a50207..5044ee1a65 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/LoginPageHelper.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/LoginPageHelper.java @@ -25,10 +25,18 @@ public class LoginPageHelper extends LoginPageElements { super(driver); } - public void authorizationTenant() { - emailField().sendKeys(Const.TENANT_EMAIL); - passwordField().sendKeys(Const.TENANT_PASSWORD); + public void login(String username, String password) { + emailField().sendKeys(username); + passwordField().sendKeys(password); submitBtn().click(); waitUntilUrlContainsText("/home"); } + + public void authorizationTenant() { + login(Const.TENANT_EMAIL, Const.TENANT_PASSWORD); + } + + public void authorizationCustomer() { + login("customer@thingsboard.org", "customer"); + } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/AssignDetailsTab.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/AssignDetailsTab.java deleted file mode 100644 index cdf10356b3..0000000000 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/AssignDetailsTab.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.thingsboard.server.msa.ui.tests; - -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; -import org.thingsboard.server.common.data.id.AlarmId; -import org.thingsboard.server.common.data.id.DeviceId; -import org.thingsboard.server.common.data.id.UserId; -import org.thingsboard.server.msa.prototypes.DevicePrototypes; -import org.thingsboard.server.msa.ui.base.AbstractDriverBaseTest; -import org.thingsboard.server.msa.ui.pages.AlarmHelper; -import org.thingsboard.server.msa.ui.pages.DevicePageHelper; -import org.thingsboard.server.msa.ui.pages.LoginPageHelper; -import org.thingsboard.server.msa.ui.pages.SideBarMenuViewHelper; -import org.thingsboard.server.msa.ui.utils.DataProviderCredential; -import org.thingsboard.server.msa.ui.utils.EntityPrototypes; - -import static org.assertj.core.api.Assertions.assertThat; - -public class AssignDetailsTab extends AbstractDriverBaseTest { - - AlarmId alarmId; - DeviceId deviceId; - UserId userId; - String deviceName; - SideBarMenuViewHelper sideBarMenuView; - AlarmHelper alarmPage; - DevicePageHelper devicePage; - - @BeforeClass - public void generateAlarm() { - new LoginPageHelper(driver).authorizationTenant(); - sideBarMenuView = new SideBarMenuViewHelper(driver); - alarmPage = new AlarmHelper(driver); - devicePage = new DevicePageHelper(driver); - } - - @AfterMethod - public void deleteAlarm() { - testRestClient.deleteAlarm(alarmId); - testRestClient.deleteDevice(deviceId); - if (userId != null) { - testRestClient.deleteUser(userId); - } - } - - @Test(dataProviderClass = DataProviderCredential.class, dataProvider = "assignTo") - public void assignAlarmTo(String user) { - deviceName = testRestClient.postDevice("", DevicePrototypes.defaultDevicePrototype("")).getName(); - deviceId = testRestClient.getDeviceByName(deviceName).getId(); - alarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId)).getId(); - - sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(deviceName); - alarmPage.assignTo(user); - - Assert.assertTrue(alarmPage.assignedUser(user).isDisplayed()); - } - - @Test - public void reassignAlarm() { - testRestClient.postCustomer(EntityPrototypes.defaultCustomerPrototype("TestCustomer")); - userId = testRestClient.postUser(EntityPrototypes.defaultUser(getCustomerByName("TestCustomer").getId())).getId(); - deviceName = testRestClient.postDevice("", DevicePrototypes.defaultDevicePrototype("")).getName(); - deviceId = testRestClient.getDeviceByName(deviceName).getId(); - alarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, userId)).getId(); - - sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(deviceName); - alarmPage.assignTo("customer@thingsboard.org"); - - Assert.assertTrue(alarmPage.assignedUser("customer@thingsboard.org").isDisplayed()); - } - - @Test - public void searchByEmail() { - deviceName = testRestClient.postDevice("", DevicePrototypes.defaultDevicePrototype("")).getName(); - deviceId = testRestClient.getDeviceByName(deviceName).getId(); - alarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId)).getId(); - - sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(deviceName); - alarmPage.assignBtn().click(); - alarmPage.searchUserField().sendKeys("customer@thingsboard.org"); - alarmPage.setUsers(); - - assertThat(alarmPage.getUsers()).contains("customer@thingsboard.org"); - alarmPage.assignUsers().forEach(u -> assertThat(u.isDisplayed()).isTrue()); - } - - @Test - public void searchByName() { - String name = "usik"; - - userId = testRestClient.postUser(EntityPrototypes.defaultUser(getCustomerByName("Customer A").getId(), name)).getId(); - deviceName = testRestClient.postDevice("", DevicePrototypes.defaultDevicePrototype("")).getName(); - deviceId = testRestClient.getDeviceByName(deviceName).getId(); - alarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId)).getId(); - - sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(deviceName); - alarmPage.assignBtn().click(); - alarmPage.searchUserField().sendKeys(name); - alarmPage.setUsers(); - - assertThat(alarmPage.getUsers()).contains(name); - alarmPage.assignUsers().forEach(u -> assertThat(u.isDisplayed()).isTrue()); - } -} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignByCustomerTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignByCustomerTest.java new file mode 100644 index 0000000000..6cc9186f5a --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignByCustomerTest.java @@ -0,0 +1,6 @@ +package org.thingsboard.server.msa.ui.tests.assignee; + +import org.thingsboard.server.msa.ui.base.AbstractDriverBaseTest; + +abstract public class AbstractAssignByCustomerTest extends AbstractDriverBaseTest { +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignTest.java new file mode 100644 index 0000000000..633345774c --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignTest.java @@ -0,0 +1,117 @@ +package org.thingsboard.server.msa.ui.tests.assignee; + +import org.openqa.selenium.WebElement; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; +import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.id.UserId; +import org.thingsboard.server.msa.ui.base.AbstractDriverBaseTest; +import org.thingsboard.server.msa.ui.pages.AlarmDetailsViewHelper; +import org.thingsboard.server.msa.ui.pages.AlarmHelper; +import org.thingsboard.server.msa.ui.pages.CustomerPageHelper; +import org.thingsboard.server.msa.ui.pages.DevicePageHelper; +import org.thingsboard.server.msa.ui.pages.LoginPageHelper; +import org.thingsboard.server.msa.ui.pages.SideBarMenuViewHelper; +import org.thingsboard.server.msa.ui.utils.EntityPrototypes; + +import java.util.List; + +import static org.thingsboard.server.msa.ui.base.AbstractBasePage.random; + +abstract public class AbstractAssignTest extends AbstractDriverBaseTest { + + protected AlarmId alarmId; + protected AlarmId assignedAlarmId; + protected AlarmId propageteAlarmId; + protected AlarmId propageteAssigneAlarmId; + protected AlarmId tenantAssigneAlarmId; + protected DeviceId deviceId; + protected UserId userId; + protected UserId userWithNameId; +// protected TenantId tenantId = testRestClient.getTenants(pageLink).getData().get(0).getId(); + protected CustomerId customerId; + protected String deviceName; + protected SideBarMenuViewHelper sideBarMenuView; + protected AlarmHelper alarmPage; + protected DevicePageHelper devicePage; + protected AlarmDetailsViewHelper alarmDetailsView; + CustomerPageHelper customerPage; + + protected String name = "User"; + protected String customerTitle = "Customer" + random(); + protected String userEmail = random() + "@thingsboard.org"; + protected String userWithNameEmail = random() + "@thingsboard.org"; + protected String alarm = "Test alarm 1"; + protected String assignedAlarm = "Test alarm 2"; + protected String propagateAlarm = "Test propagated alarm 1"; + protected String propagateAssignedAlarm = "Test propagated alarm 2"; + + @BeforeClass + public void generateTestEntities() { + new LoginPageHelper(driver).authorizationTenant(); + sideBarMenuView = new SideBarMenuViewHelper(driver); + alarmPage = new AlarmHelper(driver); + devicePage = new DevicePageHelper(driver); + alarmDetailsView = new AlarmDetailsViewHelper(driver); + customerPage = new CustomerPageHelper(driver); + + customerId = testRestClient.postCustomer(EntityPrototypes.defaultCustomerPrototype(customerTitle)).getId(); + userId = testRestClient.postUser(EntityPrototypes.defaultUser(userEmail, getCustomerByName(customerTitle).getId())).getId(); + userWithNameId = testRestClient.postUser(EntityPrototypes.defaultUser(userWithNameEmail, getCustomerByName(customerTitle).getId(), name)).getId(); + deviceName = testRestClient.postDevice("", EntityPrototypes.defaultDevicePrototype("", customerId)).getName(); + deviceId = testRestClient.getDeviceByName(deviceName).getId(); + } + + @BeforeMethod + public void generateTestAlarms() { + if (getJwtTokenFromLocalStorage() == null) { + new LoginPageHelper(driver).authorizationTenant(); + } + alarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, alarm)).getId(); + assignedAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, assignedAlarm, userId)).getId(); + propageteAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, propagateAlarm, true)).getId(); + propageteAssigneAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, propagateAssignedAlarm, userId, true)).getId(); + + + } + + @AfterClass + public void deleteTestEntities() { + testRestClient.deleteDevice(deviceId); + testRestClient.deleteCustomer(customerId); + } + + @AfterMethod + public void deleteTestAlarms() { + testRestClient.deleteAlarm(alarmId); + testRestClient.deleteAlarm(assignedAlarmId); + testRestClient.deleteAlarm(propageteAlarmId); + testRestClient.deleteAlarm(propageteAssigneAlarmId); + } + + public void loginByUser(String userEmail) { + sideBarMenuView.customerBtn().click(); + customerPage.manageCustomersUserBtn(customerTitle).click(); + customerPage.getUserLoginBtnByEmail(userEmail).click(); + } + + @DataProvider + public Object[][] alarms() { + return new Object[][]{ + {alarm}, + {propagateAlarm}}; + } + + @DataProvider + public Object[][] assignedAlarms() { + return new Object[][]{ + {assignedAlarm}, + {propagateAssignedAlarm}}; + } +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignByCustomerTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignByCustomerTest.java new file mode 100644 index 0000000000..5c376ec3d0 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignByCustomerTest.java @@ -0,0 +1,4 @@ +package org.thingsboard.server.msa.ui.tests.assignee; + +public class AssignByCustomerTest extends AbstractAssignByCustomerTest{ +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTab.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTab.java new file mode 100644 index 0000000000..aed0483f3e --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTab.java @@ -0,0 +1,209 @@ +/** + * Copyright © 2016-2023 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. + */ +package org.thingsboard.server.msa.ui.tests.assignee; + +import org.junit.platform.commons.function.Try; +import org.openqa.selenium.html5.WebStorage; +import org.testng.Assert; +import org.testng.annotations.Test; +import org.thingsboard.server.msa.ui.utils.Const; + +import static org.assertj.core.api.Assertions.assertThat; + +public class AssignDetailsTab extends AbstractAssignTest { + + /*@BeforeMethod + public void openAlarmView() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + }*/ + + @Test(dataProvider = "alarms") + public void assignAlarmToYourself(String alarm) { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(alarm, Const.TENANT_EMAIL); + + Assert.assertTrue(alarmPage.assignedUser(Const.TENANT_EMAIL).isDisplayed()); + } + + @Test(dataProvider = "alarms") + public void assignAlarmToAnotherUser(String alarm) { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(alarm, userEmail); + + Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); + } + + @Test(dataProvider = "assignedAlarms") + public void unassignedAlarm(String assignedAlarm) { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.unassignedAlarm(assignedAlarm); + + Assert.assertTrue(alarmPage.unassigned(assignedAlarm).isDisplayed()); + } + + @Test(dataProvider = "assignedAlarms") + public void reassignAlarm(String assignedAlarm) { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(assignedAlarm, Const.TENANT_EMAIL); + + Assert.assertTrue(alarmPage.assignedUser(Const.TENANT_EMAIL).isDisplayed()); + } + + @Test + public void searchByEmail() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.searchAlarm(alarm, Const.TENANT_EMAIL); + alarmPage.setUsers(); + + assertThat(alarmPage.getUsers()).hasSize(1).contains(Const.TENANT_EMAIL); + alarmPage.assignUsers().forEach(u -> assertThat(u.isDisplayed()).isTrue()); + } + + @Test + public void searchByName() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.searchAlarm(alarm, name); + alarmPage.setUsers(); + + assertThat(alarmPage.getUsers()).hasSize(1).contains(name); + alarmPage.assignUsers().forEach(u -> assertThat(u.isDisplayed()).isTrue()); + } + + @Test + public void assignAlarmToYourselfFromDetails() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.alarmDetailsBtn(alarm).click(); + alarmDetailsView.assignAlarmTo(Const.TENANT_EMAIL); + alarmDetailsView.closeViewBtn().click(); + + Assert.assertTrue(alarmPage.assignedUser(Const.TENANT_EMAIL).isDisplayed()); + } + + @Test + public void assignAlarmToAnotherUserFromDetails() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.alarmDetailsBtn(alarm).click(); + alarmDetailsView.assignAlarmTo(userEmail); + alarmDetailsView.closeViewBtn().click(); + + Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); + } + + @Test + public void unassignedAlarmFromDetails() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.alarmDetailsBtn(assignedAlarm).click(); + alarmDetailsView.unassignedAlarm(); + alarmDetailsView.closeViewBtn().click(); + + Assert.assertTrue(alarmPage.unassigned(assignedAlarm).isDisplayed()); + } + + @Test + public void reassignAlarmFromDetails() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.alarmDetailsBtn(assignedAlarm).click(); + alarmDetailsView.assignAlarmTo(Const.TENANT_EMAIL); + alarmDetailsView.closeViewBtn().click(); + + Assert.assertTrue(alarmPage.assignedUser(Const.TENANT_EMAIL).isDisplayed()); + } + + @Test + public void assignAlarmToYourselfCustomer() { + loginByUser(userEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(alarm, userEmail); + clearStorage(); + + Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); + } + + @Test + public void reassignAlarmByCustomerFromAnotherCustomerUser() { + loginByUser(userWithNameEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(assignedAlarm, name); + clearStorage(); + + Assert.assertTrue(alarmPage.assignedUser(name).isDisplayed()); + } + + @Test + public void unassignedAlarmFromCustomer() { + loginByUser(userWithNameEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.unassignedAlarm(assignedAlarm); + clearStorage(); + + Assert.assertTrue(alarmPage.unassigned(assignedAlarm).isDisplayed()); + } + + @Test + public void unassignedAlarmFromAnotherUserFromCustomer() { + loginByUser(userEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.unassignedAlarm(assignedAlarm); + clearStorage(); + + Assert.assertTrue(alarmPage.unassigned(assignedAlarm).isDisplayed()); + } + + @Test + public void checkTheDisplayOfNamesEmailsFromCustomer() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(alarm, Const.TENANT_EMAIL); + loginByUser(userEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignBtn(alarm).click(); + try { + alarmPage.assertUsersForAssignIsNotPresent(); + } finally { + clearStorage(); + } + } + + public WebStorage getWebStorage() { + if (driver instanceof WebStorage) { + return (WebStorage) driver; + } else { + throw new IllegalArgumentException("This test expects the driver to implement WebStorage"); + } + } + + public void clearStorage() { + getWebStorage().getLocalStorage().clear(); + getWebStorage().getSessionStorage().clear(); + } + +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/DataProviderCredential.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/DataProviderCredential.java index a0188665c8..bce6e071f4 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/DataProviderCredential.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/DataProviderCredential.java @@ -150,10 +150,4 @@ public class DataProviderCredential { {description, Keys.CONTROL + "A" + Keys.BACK_SPACE, ""}}; } - @DataProvider - public static Object[][] assignTo() { - return new Object[][]{ - {Const.TENANT_EMAIL}, - {"customer@thingsboard.org"}}; - } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/EntityPrototypes.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/EntityPrototypes.java index bce4373191..504980a001 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/EntityPrototypes.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/EntityPrototypes.java @@ -15,8 +15,10 @@ */ package org.thingsboard.server.msa.ui.utils; +import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfileProvisionType; import org.thingsboard.server.common.data.DeviceProfileType; @@ -32,8 +34,11 @@ import org.thingsboard.server.common.data.device.profile.DisabledDeviceProfilePr import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.UserId; +import org.thingsboard.server.common.data.notification.targets.platform.CustomerUsersFilter; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.security.Authority; +import org.thingsboard.server.common.data.security.UserCredentials; +import org.thingsboard.server.common.data.settings.UserSettings; public class EntityPrototypes { @@ -105,37 +110,71 @@ public class EntityPrototypes { return assetProfile; } - public static Alarm defaultAlarm(EntityId id) { + public static Alarm defaultAlarm(EntityId id, String type) { Alarm alarm = new Alarm(); - alarm.setType("default"); + alarm.setType(type); alarm.setOriginator(id); alarm.setSeverity(AlarmSeverity.CRITICAL); return alarm; } - public static Alarm defaultAlarm(EntityId id, UserId userId) { + public static Alarm defaultAlarm(EntityId id, String type, boolean propagate) { Alarm alarm = new Alarm(); - alarm.setType("default"); + alarm.setType(type); + alarm.setOriginator(id); + alarm.setSeverity(AlarmSeverity.CRITICAL); + alarm.setPropagate(propagate); + return alarm; + } + + public static Alarm defaultAlarm(EntityId id, String type, UserId userId) { + Alarm alarm = new Alarm(); + alarm.setType(type); alarm.setOriginator(id); alarm.setSeverity(AlarmSeverity.CRITICAL); alarm.setAssigneeId(userId); return alarm; } - public static User defaultUser(CustomerId customerId) { + public static Alarm defaultAlarm(EntityId id, String type, UserId userId, boolean propagate) { + Alarm alarm = new Alarm(); + alarm.setType(type); + alarm.setOriginator(id); + alarm.setSeverity(AlarmSeverity.CRITICAL); + alarm.setAssigneeId(userId); + alarm.setPropagate(propagate); + return alarm; + } + + public static User defaultUser(String email, CustomerId customerId) { User user = new User(); - user.setEmail("test@thingsboard.org"); + user.setEmail(email); user.setCustomerId(customerId); user.setAuthority(Authority.CUSTOMER_USER); return user; } - public static User defaultUser(CustomerId customerId, String name) { + public static User defaultUser(String email, CustomerId customerId, String name) { User user = new User(); - user.setEmail("test@thingsboard.org"); + user.setEmail(email); user.setFirstName(name); user.setCustomerId(customerId); user.setAuthority(Authority.CUSTOMER_USER); return user; } + + public static Device defaultDevicePrototype(String name){ + Device device = new Device(); + device.setName(name + RandomStringUtils.randomAlphanumeric(7)); + device.setType("DEFAULT"); + return device; + } + + public static Device defaultDevicePrototype(String name, CustomerId id){ + Device device = new Device(); + device.setName(name + RandomStringUtils.randomAlphanumeric(7)); + device.setCustomerId(id); + device.setType("DEFAULT"); + return device; + } }