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