From 1fee9a327302a0f20498267ed62715a22eb76908 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Wed, 29 Mar 2023 11:40:32 +0300 Subject: [PATCH 001/155] Revert "Add quarter and half year intervals to time window." --- .../src/app/shared/models/time/time.models.ts | 68 ------------------- .../assets/locale/locale.constant-en_US.json | 6 -- 2 files changed, 74 deletions(-) diff --git a/ui-ngx/src/app/shared/models/time/time.models.ts b/ui-ngx/src/app/shared/models/time/time.models.ts index ae093c71d2..6c04aef946 100644 --- a/ui-ngx/src/app/shared/models/time/time.models.ts +++ b/ui-ngx/src/app/shared/models/time/time.models.ts @@ -140,8 +140,6 @@ export enum QuickTimeInterval { PREVIOUS_WEEK = 'PREVIOUS_WEEK', PREVIOUS_WEEK_ISO = 'PREVIOUS_WEEK_ISO', PREVIOUS_MONTH = 'PREVIOUS_MONTH', - PREVIOUS_QUARTER = 'PREVIOUS_QUARTER', - PREVIOUS_HALF_YEAR = 'PREVIOUS_HALF_YEAR', PREVIOUS_YEAR = 'PREVIOUS_YEAR', CURRENT_HOUR = 'CURRENT_HOUR', CURRENT_DAY = 'CURRENT_DAY', @@ -152,10 +150,6 @@ export enum QuickTimeInterval { CURRENT_WEEK_ISO_SO_FAR = 'CURRENT_WEEK_ISO_SO_FAR', CURRENT_MONTH = 'CURRENT_MONTH', CURRENT_MONTH_SO_FAR = 'CURRENT_MONTH_SO_FAR', - CURRENT_QUARTER = 'CURRENT_QUARTER', - CURRENT_QUARTER_SO_FAR = 'CURRENT_QUARTER_SO_FAR', - CURRENT_HALF_YEAR = 'CURRENT_HALF_YEAR', - CURRENT_HALF_YEAR_SO_FAR = 'CURRENT_HALF_YEAR_SO_FAR', CURRENT_YEAR = 'CURRENT_YEAR', CURRENT_YEAR_SO_FAR = 'CURRENT_YEAR_SO_FAR' } @@ -167,8 +161,6 @@ export const QuickTimeIntervalTranslationMap = new Map Date: Fri, 31 Mar 2023 12:26:20 +0300 Subject: [PATCH 002/155] Update PR template delete add version in templates --- pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pull_request_template.md b/pull_request_template.md index 21362429dc..d0bf8993f1 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -5,7 +5,7 @@ Put your PR description here instead of this sentence. ## General checklist - [ ] You have reviewed the guidelines [document](https://docs.google.com/document/d/1wqcOafLx5hth8SAg4dqV_LV3un3m5WYR8RdTJ4MbbUM/edit?usp=sharing). -- [ ] PR name contains fix version. For example, "[3.3.4] Hotfix of some UI component" or "[3.4] New Super Feature". +- [ ] [Labels](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels#about-labels) that classify your pull request have been added. - [ ] The [milestone](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/about-milestones) is specified and corresponds to fix version. - [ ] Description references specific [issue](https://github.com/thingsboard/thingsboard/issues). - [ ] Description contains human-readable scope of changes. From 1ff1b7c1dd103b95da0c805f06901c8104722473 Mon Sep 17 00:00:00 2001 From: Seraphym-Tuhai Date: Mon, 3 Apr 2023 17:23:08 +0300 Subject: [PATCH 003/155] assign, reassign tests --- .../server/msa/TestRestClient.java | 41 ++++++++++- .../server/msa/ui/pages/AlarmElements.java | 26 +++++++ .../server/msa/ui/pages/AlarmHelper.java | 14 ++++ .../msa/ui/pages/DevicePageElements.java | 21 ++++++ .../server/msa/ui/pages/DevicePageHelper.java | 14 ++++ .../msa/ui/pages/SideBarMenuViewElements.java | 15 ++++ .../msa/ui/pages/SideBarMenuViewHelper.java | 20 +++++ .../server/msa/ui/tests/AssignDetailsTab.java | 73 +++++++++++++++++++ .../msa/ui/utils/DataProviderCredential.java | 7 ++ .../server/msa/ui/utils/EntityPrototypes.java | 32 ++++++++ 10 files changed, 261 insertions(+), 2 deletions(-) create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmElements.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmHelper.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageElements.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageHelper.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/AssignDetailsTab.java 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 a030f3a8c9..a014dbee07 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,13 +29,17 @@ 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.User; +import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.asset.AssetProfile; +import org.thingsboard.server.common.data.id.AlarmId; import org.thingsboard.server.common.data.id.AssetProfileId; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.RuleChainId; +import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.relation.EntityRelation; @@ -178,7 +182,7 @@ public class TestRestClient { } public JsonPath postProvisionRequest(String provisionRequest) { - return given().spec(requestSpec) + return given().spec(requestSpec) .body(provisionRequest) .post("/api/v1/provision") .getBody() @@ -293,7 +297,7 @@ public class TestRestClient { } public DeviceProfile getDeviceProfileById(DeviceProfileId deviceProfileId) { - return given().spec(requestSpec).get("/api/deviceProfile/{deviceProfileId}", deviceProfileId.getId()) + return given().spec(requestSpec).get("/api/deviceProfile/{deviceProfileId}", deviceProfileId.getId()) .then() .assertThat() .statusCode(HTTP_OK) @@ -388,6 +392,39 @@ public class TestRestClient { }); } + public Alarm postAlarm(Alarm alarm) { + return given().spec(requestSpec) + .body(alarm) + .post("/api/alarm") + .then() + .statusCode(HTTP_OK) + .extract() + .as(Alarm.class); + } + + public void deleteAlarm(AlarmId alarmId) { + given().spec(requestSpec) + .delete("/api/alarm/{alarmId}", alarmId.getId()) + .then() + .statusCode(HTTP_OK); + } + + public User postUser(User user) { + return given().spec(requestSpec) + .body(user) + .post("/api/user?sendActivationMail=false") + .then() + .statusCode(HTTP_OK) + .extract() + .as(User.class); + } + + public void deleteUser(UserId userId) { + given().spec(requestSpec) + .delete("/api/user/{userId}", userId.getId()) + .then() + .statusCode(HTTP_OK); + } public String getToken() { return token; } 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 new file mode 100644 index 0000000000..d3528b0789 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmElements.java @@ -0,0 +1,26 @@ +package org.thingsboard.server.msa.ui.pages; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class AlarmElements extends OtherPageElements{ + public AlarmElements(WebDriver driver) { + 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[contains(@class,'tb-assignee')]//span[contains(text(),'%s')]"; + private static final String ASSIGN_USER_DISPLAY_NAME = "//span[text()='%s']/ancestor::mat-row//span[@class='user-display-name']"; + + public WebElement assignBtn() { + return waitUntilElementToBeClickable(ASSIGN_BTN); + } + + public WebElement userFromAssignDropDown(String userEmail) { + return waitUntilElementToBeClickable(String.format(USER_ASSIGN_DROPDOWN, userEmail)); + } + + public WebElement assignUserDisplayName(String userEmail) { + return waitUntilElementToBeClickable(String.format(ASSIGN_USER_DISPLAY_NAME, userEmail)); + } +} 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 new file mode 100644 index 0000000000..bef84d98ee --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmHelper.java @@ -0,0 +1,14 @@ +package org.thingsboard.server.msa.ui.pages; + +import org.openqa.selenium.WebDriver; + +public class AlarmHelper extends AlarmElements { + public AlarmHelper(WebDriver driver) { + super(driver); + } + + public void assignTo(String user) { + jsClick(assignBtn()); + userFromAssignDropDown(user).click(); + } +} 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 new file mode 100644 index 0000000000..411e5545ea --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageElements.java @@ -0,0 +1,21 @@ +package org.thingsboard.server.msa.ui.pages; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class DevicePageElements extends OtherPageElements{ + public DevicePageElements(WebDriver driver) { + super(driver); + } + + private static final String DEVICE = "//table//span[text()='%s']"; + private static final String DEVICE_DETAILS_ALARMS = "//tb-details-panel//span[text()='Alarms']"; + + public WebElement device(String deviceName) { + return waitUntilElementToBeClickable(String.format(DEVICE, deviceName)); + } + + public WebElement deviceDetailsAlarmsBtn() { + return waitUntilElementToBeClickable(DEVICE_DETAILS_ALARMS); + } +} 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 new file mode 100644 index 0000000000..0377b6e207 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DevicePageHelper.java @@ -0,0 +1,14 @@ +package org.thingsboard.server.msa.ui.pages; + +import org.openqa.selenium.WebDriver; + +public class DevicePageHelper extends DevicePageElements{ + public DevicePageHelper(WebDriver driver) { + super(driver); + } + + public void openDeviceAlarms(String deviceName) { + device(deviceName).click(); + deviceDetailsAlarmsBtn().click(); + } +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java index ab8ee9bf55..5ecf27b5bd 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java @@ -30,6 +30,13 @@ public class SideBarMenuViewElements extends AbstractBasePage { private static final String PROFILES_BTN = "//mat-toolbar//mat-icon[text()='badge']/ancestor::tb-menu-toggle"; private static final String DEVICE_PROFILE_BTN = "//mat-toolbar//a[@href='/profiles/deviceProfiles']"; private static final String ASSET_PROFILE_BTN = "//mat-toolbar//a[@href='/profiles/assetProfiles']"; + private static final String ALARMS_BTN = "//mat-toolbar//a[@href='/alarms']"; + private static final String ENTITIES_DROPDOWN = "//mat-toolbar//mat-icon[text()='category']/ancestor::a//span[contains(@class,'pull-right')]"; + private static final String DEVICES_BTN = "//ul[@id='docs-menu-entity.entities']//span[text()='Devices']"; + + public WebElement entitiesDropdown() { + return waitUntilElementToBeClickable(ENTITIES_DROPDOWN); + } public WebElement ruleChainsBtn() { return waitUntilElementToBeClickable(RULE_CHAINS_BTN); @@ -54,4 +61,12 @@ public class SideBarMenuViewElements extends AbstractBasePage { public WebElement assetProfileBtn() { return waitUntilElementToBeClickable(ASSET_PROFILE_BTN); } + + public WebElement alarmsBtn() { + return waitUntilElementToBeClickable(ALARMS_BTN); + } + + public WebElement devicesBtn() { + return waitUntilElementToBeClickable(DEVICES_BTN); + } } \ No newline at end of file diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java index 4d56689809..92848ff68c 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java @@ -16,6 +16,7 @@ package org.thingsboard.server.msa.ui.pages; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; public class SideBarMenuViewHelper extends SideBarMenuViewElements { public SideBarMenuViewHelper(WebDriver driver) { @@ -31,4 +32,23 @@ public class SideBarMenuViewHelper extends SideBarMenuViewElements { profilesBtn().click(); assetProfileBtn().click(); } + + public void goToDevicesPage() { + openEntitiesDropdown(); + devicesBtn().click(); + } + + public void openEntitiesDropdown() { + if (entitiesDropdownIsClose()) { + entitiesDropdown().click(); + } + } + + public boolean entitiesDropdownIsClose() { + return dropdownIsClose(entitiesDropdown()); + } + + private boolean dropdownIsClose(WebElement dropdown) { + return !dropdown.getAttribute("class").contains("tb-toggled"); + } } \ No newline at end of file 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 new file mode 100644 index 0000000000..420fe17a86 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/AssignDetailsTab.java @@ -0,0 +1,73 @@ +package org.thingsboard.server.msa.ui.tests; + +import org.testng.Assert; +import org.testng.annotations.AfterClass; +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; + +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.assignUserDisplayName(user).isDisplayed()); + } + + @Test + public void reassignAlarm() { + userId = testRestClient.postUser(EntityPrototypes.defaultUser(getCustomerByName("Customer A").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.assignUserDisplayName("customer@thingsboard.org").isDisplayed()); + } +} 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 73783544a1..a0188665c8 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 @@ -149,4 +149,11 @@ public class DataProviderCredential { {description, newDescription, description + newDescription}, {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 c131c0fb25..84f28bb6f2 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 @@ -21,12 +21,19 @@ import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfileProvisionType; import org.thingsboard.server.common.data.DeviceProfileType; import org.thingsboard.server.common.data.DeviceTransportType; +import org.thingsboard.server.common.data.User; +import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileConfiguration; import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.device.profile.DeviceProfileData; import org.thingsboard.server.common.data.device.profile.DisabledDeviceProfileProvisionConfiguration; +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.rule.RuleChain; +import org.thingsboard.server.common.data.security.Authority; public class EntityPrototypes { @@ -97,4 +104,29 @@ public class EntityPrototypes { assetProfile.setDescription(description); return assetProfile; } + + public static Alarm defaultAlarm(EntityId id) { + Alarm alarm = new Alarm(); + alarm.setType("default"); + alarm.setOriginator(id); + alarm.setSeverity(AlarmSeverity.CRITICAL); + return alarm; + } + + public static Alarm defaultAlarm(EntityId id, UserId userId) { + Alarm alarm = new Alarm(); + alarm.setType("default"); + alarm.setOriginator(id); + alarm.setSeverity(AlarmSeverity.CRITICAL); + alarm.setAssigneeId(userId); + return alarm; + } + + public static User defaultUser(CustomerId customerId) { + User user = new User(); + user.setEmail("test@thingsboard.org"); + user.setCustomerId(customerId); + user.setAuthority(Authority.CUSTOMER_USER); + return user; + } } From 32c6b7385f1fa9cde915a3d3338a39483a51401e Mon Sep 17 00:00:00 2001 From: Seraphym-Tuhai Date: Mon, 10 Apr 2023 09:07:22 +0300 Subject: [PATCH 004/155] add tests on search --- .../server/msa/ui/pages/AlarmElements.java | 18 ++++++-- .../server/msa/ui/pages/AlarmHelper.java | 18 ++++++++ .../msa/ui/pages/DevicePageElements.java | 7 ++- .../server/msa/ui/pages/DevicePageHelper.java | 6 ++- .../server/msa/ui/tests/AssignDetailsTab.java | 45 +++++++++++++++++-- .../server/msa/ui/utils/EntityPrototypes.java | 9 ++++ 6 files changed, 93 insertions(+), 10 deletions(-) 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 d3528b0789..48300429f6 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 @@ -3,14 +3,18 @@ package org.thingsboard.server.msa.ui.pages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import java.util.List; + public class AlarmElements extends OtherPageElements{ public AlarmElements(WebDriver driver) { 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[contains(@class,'tb-assignee')]//span[contains(text(),'%s')]"; - private static final String ASSIGN_USER_DISPLAY_NAME = "//span[text()='%s']/ancestor::mat-row//span[@class='user-display-name']"; + 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_USER_DISPLAY_NAME = "//span[@class='user-display-name'][contains(text(),'%s')]"; + private static final String SEARCH_FIELD = "//input[@placeholder='Search users']"; public WebElement assignBtn() { return waitUntilElementToBeClickable(ASSIGN_BTN); @@ -20,7 +24,15 @@ public class AlarmElements extends OtherPageElements{ return waitUntilElementToBeClickable(String.format(USER_ASSIGN_DROPDOWN, userEmail)); } - public WebElement assignUserDisplayName(String userEmail) { + public WebElement assignedUser(String userEmail) { return waitUntilElementToBeClickable(String.format(ASSIGN_USER_DISPLAY_NAME, userEmail)); } + + public List assignUsers() { + return waitUntilElementsToBeClickable(ASSIGN_USERS_DISPLAY_NAME); + } + + public WebElement searchUserField() { + return waitUntilElementToBeClickable(SEARCH_FIELD); + } } 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 bef84d98ee..4075a89ad1 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,6 +1,11 @@ package org.thingsboard.server.msa.ui.pages; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; public class AlarmHelper extends AlarmElements { public AlarmHelper(WebDriver driver) { @@ -11,4 +16,17 @@ public class AlarmHelper extends AlarmElements { jsClick(assignBtn()); userFromAssignDropDown(user).click(); } + + private List users; + + public void setUsers() { + users = assignUsers() + .stream() + .map(WebElement::getText) + .collect(Collectors.toList()); + } + + public List getUsers() { + return users; + } } 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 411e5545ea..ba766ef3fd 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 @@ -9,7 +9,8 @@ public class DevicePageElements extends OtherPageElements{ } private static final String DEVICE = "//table//span[text()='%s']"; - private static final String DEVICE_DETAILS_ALARMS = "//tb-details-panel//span[text()='Alarms']"; + private static final String DEVICE_DETAILS_VIEW = "//tb-details-panel"; + private static final String DEVICE_DETAILS_ALARMS = DEVICE_DETAILS_VIEW + "//span[text()='Alarms']"; public WebElement device(String deviceName) { return waitUntilElementToBeClickable(String.format(DEVICE, deviceName)); @@ -18,4 +19,8 @@ public class DevicePageElements extends OtherPageElements{ public WebElement deviceDetailsAlarmsBtn() { return waitUntilElementToBeClickable(DEVICE_DETAILS_ALARMS); } + + public WebElement deviceDetailsView() { + return waitUntilPresenceOfElementLocated(DEVICE_DETAILS_VIEW); + } } 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 0377b6e207..19716d3fb6 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 @@ -2,13 +2,15 @@ package org.thingsboard.server.msa.ui.pages; import org.openqa.selenium.WebDriver; -public class DevicePageHelper extends DevicePageElements{ +public class DevicePageHelper extends DevicePageElements { public DevicePageHelper(WebDriver driver) { super(driver); } public void openDeviceAlarms(String deviceName) { - device(deviceName).click(); + if (!deviceDetailsView().isDisplayed()) { + device(deviceName).click(); + } deviceDetailsAlarmsBtn().click(); } } 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 index 420fe17a86..cdf10356b3 100644 --- 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 @@ -1,7 +1,6 @@ package org.thingsboard.server.msa.ui.tests; import org.testng.Assert; -import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -17,6 +16,8 @@ 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; @@ -54,12 +55,13 @@ public class AssignDetailsTab extends AbstractDriverBaseTest { devicePage.openDeviceAlarms(deviceName); alarmPage.assignTo(user); - Assert.assertTrue(alarmPage.assignUserDisplayName(user).isDisplayed()); + Assert.assertTrue(alarmPage.assignedUser(user).isDisplayed()); } @Test public void reassignAlarm() { - userId = testRestClient.postUser(EntityPrototypes.defaultUser(getCustomerByName("Customer A").getId())).getId(); + 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(); @@ -68,6 +70,41 @@ public class AssignDetailsTab extends AbstractDriverBaseTest { devicePage.openDeviceAlarms(deviceName); alarmPage.assignTo("customer@thingsboard.org"); - Assert.assertTrue(alarmPage.assignUserDisplayName("customer@thingsboard.org").isDisplayed()); + 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/utils/EntityPrototypes.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/utils/EntityPrototypes.java index 84f28bb6f2..bce4373191 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 @@ -129,4 +129,13 @@ public class EntityPrototypes { user.setAuthority(Authority.CUSTOMER_USER); return user; } + + public static User defaultUser(CustomerId customerId, String name) { + User user = new User(); + user.setEmail("test@thingsboard.org"); + user.setFirstName(name); + user.setCustomerId(customerId); + user.setAuthority(Authority.CUSTOMER_USER); + return user; + } } From 982f6e23fb307347dd4979f4206f2ac3fc1b897f Mon Sep 17 00:00:00 2001 From: Seraphym-Tuhai Date: Thu, 13 Apr 2023 10:57:23 +0300 Subject: [PATCH 005/155] add test on propagated alarm --- .../server/msa/TestRestClient.java | 13 ++ .../ui/pages/AlarmDetailsViewElements.java | 32 +++ .../msa/ui/pages/AlarmDetailsViewHelper.java | 19 ++ .../server/msa/ui/pages/AlarmElements.java | 40 +++- .../server/msa/ui/pages/AlarmHelper.java | 36 ++- .../msa/ui/pages/CustomerPageElements.java | 10 +- .../msa/ui/pages/DevicePageElements.java | 15 ++ .../server/msa/ui/pages/DevicePageHelper.java | 15 ++ .../server/msa/ui/pages/LoginPageHelper.java | 14 +- .../server/msa/ui/tests/AssignDetailsTab.java | 110 --------- .../AbstractAssignByCustomerTest.java | 6 + .../ui/tests/assignee/AbstractAssignTest.java | 117 ++++++++++ .../tests/assignee/AssignByCustomerTest.java | 4 + .../ui/tests/assignee/AssignDetailsTab.java | 209 ++++++++++++++++++ .../msa/ui/utils/DataProviderCredential.java | 6 - .../server/msa/ui/utils/EntityPrototypes.java | 55 ++++- 16 files changed, 564 insertions(+), 137 deletions(-) create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewElements.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewHelper.java delete mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/AssignDetailsTab.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignByCustomerTest.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignTest.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignByCustomerTest.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTab.java 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; + } } From c9760ab55be5e38020f7b76ca2bd7a840d096d06 Mon Sep 17 00:00:00 2001 From: Seraphym-Tuhai Date: Thu, 13 Apr 2023 17:39:55 +0300 Subject: [PATCH 006/155] add test on customer, asset and entity view alarm --- .../server/msa/TestRestClient.java | 42 +++++++++ .../msa/ui/base/AbstractDriverBaseTest.java | 14 +++ .../ui/pages/AlarmDetailsViewElements.java | 23 ++++- .../msa/ui/pages/AlarmDetailsViewHelper.java | 15 ++++ .../server/msa/ui/pages/AlarmElements.java | 5 ++ .../msa/ui/pages/CustomerPageElements.java | 10 +++ .../msa/ui/pages/CustomerPageHelper.java | 7 ++ .../msa/ui/pages/DevicePageElements.java | 27 +++++- .../server/msa/ui/pages/DevicePageHelper.java | 6 ++ .../msa/ui/pages/SideBarMenuViewElements.java | 10 +++ .../msa/ui/pages/SideBarMenuViewHelper.java | 10 +++ .../AbstractAssignByCustomerTest.java | 15 ++++ .../ui/tests/assignee/AbstractAssignTest.java | 52 +++++++++-- .../tests/assignee/AssignByCustomerTest.java | 15 ++++ .../ui/tests/assignee/AssignDetailsTab.java | 88 ++++++++++++------- .../server/msa/ui/utils/EntityPrototypes.java | 18 ++++ 16 files changed, 315 insertions(+), 42 deletions(-) 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 45829e7d1e..c34d14e48f 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,16 +29,20 @@ 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.EntityView; 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.Asset; import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.AssetProfileId; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.EntityViewId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.page.PageData; @@ -445,4 +449,42 @@ public class TestRestClient { .as(new TypeRef>() { }); } + + public Asset postAsset(Asset asset) { + return given().spec(requestSpec) + .body(asset) + .post("/api/asset") + .then() + .statusCode(HTTP_OK) + .extract() + .as(Asset.class); + } + + public Asset getAssetById(AssetId assetId) { + return given().spec(requestSpec) + .get("/api/asset/{assetId}", assetId.getId()) + .then() + .statusCode(HTTP_OK) + .extract() + .as(Asset.class); + } + + public EntityView postEntityView(EntityView entityView) { + return given().spec(requestSpec) + .body(entityView) + .post("/api/entityView") + .then() + .statusCode(HTTP_OK) + .extract() + .as(EntityView.class); + } + + public EntityView getEntityViewById(EntityViewId entityViewId) { + return given().spec(requestSpec) + .get("/api/entityView/{entityViewId}", entityViewId.getId()) + .then() + .statusCode(HTTP_OK) + .extract() + .as(EntityView.class); + } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java index e88397b781..aecdc61c03 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java @@ -27,6 +27,7 @@ import org.openqa.selenium.WebDriverException; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.html5.WebStorage; import org.openqa.selenium.remote.LocalFileDetector; import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; @@ -179,4 +180,17 @@ abstract public class AbstractDriverBaseTest extends AbstractContainerTest { new ByteArrayInputStream(((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES))); } } + + 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/pages/AlarmDetailsViewElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmDetailsViewElements.java index 44f41aff2c..7d88a1ed4f 100644 --- 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 @@ -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; @@ -9,9 +24,9 @@ public class AlarmDetailsViewElements extends AbstractBasePage { super(driver); } - private static final String ASSIGN_FIELD = "//mat-label[contains(text(),'Assignee')]/parent::label/following-sibling::input"; + private static final String ASSIGN_FIELD = "//tb-alarm-assignee//mat-icon[contains(text(),'keyboard_arrow_down')]/parent::button"; 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 CLOSE_ALARM_DETAILS_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() { @@ -22,8 +37,8 @@ public class AlarmDetailsViewElements extends AbstractBasePage { return waitUntilElementToBeClickable(String.format(USER_FROM_DROP_DOWN, emailOrName)); } - public WebElement closeViewBtn() { - return waitUntilElementToBeClickable(CLOSE_VIEW_BTN); + public WebElement closeAlarmDetailsViewBtn() { + return waitUntilElementToBeClickable(CLOSE_ALARM_DETAILS_VIEW_BTN); } public WebElement unassignedBtn() { 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 index b658164b37..89d572cf3c 100644 --- 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 @@ -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/AlarmElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AlarmElements.java index ad3ccb748d..87baef8594 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 @@ -33,6 +33,7 @@ public class AlarmElements extends OtherPageElements{ 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"; + private static final String ACCESS_FORBIDDEN_DIALOG_VIEW = "//h2[text() = 'Access Forbidden']/parent::tb-confirm-dialog"; public WebElement assignBtn(String type) { return waitUntilElementToBeClickable(String.format(ASSIGN_BTN, type)); @@ -65,4 +66,8 @@ public class AlarmElements extends OtherPageElements{ public WebElement alarmDetailsBtn(String alarmType) { return waitUntilElementToBeClickable(String.format(ALARM_DETAILS_BTN, alarmType)); } + + public WebElement accessForbiddenDialogView() { + return waitUntilVisibilityOfElementLocated(ACCESS_FORBIDDEN_DIALOG_VIEW); + } } 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 90f51c4903..465c3d918e 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 @@ -73,6 +73,8 @@ public class CustomerPageElements extends OtherPageElementsHelper { private static final String MANAGE_CUSTOMERS_DASHBOARD_BTN_VIEW = "Manage dashboards"; private static final String MANAGE_CUSTOMERS_EDGE_BTN_VIEW = "Manage edges "; private static final String DELETE_FROM_VIEW_BTN = "//tb-customer//span[contains(text(),' Delete')]"; + private static final String CUSTOMER_DETAILS_VIEW = "//tb-details-panel"; + private static final String CUSTOMER_DETAILS_ALARMS = CUSTOMER_DETAILS_VIEW + "//span[text()='Alarms']"; public WebElement titleFieldAddEntityView() { return waitUntilElementToBeClickable(ADD_ENTITY_VIEW + String.format(INPUT_FIELD, INPUT_FIELD_NAME_TITLE)); @@ -285,4 +287,12 @@ public class CustomerPageElements extends OtherPageElementsHelper { public WebElement customerViewDeleteBtn() { return waitUntilElementToBeClickable(DELETE_FROM_VIEW_BTN); } + + public WebElement customerDetailsView() { + return waitUntilPresenceOfElementLocated(CUSTOMER_DETAILS_VIEW); + } + + public WebElement customerDetailsAlarmsBtn() { + return waitUntilElementToBeClickable(CUSTOMER_DETAILS_ALARMS); + } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageHelper.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageHelper.java index ba90361dc8..25b3aff7e1 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageHelper.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageHelper.java @@ -161,4 +161,11 @@ public class CustomerPageHelper extends CustomerPageElements { phoneNumberEntityView().sendKeys(number); phoneNumberEntityView().sendKeys(Keys.TAB); } + + public void openCustomerAlarms(String customerName) { + if (!customerDetailsView().isDisplayed()) { + customer(customerName).click(); + } + customerDetailsAlarmsBtn().click(); + } } 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 d8bb1b021e..f5e6c2800a 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 @@ -26,7 +26,12 @@ public class DevicePageElements extends OtherPageElements{ private static final String DEVICE = "//table//span[text()='%s']"; private static final String DEVICE_DETAILS_VIEW = "//tb-details-panel"; private static final String DEVICE_DETAILS_ALARMS = DEVICE_DETAILS_VIEW + "//span[text()='Alarms']"; - + private static final String ASSIGN_TO_CUSTOMER_BTN = "//mat-cell[contains(@class,'name')]/span[text()='%s']" + + "/ancestor::mat-row//mat-icon[contains(text(),'assignment_ind')]/parent::button"; + private static final String CHOOSE_CUSTOMER_FOR_ASSIGN_FIELD = "//input[@formcontrolname='entity']"; + private static final String CUSTOMER_FROM_ASSIGN_DROPDOWN = "//div[@role = 'listbox']//span[text() = '%s']"; + private static final String CLOSE_DEVICE_DETAILS_VIEW = "//header//mat-icon[contains(text(),'close')]/parent::button"; + private static final String SUBMIT_ASSIGN_TO_CUSTOMER_BTN = "//button[@type='submit']"; public WebElement device(String deviceName) { return waitUntilElementToBeClickable(String.format(DEVICE, deviceName)); } @@ -38,4 +43,24 @@ public class DevicePageElements extends OtherPageElements{ public WebElement deviceDetailsView() { return waitUntilPresenceOfElementLocated(DEVICE_DETAILS_VIEW); } + + public WebElement assignToCustomerBtn(String deviceName) { + return waitUntilElementToBeClickable(String.format(ASSIGN_TO_CUSTOMER_BTN, deviceName)); + } + + public WebElement chooseCustomerForAssignField() { + return waitUntilElementToBeClickable(CHOOSE_CUSTOMER_FOR_ASSIGN_FIELD); + } + + public WebElement customerFromAssignDropdown(String customerTitle) { + return waitUntilElementToBeClickable(String.format(CUSTOMER_FROM_ASSIGN_DROPDOWN, customerTitle)); + } + + public WebElement closeDeviceDetailsViewBtn() { + return waitUntilElementToBeClickable(CLOSE_DEVICE_DETAILS_VIEW); + } + + public WebElement submitAssignToCustomerBtn() { + return waitUntilElementToBeClickable(SUBMIT_ASSIGN_TO_CUSTOMER_BTN); + } } 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 12413641af..19e85244cd 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 @@ -28,4 +28,10 @@ public class DevicePageHelper extends DevicePageElements { } deviceDetailsAlarmsBtn().click(); } + + public void assignToCustomer(String customerTitle) { + chooseCustomerForAssignField().click(); + customerFromAssignDropdown(customerTitle).click(); + submitAssignToCustomerBtn().click(); + } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java index 5ecf27b5bd..54675bdc7a 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewElements.java @@ -33,6 +33,8 @@ public class SideBarMenuViewElements extends AbstractBasePage { private static final String ALARMS_BTN = "//mat-toolbar//a[@href='/alarms']"; private static final String ENTITIES_DROPDOWN = "//mat-toolbar//mat-icon[text()='category']/ancestor::a//span[contains(@class,'pull-right')]"; private static final String DEVICES_BTN = "//ul[@id='docs-menu-entity.entities']//span[text()='Devices']"; + private static final String ASSETS_BTN = "//ul[@id='docs-menu-entity.entities']//span[text()='Assets']"; + private static final String ENTITY_VIEWS_BTN = "//ul[@id='docs-menu-entity.entities']//span[text()='Entity Views']"; public WebElement entitiesDropdown() { return waitUntilElementToBeClickable(ENTITIES_DROPDOWN); @@ -69,4 +71,12 @@ public class SideBarMenuViewElements extends AbstractBasePage { public WebElement devicesBtn() { return waitUntilElementToBeClickable(DEVICES_BTN); } + + public WebElement assetsBtn() { + return waitUntilElementToBeClickable(ASSETS_BTN); + } + + public WebElement entityViewsBtn() { + return waitUntilElementToBeClickable(ENTITY_VIEWS_BTN); + } } \ No newline at end of file diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java index 92848ff68c..297438c193 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java @@ -38,6 +38,16 @@ public class SideBarMenuViewHelper extends SideBarMenuViewElements { devicesBtn().click(); } + public void goToAssetsPage() { + openEntitiesDropdown(); + assetsBtn().click(); + } + + public void goToEntityViewsPage() { + openEntitiesDropdown(); + entityViewsBtn().click(); + } + public void openEntitiesDropdown() { if (entitiesDropdownIsClose()) { entitiesDropdown().click(); 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 index 6cc9186f5a..516abf8ab7 100644 --- 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 @@ -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.tests.assignee; import org.thingsboard.server.msa.ui.base.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 index 633345774c..1dfe2b139d 100644 --- 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 @@ -1,15 +1,30 @@ +/** + * 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.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.AssetId; 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.EntityViewId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.msa.ui.base.AbstractDriverBaseTest; import org.thingsboard.server.msa.ui.pages.AlarmDetailsViewHelper; @@ -20,8 +35,6 @@ 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 { @@ -30,13 +43,19 @@ abstract public class AbstractAssignTest extends AbstractDriverBaseTest { protected AlarmId assignedAlarmId; protected AlarmId propageteAlarmId; protected AlarmId propageteAssigneAlarmId; - protected AlarmId tenantAssigneAlarmId; + protected AlarmId tenantAlarmId; + protected AlarmId onCustomerAlarmId; + protected AlarmId assetAlarmId; + protected AlarmId entityViewAlarmId; protected DeviceId deviceId; + protected DeviceId tenantDeviceId; protected UserId userId; protected UserId userWithNameId; -// protected TenantId tenantId = testRestClient.getTenants(pageLink).getData().get(0).getId(); protected CustomerId customerId; protected String deviceName; + protected String assetName; + protected String entityViewName; + protected String tenantDeviceName; protected SideBarMenuViewHelper sideBarMenuView; protected AlarmHelper alarmPage; protected DevicePageHelper devicePage; @@ -51,6 +70,12 @@ abstract public class AbstractAssignTest extends AbstractDriverBaseTest { protected String assignedAlarm = "Test alarm 2"; protected String propagateAlarm = "Test propagated alarm 1"; protected String propagateAssignedAlarm = "Test propagated alarm 2"; + protected String tenantAlarm = "Test tenant alarm"; + protected String customerAlarm = "Test customer alarm"; + protected String assetAlarm = "Test asset alarm"; + protected String entityViewAlarm = "Test entity view alarm"; + protected AssetId assetId; + protected EntityViewId entityViewId; @BeforeClass public void generateTestEntities() { @@ -65,7 +90,16 @@ abstract public class AbstractAssignTest extends AbstractDriverBaseTest { 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(); + tenantDeviceName = testRestClient.postDevice("", EntityPrototypes.defaultDevicePrototype("")).getName(); deviceId = testRestClient.getDeviceByName(deviceName).getId(); + tenantDeviceId = testRestClient.getDeviceByName(tenantDeviceName).getId(); + onCustomerAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(customerId, customerAlarm)).getId(); + assetId = testRestClient.postAsset(EntityPrototypes.defaultAssetPrototype("", customerId)).getId(); + assetName = testRestClient.getAssetById(assetId).getName(); + assetAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(assetId, assetAlarm)).getId(); + entityViewId = testRestClient.postEntityView(EntityPrototypes.defaultEntityViewPrototype("", "", "DEVICE")).getId(); + entityViewName = testRestClient.getEntityViewById(entityViewId).getName(); + entityViewAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(entityViewId, entityViewAlarm)).getId(); } @BeforeMethod @@ -78,13 +112,18 @@ abstract public class AbstractAssignTest extends AbstractDriverBaseTest { propageteAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, propagateAlarm, true)).getId(); propageteAssigneAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, propagateAssignedAlarm, userId, true)).getId(); + tenantAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(tenantDeviceId, tenantAlarm)).getId(); } @AfterClass public void deleteTestEntities() { testRestClient.deleteDevice(deviceId); + testRestClient.deleteDevice(tenantDeviceId); testRestClient.deleteCustomer(customerId); + testRestClient.deleteAlarm(onCustomerAlarmId); + testRestClient.deleteAlarm(assetAlarmId); + testRestClient.deleteAlarm(entityViewAlarmId); } @AfterMethod @@ -93,6 +132,7 @@ abstract public class AbstractAssignTest extends AbstractDriverBaseTest { testRestClient.deleteAlarm(assignedAlarmId); testRestClient.deleteAlarm(propageteAlarmId); testRestClient.deleteAlarm(propageteAssigneAlarmId); + testRestClient.deleteAlarm(tenantAlarmId); } public void loginByUser(String userEmail) { 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 index 5c376ec3d0..e02f0ce45b 100644 --- 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 @@ -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.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 index aed0483f3e..9781ef6417 100644 --- 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 @@ -15,22 +15,15 @@ */ 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.pages.AssetPageElements; 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(); @@ -85,7 +78,7 @@ public class AssignDetailsTab extends AbstractAssignTest { alarmPage.searchAlarm(alarm, name); alarmPage.setUsers(); - assertThat(alarmPage.getUsers()).hasSize(1).contains(name); + //assertThat(alarmPage.getUsers()).hasSize(1).contains(name); alarmPage.assignUsers().forEach(u -> assertThat(u.isDisplayed()).isTrue()); } @@ -95,7 +88,7 @@ public class AssignDetailsTab extends AbstractAssignTest { devicePage.openDeviceAlarms(deviceName); alarmPage.alarmDetailsBtn(alarm).click(); alarmDetailsView.assignAlarmTo(Const.TENANT_EMAIL); - alarmDetailsView.closeViewBtn().click(); + alarmDetailsView.closeAlarmDetailsViewBtn().click(); Assert.assertTrue(alarmPage.assignedUser(Const.TENANT_EMAIL).isDisplayed()); } @@ -106,7 +99,7 @@ public class AssignDetailsTab extends AbstractAssignTest { devicePage.openDeviceAlarms(deviceName); alarmPage.alarmDetailsBtn(alarm).click(); alarmDetailsView.assignAlarmTo(userEmail); - alarmDetailsView.closeViewBtn().click(); + alarmDetailsView.closeAlarmDetailsViewBtn().click(); Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); } @@ -117,7 +110,7 @@ public class AssignDetailsTab extends AbstractAssignTest { devicePage.openDeviceAlarms(deviceName); alarmPage.alarmDetailsBtn(assignedAlarm).click(); alarmDetailsView.unassignedAlarm(); - alarmDetailsView.closeViewBtn().click(); + alarmDetailsView.closeAlarmDetailsViewBtn().click(); Assert.assertTrue(alarmPage.unassigned(assignedAlarm).isDisplayed()); } @@ -128,7 +121,7 @@ public class AssignDetailsTab extends AbstractAssignTest { devicePage.openDeviceAlarms(deviceName); alarmPage.alarmDetailsBtn(assignedAlarm).click(); alarmDetailsView.assignAlarmTo(Const.TENANT_EMAIL); - alarmDetailsView.closeViewBtn().click(); + alarmDetailsView.closeAlarmDetailsViewBtn().click(); Assert.assertTrue(alarmPage.assignedUser(Const.TENANT_EMAIL).isDisplayed()); } @@ -180,30 +173,63 @@ public class AssignDetailsTab extends AbstractAssignTest { @Test public void checkTheDisplayOfNamesEmailsFromCustomer() { sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(deviceName); - alarmPage.assignAlarmTo(alarm, Const.TENANT_EMAIL); + devicePage.openDeviceAlarms(tenantDeviceName); + alarmPage.assignAlarmTo(tenantAlarm, Const.TENANT_EMAIL); + devicePage.closeDeviceDetailsViewBtn().click(); + devicePage.assignToCustomerBtn(tenantDeviceName).click(); + devicePage.assignToCustomer(customerTitle); loginByUser(userEmail); sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(deviceName); - alarmPage.assignBtn(alarm).click(); - try { - alarmPage.assertUsersForAssignIsNotPresent(); - } finally { - clearStorage(); - } + devicePage.openDeviceAlarms(tenantDeviceName); + + clearStorage(); + Assert.assertTrue(alarmPage.assignedUser(Const.TENANT_EMAIL).isDisplayed()); + } + + @Test + public void reassignTenantForOldAlarm() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(tenantDeviceName); + alarmPage.assignAlarmTo(tenantAlarm, Const.TENANT_EMAIL); + devicePage.closeDeviceDetailsViewBtn().click(); + devicePage.assignToCustomerBtn(tenantDeviceName).click(); + devicePage.assignToCustomer(customerTitle); + loginByUser(userEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(tenantDeviceName); + alarmPage.assignAlarmTo(tenantAlarm, userEmail); + + clearStorage(); + Assert.assertTrue(alarmPage.accessForbiddenDialogView().isDisplayed()); + } + + @Test + public void assignCustomerAlarmToYourself() { + sideBarMenuView.customerBtn().click(); + customerPage.openCustomerAlarms(customerTitle); + alarmPage.assignAlarmTo(customerAlarm, userEmail); + + Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); } - public WebStorage getWebStorage() { - if (driver instanceof WebStorage) { - return (WebStorage) driver; - } else { - throw new IllegalArgumentException("This test expects the driver to implement WebStorage"); - } + @Test + public void assignAssetAlarmToYourself() { + AssetPageElements assetPageElements = new AssetPageElements(driver); + sideBarMenuView.goToAssetsPage(); + assetPageElements.openAssetAlarms(customerTitle); + alarmPage.assignAlarmTo(assetAlarm, userEmail); + + Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); } - public void clearStorage() { - getWebStorage().getLocalStorage().clear(); - getWebStorage().getSessionStorage().clear(); + @Test + public void assignEntityViewsAlarmToYourself() { + AssetPageElements assetPageElements = new AssetPageElements(driver); + sideBarMenuView.goToEntityViewsPage(); + assetPageElements.openAssetAlarms(entityViewName); + alarmPage.assignAlarmTo(entityViewAlarm, userEmail); + + Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); } } 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 504980a001..15452506ed 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 @@ -23,9 +23,11 @@ import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfileProvisionType; import org.thingsboard.server.common.data.DeviceProfileType; import org.thingsboard.server.common.data.DeviceTransportType; +import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmSeverity; +import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileConfiguration; import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileTransportConfiguration; @@ -177,4 +179,20 @@ public class EntityPrototypes { device.setType("DEFAULT"); return device; } + + public static Asset defaultAssetPrototype(String name, CustomerId id){ + Asset asset = new Asset(); + asset.setName(name + RandomStringUtils.randomAlphanumeric(7)); + asset.setCustomerId(id); + asset.setType("DEFAULT"); + return asset; + } + + public static EntityView defaultEntityViewPrototype(String name, String type, String entityType){ + EntityView entityView = new EntityView(); + entityView.setName(name + RandomStringUtils.randomAlphanumeric(7)); + entityView.setType(type + RandomStringUtils.randomAlphanumeric(7)); + entityView.setAdditionalInfo(JacksonUtil.newObjectNode().put("entityType", entityType)); + return entityView; + } } From c33407bb193ae21a5055b0590ea625ade6e7d92e Mon Sep 17 00:00:00 2001 From: Seraphym-Tuhai Date: Fri, 14 Apr 2023 17:37:39 +0300 Subject: [PATCH 007/155] add AbstractAssignTest class, add assertIsDisplayed(), add assignee.xml suite --- .../server/msa/TestRestClient.java | 27 +- .../msa/ui/base/AbstractDriverBaseTest.java | 5 + .../ui/pages/AlarmDetailsViewElements.java | 3 +- .../msa/ui/pages/AssetPageElements.java | 44 ++++ .../server/msa/ui/pages/EntityViewPage.java | 45 ++++ .../AbstractAssignByCustomerTest.java | 21 -- .../ui/tests/assignee/AbstractAssignTest.java | 99 ++------ .../tests/assignee/AssignByCustomerTest.java | 19 -- .../ui/tests/assignee/AssignDetailsTab.java | 235 ------------------ .../assignee/AssignDetailsTabAssignTest.java | 229 +++++++++++++++++ ...ssignDetailsTabFromCustomerAssignTest.java | 129 ++++++++++ .../src/test/resources/assignee.xml | 36 +++ 12 files changed, 523 insertions(+), 369 deletions(-) create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AssetPageElements.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/EntityViewPage.java delete mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignByCustomerTest.java delete mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignByCustomerTest.java delete mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTab.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTabAssignTest.java create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTabFromCustomerAssignTest.java create mode 100644 msa/black-box-tests/src/test/resources/assignee.xml 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 c34d14e48f..de7f92cfb3 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 @@ -430,6 +430,7 @@ public class TestRestClient { .then() .statusCode(HTTP_OK); } + public String getToken() { return token; } @@ -438,18 +439,6 @@ public class TestRestClient { 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>() { - }); - } - public Asset postAsset(Asset asset) { return given().spec(requestSpec) .body(asset) @@ -469,6 +458,13 @@ public class TestRestClient { .as(Asset.class); } + public void deleteAsset(AssetId assetId) { + given().spec(requestSpec) + .delete("/api/asset/{assetId}", assetId.getId()) + .then() + .statusCode(HTTP_OK); + } + public EntityView postEntityView(EntityView entityView) { return given().spec(requestSpec) .body(entityView) @@ -487,4 +483,11 @@ public class TestRestClient { .extract() .as(EntityView.class); } + + public void deleteEntityView(EntityViewId entityViewId) { + given().spec(requestSpec) + .delete("/api/entityView/{entityViewId}", entityViewId.getId()) + .then() + .statusCode(HTTP_OK); + } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java index aecdc61c03..3073ce506d 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java @@ -50,6 +50,7 @@ import java.net.URL; import java.time.Duration; import java.util.stream.Collectors; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; import static org.thingsboard.server.msa.TestProperties.getBaseUiUrl; import static org.thingsboard.server.msa.ui.utils.Const.TENANT_EMAIL; @@ -193,4 +194,8 @@ abstract public class AbstractDriverBaseTest extends AbstractContainerTest { getWebStorage().getLocalStorage().clear(); getWebStorage().getSessionStorage().clear(); } + + public void assertIsDisplayed(WebElement element) { + assertThat(element.isDisplayed()).as(element + " is displayed").isTrue(); + } } 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 index 7d88a1ed4f..6e1e38a226 100644 --- 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 @@ -24,7 +24,8 @@ public class AlarmDetailsViewElements extends AbstractBasePage { super(driver); } - private static final String ASSIGN_FIELD = "//tb-alarm-assignee//mat-icon[contains(text(),'keyboard_arrow_down')]/parent::button"; + //private static final String ASSIGN_FIELD = "//tb-alarm-assignee//mat-icon[contains(text(),'keyboard_arrow_down')]/parent::button"; + private static final String ASSIGN_FIELD = "//mat-label[text()='Assignee']/parent::label/parent::div//input"; private static final String USER_FROM_DROP_DOWN = "//div[@class='user-display-name']/span[text() = '%s']"; private static final String CLOSE_ALARM_DETAILS_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"; diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AssetPageElements.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AssetPageElements.java new file mode 100644 index 0000000000..f4424894dd --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/AssetPageElements.java @@ -0,0 +1,44 @@ +/** + * 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; + +public class AssetPageElements extends OtherPageElements{ + public AssetPageElements(WebDriver driver) { + super(driver); + } + + private static final String CUSTOMER_DETAILS_VIEW = "//tb-details-panel"; + private static final String CUSTOMER_DETAILS_ALARMS = CUSTOMER_DETAILS_VIEW + "//span[text()='Alarms']"; + + public WebElement customerDetailsView() { + return waitUntilPresenceOfElementLocated(CUSTOMER_DETAILS_VIEW); + } + + public WebElement customerDetailsAlarmsBtn() { + return waitUntilElementToBeClickable(CUSTOMER_DETAILS_ALARMS); + } + + public void openAssetAlarms(String assetName) { + if (!customerDetailsView().isDisplayed()) { + entity(assetName).click(); + } + customerDetailsAlarmsBtn().click(); + } + +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/EntityViewPage.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/EntityViewPage.java new file mode 100644 index 0000000000..b62c13d8a7 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/EntityViewPage.java @@ -0,0 +1,45 @@ +/** + * 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; + +public class EntityViewPage extends OtherPageElementsHelper{ + public EntityViewPage(WebDriver driver) { + super(driver); + } + + private static final String CUSTOMER_DETAILS_VIEW = "//tb-details-panel"; + private static final String CUSTOMER_DETAILS_ALARMS = CUSTOMER_DETAILS_VIEW + "//span[text()='Alarms']"; + + public WebElement customerDetailsView() { + return waitUntilPresenceOfElementLocated(CUSTOMER_DETAILS_VIEW); + } + + public WebElement customerDetailsAlarmsBtn() { + return waitUntilElementToBeClickable(CUSTOMER_DETAILS_ALARMS); + } + + + public void openEntityViewAlarms(String customerName) { + if (!customerDetailsView().isDisplayed()) { + entity(customerName).click(); + } + customerDetailsAlarmsBtn().click(); + } + +} 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 deleted file mode 100644 index 516abf8ab7..0000000000 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AbstractAssignByCustomerTest.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * 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.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 index 1dfe2b139d..182bf04fb4 100644 --- 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 @@ -19,12 +19,9 @@ 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.AssetId; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DeviceId; -import org.thingsboard.server.common.data.id.EntityViewId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.msa.ui.base.AbstractDriverBaseTest; import org.thingsboard.server.msa.ui.pages.AlarmDetailsViewHelper; @@ -41,117 +38,57 @@ abstract public class AbstractAssignTest extends AbstractDriverBaseTest { protected AlarmId alarmId; protected AlarmId assignedAlarmId; - protected AlarmId propageteAlarmId; - protected AlarmId propageteAssigneAlarmId; - protected AlarmId tenantAlarmId; - protected AlarmId onCustomerAlarmId; - protected AlarmId assetAlarmId; - protected AlarmId entityViewAlarmId; protected DeviceId deviceId; - protected DeviceId tenantDeviceId; + protected UserId userId; protected UserId userWithNameId; protected CustomerId customerId; protected String deviceName; - protected String assetName; - protected String entityViewName; - protected String tenantDeviceName; + protected SideBarMenuViewHelper sideBarMenuView; protected AlarmHelper alarmPage; protected DevicePageHelper devicePage; + protected CustomerPageHelper customerPage; protected AlarmDetailsViewHelper alarmDetailsView; - CustomerPageHelper customerPage; - protected String name = "User"; - protected String customerTitle = "Customer" + random(); + protected String userName = "User " + random(); + 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"; - protected String tenantAlarm = "Test tenant alarm"; - protected String customerAlarm = "Test customer alarm"; - protected String assetAlarm = "Test asset alarm"; - protected String entityViewAlarm = "Test entity view alarm"; - protected AssetId assetId; - protected EntityViewId entityViewId; + protected String alarm = "Test alarm " + random(); + protected String assignedAlarm = "Test assigned alarm " + random(); @BeforeClass - public void generateTestEntities() { + public void generateTestEntity() { new LoginPageHelper(driver).authorizationTenant(); sideBarMenuView = new SideBarMenuViewHelper(driver); alarmPage = new AlarmHelper(driver); devicePage = new DevicePageHelper(driver); - alarmDetailsView = new AlarmDetailsViewHelper(driver); customerPage = new CustomerPageHelper(driver); + alarmDetailsView = new AlarmDetailsViewHelper(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(); + userWithNameId = testRestClient.postUser(EntityPrototypes.defaultUser(userWithNameEmail, getCustomerByName(customerTitle).getId(), userName)).getId(); deviceName = testRestClient.postDevice("", EntityPrototypes.defaultDevicePrototype("", customerId)).getName(); - tenantDeviceName = testRestClient.postDevice("", EntityPrototypes.defaultDevicePrototype("")).getName(); deviceId = testRestClient.getDeviceByName(deviceName).getId(); - tenantDeviceId = testRestClient.getDeviceByName(tenantDeviceName).getId(); - onCustomerAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(customerId, customerAlarm)).getId(); - assetId = testRestClient.postAsset(EntityPrototypes.defaultAssetPrototype("", customerId)).getId(); - assetName = testRestClient.getAssetById(assetId).getName(); - assetAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(assetId, assetAlarm)).getId(); - entityViewId = testRestClient.postEntityView(EntityPrototypes.defaultEntityViewPrototype("", "", "DEVICE")).getId(); - entityViewName = testRestClient.getEntityViewById(entityViewId).getName(); - entityViewAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(entityViewId, entityViewAlarm)).getId(); + } + + @AfterClass + public void deleteEntities() { + testRestClient.deleteCustomer(customerId); + testRestClient.deleteDevice(deviceId); } @BeforeMethod - public void generateTestAlarms() { - if (getJwtTokenFromLocalStorage() == null) { - new LoginPageHelper(driver).authorizationTenant(); - } + public void createTestAlarms() { 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(); - - tenantAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(tenantDeviceId, tenantAlarm)).getId(); - - } - - @AfterClass - public void deleteTestEntities() { - testRestClient.deleteDevice(deviceId); - testRestClient.deleteDevice(tenantDeviceId); - testRestClient.deleteCustomer(customerId); - testRestClient.deleteAlarm(onCustomerAlarmId); - testRestClient.deleteAlarm(assetAlarmId); - testRestClient.deleteAlarm(entityViewAlarmId); } @AfterMethod - public void deleteTestAlarms() { + public void deleteCreatedAlarms() { testRestClient.deleteAlarm(alarmId); testRestClient.deleteAlarm(assignedAlarmId); - testRestClient.deleteAlarm(propageteAlarmId); - testRestClient.deleteAlarm(propageteAssigneAlarmId); - testRestClient.deleteAlarm(tenantAlarmId); - } - - 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 deleted file mode 100644 index e02f0ce45b..0000000000 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignByCustomerTest.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * 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; - -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 deleted file mode 100644 index 9781ef6417..0000000000 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTab.java +++ /dev/null @@ -1,235 +0,0 @@ -/** - * 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.testng.Assert; -import org.testng.annotations.Test; -import org.thingsboard.server.msa.ui.pages.AssetPageElements; -import org.thingsboard.server.msa.ui.utils.Const; - -import static org.assertj.core.api.Assertions.assertThat; - -public class AssignDetailsTab extends AbstractAssignTest { - - @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.closeAlarmDetailsViewBtn().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.closeAlarmDetailsViewBtn().click(); - - Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); - } - - @Test - public void unassignedAlarmFromDetails() { - sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(deviceName); - alarmPage.alarmDetailsBtn(assignedAlarm).click(); - alarmDetailsView.unassignedAlarm(); - alarmDetailsView.closeAlarmDetailsViewBtn().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.closeAlarmDetailsViewBtn().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(tenantDeviceName); - alarmPage.assignAlarmTo(tenantAlarm, Const.TENANT_EMAIL); - devicePage.closeDeviceDetailsViewBtn().click(); - devicePage.assignToCustomerBtn(tenantDeviceName).click(); - devicePage.assignToCustomer(customerTitle); - loginByUser(userEmail); - sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(tenantDeviceName); - - clearStorage(); - Assert.assertTrue(alarmPage.assignedUser(Const.TENANT_EMAIL).isDisplayed()); - } - - @Test - public void reassignTenantForOldAlarm() { - sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(tenantDeviceName); - alarmPage.assignAlarmTo(tenantAlarm, Const.TENANT_EMAIL); - devicePage.closeDeviceDetailsViewBtn().click(); - devicePage.assignToCustomerBtn(tenantDeviceName).click(); - devicePage.assignToCustomer(customerTitle); - loginByUser(userEmail); - sideBarMenuView.goToDevicesPage(); - devicePage.openDeviceAlarms(tenantDeviceName); - alarmPage.assignAlarmTo(tenantAlarm, userEmail); - - clearStorage(); - Assert.assertTrue(alarmPage.accessForbiddenDialogView().isDisplayed()); - } - - @Test - public void assignCustomerAlarmToYourself() { - sideBarMenuView.customerBtn().click(); - customerPage.openCustomerAlarms(customerTitle); - alarmPage.assignAlarmTo(customerAlarm, userEmail); - - Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); - } - - @Test - public void assignAssetAlarmToYourself() { - AssetPageElements assetPageElements = new AssetPageElements(driver); - sideBarMenuView.goToAssetsPage(); - assetPageElements.openAssetAlarms(customerTitle); - alarmPage.assignAlarmTo(assetAlarm, userEmail); - - Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); - } - - @Test - public void assignEntityViewsAlarmToYourself() { - AssetPageElements assetPageElements = new AssetPageElements(driver); - sideBarMenuView.goToEntityViewsPage(); - assetPageElements.openAssetAlarms(entityViewName); - alarmPage.assignAlarmTo(entityViewAlarm, userEmail); - - Assert.assertTrue(alarmPage.assignedUser(userEmail).isDisplayed()); - } - -} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTabAssignTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTabAssignTest.java new file mode 100644 index 0000000000..5f65c94810 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTabAssignTest.java @@ -0,0 +1,229 @@ +/** + * 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.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.testng.annotations.Test; +import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.AssetId; +import org.thingsboard.server.common.data.id.EntityViewId; +import org.thingsboard.server.msa.ui.pages.AssetPageElements; +import org.thingsboard.server.msa.ui.pages.EntityViewPage; +import org.thingsboard.server.msa.ui.utils.Const; +import org.thingsboard.server.msa.ui.utils.EntityPrototypes; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.thingsboard.server.msa.ui.base.AbstractBasePage.random; + +public class AssignDetailsTabAssignTest extends AbstractAssignTest { + + private AlarmId propageteAlarmId; + private AlarmId propageteAssigneAlarmId; + private AlarmId customerAlarmId; + private AlarmId assetAlarmId; + private AlarmId entityViewAlarmId; + private String assetName; + private String entityViewName; + private final String propagateAlarm = "Test propagated alarm 1 " + random(); + private final String propagateAssignedAlarm = "Test propagated alarm 2 " + random(); + private final String customerAlarm = "Test customer alarm" + random(); + private final String assetAlarm = "Test asset alarm" + random(); + private final String entityViewAlarm = "Test entity view alarm" + random(); + private AssetId assetId; + private EntityViewId entityViewId; + + @BeforeClass + public void generateTestEntities() { + customerAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(customerId, customerAlarm)).getId(); + assetId = testRestClient.postAsset(EntityPrototypes.defaultAssetPrototype("", customerId)).getId(); + assetName = testRestClient.getAssetById(assetId).getName(); + assetAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(assetId, assetAlarm)).getId(); + entityViewId = testRestClient.postEntityView(EntityPrototypes.defaultEntityViewPrototype("", "", "DEVICE")).getId(); + entityViewName = testRestClient.getEntityViewById(entityViewId).getName(); + entityViewAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(entityViewId, entityViewAlarm)).getId(); + } + + @BeforeMethod + public void generateTestAlarms() { + propageteAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, propagateAlarm, true)).getId(); + propageteAssigneAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(deviceId, propagateAssignedAlarm, userId, true)).getId(); + } + + @AfterClass + public void deleteTestEntities() { + testRestClient.deleteAlarm(customerAlarmId); + testRestClient.deleteAlarm(assetAlarmId); + testRestClient.deleteAlarm(entityViewAlarmId); + testRestClient.deleteAsset(assetId); + testRestClient.deleteEntityView(entityViewId); + } + + @AfterMethod + public void deleteTestAlarms() { + testRestClient.deleteAlarm(propageteAlarmId); + testRestClient.deleteAlarm(propageteAssigneAlarmId); + } + + @DataProvider + public Object[][] alarms() { + return new Object[][]{ + {alarm}, + {propagateAlarm}}; + } + + @DataProvider + public Object[][] assignedAlarms() { + return new Object[][]{ + {assignedAlarm}, + {propagateAssignedAlarm}}; + } + + @Test(dataProvider = "alarms") + public void assignAlarmToYourself(String alarm) { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(alarm, Const.TENANT_EMAIL); + + assertIsDisplayed(alarmPage.assignedUser(Const.TENANT_EMAIL)); + } + + @Test(dataProvider = "alarms") + public void assignAlarmToAnotherUser(String alarm) { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(alarm, userEmail); + + assertIsDisplayed(alarmPage.assignedUser(userEmail)); + } + + @Test(dataProvider = "assignedAlarms") + public void unassignedAlarm(String assignedAlarm) { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.unassignedAlarm(assignedAlarm); + + assertIsDisplayed(alarmPage.unassigned(assignedAlarm)); + } + + @Test(dataProvider = "assignedAlarms") + public void reassignAlarm(String assignedAlarm) { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(assignedAlarm, Const.TENANT_EMAIL); + + assertIsDisplayed(alarmPage.assignedUser(Const.TENANT_EMAIL)); + } + + @Test + public void searchByEmail() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.searchAlarm(alarm, Const.TENANT_EMAIL); + alarmPage.setUsers(); + + assertThat(alarmPage.getUsers()).hasSize(1).as("Search result contains search input").contains(Const.TENANT_EMAIL); + alarmPage.assignUsers().forEach(this::assertIsDisplayed); + } + + @Test(groups = "broken") + public void searchByName() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.searchAlarm(alarm, userName); + alarmPage.setUsers(); + + assertThat(alarmPage.getUsers()).hasSize(1).as("Search result contains search input").contains(userName); + alarmPage.assignUsers().forEach(this::assertIsDisplayed); + } + + @Test + public void assignAlarmToYourselfFromDetails() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.alarmDetailsBtn(alarm).click(); + alarmDetailsView.assignAlarmTo(Const.TENANT_EMAIL); + alarmDetailsView.closeAlarmDetailsViewBtn().click(); + + assertIsDisplayed(alarmPage.assignedUser(Const.TENANT_EMAIL)); + } + + @Test + public void assignAlarmToAnotherUserFromDetails() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.alarmDetailsBtn(alarm).click(); + alarmDetailsView.assignAlarmTo(userEmail); + alarmDetailsView.closeAlarmDetailsViewBtn().click(); + + assertIsDisplayed(alarmPage.assignedUser(userEmail)); + } + + @Test + public void unassignedAlarmFromDetails() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.alarmDetailsBtn(assignedAlarm).click(); + alarmDetailsView.unassignedAlarm(); + alarmDetailsView.closeAlarmDetailsViewBtn().click(); + + assertIsDisplayed(alarmPage.unassigned(assignedAlarm)); + } + + @Test + public void reassignAlarmFromDetails() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.alarmDetailsBtn(assignedAlarm).click(); + alarmDetailsView.assignAlarmTo(Const.TENANT_EMAIL); + alarmDetailsView.closeAlarmDetailsViewBtn().click(); + + assertIsDisplayed(alarmPage.assignedUser(Const.TENANT_EMAIL)); + } + + @Test + public void assignCustomerAlarmToYourself() { + sideBarMenuView.customerBtn().click(); + customerPage.openCustomerAlarms(customerTitle); + alarmPage.assignAlarmTo(customerAlarm, Const.TENANT_EMAIL); + + assertIsDisplayed(alarmPage.assignedUser(Const.TENANT_EMAIL)); + } + + @Test + public void assignAssetAlarmToYourself() { + AssetPageElements assetPageElements = new AssetPageElements(driver); + sideBarMenuView.goToAssetsPage(); + assetPageElements.openAssetAlarms(assetName); + alarmPage.assignAlarmTo(assetAlarm, Const.TENANT_EMAIL); + + assertIsDisplayed(alarmPage.assignedUser(Const.TENANT_EMAIL)); + } + + @Test + public void assignEntityViewsAlarmToYourself() { + EntityViewPage entityViewPage = new EntityViewPage(driver); + sideBarMenuView.goToEntityViewsPage(); + entityViewPage.openEntityViewAlarms(entityViewName); + alarmPage.assignAlarmTo(entityViewAlarm, Const.TENANT_EMAIL); + + assertIsDisplayed(alarmPage.assignedUser(Const.TENANT_EMAIL)); + } + +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTabFromCustomerAssignTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTabFromCustomerAssignTest.java new file mode 100644 index 0000000000..7696b4cbe8 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assignee/AssignDetailsTabFromCustomerAssignTest.java @@ -0,0 +1,129 @@ +/** + * 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.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +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.msa.ui.pages.LoginPageHelper; +import org.thingsboard.server.msa.ui.utils.Const; +import org.thingsboard.server.msa.ui.utils.EntityPrototypes; + +import static org.thingsboard.server.msa.ui.base.AbstractBasePage.random; + +public class AssignDetailsTabFromCustomerAssignTest extends AbstractAssignTest { + + AlarmId tenantAlarmId; + DeviceId tenantDeviceId; + String tenantDeviceName; + String tenantAlarm = "Test tenant alarm " + random(); + + public void loginByUser(String userEmail) { + sideBarMenuView.customerBtn().click(); + customerPage.manageCustomersUserBtn(customerTitle).click(); + customerPage.getUserLoginBtnByEmail(userEmail).click(); + } + + @BeforeMethod + public void generateTenantEntity() { + if (getJwtTokenFromLocalStorage() == null) { + new LoginPageHelper(driver).authorizationTenant(); + } + tenantDeviceName = testRestClient.postDevice("", EntityPrototypes.defaultDevicePrototype("")).getName(); + tenantDeviceId = testRestClient.getDeviceByName(tenantDeviceName).getId(); + tenantAlarmId = testRestClient.postAlarm(EntityPrototypes.defaultAlarm(tenantDeviceId, tenantAlarm)).getId(); + } + + @AfterMethod + public void clear() { + testRestClient.deleteAlarm(tenantAlarmId); + testRestClient.deleteDevice(tenantDeviceId); + clearStorage(); + } + + @Test + public void assignAlarmToYourselfCustomer() { + loginByUser(userEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(alarm, userEmail); + + assertIsDisplayed(alarmPage.assignedUser(userEmail)); + } + + @Test + public void reassignAlarmByCustomerFromAnotherCustomerUser() { + loginByUser(userWithNameEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.assignAlarmTo(assignedAlarm, userName); + + assertIsDisplayed(alarmPage.assignedUser(userName)); + } + + @Test + public void unassignedAlarmFromCustomer() { + loginByUser(userWithNameEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.unassignedAlarm(assignedAlarm); + + assertIsDisplayed(alarmPage.unassigned(assignedAlarm)); + } + + @Test + public void unassignedAlarmFromAnotherUserFromCustomer() { + loginByUser(userEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(deviceName); + alarmPage.unassignedAlarm(assignedAlarm); + + assertIsDisplayed(alarmPage.unassigned(assignedAlarm)); + } + + @Test + public void checkTheDisplayOfNamesEmailsFromCustomer() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(tenantDeviceName); + alarmPage.assignAlarmTo(tenantAlarm, Const.TENANT_EMAIL); + devicePage.closeDeviceDetailsViewBtn().click(); + devicePage.assignToCustomerBtn(tenantDeviceName).click(); + devicePage.assignToCustomer(customerTitle); + loginByUser(userEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(tenantDeviceName); + + assertIsDisplayed(alarmPage.assignedUser(Const.TENANT_EMAIL)); + } + + @Test + public void reassignTenantForOldAlarm() { + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(tenantDeviceName); + alarmPage.assignAlarmTo(tenantAlarm, Const.TENANT_EMAIL); + devicePage.closeDeviceDetailsViewBtn().click(); + devicePage.assignToCustomerBtn(tenantDeviceName).click(); + devicePage.assignToCustomer(customerTitle); + loginByUser(userEmail); + sideBarMenuView.goToDevicesPage(); + devicePage.openDeviceAlarms(tenantDeviceName); + alarmPage.assignBtn(tenantAlarm).click(); + + assertIsDisplayed(alarmPage.accessForbiddenDialogView()); + } +} diff --git a/msa/black-box-tests/src/test/resources/assignee.xml b/msa/black-box-tests/src/test/resources/assignee.xml new file mode 100644 index 0000000000..52499824cd --- /dev/null +++ b/msa/black-box-tests/src/test/resources/assignee.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 415c95907bf23a3c4f435e7d6bf914b71b1d2fcd Mon Sep 17 00:00:00 2001 From: Chantsova Ekaterina Date: Fri, 14 Apr 2023 18:33:42 +0300 Subject: [PATCH 008/155] UI: widget extension module support in custom actions --- ...ction-pretty-resources-tabs.component.html | 6 ++- .../widget/dialog/custom-dialog.service.ts | 9 ++-- .../components/widget/widget.component.ts | 53 ++++++++++++++++--- ui-ngx/src/app/shared/models/widget.models.ts | 3 +- 4 files changed, 59 insertions(+), 12 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/action/custom-action-pretty-resources-tabs.component.html b/ui-ngx/src/app/modules/home/components/widget/action/custom-action-pretty-resources-tabs.component.html index c3d0141d20..3e4564f505 100644 --- a/ui-ngx/src/app/modules/home/components/widget/action/custom-action-pretty-resources-tabs.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/action/custom-action-pretty-resources-tabs.component.html @@ -27,6 +27,10 @@ (ngModelChange)="notifyActionUpdated()" placeholder="{{ 'widget.resource-url' | translate }}"/> + + {{ 'widget.resource-is-module' | translate }} + - - - + + -
-
+ - -
+