Add Create Service Substituition Filter Intergration Test 41/120141/4
authordavsad <david.sadlier@est.tech>
Tue, 9 Mar 2021 18:29:48 +0000 (18:29 +0000)
committerChristophe Closset <christophe.closset@intl.att.com>
Tue, 6 Apr 2021 09:09:21 +0000 (09:09 +0000)
Issue-ID: SDC-3543
Signed-off-by: davsad <david.sadlier@est.tech>
Change-Id: Id6aabc02e36f199ee9106ec1fb145b57c8493c88

catalog-ui/src/app/ng2/components/logic/properties-table/properties-table.component.html
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/datatypes/LogicalOperator.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/datatypes/ServiceDependencyProperty.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/CreateServiceSubstitutionFilterTest.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/CreateSubtitutionFilterFlow.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/DownloadToscaTemplateFlow.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/ServiceDependenciesEditor.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/CompositionPage.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/CompositionSubstitutionFilterTab.java
integration-tests/src/test/resources/ci/testSuites/frontend/onapUiSanity.xml

index af7a612..2d8fa77 100644 (file)
@@ -53,7 +53,7 @@
                         <checkbox *ngIf="hasDeclareOption" [(checked)]="property.isSelected" [disabled]="property.isDisabled || property.isDeclared || readonly"
                             (checkedChange)="propertyChecked(property)" [attr.data-tests-id]="property.name"></checkbox>
                         <div class="inner-cell-div-multiline" tooltip="{{property.name}}">
-                            <multiline-ellipsis className="table-cell-multiline-ellipsis" [lines]="2">{{property.name}}</multiline-ellipsis>
+                            <multiline-ellipsis data-tests-id="propertyName" className="table-cell-multiline-ellipsis" [lines]="2">{{property.name}}</multiline-ellipsis>
                         </div>
                     </div>
                     <span *ngIf="property.description" class="property-description-icon sprite-new show-desc" tooltip="{{property.description}}"
@@ -65,7 +65,7 @@
                 <!-- Property Type -->
                 <div class="table-cell col2" *ngIf="!hidePropertyType">
                     <div class="inner-cell-div" tooltip="{{property.type | contentAfterLastDot}}">
-                        <span>{{property.type | contentAfterLastDot}}</span>
+                        <span data-tests-id="propertyType">{{property.type | contentAfterLastDot}}</span>
                     </div>
                 </div>
                 <!-- Property ES (Entry Schema) -->
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/datatypes/LogicalOperator.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/datatypes/LogicalOperator.java
new file mode 100644 (file)
index 0000000..5a4cfce
--- /dev/null
@@ -0,0 +1,15 @@
+package org.onap.sdc.frontend.ci.tests.datatypes;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum LogicalOperator {
+    EQUALS("equal","="),
+    GREATER_THAN("greater_than",">"),
+    LESS_THAN("less_than","<");
+
+    private final String name;
+    private final String operator;
+}
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/datatypes/ServiceDependencyProperty.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/datatypes/ServiceDependencyProperty.java
new file mode 100644 (file)
index 0000000..6afbdc2
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * ============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.datatypes;
+
+import org.onap.sdc.frontend.ci.tests.pages.ServiceDependenciesEditor;
+
+import lombok.Data;
+
+/**
+ * Represents the a property within the Service Dependencies Editor
+ * @see ServiceDependenciesEditor
+ */
+@Data
+public class ServiceDependencyProperty {
+    private final String name;
+    private final String value;
+    private final String source;
+    private final LogicalOperator logicalOperator;
+
+    public ServiceDependencyProperty(String name, String value, LogicalOperator logicalOperator) {
+        this.name = name;
+        this.value = value;
+        this.source = "Static";
+        this.logicalOperator = logicalOperator;
+    }
+}
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/CreateServiceSubstitutionFilterTest.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/CreateServiceSubstitutionFilterTest.java
new file mode 100644 (file)
index 0000000..c49c2dc
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * ============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.execute.sanity;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.onap.sdc.backend.ci.tests.datatypes.enums.ServiceInstantiationType;
+import org.onap.sdc.frontend.ci.tests.datatypes.LogicalOperator;
+import org.onap.sdc.frontend.ci.tests.datatypes.ServiceCreateData;
+import org.onap.sdc.frontend.ci.tests.datatypes.ServiceDependencyProperty;
+import org.onap.sdc.frontend.ci.tests.execute.setup.DriverFactory;
+import org.onap.sdc.frontend.ci.tests.execute.setup.SetupCDTest;
+import org.onap.sdc.frontend.ci.tests.flow.CreateServiceFlow;
+import org.onap.sdc.frontend.ci.tests.flow.CreateSubtitutionFilterFlow;
+import org.onap.sdc.frontend.ci.tests.flow.DownloadToscaTemplateFlow;
+import org.onap.sdc.frontend.ci.tests.pages.ResourcePropertiesAssignmentPage;
+import org.onap.sdc.frontend.ci.tests.pages.ServiceComponentPage;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionPage;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.ToscaArtifactsPage;
+import org.onap.sdc.frontend.ci.tests.pages.home.HomePage;
+import org.onap.sdc.frontend.ci.tests.utilities.FileHandling;
+import org.openqa.selenium.WebDriver;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class CreateServiceSubstitutionFilterTest extends SetupCDTest {
+    private final String serviceName = "CreateServiceSubstitutionFilterTest";
+    private final String stringValue = "Test";
+    private final String booleanValue = "TRUE";
+    private final LogicalOperator operator = LogicalOperator.EQUALS;
+    private final List<ServiceDependencyProperty> substitutionFilterProperties = new ArrayList<ServiceDependencyProperty>();
+    private final ServiceCreateData serviceCreateData = loadServiceCreateData();
+
+    private WebDriver webDriver;
+
+    @BeforeClass
+    public void classSetup() {
+        webDriver = DriverFactory.getDriver();
+    }
+
+    @Test
+    public void createSubsitutionFilter() throws Exception {
+       new CreateServiceFlow(webDriver, serviceCreateData).run(new HomePage(webDriver));
+
+       ServiceComponentPage serviceComponentPage = new ServiceComponentPage(webDriver);
+       serviceComponentPage.isLoaded();
+
+       loadSubstitutionFilterProperties(serviceComponentPage);
+       final CompositionPage compositionPage = serviceComponentPage.goToComposition();
+
+       substitutionFilterProperties.forEach(substitutionFilterProperty -> {
+           final CreateSubtitutionFilterFlow createSubtitutionFilterFlow = new CreateSubtitutionFilterFlow(webDriver, substitutionFilterProperty);
+           createSubtitutionFilterFlow.run();
+       });
+
+       serviceComponentPage = compositionPage.goToServiceGeneral();
+       serviceComponentPage.isLoaded();
+
+       verifyToscaTemplateYaml(serviceComponentPage, false);
+    }
+
+    private ServiceCreateData loadServiceCreateData() {
+        ServiceCreateData serviceCreateData = new ServiceCreateData();
+        serviceCreateData.setRandomName(serviceName);
+        serviceCreateData.setDescription(serviceName);
+        serviceCreateData.setCategory("Network Service");
+        serviceCreateData.setInstantiationType(ServiceInstantiationType.A_LA_CARTE);
+        return serviceCreateData;
+    }
+
+    private void loadSubstitutionFilterProperties(final ServiceComponentPage serviceComponentPage) {
+        final ResourcePropertiesAssignmentPage propertiesPage = serviceComponentPage.goToPropertiesAssignment();
+        propertiesPage.isLoaded();
+        final Map<String, String> propertyNamesAndTypes = propertiesPage.getPropertyNamesAndTypes();
+        propertyNamesAndTypes.forEach((name, type)
+                -> substitutionFilterProperties.add(new ServiceDependencyProperty(name, getPropertyValueByType(type), operator)));
+    }
+
+    private void verifyToscaTemplateYaml(final ServiceComponentPage serviceComponentPage, final boolean delete) throws Exception {
+        final DownloadToscaTemplateFlow downloadCsarTemplateFlow = new DownloadToscaTemplateFlow(webDriver);
+        final ToscaArtifactsPage toscaArtifactsPage = (ToscaArtifactsPage) downloadCsarTemplateFlow.run(serviceComponentPage).get();
+        final Map<?, ?> yaml = FileHandling.parseYamlFile(getConfig().getDownloadAutomationFolder()
+                .concat(java.io.File.separator).concat(toscaArtifactsPage.getDownloadedArtifactList().get(0)));
+        verifyToscaTemplateHasSubstitutionFilter(yaml);
+    }
+
+    private void verifyToscaTemplateHasSubstitutionFilter(final Map<?, ?> yaml) {
+        assertNotNull(yaml, "No contents in TOSCA Template");
+        final List<?> substitutionFilters = (List<?>) getSubstitutionFilterFromYaml(yaml).get("properties");
+        substitutionFilterProperties.forEach(substitutionFilterProperty -> {
+            final Map<?, ?> substitutionFilter = (Map<?, ?>) substitutionFilters.stream()
+                    .filter(subFilter -> ((Map<?, ?>) subFilter).containsKey(substitutionFilterProperty.getName())).findAny().get();
+            assertTrue(substitutionFilter.containsKey(substitutionFilterProperty.getName()), "Added substitution filter not found in TOSCA Template");
+
+            final Map<?, ?> substitutionFilterValue = (Map<?, ?>) ((List<?>) substitutionFilter.get(substitutionFilterProperty.getName())).get(0);
+            assertTrue(substitutionFilterValue.containsValue(convertValue(substitutionFilterProperty.getValue()))
+                    , "Invalid value for added substitution filters found in TOSCA Template");
+            assertTrue(substitutionFilterValue.containsKey(substitutionFilterProperty.getLogicalOperator().getName())
+                    , "Invalid logical operator for added substitution filters found in TOSCA Template");
+        });
+    }
+
+    private Map<?,?> getSubstitutionFilterFromYaml(final Map<?,?> yaml) {
+        final Map<?, ?> topology = (Map<?, ?>) yaml.get("topology_template");
+        final Map<?, ?> substitutionMappings = (Map<?, ?>) topology.get("substitution_mappings");
+        return (Map<?, ?>) substitutionMappings.get("substitution_filter");
+    }
+
+    private Object convertValue(String value) {
+        return booleanValue.equals(value) ? Boolean.parseBoolean(value) : value;
+    }
+
+    private String getPropertyValueByType(String type) {
+        return "string".equals(type) ? stringValue : booleanValue;
+    }
+}
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/CreateSubtitutionFilterFlow.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/CreateSubtitutionFilterFlow.java
new file mode 100644 (file)
index 0000000..c293d1c
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * ============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.flow;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Optional;
+
+import org.onap.sdc.frontend.ci.tests.datatypes.ServiceDependencyProperty;
+import org.onap.sdc.frontend.ci.tests.pages.PageObject;
+import org.onap.sdc.frontend.ci.tests.pages.ServiceDependenciesEditor;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionDetailSideBarComponent;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionDetailSideBarComponent.CompositionDetailTabName;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionPage;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionSubstitutionFilterTab;
+import org.openqa.selenium.WebDriver;
+
+import com.aventstack.extentreports.Status;
+
+public class CreateSubtitutionFilterFlow extends AbstractUiTestFlow {
+
+    private CompositionPage compositionPage;
+    private final ServiceDependencyProperty substitutionFilterProperty;
+
+    public CreateSubtitutionFilterFlow(final WebDriver webDriver, final ServiceDependencyProperty substitutionFilterProperty) {
+        super(webDriver);
+        this.substitutionFilterProperty = substitutionFilterProperty;
+    }
+
+    @Override
+    public Optional<PageObject> run(final PageObject... pageObjects) {
+        extendTest.log(Status.INFO, "Creating substitution filter");
+
+        compositionPage = getCompositionPage(pageObjects);
+        compositionPage.isLoaded();
+
+        final CompositionDetailSideBarComponent sideBar = compositionPage.getDetailSideBar();
+        sideBar.isLoaded();
+
+        final CompositionSubstitutionFilterTab compositionSubstitutionFilterTab = (CompositionSubstitutionFilterTab) sideBar.selectTab(CompositionDetailTabName.SUBSTITUTION_FILTER);
+        compositionSubstitutionFilterTab.isLoaded();
+
+        final ServiceDependenciesEditor compositionSubstitutionDependenciesEditor = compositionSubstitutionFilterTab.clickAddSubstitutionFilter();
+        compositionSubstitutionDependenciesEditor.isLoaded();
+        compositionSubstitutionDependenciesEditor.addProperty(substitutionFilterProperty);
+
+        compositionSubstitutionFilterTab.isLoaded();
+        assertTrue(compositionSubstitutionFilterTab.isSubstitutionFilterPresent(substitutionFilterProperty.getName()), "Created substitution filter is not present");
+
+        return Optional.of(compositionPage);
+    }
+
+    @Override
+    public Optional<? extends PageObject> getLandedPage() {
+        return Optional.ofNullable(compositionPage);
+    }
+
+    private CompositionPage getCompositionPage(final PageObject... pageObjects) {
+        return getParameter(pageObjects, CompositionPage.class)
+        .orElseGet(() -> {
+            return new CompositionPage(webDriver);
+        });
+    }
+}
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/DownloadToscaTemplateFlow.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/DownloadToscaTemplateFlow.java
new file mode 100644 (file)
index 0000000..1ad4706
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * ============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.flow;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+import java.io.File;
+import java.time.Duration;
+import java.util.Optional;
+
+import org.onap.sdc.frontend.ci.tests.execute.setup.ExtentTestActions;
+import org.onap.sdc.frontend.ci.tests.pages.ComponentPage;
+import org.onap.sdc.frontend.ci.tests.pages.PageObject;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.ToscaArtifactsPage;
+import org.onap.sdc.frontend.ci.tests.utilities.FileHandling;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.interactions.Actions;
+import org.openqa.selenium.support.ui.FluentWait;
+
+import com.aventstack.extentreports.Status;
+
+import lombok.Setter;
+
+public class DownloadToscaTemplateFlow extends AbstractUiTestFlow {
+
+    private ToscaArtifactsPage toscaArtifactsPage;
+    @Setter
+    private long waitBeforeGetTheFile = 0L;
+
+    public DownloadToscaTemplateFlow(final WebDriver webDriver) {
+        super(webDriver);
+    }
+
+    @Override
+    public Optional<PageObject> run(final PageObject... pageObjects) {
+        final ComponentPage componentPage = findParameter(pageObjects, ComponentPage.class);
+        toscaArtifactsPage = (ToscaArtifactsPage) componentPage.goToToscaArtifacts();
+        toscaArtifactsPage.isLoaded();
+
+        toscaArtifactsPage.clickOnDownload("Tosca Template");
+        final File downloadedTemplate = waitAndGetDowloadedTemplate();
+        assertThat("The downloaded Template exists", downloadedTemplate, is(notNullValue()));
+        assertThat("The downloaded Template exists", downloadedTemplate.exists(), is(true));
+        toscaArtifactsPage.addToDownloadedArtifactList(downloadedTemplate.getName());
+        ExtentTestActions.takeScreenshot(Status.INFO, "tosca-template-download", "TOSCA template downloaded");
+
+        return Optional.of(toscaArtifactsPage);
+    }
+
+    @Override
+    public Optional<ToscaArtifactsPage> getLandedPage() {
+        return Optional.ofNullable(toscaArtifactsPage);
+    }
+
+    private File waitAndGetDowloadedTemplate() {
+        new Actions(webDriver).pause(Duration.ofSeconds(waitBeforeGetTheFile)).perform();
+        final FluentWait<String> fluentWait = new FluentWait<>("").withTimeout(Duration.ofSeconds(5)).pollingEvery(Duration.ofSeconds(1));
+        fluentWait.until(s -> FileHandling.getLastModifiedFileNameFromDir() != null);
+        return FileHandling.getLastModifiedFileNameFromDir();
+    }
+}
index 9cb104d..0b38c9d 100644 (file)
@@ -22,9 +22,10 @@ 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 lombok.AllArgsConstructor;
-import lombok.Getter;
+import java.util.Map;
+
 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;
@@ -33,6 +34,9 @@ import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
 /**
  * Handles the Resource Properties Assignment Page UI actions
  */
@@ -158,6 +162,22 @@ public class ResourcePropertiesAssignmentPage extends AbstractPageObject {
         notificationComponent.waitForNotification(NotificationType.SUCCESS, 20);
     }
 
+    /**
+     * Creates a map based on property names and data types
+     */
+    public Map<String, String> getPropertyNamesAndTypes() {
+        waitPropertiesToLoad();
+        final Map<String, String> namesAndTypes = new HashMap<String, String>();
+        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;
+    }
+
     /**
      * Enum that contains identifiers and xpath expressions to elements related to the enclosing page object.
      */
@@ -171,7 +191,9 @@ public class ResourcePropertiesAssignmentPage extends AbstractPageObject {
         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']"),
-        INPUT_PROPERTY("//input[@data-tests-id='value-prop-%s']");
+        INPUT_PROPERTY("//input[@data-tests-id='value-prop-%s']"),
+        PROPERTY_TYPES("//*[contains(@data-tests-id, 'propertyType')]"),
+        PROPERTY_NAMES("//*[contains(@data-tests-id, 'propertyName')]");
 
         @Getter
         private String id;
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ServiceDependenciesEditor.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ServiceDependenciesEditor.java
new file mode 100644 (file)
index 0000000..d1ec6d0
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * ============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 org.onap.sdc.frontend.ci.tests.datatypes.ServiceDependencyProperty;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.Select;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * Represents the Service Dependencies Editor
+ */
+public class ServiceDependenciesEditor extends AbstractPageObject {
+
+    public ServiceDependenciesEditor(final WebDriver webDriver) {
+        super(webDriver);
+    }
+
+    @Override
+    public void isLoaded() {
+        waitForElementVisibility(By.xpath(XpathSelector.SERVICE_DEPENDENCIES_EDITOR.xPath));
+    }
+
+    public void addProperty(final ServiceDependencyProperty property) {
+        final Select properties = new Select(webDriver.findElement(By.xpath(XpathSelector.SERVICE_PROPERTY_NAME.xPath)));
+        properties.selectByVisibleText(property.getName());
+        final Select logicalOperator = new Select(webDriver.findElement(By.xpath(XpathSelector.CONSTRAINT_OPERATOR.xPath)));
+        logicalOperator.selectByVisibleText(property.getLogicalOperator().getOperator());
+        final Select sourceType = new Select(webDriver.findElement(By.xpath(XpathSelector.SOURCE_TYPE.xPath)));
+        sourceType.selectByVisibleText(property.getSource());
+        addRuleAssignedValue(webDriver.findElement(
+                By.xpath(XpathSelector.RULE_ASSIGNED_VALUE.xPath)), property.getValue());
+        webDriver.findElement(By.xpath(XpathSelector.CREATE_BUTTON.xPath)).click();
+    }
+
+    private void addRuleAssignedValue(final WebElement element, final String value) {
+        if ("select".equals(element.getTagName())) {
+            new Select(element).selectByVisibleText(value);
+        } else {
+            element.sendKeys(value);
+        }
+    }
+
+    @AllArgsConstructor
+    @Getter
+    private enum XpathSelector {
+        SERVICE_DEPENDENCIES_EDITOR("//service-dependencies-editor"),
+        SERVICE_PROPERTY_NAME("//*[@data-tests-id='servicePropertyName']/select"),
+        CONSTRAINT_OPERATOR("//*[@data-tests-id='constraintOperator']/select"),
+        SOURCE_TYPE("//*[@data-tests-id='sourceType']/select"),
+        RULE_ASSIGNED_VALUE("//*[@data-tests-id='ruleAssignedValue']//*[self::input or self::select]"),
+        CREATE_BUTTON("//button[text()='Create']");
+
+        private final String xPath;
+
+    }
+}
index 19a2150..fb07aec 100644 (file)
@@ -81,6 +81,11 @@ public class CompositionPage extends AbstractPageObject {
         return new ResourceCreatePage(webDriver);
     }
 
+    public ServiceComponentPage goToServiceGeneral() {
+        topNavComponent.clickOnBreadCrumb(1);
+        return new ServiceComponentPage(webDriver);
+    }
+
     /**
      * Get the composition page detail sidebar component
      *
index d279e1f..f0b6b71 100644 (file)
 
 package org.onap.sdc.frontend.ci.tests.pages.component.workspace;
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
 import org.onap.sdc.frontend.ci.tests.pages.AbstractPageObject;
+import org.onap.sdc.frontend.ci.tests.pages.ServiceDependenciesEditor;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
 /**
  * Represents the composition page, details panel, Substitution Filters tab
  */
@@ -36,15 +38,29 @@ public class CompositionSubstitutionFilterTab extends AbstractPageObject {
 
     @Override
     public void isLoaded() {
-        waitForElementVisibility(By.xpath(XpathSelector.SUBSTITUTION_FILTER_TAB.getXPath()));
-        waitForElementVisibility(By.xpath(XpathSelector.ADD_SUBSTITUTION_FILTER_BTN.getXPath()));
+        waitForElementVisibility(By.xpath(XpathSelector.SUBSTITUTION_FILTER_TAB.xPath));
+        waitForElementVisibility(By.xpath(XpathSelector.SUBSTITUTION_FILTER_ADD_BTN.xPath));
+    }
+
+    public ServiceDependenciesEditor clickAddSubstitutionFilter() {
+        findElement(By.xpath(XpathSelector.SUBSTITUTION_FILTER_ADD_BTN.xPath)).click();
+        return new ServiceDependenciesEditor(webDriver);
+    }
+
+    public boolean isSubstitutionFilterPresent(final String propertyName) {
+        try {
+            return waitForElementVisibility(By.xpath(String.format(XpathSelector.SUBSTITUTION_FILTER_DESC.xPath, propertyName))) != null;
+        } catch (final Exception ignored) {
+            return false;
+        }
     }
 
     @AllArgsConstructor
     @Getter
     private enum XpathSelector {
         SUBSTITUTION_FILTER_TAB("//substitution-filter-tab"),
-        ADD_SUBSTITUTION_FILTER_BTN("//button[@data-tests-id='add-substitution-filter-button']");
+        SUBSTITUTION_FILTER_ADD_BTN("//button[@data-tests-id='add-substitution-filter-button']"),
+        SUBSTITUTION_FILTER_DESC("//*[@class='rule-desc' and contains(text(),'%s')]");
 
         private final String xPath;
 
index 0489370..a834ffd 100644 (file)
@@ -38,6 +38,7 @@
           <include name="onboardEtsiVnfCnfFlow"/>
         </methods>
       </class>
+      <class name="org.onap.sdc.frontend.ci.tests.execute.sanity.CreateServiceSubstitutionFilterTest"/>
     </classes>
   </test>
 </suite>