Add IT Tests Adding Metadata to property input 75/121375/7
authordavsad <david.sadlier@est.tech>
Wed, 28 Apr 2021 08:46:46 +0000 (09:46 +0100)
committerDavid Sadlier <david.sadlier@est.tech>
Thu, 27 May 2021 23:23:02 +0000 (23:23 +0000)
Issue-ID: SDC-3586
Signed-off-by: davsad <david.sadlier@est.tech>
Change-Id: I554ff2e226520b1af7af865f394c8af5aaf15469

integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/ServiceTemplateDesignUiTests.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentInputTab.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentPage.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentTab.java [new file with mode: 0644]
integration-tests/src/test/resources/ci/testSuites/frontend/onapUiSanity.xml

index 79a634e..2fcd29f 100644 (file)
@@ -167,6 +167,28 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
         downloadAndVerifyCsarPackage(componentPage);
     }
 
+    @Test(dependsOnMethods = "addRelationshipTemplate")
+    public void createMetadataForServiceProperty() throws Exception {
+        homePage.isLoaded();
+        componentPage = (ComponentPage) homePage.clickOnComponent(vfResourceCreateData.getName());
+        componentPage.isLoaded();
+        final ResourcePropertiesAssignmentPage propertiesAssignmentPage = componentPage.goToPropertiesAssignment();
+
+        propertiesAssignmentPage.isLoaded();
+        propertiesAssignmentPage.selectInputTab();
+        final var propertyName = propertiesAssignmentPage.getInputPropertyNames().get(0);
+        final var key = "Key";
+        final var value = "Test";
+        propertiesAssignmentPage.setInputPropertyMetadata(propertyName, key, value);
+
+        final var topologyTemplate = getMapEntry(downloadToscaTemplate(), "topology_template");
+        final var inputs = getMapEntry(topologyTemplate, "inputs");
+        final var serviceProperty = getMapEntry(inputs, propertyName);
+        final var servicePropertyMetadata = getMapEntry(serviceProperty, "metadata");
+        assertNotNull(servicePropertyMetadata, String.format("Metadata not found for property %s", propertyName));
+        assertEquals(servicePropertyMetadata.get(key), value, "Created service property metadata has invalid value");
+    }
+
     @Test(dependsOnMethods = "addRelationshipTemplate")
     public void addOutputsToVF_test() throws UnzipException, IOException {
         homePage.isLoaded();
@@ -718,7 +740,7 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
         return expectedDefinitionFolderFileList;
     }
 
-    private Map<String, Object> getMapEntry(final Map<String, Object> yamlObj, final String entryName) {
+    private Map<String, Object> getMapEntry(final Map<?, ?> yamlObj, final String entryName) {
         try {
             return (Map<String, Object>) yamlObj.get(entryName);
         } catch (final Exception e) {
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentInputTab.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentInputTab.java
new file mode 100644 (file)
index 0000000..dedb084
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.frontend.ci.tests.pages;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.onap.sdc.frontend.ci.tests.execute.setup.ExtentTestActions;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import com.aventstack.extentreports.Status;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * Handles the Resource Properties Assignment Input Tab UI actions
+ */
+public class ResourcePropertiesAssignmentInputTab extends AbstractPageObject {
+
+    public ResourcePropertiesAssignmentInputTab(final WebDriver webDriver) {
+        super(webDriver);
+    }
+
+    @Override
+    public void isLoaded() {
+        waitForElementVisibility(XpathSelector.INPUT_TAB.getXpath());
+        isInputPropertiesTableLoaded();
+    }
+
+    /**
+     * Creates a List of property names from the inputs tab
+     */
+    public List<String> getInputPropertyNames() {
+        isInputPropertiesTableLoaded();
+        final List<WebElement> propertyNames = findElements(By.xpath(XpathSelector.INPUT_PROPERTY_NAME.getXpath()));
+        return propertyNames.stream().map(propertyName -> propertyName.getAttribute("innerText")).collect(Collectors.toList());
+    }
+
+    /**
+     * Adds metadata to a property within the inputs tab based on a property name
+     * @param name used to determine which property to add metadata
+     * @param key the metadata key to add
+     * @param value the metadata value to add
+     */
+    public void setInputPropertyMetadata(String name, String key, String value) {
+        isInputPropertiesTableLoaded();
+        findElement(By.xpath(XpathSelector.INPUT_PROPERTY_ADD_METADATA_BUTTON.formatXpath(name))).click();
+        waitForElementVisibility(XpathSelector.INPUT_PROPERTY_METADATA_KEY_VALUE_PAIR.formatXpath(name));
+        List<WebElement> keyValueInputs = findElements(By.xpath(XpathSelector.INPUT_PROPERTY_METADATA_KEY_VALUE_PAIR.formatXpath(name)));
+        keyValueInputs.get(0).sendKeys(key);
+        keyValueInputs.get(1).sendKeys(value);
+        saveInputProperties();
+        ExtentTestActions.takeScreenshot(Status.INFO, name, String.format("Added metadata for property %s", name));
+    }
+
+    private void isInputPropertiesTableLoaded() {
+        waitForElementVisibility(XpathSelector.PROPERTIES_TABLE.getXpath());
+        waitForElementInvisibility(By.xpath(XpathSelector.NO_DATA_MESSAGE.getXpath()));
+    }
+
+    private void saveInputProperties() {
+        findElement(By.xpath(XpathSelector.PROPERTY_SAVE_BTN.getXpath())).click();
+        waitForElementVisibility(XpathSelector.PROPERTY_SAVE_MESSAGE.getXpath());
+        waitForElementInvisibility(By.xpath(XpathSelector.PROPERTY_SAVE_MESSAGE.getXpath()));
+    }
+
+    /**
+     * Enum that contains identifiers and xpath expressions to elements related to the enclosing page object.
+     */
+    @AllArgsConstructor
+    @Getter
+    private enum XpathSelector {
+        INPUT_TAB("//*[contains(@data-tests-id, 'Inputs') and contains(@class, 'active')]"),
+        PROPERTIES_TABLE("//div[contains(@class,'properties-table')]"),
+        NO_DATA_MESSAGE("//div[contains(@class,'no-data') and text()='No data to display']"),
+        PROPERTY_SAVE_BTN("//button[@data-tests-id='properties-save-button']"),
+        PROPERTY_SAVE_MESSAGE("//div[contains(text(), 'Successfully saved')]"),
+        INPUT_PROPERTY_NAME("//*[contains(@class, 'property-name')]"),
+        INPUT_PROPERTY_TABLE_ROW("//div[contains(@class, 'table-row') and descendant::*[text() = '%s']]"),
+        INPUT_PROPERTY_ADD_METADATA_BUTTON(INPUT_PROPERTY_TABLE_ROW.getXpath().concat("//a")),
+        INPUT_PROPERTY_METADATA_KEY_VALUE_PAIR(INPUT_PROPERTY_TABLE_ROW.getXpath().concat("//input"));
+
+        private final String xpath;
+
+        public String formatXpath(Object... params) {
+            return String.format(xpath, params);
+        }
+    }
+
+}
index dcc2612..e69f113 100644 (file)
 
 package org.onap.sdc.frontend.ci.tests.pages;
 
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import com.aventstack.extentreports.Status;
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import org.onap.sdc.frontend.ci.tests.execute.setup.ExtentTestActions;
-import org.onap.sdc.frontend.ci.tests.utilities.LoaderHelper;
-import org.onap.sdc.frontend.ci.tests.utilities.NotificationComponent;
-import org.onap.sdc.frontend.ci.tests.utilities.NotificationComponent.NotificationType;
+
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-import org.openqa.selenium.support.ui.Select;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
 
 /**
- * Handles the Resource Properties Assignment Page UI actions
+ * Handles the Resource Properties Assignment Page UI actions.
  */
 public class ResourcePropertiesAssignmentPage extends AbstractPageObject {
 
-    private WebElement wrappingElement;
-    private LoaderHelper loaderHelper;
-    private NotificationComponent notificationComponent;
+    private ResourcePropertiesAssignmentTab resourcePropertiesAssignmentTab;
+    private ResourcePropertiesAssignmentInputTab resourcePropertiesAssignmentInputTab;
 
     public ResourcePropertiesAssignmentPage(final WebDriver webDriver) {
         super(webDriver);
-        notificationComponent = new NotificationComponent(webDriver);
-        loaderHelper = new LoaderHelper(webDriver);
+        resourcePropertiesAssignmentTab = new ResourcePropertiesAssignmentTab(webDriver);
+        resourcePropertiesAssignmentInputTab = new ResourcePropertiesAssignmentInputTab(webDriver);
     }
 
     @Override
     public void isLoaded() {
-        wrappingElement = getWait(5)
-            .until(ExpectedConditions.visibilityOfElementLocated(By.xpath(XpathSelector.MAIN_DIV.getXpath())));
-        getWait(5)
-            .until(ExpectedConditions.visibilityOfElementLocated(By.xpath(XpathSelector.TITLE_DIV.getXpath())));
-    }
-
-    /**
-     * Gets the software_version property values.
-     *
-     * @return the list of software versions found
-     */
-    public List<String> getSoftwareVersionProperty() {
-        waitPropertiesToLoad();
-        final By swVersionCheckboxLocator = By.xpath(XpathSelector.SOFTWARE_VERSION_PROPERTY_CHECKBOX.getXpath());
-        waitForElementVisibility(swVersionCheckboxLocator, 5);
-
-        final List<String> softwareVersionList = new ArrayList<>();
-        final List<WebElement> elements = wrappingElement.findElements(By.xpath(XpathSelector.SOFTWARE_VERSION_INPUT.getXpath()));
-        for (final WebElement element : elements) {
-            softwareVersionList.add(element.getAttribute("value"));
-        }
-
-        return softwareVersionList;
-    }
-
-    /**
-     * Gets the property row element for the given propertyName
-     * @param propertyName the property name
-     * @return the property row element
-     */
-    private WebElement getPropertyRow(String propertyName) {
-        final By propertyCheckboxLocator = By.xpath(XpathSelector.PROPERTY_CHECKBOX.getXpath(propertyName));
-        final WebElement propertyCheckbox = waitForElementVisibility(propertyCheckboxLocator, 5);
-        return propertyCheckbox.findElement(By.xpath("./../../.."));
+        waitForElementVisibility((By.xpath(XpathSelector.MAIN_DIV.getXpath())));
+        waitForElementVisibility(By.xpath(XpathSelector.TITLE_DIV.getXpath()));
+        resourcePropertiesAssignmentTab.isLoaded();
     }
 
     /**
-     * Gets the value of a string TOSCA property.
-     * @return the value of the property
+     * Select the Properties Tab to be displayed
      */
-    public String getStringPropertyValue(final String propertyName) {
-        waitPropertiesToLoad();
-        final WebElement propertyInput = getPropertyRow(propertyName).findElement(By.xpath(XpathSelector.INPUT_PROPERTY.getXpath(propertyName)));
-        return propertyInput.getAttribute("value");
+    public void selectPropertiesTab() {
+        findElement(By.xpath(XpathSelector.PROPERTIES_TAB.getXpath())).click();
+        resourcePropertiesAssignmentTab.isLoaded();
     }
 
     /**
-     * Sets a String value to a TOSCA property.
-     * @param propertyName the property name
-     * @param value property value to be set
+     * Select the Input Tab to be displayed
      */
-    public void setStringPropertyValue(final String propertyName, final String value) {
-        if (value == null) {
-            return;
-        }
-        waitPropertiesToLoad();
-        getPropertyRow(propertyName).findElement(By.xpath(XpathSelector.INPUT_PROPERTY.getXpath(propertyName))).sendKeys(value);
-    }
-
-    /**
-     * Sets a boolean value to a TOSCA property.
-     * @param propertyName
-     */
-    private void setBooleanPropertyValue(final String propertyName) {
-        waitPropertiesToLoad();
-        new Select(getPropertyRow(propertyName).findElement(By.xpath(XpathSelector.SELECT_INPUT_PROPERTY.getXpath(propertyName)))).
-            selectByVisibleText("TRUE");
+    public void selectInputTab() {
+        findElement(By.xpath(XpathSelector.INPUT_TAB.getXpath())).click();
+        resourcePropertiesAssignmentInputTab.isLoaded();
     }
 
-    /**
-     * Sets a complex property  type value to a TOSCA property. It handles List and Map
-     * @param propertyName the property name
-     * @param objectValue the property complex type value
-     */
-    public void setComplexPropertyValue(final String propertyName, final Object objectValue) {
-        if (objectValue == null) {
-            return;
-        }
-        waitPropertiesToLoad();
-        final WebElement addToListLink = getPropertyRow(propertyName)
-            .findElement(By.xpath(XpathSelector.PROPERTY_ADD_VALUE_COMPLEX_TYPE.getXpath(propertyName)));
-        if (objectValue instanceof List) {
-            setValueFromList(propertyName, (List<String>) objectValue, addToListLink);
-        }
-        if (objectValue instanceof Map) {
-            setValueFromMap(propertyName, (Map) objectValue, addToListLink);
-        }
-    }
-
-    /**
-     * Sets a value to a complex (List) property type.
-     * @param propertyName the property name
-     * @param values the List of values to be added to the given property name
-     * @param addToListLink the link to add the input value
-     */
-    private void setValueFromList(final String propertyName, final List<String> values, final WebElement addToListLink) {
-        AtomicInteger inputIndex = new AtomicInteger(0);
-        values.forEach(value -> {
-            addToListLink.click();
-            final WebElement propertyInput = addToListLink.findElement(By.xpath(XpathSelector.INPUT_PROPERTY_COMPLEX_TYPE_VALUE.getXpath(
-                String.valueOf(new StringBuilder(propertyName).append(".").append(inputIndex)))));
-            propertyInput.sendKeys(value);
-            inputIndex.getAndIncrement();
-        });
-    }
-
-    /**
-     * Sets a value to a complex (Map) property type.
-     * @param propertyName the property name
-     * @param values the Map of values to be added to the given property name
-     * @param addToListLink the link to add the input value
-     */
-    private void setValueFromMap(final String propertyName, final Map values, final WebElement addToListLink) {
-        AtomicInteger inputIndex = new AtomicInteger(0);
-        values.forEach((key, value) -> {
-            addToListLink.click();
-            WebElement propertyInput;
-            // Add Key
-            propertyInput = addToListLink.findElement(By.xpath(XpathSelector.INPUT_PROPERTY_COMPLEX_TYPE_KEY.getXpath(
-                String.valueOf(new StringBuilder(propertyName).append(".").append(inputIndex)))));
-            propertyInput.sendKeys(key.toString());
-            // Add Value
-            propertyInput = addToListLink.findElement(By.xpath(XpathSelector.INPUT_PROPERTY_COMPLEX_TYPE_VALUE.getXpath(
-                String.valueOf(new StringBuilder(propertyName).append(".").append(inputIndex)))));
-            propertyInput.sendKeys(value.toString());
-            inputIndex.getAndIncrement();
-        });
+    public List<String> getSoftwareVersionProperty() {
+        return resourcePropertiesAssignmentTab.getSoftwareVersionProperty();
     }
 
-    /**
-     * Sets a property value
-     * @param propertyName the property name
-     * @param value the property value
-     */
     public void setPropertyValue(final String propertyName, final Object value) {
-        if (value == null) {
-            return;
-        }
-
-        if (value instanceof String) {
-            setStringPropertyValue(propertyName, (String) value);
-            return;
-        }
-
-        if (value instanceof Integer) {
-            setStringPropertyValue(propertyName, ((Integer) value).toString());
-            return;
-        }
-
-        if (value instanceof Boolean) {
-            setBooleanPropertyValue(propertyName);
-            return;
-        }
-
-        if (value instanceof Map) {
-            setComplexPropertyValue(propertyName, value);
-            return;
-        }
-
-        if (value instanceof List) {
-            setComplexPropertyValue(propertyName, value);
-            return;
-        }
-
-        throw new UnsupportedOperationException("Cannot set property value of type: " + value.getClass());
+        resourcePropertiesAssignmentTab.setPropertyValue(propertyName, value);
     }
 
-    /**
-     * Checks if a property exists.
-     * @param propertyName the property name
-     * @return the value of the property
-     */
     public boolean isPropertyPresent(final String propertyName) {
-        waitPropertiesToLoad();
-        try {
-            waitForElementVisibility(By.xpath(XpathSelector.PROPERTY_CHECKBOX.getXpath(propertyName)), 5);
-        } catch (final Exception ignored) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Waits for the properties loading.
-     */
-    private void waitPropertiesToLoad() {
-        waitForElementVisibility(By.xpath(XpathSelector.PROPERTIES_TABLE.getXpath()), 5);
-        waitForElementInvisibility(By.xpath(XpathSelector.NO_DATA_MESSAGE.getXpath()), 5);
+        return resourcePropertiesAssignmentTab.isPropertyPresent(propertyName);
     }
 
-    /**
-     * Saves a property
-     */
     public void saveProperties() {
-        final WebElement saveBtn = waitForElementVisibility(By.xpath(XpathSelector.PROPERTY_SAVE_BTN.getXpath()));
-        assertTrue(saveBtn.isEnabled(), "Property save button should be enabled.");
-        saveBtn.click();
-        loaderHelper.waitForLoaderInvisibility(20);
-        notificationComponent.waitForNotification(NotificationType.SUCCESS, 20);
+        resourcePropertiesAssignmentTab.saveProperties();
     }
 
-    /**
-     * Adds a property
-     * @param propertiesMap the properties map to be added
-     */
     public void addProperties(final Map<String, String> propertiesMap) {
-        waitPropertiesToLoad();
-        propertiesMap.forEach((propertyName, propertyType) -> {
-            final By addPropertyButtonLocator = By.xpath(XpathSelector.PROPERTY_ADD_BTN.getXpath());
-            waitForElementVisibility(addPropertyButtonLocator, 30);
-            final WebElement addPropertyRightColumn = findElement(By.xpath(XpathSelector.PROPERTY_ADD_RIGHT_COLUMN_DIV.getXpath()));
-            final WebElement propertyAddButton = addPropertyRightColumn.findElement(addPropertyButtonLocator);
-            assertTrue(propertyAddButton.isDisplayed(), "Property add button should be enabled.");
-            propertyAddButton.click();
-            createProperty(propertyName, propertyType);
-            verifyProperty(propertyName);
-            ExtentTestActions.takeScreenshot(Status.INFO, "added-property",
-                String.format("Property '%s' was created on component", propertyName));
-        });
+        resourcePropertiesAssignmentTab.addProperties(propertiesMap);
     }
 
-    /**
-     * Fills the creation property modal.
-     * @param propertyName the property name to be created
-     * @param propertyType the property type to be selected
-     */
-    private void createProperty(final String propertyName, final String propertyType) {
-        final AddPropertyModal addPropertyModal = new AddPropertyModal(webDriver);
-        addPropertyModal.isLoaded();
-        addPropertyModal.fillPropertyForm(propertyName, propertyType);
-        addPropertyModal.clickOnCreate();
+    public Map<String, String> getPropertyNamesAndTypes() {
+        return resourcePropertiesAssignmentTab.getPropertyNamesAndTypes();
     }
 
-    /**
-     * Verifies if the added property is displayed on the UI.
-     * @param propertyName the property name to be found
-     */
-    private void verifyProperty(final String propertyName) {
-        final By propertyCheckboxLocator = By.xpath(XpathSelector.PROPERTY_CHECKBOX.getXpath(propertyName));
-        final WebElement propertyCheckbox = waitForElementVisibility(propertyCheckboxLocator, 5);
-        assertTrue(propertyCheckbox.isDisplayed(), String.format("%s Property should be displayed", propertyName));
-        assertTrue(this.getPropertyNamesAndTypes().containsKey(propertyName),
-            String.format("%s Property should be listed but found %s", propertyName, this.getPropertyNamesAndTypes().toString()));
+    public void setInputPropertyMetadata(String name, String key, String value) {
+        resourcePropertiesAssignmentInputTab.setInputPropertyMetadata(name, key, value);
     }
 
-    /**
-     * Creates a map based on property names and data types
-     */
-    public Map<String, String> getPropertyNamesAndTypes() {
-        waitPropertiesToLoad();
-        final Map<String, String> namesAndTypes = new HashMap<>();
-        final List<WebElement> names = findElements(By.xpath(XpathSelector.PROPERTY_NAMES.getXpath()));
-        final List<WebElement> types = findElements(By.xpath(XpathSelector.PROPERTY_TYPES.getXpath()));
-
-        for (int i = 0;i < names.size();i++) {
-            namesAndTypes.put(names.get(i).getAttribute("innerText"), types.get(i).getAttribute("innerText"));
-        }
-
-        return namesAndTypes;
+    public List<String> getInputPropertyNames() {
+        return resourcePropertiesAssignmentInputTab.getInputPropertyNames();
     }
 
     /**
@@ -324,21 +104,8 @@ public class ResourcePropertiesAssignmentPage extends AbstractPageObject {
     private enum XpathSelector {
         MAIN_DIV("w-sdc-main-right-container", "//div[@class='%s']"),
         TITLE_DIV("tab-title", "//div[contains(@class,'%s') and contains(text(), 'Properties Assignment')]"),
-        PROPERTIES_TABLE("properties-table", "//div[contains(@class,'%s')]"),
-        NO_DATA_MESSAGE("no-data", "//div[contains(@class,'%s') and text()='No data to display']"),
-        SOFTWARE_VERSION_PROPERTY_CHECKBOX("software_versions", "//checkbox[@data-tests-id='%s']"),
-        SOFTWARE_VERSION_INPUT("value-prop-software_versions", "//input[starts-with(@data-tests-id,'%s')]"),
-        PROPERTY_CHECKBOX("//checkbox[@data-tests-id='%s']"),
-        PROPERTY_SAVE_BTN("properties-save-button", "//button[@data-tests-id='%s']"),
-        PROPERTY_ADD_RIGHT_COLUMN_DIV("right-column", "//div[@class='%s']"),
-        PROPERTY_ADD_BTN("add-btn", "//div[contains(@class,'%s')]"),
-        PROPERTY_ADD_VALUE_COMPLEX_TYPE("//a[contains(@data-tests-id, 'add-to-list-%s')]"),
-        INPUT_PROPERTY_COMPLEX_TYPE_KEY("//input[contains(@data-tests-id, 'value-prop-key-%s')]"),
-        INPUT_PROPERTY_COMPLEX_TYPE_VALUE("//input[contains(@data-tests-id, 'value-prop-%s')]"),
-        INPUT_PROPERTY("//input[@data-tests-id='value-prop-%s']"),
-        SELECT_INPUT_PROPERTY("//select[@data-tests-id='value-prop-%s']"),
-        PROPERTY_TYPES("//*[contains(@data-tests-id, 'propertyType')]"),
-        PROPERTY_NAMES("//*[contains(@data-tests-id, 'propertyName')]");
+        PROPERTIES_TAB("//*[contains(@data-tests-id, 'Properties') and contains(@class, 'tab')]"),
+        INPUT_TAB("//*[contains(@data-tests-id, 'Inputs') and contains(@class, 'tab')]");
 
         @Getter
         private String id;
@@ -351,10 +118,6 @@ public class ResourcePropertiesAssignmentPage extends AbstractPageObject {
         public String getXpath() {
             return String.format(xpathFormat, id);
         }
-
-        public String getXpath(final String... xpathParams) {
-            return String.format(xpathFormat, xpathParams);
-        }
     }
 
 }
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentTab.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentTab.java
new file mode 100644 (file)
index 0000000..b237b17
--- /dev/null
@@ -0,0 +1,351 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.frontend.ci.tests.pages;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.onap.sdc.frontend.ci.tests.execute.setup.ExtentTestActions;
+import org.onap.sdc.frontend.ci.tests.utilities.LoaderHelper;
+import org.onap.sdc.frontend.ci.tests.utilities.NotificationComponent;
+import org.onap.sdc.frontend.ci.tests.utilities.NotificationComponent.NotificationType;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.Select;
+
+import com.aventstack.extentreports.Status;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * Handles the Resource Properties Assignment Properties Tab UI actions
+ */
+public class ResourcePropertiesAssignmentTab extends AbstractPageObject {
+
+    private WebElement wrappingElement;
+    private LoaderHelper loaderHelper;
+    private NotificationComponent notificationComponent;
+
+    public ResourcePropertiesAssignmentTab(final WebDriver webDriver) {
+        super(webDriver);
+        notificationComponent = new NotificationComponent(webDriver);
+        loaderHelper = new LoaderHelper(webDriver);
+    }
+
+    @Override
+    public void isLoaded() {
+       wrappingElement = waitForElementVisibility(XpathSelector.MAIN_DIV.getXpath());
+       waitForElementVisibility(XpathSelector.PROPERTIES_TAB.getXpath());
+       isPropertiesTableLoaded();
+    }
+
+    /**
+     * Waits for the table of properties to load
+     */
+    private void isPropertiesTableLoaded() {
+        waitForElementVisibility(By.xpath(XpathSelector.PROPERTIES_TABLE.getXpath()), 5);
+        waitForElementInvisibility(By.xpath(XpathSelector.NO_DATA_MESSAGE.getXpath()), 5);
+    }
+
+    /**
+     * Gets the software_version property values.
+     *
+     * @return the list of software versions found
+     */
+    public List<String> getSoftwareVersionProperty() {
+        isPropertiesTableLoaded();
+        final By swVersionCheckboxLocator = By.xpath(XpathSelector.SOFTWARE_VERSION_PROPERTY_CHECKBOX.getXpath());
+        waitForElementVisibility(swVersionCheckboxLocator, 5);
+
+        final List<String> softwareVersionList = new ArrayList<>();
+        final List<WebElement> elements = wrappingElement.findElements(By.xpath(XpathSelector.SOFTWARE_VERSION_INPUT.getXpath()));
+        for (final WebElement element : elements) {
+            softwareVersionList.add(element.getAttribute("value"));
+        }
+
+        return softwareVersionList;
+    }
+
+    /**
+     * Sets a property value
+     * @param propertyName the property name
+     * @param value the property value
+     */
+    public void setPropertyValue(final String propertyName, final Object value) {
+        if (value == null) {
+            return;
+        }
+
+        if (value instanceof String) {
+            setStringPropertyValue(propertyName, (String) value);
+            return;
+        }
+
+        if (value instanceof Integer) {
+            setStringPropertyValue(propertyName, ((Integer) value).toString());
+            return;
+        }
+
+        if (value instanceof Boolean) {
+            setBooleanPropertyValue(propertyName);
+            return;
+        }
+
+        if (value instanceof Map) {
+            setComplexPropertyValue(propertyName, value);
+            return;
+        }
+
+        if (value instanceof List) {
+            setComplexPropertyValue(propertyName, value);
+            return;
+        }
+
+        throw new UnsupportedOperationException("Cannot set property value of type: " + value.getClass());
+    }
+
+    /**
+     * Checks if a property exists.
+     * @param propertyName the property name
+     * @return the value of the property
+     */
+    public boolean isPropertyPresent(final String propertyName) {
+        isPropertiesTableLoaded();
+        try {
+            waitForElementVisibility(By.xpath(XpathSelector.PROPERTY_CHECKBOX.getXpath(propertyName)), 5);
+        } catch (final Exception ignored) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Saves a property
+     */
+    public void saveProperties() {
+        final WebElement saveBtn = waitForElementVisibility(By.xpath(XpathSelector.PROPERTY_SAVE_BTN.getXpath()));
+        assertTrue(saveBtn.isEnabled(), "Property save button should be enabled.");
+        saveBtn.click();
+        loaderHelper.waitForLoaderInvisibility(20);
+        notificationComponent.waitForNotification(NotificationType.SUCCESS, 20);
+    }
+
+    /**
+     * Adds a property
+     * @param propertiesMap the properties map to be added
+     */
+    public void addProperties(final Map<String, String> propertiesMap) {
+        isPropertiesTableLoaded();
+        propertiesMap.forEach((propertyName, propertyType) -> {
+            final By addPropertyButtonLocator = By.xpath(XpathSelector.PROPERTY_ADD_BTN.getXpath());
+            waitForElementVisibility(addPropertyButtonLocator, 30);
+            final WebElement addPropertyRightColumn = findElement(By.xpath(XpathSelector.PROPERTY_ADD_RIGHT_COLUMN_DIV.getXpath()));
+            final WebElement propertyAddButton = addPropertyRightColumn.findElement(addPropertyButtonLocator);
+            assertTrue(propertyAddButton.isDisplayed(), "Property add button should be enabled.");
+            propertyAddButton.click();
+            createProperty(propertyName, propertyType);
+            verifyProperty(propertyName);
+            ExtentTestActions.takeScreenshot(Status.INFO, "added-property",
+                String.format("Property '%s' was created on component", propertyName));
+        });
+    }
+
+    /**
+     * Creates a map based on property names and data types
+     */
+    public Map<String, String> getPropertyNamesAndTypes() {
+        isPropertiesTableLoaded();
+        final Map<String, String> namesAndTypes = new HashMap<>();
+        final List<WebElement> names = findElements(By.xpath(XpathSelector.PROPERTY_NAMES.getXpath()));
+        final List<WebElement> types = findElements(By.xpath(XpathSelector.PROPERTY_TYPES.getXpath()));
+
+        for (int i = 0;i < names.size();i++) {
+            namesAndTypes.put(names.get(i).getAttribute("innerText"), types.get(i).getAttribute("innerText"));
+        }
+
+        return namesAndTypes;
+    }
+
+    /**
+     * Gets the property row element for the given propertyName
+     * @param propertyName the property name
+     * @return the property row element
+     */
+    private WebElement getPropertyRow(String propertyName) {
+        final By propertyCheckboxLocator = By.xpath(XpathSelector.PROPERTY_CHECKBOX.getXpath(propertyName));
+        final WebElement propertyCheckbox = waitForElementVisibility(propertyCheckboxLocator, 5);
+        return propertyCheckbox.findElement(By.xpath("./../../.."));
+    }
+
+    /**
+     * Sets a String value to a TOSCA property.
+     * @param propertyName the property name
+     * @param value property value to be set
+     */
+    private void setStringPropertyValue(final String propertyName, final String value) {
+        if (value == null) {
+            return;
+        }
+        isPropertiesTableLoaded();
+        getPropertyRow(propertyName).findElement(By.xpath(XpathSelector.INPUT_PROPERTY.getXpath(propertyName))).sendKeys(value);
+    }
+
+    /**
+     * Sets a boolean value to a TOSCA property.
+     * @param propertyName
+     */
+    private void setBooleanPropertyValue(final String propertyName) {
+        isPropertiesTableLoaded();
+        new Select(getPropertyRow(propertyName).findElement(By.xpath(XpathSelector.SELECT_INPUT_PROPERTY.getXpath(propertyName)))).
+            selectByVisibleText("TRUE");
+    }
+
+    /**
+     * Sets a complex property  type value to a TOSCA property. It handles List and Map
+     * @param propertyName the property name
+     * @param objectValue the property complex type value
+     */
+    private void setComplexPropertyValue(final String propertyName, final Object objectValue) {
+        if (objectValue == null) {
+            return;
+        }
+        isPropertiesTableLoaded();
+        final WebElement addToListLink = getPropertyRow(propertyName)
+            .findElement(By.xpath(XpathSelector.PROPERTY_ADD_VALUE_COMPLEX_TYPE.getXpath(propertyName)));
+        if (objectValue instanceof List) {
+            setValueFromList(propertyName, (List) objectValue, addToListLink);
+        }
+        if (objectValue instanceof Map) {
+            setValueFromMap(propertyName, (Map<?, ?>) objectValue, addToListLink);
+        }
+    }
+
+    /**
+     * Sets a value to a complex (List) property type.
+     * @param propertyName the property name
+     * @param values the List of values to be added to the given property name
+     * @param addToListLink the link to add the input value
+     */
+    private void setValueFromList(final String propertyName, final List<String> values, final WebElement addToListLink) {
+        final AtomicInteger inputIndex = new AtomicInteger(0);
+        values.forEach(value -> {
+            addToListLink.click();
+            final WebElement propertyInput = addToListLink.findElement(By.xpath(XpathSelector.INPUT_PROPERTY_COMPLEX_TYPE_VALUE.getXpath(
+                String.valueOf(new StringBuilder(propertyName).append(".").append(inputIndex)))));
+            propertyInput.sendKeys(value);
+            inputIndex.getAndIncrement();
+        });
+    }
+
+    /**
+     * Sets a value to a complex (Map) property type.
+     * @param propertyName the property name
+     * @param values the Map of values to be added to the given property name
+     * @param addToListLink the link to add the input value
+     */
+    private void setValueFromMap(final String propertyName, final Map<?, ?> values, final WebElement addToListLink) {
+        final AtomicInteger inputIndex = new AtomicInteger(0);
+        values.forEach((key, value) -> {
+            addToListLink.click();
+            WebElement propertyInput;
+            // Add Key
+            propertyInput = addToListLink.findElement(By.xpath(XpathSelector.INPUT_PROPERTY_COMPLEX_TYPE_KEY.getXpath(
+                String.valueOf(new StringBuilder(propertyName).append(".").append(inputIndex)))));
+            propertyInput.sendKeys(key.toString());
+            // Add Value
+            propertyInput = addToListLink.findElement(By.xpath(XpathSelector.INPUT_PROPERTY_COMPLEX_TYPE_VALUE.getXpath(
+                String.valueOf(new StringBuilder(propertyName).append(".").append(inputIndex)))));
+            propertyInput.sendKeys(value.toString());
+            inputIndex.getAndIncrement();
+        });
+    }
+
+    /**
+     * Fills the creation property modal.
+     * @param propertyName the property name to be created
+     * @param propertyType the property type to be selected
+     */
+    private void createProperty(final String propertyName, final String propertyType) {
+        final AddPropertyModal addPropertyModal = new AddPropertyModal(webDriver);
+        addPropertyModal.isLoaded();
+        addPropertyModal.fillPropertyForm(propertyName, propertyType);
+        addPropertyModal.clickOnCreate();
+    }
+
+    /**
+     * Verifies if the added property is displayed on the UI.
+     * @param propertyName the property name to be found
+     */
+    private void verifyProperty(final String propertyName) {
+        final By propertyCheckboxLocator = By.xpath(XpathSelector.PROPERTY_CHECKBOX.getXpath(propertyName));
+        final WebElement propertyCheckbox = waitForElementVisibility(propertyCheckboxLocator, 5);
+        assertTrue(propertyCheckbox.isDisplayed(), String.format("%s Property should be displayed", propertyName));
+        assertTrue(this.getPropertyNamesAndTypes().containsKey(propertyName),
+            String.format("%s Property should be listed but found %s", propertyName, this.getPropertyNamesAndTypes().toString()));
+    }
+
+    /**
+     * Enum that contains identifiers and xpath expressions to elements related to the enclosing page object.
+     */
+    @AllArgsConstructor
+    private enum XpathSelector {
+        MAIN_DIV("w-sdc-main-right-container", "//div[@class='%s']"),
+        PROPERTIES_TAB("//*[contains(@data-tests-id, 'Properties') and contains(@class, 'active')]"),
+        PROPERTIES_TABLE("properties-table", "//div[contains(@class,'%s')]"),
+        NO_DATA_MESSAGE("no-data", "//div[contains(@class,'%s') and text()='No data to display']"),
+        SOFTWARE_VERSION_PROPERTY_CHECKBOX("software_versions", "//checkbox[@data-tests-id='%s']"),
+        SOFTWARE_VERSION_INPUT("value-prop-software_versions", "//input[starts-with(@data-tests-id,'%s')]"),
+        PROPERTY_CHECKBOX("//checkbox[@data-tests-id='%s']"),
+        PROPERTY_SAVE_BTN("properties-save-button", "//button[@data-tests-id='%s']"),
+        PROPERTY_ADD_RIGHT_COLUMN_DIV("right-column", "//div[@class='%s']"),
+        PROPERTY_ADD_BTN("add-btn", "//div[contains(@class,'%s')]"),
+        PROPERTY_ADD_VALUE_COMPLEX_TYPE("//a[contains(@data-tests-id, 'add-to-list-%s')]"),
+        INPUT_PROPERTY_COMPLEX_TYPE_KEY("//input[contains(@data-tests-id, 'value-prop-key-%s')]"),
+        INPUT_PROPERTY_COMPLEX_TYPE_VALUE("//input[contains(@data-tests-id, 'value-prop-%s')]"),
+        INPUT_PROPERTY("//input[@data-tests-id='value-prop-%s']"),
+        SELECT_INPUT_PROPERTY("//select[@data-tests-id='value-prop-%s']"),
+        PROPERTY_TYPES("//*[contains(@data-tests-id, 'propertyType')]"),
+        PROPERTY_NAMES("//*[contains(@data-tests-id, 'propertyName')]");
+
+        @Getter
+        private String id;
+        private final String xpathFormat;
+
+        XpathSelector(final String xpathFormat) {
+            this.xpathFormat = xpathFormat;
+        }
+
+        public String getXpath() {
+            return String.format(xpathFormat, id);
+        }
+
+        public String getXpath(final Object... xpathParams) {
+            return String.format(xpathFormat, xpathParams);
+        }
+    }
+
+}
index 8c75510..ce2436e 100644 (file)
@@ -44,6 +44,7 @@
           <include name="createSubstitutionFilter"/>
           <include name="createDirectiveNodeFilterTest"/>
           <include name="updateInterfaceOperation"/>
+          <include name="createMetadataForServiceProperty"/>
         </methods>
       </class>
     </classes>