From c0acbdcd2112c271f17f7ded94210d49d2130015 Mon Sep 17 00:00:00 2001 From: Mihai BOZ <Mihai.BOZ@ext.ec.europa.eu> Date: Fri, 29 Sep 2023 16:21:30 +0300 Subject: [PATCH] added Matselect wrapper, added EditGroupsPage --- .../java/ddsl/dcomponents/DComponent.java | 9 +- .../SubcategoryTabComponent.java | 17 +- .../main/java/ddsl/dobjects/DMatSelect.java | 171 ++++++++++++++++++ .../CreateGroupDetailsDialog.java | 8 +- .../editDomainsPage/GroupTab.java | 14 +- .../editGroupsPage/EditGroupsPage.java | 9 +- .../editGroupsPage/GroupMembersTab.java | 2 +- .../editGroupsPage/ResourceTab.java | 2 +- .../domiSMPTests/ui/EditDomainsPgTests.java | 42 ++++- .../domiSMPTests/ui/EditGroupsPgTests.java | 50 +++++ 10 files changed, 308 insertions(+), 16 deletions(-) create mode 100644 domiSMP-ui-tests/src/main/java/ddsl/dobjects/DMatSelect.java create mode 100644 domiSMP-ui-tests/src/test/java/domiSMPTests/ui/EditGroupsPgTests.java diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DComponent.java b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DComponent.java index 1d13f1b91..19bcdc625 100644 --- a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DComponent.java +++ b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/DComponent.java @@ -1,9 +1,6 @@ package ddsl.dcomponents; -import ddsl.dobjects.DButton; -import ddsl.dobjects.DInput; -import ddsl.dobjects.DSelect; -import ddsl.dobjects.DWait; +import ddsl.dobjects.*; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import utils.TestRunData; @@ -35,4 +32,8 @@ public class DComponent { return new DSelect(driver, element); } + protected DMatSelect weToMatDSelect(WebElement element) { + return new DMatSelect(driver, element); + } + } diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/commonComponents/subcategoryTab/SubcategoryTabComponent.java b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/commonComponents/subcategoryTab/SubcategoryTabComponent.java index 0080f3187..f11c96a11 100644 --- a/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/commonComponents/subcategoryTab/SubcategoryTabComponent.java +++ b/domiSMP-ui-tests/src/main/java/ddsl/dcomponents/commonComponents/subcategoryTab/SubcategoryTabComponent.java @@ -1,8 +1,8 @@ package ddsl.dcomponents.commonComponents.subcategoryTab; +import ddsl.dcomponents.ConfirmationDialog; import ddsl.dcomponents.DComponent; import ddsl.dcomponents.Grid.SmallGrid; -import org.apache.poi.ss.formula.functions.T; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; @@ -31,16 +31,23 @@ public class SubcategoryTabComponent extends DComponent { return new SmallGrid(driver, rightSidePanel); } - public DComponent create() throws Exception { + public void create() throws Exception { weToDButton(createBtn).click(); - return new DComponent(driver); } - public T edit(String columnName, String value) throws Exception { + protected void edit(String columnName, String value) throws Exception { WebElement tobeEdited = getGrid().searchAndGetElementInColumn(columnName, value); tobeEdited.click(); wait.forElementToBeEnabled(editBtn); weToDButton(editBtn).click(); - return new T(); + } + + protected void delete(String columnName, String value) throws Exception { + WebElement tobeDeleted = getGrid().searchAndGetElementInColumn(columnName, value); + tobeDeleted.click(); + wait.forElementToBeEnabled(deleteBtn); + weToDButton(deleteBtn).click(); + ConfirmationDialog confirmationDialog = new ConfirmationDialog(driver); + confirmationDialog.confirm(); } } diff --git a/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DMatSelect.java b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DMatSelect.java new file mode 100644 index 000000000..394cf1d1e --- /dev/null +++ b/domiSMP-ui-tests/src/main/java/ddsl/dobjects/DMatSelect.java @@ -0,0 +1,171 @@ +package ddsl.dobjects; + +import ddsl.dcomponents.ConfirmationDialog; +import ddsl.dcomponents.DComponent; +import org.apache.commons.lang3.StringUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; +import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class DMatSelect extends DComponent { + /** + * Generic wrapper for select element. + */ + private final static Logger LOG = LoggerFactory.getLogger(ConfirmationDialog.class); + + public WebElement selectContainer; + protected List<String> optionIDs = new ArrayList<String>(); + + @FindBy(css = "[class*=\"select-arrow\"]") + protected WebElement expandBtn; + + private By options = By.cssSelector("div > mat-option"); + private By selectedOption = By.cssSelector("[class*=\"-select-value\"]"); + + public DMatSelect(WebDriver driver, WebElement container) { + super(driver); + wait.forXMillis(100); + PageFactory.initElements(new AjaxElementLocatorFactory(container, data.getWaitTimeShort()), this); + + this.selectContainer = container; +// try { +// if (isDisplayed() && isEnabled()) { +// weToDButton(expandBtn).click(); +// extractOptionIDs(); +// contract(); +// } +// } catch (Exception e) { +// } + } + + public boolean isDisplayed() throws Exception { + try { + return weToDButton(expandBtn).isEnabled(); + } catch (Exception e) { + return false; + } + } + + public boolean isEnabled() { +// aria-disabled="true" + boolean isEnabled = true; + try { + isEnabled = !Boolean.valueOf((selectContainer).getAttribute("aria-disabled")); + } catch (Exception e) { + } + + return isEnabled; + } + + private void extractOptionIDs() throws Exception { + wait.forAttributeToContain(selectContainer, "aria-owns", "mat-option"); + String[] ids = selectContainer.getAttribute("aria-owns").split(" "); + optionIDs.addAll(Arrays.asList(ids)); + + // log.debug(optionIDs.size() + " option ids identified : " + optionIDs); + } + +// private void expand() throws Exception { +// try { +// weToDButton(expandBtn).click(); +// wait.forAttributeNotEmpty(selectContainer, "aria-owns"); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + + private void contract() throws Exception { + try { + wait.forXMillis(200); + selectContainer.sendKeys(Keys.ESCAPE); + wait.forXMillis(200); + + } catch (Exception e) { + } + } + +// ----------------------------------------------------------------- + + protected List<DObject> getOptionElements() throws Exception { + weToDButton(expandBtn).click(); + + List<DObject> optionObj = new ArrayList<>(); + + for (int i = 0; i < optionIDs.size(); i++) { + String optionId = optionIDs.get(i); + WebElement option = driver.findElement(By.id(optionId)); + optionObj.add(new DObject(driver, option)); + } + return optionObj; + } + + public boolean selectOptionByText(String text) throws Exception { + LOG.debug("selecting option by text: " + text); + + if (StringUtils.isEmpty(text)) { + return false; + } + + List<DObject> optionObj = getOptionElements(); + if (optionObj.size() == 0) { + LOG.warn("select has no options "); + } + + for (DObject dObject : optionObj) { + if (StringUtils.equalsIgnoreCase(dObject.getText(), text)) { + dObject.click(); + return true; + } + } + + return false; + } + + public boolean deselectOptionByText(String text) throws Exception { + LOG.debug("selecting option by text: " + text); + + if (StringUtils.isEmpty(text)) { + return false; + } + + List<DObject> optionObj = getOptionElements(); + if (optionObj.size() == 0) { + LOG.warn("select has no options "); + } + + for (DObject dObject : optionObj) { + if (StringUtils.equalsIgnoreCase(dObject.getText(), text)) { + dObject.click(); + if (dObject.getAttribute("aria-selected").equals(true)) { + return true; + } + } + } + + return false; + } + + + public List<String> getOptionsTexts() throws Exception { + List<String> texts = new ArrayList<>(); + List<DObject> options = getOptionElements(); + + for (int i = 0; i < options.size(); i++) { + texts.add(options.get(i).getText()); + } + contract(); + return texts; + } + +} diff --git a/domiSMP-ui-tests/src/main/java/pages/administration/editDomainsPage/CreateGroupDetailsDialog.java b/domiSMP-ui-tests/src/main/java/pages/administration/editDomainsPage/CreateGroupDetailsDialog.java index dbd956cf4..022bef5e0 100644 --- a/domiSMP-ui-tests/src/main/java/pages/administration/editDomainsPage/CreateGroupDetailsDialog.java +++ b/domiSMP-ui-tests/src/main/java/pages/administration/editDomainsPage/CreateGroupDetailsDialog.java @@ -1,5 +1,6 @@ package pages.administration.editDomainsPage; +import ddsl.dcomponents.AlertComponent; import ddsl.dcomponents.DComponent; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -19,10 +20,15 @@ public class CreateGroupDetailsDialog extends DComponent { private WebElement saveBtn; public CreateGroupDetailsDialog(WebDriver driver) { super(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getTIMEOUT()), this); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getWaitTimeShort()), this); } + public AlertComponent getAlertArea() { + return new AlertComponent(driver); + } + + public void fillGroupDetails(GroupModel group) { groupNameLbl.sendKeys(group.getGroupName()); groupDescriptionLbl.sendKeys(group.getGroupDescription()); diff --git a/domiSMP-ui-tests/src/main/java/pages/administration/editDomainsPage/GroupTab.java b/domiSMP-ui-tests/src/main/java/pages/administration/editDomainsPage/GroupTab.java index f5a48a8d0..a4cc878a0 100644 --- a/domiSMP-ui-tests/src/main/java/pages/administration/editDomainsPage/GroupTab.java +++ b/domiSMP-ui-tests/src/main/java/pages/administration/editDomainsPage/GroupTab.java @@ -8,12 +8,22 @@ import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory; public class GroupTab extends SubcategoryTabComponent { public GroupTab(WebDriver driver) { super(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getTIMEOUT()), this); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getWaitTimeShort()), this); } - public CreateGroupDetailsDialog clickOnCreateNewGroup() throws Exception { + public CreateGroupDetailsDialog clickCreateNewGroup() throws Exception { create(); return new CreateGroupDetailsDialog(driver); } + + public CreateGroupDetailsDialog clickEditGroup(String domainCode) throws Exception { + edit("Group name", domainCode); + return new CreateGroupDetailsDialog(driver); + } + + public void deleteGroup(String domainCode) throws Exception { + delete("Group name", domainCode); + } + } diff --git a/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/EditGroupsPage.java b/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/EditGroupsPage.java index 065874f84..6ec5b06f4 100644 --- a/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/EditGroupsPage.java +++ b/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/EditGroupsPage.java @@ -4,8 +4,11 @@ import ddsl.CommonPageWithTabs; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.ui.Select; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import rest.models.DomainModel; +import rest.models.GroupModel; public class EditGroupsPage extends CommonPageWithTabs { /** @@ -16,13 +19,17 @@ public class EditGroupsPage extends CommonPageWithTabs { @FindBy(id = "domain_id") private WebElement domainDdl; @FindBy(id = "group_id") - private WebElement groupDdl; + private Select groupDdl; public EditGroupsPage(WebDriver driver) { super(driver); LOG.debug("Loading Edit groups page."); } + public void selectGroup(DomainModel domainModel, GroupModel groupModel) throws Exception { + weToMatDSelect(domainDdl).selectOptionByText(domainModel.getDomainCode()); + } + public GroupMembersTab getDomainMembersTab() { return new GroupMembersTab(driver); } diff --git a/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/GroupMembersTab.java b/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/GroupMembersTab.java index 90a8177dc..a9a91de39 100644 --- a/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/GroupMembersTab.java +++ b/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/GroupMembersTab.java @@ -9,7 +9,7 @@ public class GroupMembersTab extends MembersComponent { public GroupMembersTab(WebDriver driver) { super(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getTIMEOUT()), this); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getWaitTimeShort()), this); } } diff --git a/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/ResourceTab.java b/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/ResourceTab.java index f3d1fe86a..c359fa0e3 100644 --- a/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/ResourceTab.java +++ b/domiSMP-ui-tests/src/main/java/pages/administration/editGroupsPage/ResourceTab.java @@ -9,7 +9,7 @@ import pages.administration.editDomainsPage.CreateGroupDetailsDialog; public class ResourceTab extends SubcategoryTabComponent { public ResourceTab(WebDriver driver) { super(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getTIMEOUT()), this); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getWaitTimeShort()), this); } diff --git a/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/EditDomainsPgTests.java b/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/EditDomainsPgTests.java index 4f001274d..8fd3698cd 100644 --- a/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/EditDomainsPgTests.java +++ b/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/EditDomainsPgTests.java @@ -6,6 +6,7 @@ import domiSMPTests.SeleniumTest; import org.json.JSONObject; import org.openqa.selenium.WebElement; import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Ignore; import org.testng.annotations.Test; import org.testng.asserts.SoftAssert; import pages.LoginPage; @@ -104,6 +105,7 @@ public class EditDomainsPgTests extends SeleniumTest { } + @Ignore @Test(description = "EDTDOM-02 Domain admins are able to create new groups") public void DomainAdminsAreAbleToCreate() throws Exception { GroupModel groupToBeCreated = GroupModel.generatePublicDomain(); @@ -111,7 +113,7 @@ public class EditDomainsPgTests extends SeleniumTest { editDomainPage.goToTab("Group"); - CreateGroupDetailsDialog createGroupDetailsDialog = editDomainPage.getGroupTab().clickOnCreateNewGroup(); + CreateGroupDetailsDialog createGroupDetailsDialog = editDomainPage.getGroupTab().clickCreateNewGroup(); createGroupDetailsDialog.fillGroupDetails(groupToBeCreated); Boolean isSaveSuccesfully = createGroupDetailsDialog.tryClickOnSave(); soft.assertTrue(isSaveSuccesfully); @@ -123,4 +125,42 @@ public class EditDomainsPgTests extends SeleniumTest { soft.assertAll(); } + + @Test(description = "EDTDOM-03 Domain admins are not able to create duplicated groups") + public void DomainAdminsAreNotAbleToCreateDuplicatedGroups() throws Exception { + GroupModel duplicatedGroup = GroupModel.generatePublicDomain(); + + editDomainPage.getLeftSideGrid().searchAndGetElementInColumn("Domain code", domainModel.getDomainCode()).click(); + editDomainPage.goToTab("Group"); + CreateGroupDetailsDialog createGroupDetailsDialog = editDomainPage.getGroupTab().clickCreateNewGroup(); + createGroupDetailsDialog.fillGroupDetails(duplicatedGroup); + Boolean isSaveSuccesfully = createGroupDetailsDialog.tryClickOnSave(); + soft.assertTrue(isSaveSuccesfully); + + + createGroupDetailsDialog = editDomainPage.getGroupTab().clickCreateNewGroup(); + createGroupDetailsDialog.fillGroupDetails(duplicatedGroup); + isSaveSuccesfully = createGroupDetailsDialog.tryClickOnSave(); + String duplicateAlertMessage = createGroupDetailsDialog.getAlertArea().getAlertMessage(); + soft.assertTrue(isSaveSuccesfully); + soft.assertEquals(duplicateAlertMessage, String.format("Invalid request [CreateGroup]. Error: Group with name [%s] already exists!!", duplicatedGroup.getGroupName())); + soft.assertAll(); + } + + @Test(description = "EDTDOM-04 Domain admins are able to delete groups without resources") + public void DomainAdminsAreNotAbleToDeleteGroups() throws Exception { + GroupModel groupToBeDeleted = GroupModel.generatePublicDomain(); + + editDomainPage.getLeftSideGrid().searchAndGetElementInColumn("Domain code", domainModel.getDomainCode()).click(); + editDomainPage.goToTab("Group"); + CreateGroupDetailsDialog createGroupDetailsDialog = editDomainPage.getGroupTab().clickCreateNewGroup(); + createGroupDetailsDialog.fillGroupDetails(groupToBeDeleted); + Boolean isSaveSuccesfully = createGroupDetailsDialog.tryClickOnSave(); + soft.assertTrue(isSaveSuccesfully); + + editDomainPage.getGroupTab().deleteGroup(groupToBeDeleted.getGroupName()); + String deleteMessage = editDomainPage.getAlertArea().getAlertMessage(); + soft.assertEquals(deleteMessage, String.format("Domain group [%s] deleted", groupToBeDeleted.getGroupName())); + soft.assertAll(); + } } diff --git a/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/EditGroupsPgTests.java b/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/EditGroupsPgTests.java new file mode 100644 index 000000000..94b01e1f8 --- /dev/null +++ b/domiSMP-ui-tests/src/test/java/domiSMPTests/ui/EditGroupsPgTests.java @@ -0,0 +1,50 @@ +package domiSMPTests.ui; + +import ddsl.DomiSMPPage; +import ddsl.enums.Pages; +import domiSMPTests.SeleniumTest; +import org.json.JSONObject; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; +import pages.LoginPage; +import pages.administration.editDomainsPage.EditDomainsPage; +import rest.models.DomainModel; +import rest.models.MemberModel; +import rest.models.UserModel; + +public class EditGroupsPgTests extends SeleniumTest { + DomiSMPPage homePage; + LoginPage loginPage; + EditDomainsPage editDomainPage; + String domainId; + DomainModel domainModel; + UserModel adminUser; + SoftAssert soft; + + @BeforeMethod(alwaysRun = true) + public void beforeTest() throws Exception { + soft = new SoftAssert(); + domainModel = DomainModel.generatePublicDomainModelWithSML(); + adminUser = UserModel.generateUserWithADMINrole(); + + MemberModel domainMember = new MemberModel(); + domainMember.setUsername(adminUser.getUsername()); + domainMember.setRoleType("ADMIN"); + + rest.users().createUser(adminUser); + JSONObject domainJson = rest.domains().createDomain(domainModel); + domainId = domainJson.get("domainId").toString(); + rest.domains().addMembersToDomain(domainId, domainMember); + + homePage = new DomiSMPPage(driver); + loginPage = homePage.goToLoginPage(); + loginPage.login(adminUser.getUsername(), data.getNewPassword()); + editDomainPage = homePage.getSidebar().navigateTo(Pages.ADMINISTRATION_EDIT_DOMAINS); + } + + @Test(description = "EDTDOM-01 Domain admins are able to invite/edit/remove members") + public void DomainAdminsAreAbleToInviteEditRemoveMembers() throws Exception { + + } +} -- GitLab