fix ui tests, add alarm assignee tests to suite
This commit is contained in:
		
							parent
							
								
									ceda0f14e6
								
							
						
					
					
						commit
						7116491824
					
				@ -18,6 +18,7 @@ package org.thingsboard.server.msa.ui.base;
 | 
			
		||||
import lombok.SneakyThrows;
 | 
			
		||||
import org.openqa.selenium.By;
 | 
			
		||||
import org.openqa.selenium.JavascriptExecutor;
 | 
			
		||||
import org.openqa.selenium.Keys;
 | 
			
		||||
import org.openqa.selenium.WebDriver;
 | 
			
		||||
import org.openqa.selenium.WebDriverException;
 | 
			
		||||
import org.openqa.selenium.WebElement;
 | 
			
		||||
@ -42,7 +43,6 @@ abstract public class AbstractBasePage {
 | 
			
		||||
    protected Actions actions;
 | 
			
		||||
    protected JavascriptExecutor js;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public AbstractBasePage(WebDriver driver) {
 | 
			
		||||
        this.driver = driver;
 | 
			
		||||
        this.wait = new WebDriverWait(driver, Duration.ofMillis(WAIT_TIMEOUT));
 | 
			
		||||
@ -154,7 +154,11 @@ abstract public class AbstractBasePage {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void waitUntilAttributeContains(WebElement element, String attribute, String value) {
 | 
			
		||||
        wait.until(ExpectedConditions.attributeContains(element, attribute, value));
 | 
			
		||||
        try {
 | 
			
		||||
            wait.until(ExpectedConditions.attributeContains(element, attribute, value));
 | 
			
		||||
        } catch (WebDriverException e) {
 | 
			
		||||
            fail("Failed to wait until attribute '" + attribute + "' of element '" + element + "' contains value '" + value + "'");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void goToNextTab(int tabNumber) {
 | 
			
		||||
@ -189,4 +193,25 @@ abstract public class AbstractBasePage {
 | 
			
		||||
    public void pull(WebElement element, int xOffset, int yOffset) {
 | 
			
		||||
        actions.clickAndHold(element).moveByOffset(xOffset, yOffset).release().perform();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void waitUntilAttributeToBe(String locator, String attribute, String value) {
 | 
			
		||||
        try {
 | 
			
		||||
            wait.until(ExpectedConditions.attributeToBe(By.xpath(locator), attribute, value));
 | 
			
		||||
        } catch (WebDriverException e) {
 | 
			
		||||
            fail("Failed to wait until attribute '" + attribute + "' of element located by '" + locator + "' is '" + value + "'");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void clearInputField(WebElement element) {
 | 
			
		||||
        element.click();
 | 
			
		||||
        element.sendKeys(Keys.CONTROL + "A" + Keys.BACK_SPACE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void waitUntilAttributeToBeNotEmpty(WebElement element, String attribute) {
 | 
			
		||||
        try {
 | 
			
		||||
            wait.until(ExpectedConditions.attributeToBeNotEmpty(element, attribute));
 | 
			
		||||
        } catch (WebDriverException e) {
 | 
			
		||||
            fail("Failed to wait until attribute '" + attribute + "' of element '" + element + "' is not empty");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,6 @@ import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.net.MalformedURLException;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.time.Duration;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
@ -231,13 +230,9 @@ abstract public class AbstractDriverBaseTest extends AbstractContainerTest {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WebStorage getWebStorage() {
 | 
			
		||||
        return webStorage = (WebStorage) driver;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void clearStorage() {
 | 
			
		||||
        getWebStorage().getLocalStorage().clear();
 | 
			
		||||
        getWebStorage().getSessionStorage().clear();
 | 
			
		||||
        getJs().executeScript("window.localStorage.clear();");
 | 
			
		||||
        getJs().executeScript("window.sessionStorage.clear();");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void deleteAlarmById(AlarmId alarmId) {
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ public class AlarmDetailsEntityTabElements extends OtherPageElements {
 | 
			
		||||
    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";
 | 
			
		||||
    private static final String ALARM_ASSIGNEE_DROPDOWN = "//tb-alarm-assignee-panel";
 | 
			
		||||
    private static final String NO_USERS_FOUND_MESSAGE = "//div[@class='tb-not-found-content']/span";
 | 
			
		||||
 | 
			
		||||
    public WebElement assignBtn(String type) {
 | 
			
		||||
        return waitUntilElementToBeClickable(String.format(ASSIGN_BTN, type));
 | 
			
		||||
@ -75,4 +76,8 @@ public class AlarmDetailsEntityTabElements extends OtherPageElements {
 | 
			
		||||
    public WebElement alarmAssigneeDropdown() {
 | 
			
		||||
        return waitUntilVisibilityOfElementLocated(ALARM_ASSIGNEE_DROPDOWN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WebElement noUsersFoundMessage() {
 | 
			
		||||
        return waitUntilVisibilityOfElementLocated(NO_USERS_FOUND_MESSAGE);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -146,6 +146,14 @@ public class CustomerPageHelper extends CustomerPageElements {
 | 
			
		||||
        submitAssignedBtn().click();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void assignedDashboard(String dashboardName) {
 | 
			
		||||
        plusBtn().click();
 | 
			
		||||
        assignedField().click();
 | 
			
		||||
        entityFromList(dashboardName).click();
 | 
			
		||||
        assignedField().sendKeys(Keys.ESCAPE);
 | 
			
		||||
        submitAssignedBtn().click();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean customerIsNotPresent(String title) {
 | 
			
		||||
        return elementsIsNotPresent(getEntity(title));
 | 
			
		||||
    }
 | 
			
		||||
@ -169,4 +177,13 @@ public class CustomerPageHelper extends CustomerPageElements {
 | 
			
		||||
        }
 | 
			
		||||
        customerDetailsAlarmsBtn().click();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void disableHideHomeDashboardToolbar() {
 | 
			
		||||
        hideHomeDashboardToolbarCheckbox().click();
 | 
			
		||||
        waitUntilAttributeToBe("//mat-checkbox[@formcontrolname='homeDashboardHideToolbar']//input", "class", "mdc-checkbox__native-control");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void waitUntilDashboardFieldToBeNotEmpty() {
 | 
			
		||||
        waitUntilAttributeToBeNotEmpty(editMenuDashboardField(), "value");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -30,13 +30,12 @@ public class DashboardPageElements extends OtherPageElementsHelper {
 | 
			
		||||
    private static final String MANAGE_ASSIGNED_ENTITY_LIST_FIELD = "//input[@formcontrolname='entity']";
 | 
			
		||||
    private static final String MANAGE_ASSIGNED_ENTITY = "//mat-option//span[contains(text(),'%s')]";
 | 
			
		||||
    private static final String MANAGE_ASSIGNED_UPDATE_BTN = "//button[@type='submit']";
 | 
			
		||||
    private static final String EDIT_BTN = "//mat-icon[text() = 'edit']/parent::button";
 | 
			
		||||
    private static final String ADD_BTN = "//tb-footer-fab-buttons//button";
 | 
			
		||||
    private static final String CREAT_NEW_DASHBOARD_BTN = "//mat-icon[text() = 'insert_drive_file']/parent::button";
 | 
			
		||||
    private static final String EDIT_BTN = "//mat-icon[text() = 'edit']/parent::button[@mat-stroked-button]";
 | 
			
		||||
    private static final String ADD_BTN = "//mat-fab-actions//mat-icon[text() = 'add']/parent::button";
 | 
			
		||||
    private static final String ALARM_WIDGET_BUNDLE = "//mat-card-title[text() = 'Alarm widgets']/ancestor::mat-card";
 | 
			
		||||
    private static final String ALARM_TABLE_WIDGET = "//img[@alt='Alarms table']/ancestor::mat-card";
 | 
			
		||||
    private static final String WIDGET_SE_CORNER = "//div[contains(@class,'handle-se')]";
 | 
			
		||||
    private static final String DONE_BTN = "//tb-footer-fab-buttons/following-sibling::button//mat-icon[text() = 'done']/parent::button";
 | 
			
		||||
    private static final String SAVE_BTN = "//mat-icon[text() = 'done']/parent::button[@fxhide.lt-lg]";
 | 
			
		||||
 | 
			
		||||
    public List<WebElement> entityTitles() {
 | 
			
		||||
        return waitUntilVisibilityOfElementsLocated(TITLES);
 | 
			
		||||
@ -66,10 +65,6 @@ public class DashboardPageElements extends OtherPageElementsHelper {
 | 
			
		||||
        return waitUntilElementToBeClickable(ADD_BTN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WebElement createNewDashboardBtn() {
 | 
			
		||||
        return waitUntilElementToBeClickable(CREAT_NEW_DASHBOARD_BTN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WebElement alarmWidgetBundle() {
 | 
			
		||||
        return waitUntilElementToBeClickable(ALARM_WIDGET_BUNDLE);
 | 
			
		||||
    }
 | 
			
		||||
@ -82,7 +77,7 @@ public class DashboardPageElements extends OtherPageElementsHelper {
 | 
			
		||||
        return waitUntilElementToBeClickable(WIDGET_SE_CORNER);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WebElement doneBtn() {
 | 
			
		||||
        return waitUntilVisibilityOfElementLocated(DONE_BTN);
 | 
			
		||||
    public WebElement saveBtn() {
 | 
			
		||||
        return waitUntilVisibilityOfElementLocated(SAVE_BTN);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,6 @@ public class DashboardPageHelper extends DashboardPageElements {
 | 
			
		||||
 | 
			
		||||
    public void openSelectWidgetsBundleMenu() {
 | 
			
		||||
        addBtn().click();
 | 
			
		||||
        createNewDashboardBtn().click();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void openCreateWidgetPopup() {
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.assignee;
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.alarmassignee;
 | 
			
		||||
 | 
			
		||||
import io.qameta.allure.Epic;
 | 
			
		||||
import org.testng.annotations.AfterClass;
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.assignee;
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.alarmassignee;
 | 
			
		||||
 | 
			
		||||
import io.qameta.allure.Description;
 | 
			
		||||
import io.qameta.allure.Feature;
 | 
			
		||||
@ -161,15 +161,13 @@ public class AssignDetailsTabAssignTest extends AbstractAssignTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Description("Search by name")
 | 
			
		||||
    @Test(groups = "broken")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void searchByName() {
 | 
			
		||||
        sideBarMenuView.goToDevicesPage();
 | 
			
		||||
        devicePage.openDeviceAlarms(deviceName);
 | 
			
		||||
        alarmPage.searchAlarm(alarmType, userName);
 | 
			
		||||
        alarmPage.setUsers();
 | 
			
		||||
 | 
			
		||||
        assertThat(alarmPage.getUsers()).hasSize(1).as("Search result contains search input").contains(userName);
 | 
			
		||||
        alarmPage.assignUsers().forEach(this::assertIsDisplayed);
 | 
			
		||||
        assertIsDisplayed(alarmPage.noUsersFoundMessage());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Description("Assign alarm to yourself from details of alarm")
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.assignee;
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.alarmassignee;
 | 
			
		||||
 | 
			
		||||
import io.qameta.allure.Description;
 | 
			
		||||
import io.qameta.allure.Feature;
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.assignee;
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.alarmassignee;
 | 
			
		||||
 | 
			
		||||
import io.qameta.allure.Description;
 | 
			
		||||
import io.qameta.allure.Feature;
 | 
			
		||||
@ -56,7 +56,7 @@ public class AssignFromAlarmWidgetTest extends AbstractAssignTest {
 | 
			
		||||
        createWidgetPopup.addAliasBtn().click();
 | 
			
		||||
        createWidgetPopup.addWidgetBtn().click();
 | 
			
		||||
        dashboardPage.increaseSizeOfTheWidget();
 | 
			
		||||
        dashboardPage.doneBtn().click();
 | 
			
		||||
        dashboardPage.saveBtn().click();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterClass
 | 
			
		||||
@ -135,12 +135,10 @@ public class AssignFromAlarmWidgetTest extends AbstractAssignTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Description("Search by name")
 | 
			
		||||
    @Test(groups = "broken")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void searchByName() {
 | 
			
		||||
        alarmWidget.searchAlarm(alarmType, userName);
 | 
			
		||||
        alarmWidget.setUsers();
 | 
			
		||||
 | 
			
		||||
        assertThat(alarmWidget.getUsers()).hasSize(1).as("Search result contains search input").contains(userName);
 | 
			
		||||
        alarmWidget.assignUsers().forEach(this::assertIsDisplayed);
 | 
			
		||||
        assertIsDisplayed(alarmWidget.noUsersFoundMessage());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -207,9 +207,9 @@ public class CreateCustomerTest extends AbstractDriverBaseTest {
 | 
			
		||||
 | 
			
		||||
        sideBarMenuView.customerBtn().click();
 | 
			
		||||
        customerPage.plusBtn().click();
 | 
			
		||||
        customerPage.titleFieldAddEntityView().sendKeys(customerName);
 | 
			
		||||
        customerPage.phoneNumberAddEntityView().sendKeys(number);
 | 
			
		||||
        customerPage.phoneNumberAddEntityView().sendKeys(Keys.CONTROL + "A" + Keys.BACK_SPACE);
 | 
			
		||||
        customerPage.addCustomerViewEnterName(customerName);
 | 
			
		||||
        customerPage.enterText(customerPage.phoneNumberAddEntityView(), number);
 | 
			
		||||
        customerPage.clearInputField(customerPage.phoneNumberAddEntityView());
 | 
			
		||||
        customerPage.addBtnC().click();
 | 
			
		||||
        this.customerName = customerName;
 | 
			
		||||
        customerPage.entity(customerName).click();
 | 
			
		||||
 | 
			
		||||
@ -204,31 +204,32 @@ public class CustomerEditMenuTest extends AbstractDriverBaseTest {
 | 
			
		||||
 | 
			
		||||
    @Epic("Customers smoke tests")
 | 
			
		||||
    @Feature("Edit customer")
 | 
			
		||||
    @Test(priority = 20, groups = "smoke")
 | 
			
		||||
    @Test(priority = 20, groups = { "smoke", "broken" })
 | 
			
		||||
    @Description("Assigned dashboard without hide")
 | 
			
		||||
    public void assignedDashboardWithoutHide() {
 | 
			
		||||
        String customerName = ENTITY_NAME + random();
 | 
			
		||||
        String dashboardName = "Firmware";
 | 
			
		||||
        testRestClient.postCustomer(defaultCustomerPrototype(customerName));
 | 
			
		||||
        this.customerName = customerName;
 | 
			
		||||
 | 
			
		||||
        sideBarMenuView.customerBtn().click();
 | 
			
		||||
        customerPage.manageCustomersDashboardsBtn(customerName).click();
 | 
			
		||||
        customerPage.assignedDashboard();
 | 
			
		||||
        customerPage.assignedDashboard(dashboardName);
 | 
			
		||||
        sideBarMenuView.customerBtn().click();
 | 
			
		||||
        customerPage.entity(customerName).click();
 | 
			
		||||
        jsClick(customerPage.editPencilBtn());
 | 
			
		||||
        customerPage.chooseDashboard(customerPage.getDashboard());
 | 
			
		||||
        customerPage.hideHomeDashboardToolbarCheckbox().click();
 | 
			
		||||
        customerPage.chooseDashboard(dashboardName);
 | 
			
		||||
        customerPage.disableHideHomeDashboardToolbar();
 | 
			
		||||
        customerPage.doneBtnEditView().click();
 | 
			
		||||
        customerPage.waitUntilDashboardFieldToBeNotEmpty();
 | 
			
		||||
        customerPage.setDashboardFromView();
 | 
			
		||||
        customerPage.closeEntityViewBtn().click();
 | 
			
		||||
        jsClick(customerPage.manageCustomersUserBtn(customerName));
 | 
			
		||||
        customerPage.createCustomersUser();
 | 
			
		||||
        jsClick(customerPage.userLoginBtn());
 | 
			
		||||
 | 
			
		||||
        Assert.assertNotNull(customerPage.usersWidget());
 | 
			
		||||
        Assert.assertTrue(customerPage.usersWidget().isDisplayed());
 | 
			
		||||
        Assert.assertEquals(customerPage.getDashboard(), customerPage.getDashboardFromView());
 | 
			
		||||
        Assert.assertEquals(dashboardName, customerPage.getDashboardFromView());
 | 
			
		||||
        Assert.assertNotNull(customerPage.stateController());
 | 
			
		||||
        Assert.assertNotNull(customerPage.filterBtn());
 | 
			
		||||
        Assert.assertNotNull(customerPage.timeBtn());
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
package org.thingsboard.server.msa.ui.tests.devicessmoke;
 | 
			
		||||
 | 
			
		||||
import io.qameta.allure.Description;
 | 
			
		||||
import io.qameta.allure.Epic;
 | 
			
		||||
import io.qameta.allure.Feature;
 | 
			
		||||
import org.testng.annotations.AfterClass;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
@ -33,7 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.thingsboard.server.msa.ui.base.AbstractBasePage.random;
 | 
			
		||||
import static org.thingsboard.server.msa.ui.utils.Const.ENTITY_NAME;
 | 
			
		||||
 | 
			
		||||
@Epic("Filter devices (By device profile and state)")
 | 
			
		||||
@Feature("Filter devices (By device profile and state)")
 | 
			
		||||
public class DeviceFilterTest extends AbstractDeviceTest {
 | 
			
		||||
 | 
			
		||||
    private String activeDeviceName;
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,7 @@
 | 
			
		||||
-->
 | 
			
		||||
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 | 
			
		||||
 | 
			
		||||
<suite name="Assignee ui tests">
 | 
			
		||||
<suite name="Assignee alarm ui tests">
 | 
			
		||||
    <listeners>
 | 
			
		||||
        <listener class-name="org.thingsboard.server.msa.ui.listeners.RetryTestListener"/>
 | 
			
		||||
    </listeners>
 | 
			
		||||
@ -29,7 +29,7 @@
 | 
			
		||||
            </run>
 | 
			
		||||
        </groups>
 | 
			
		||||
        <packages>
 | 
			
		||||
            <package name="org.thingsboard.server.msa.ui.tests.assignee.*"/>
 | 
			
		||||
            <package name="org.thingsboard.server.msa.ui.tests.alarmassignee.*"/>
 | 
			
		||||
        </packages>
 | 
			
		||||
    </test>
 | 
			
		||||
</suite>
 | 
			
		||||
@ -77,4 +77,14 @@
 | 
			
		||||
            <package name="org.thingsboard.server.msa.ui.tests.devicessmoke"/>
 | 
			
		||||
        </packages>
 | 
			
		||||
    </test>
 | 
			
		||||
    <test name="Alarm assignee tests">
 | 
			
		||||
        <groups>
 | 
			
		||||
            <run>
 | 
			
		||||
                <exclude name="broken"/>
 | 
			
		||||
            </run>
 | 
			
		||||
        </groups>
 | 
			
		||||
        <packages>
 | 
			
		||||
            <package name="org.thingsboard.server.msa.ui.tests.alarmassignee.*"/>
 | 
			
		||||
        </packages>
 | 
			
		||||
    </test>
 | 
			
		||||
</suite>
 | 
			
		||||
@ -72,4 +72,14 @@
 | 
			
		||||
            <package name="org.thingsboard.server.msa.ui.tests.devicessmoke"/>
 | 
			
		||||
        </packages>
 | 
			
		||||
    </test>
 | 
			
		||||
    <test name="Alarm assignee tests">
 | 
			
		||||
        <groups>
 | 
			
		||||
            <run>
 | 
			
		||||
                <exclude name="broken"/>
 | 
			
		||||
            </run>
 | 
			
		||||
        </groups>
 | 
			
		||||
        <packages>
 | 
			
		||||
            <package name="org.thingsboard.server.msa.ui.tests.alarmassignee.*"/>
 | 
			
		||||
        </packages>
 | 
			
		||||
    </test>
 | 
			
		||||
</suite>
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user