Implement 'Add Outputs UI TC' 41/120841/2
authorvasraz <vasyl.razinkov@est.tech>
Tue, 20 Apr 2021 15:40:31 +0000 (16:40 +0100)
committerChristophe Closset <christophe.closset@intl.att.com>
Mon, 26 Apr 2021 08:04:09 +0000 (08:04 +0000)
Change-Id: I8a357b9457c7f30b89400621ab7c4379ac586f88
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Issue-ID: SDC-3503

21 files changed:
catalog-ui/src/app/ng2/components/logic/attributes-table/attributes-table.component.html
catalog-ui/src/app/ng2/components/logic/attributes-table/attributes-table.component.less
catalog-ui/src/app/ng2/components/logic/outputs-table/outputs-table.component.html
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/AddOutputsUiTest.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/EtsiOnboardVnfCnfUiTests.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/ImportVfcUiTest.java
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/flow/DownloadCsarArtifactFlow.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/DownloadToscaCsarFlow.java [deleted file]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/DownloadToscaTemplateFlow.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesOutputsPage.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesTabComponent.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ComponentPage.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/OutputsTabComponent.java [new file with mode: 0644]
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourceCreatePage.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourceLeftSideMenu.java
integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/CompositionHierarchyComponent.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/home/HomePage.java
integration-tests/src/test/resources/Files/VFCs/1-VFC-NetworkFunction.yaml
integration-tests/src/test/resources/ci/testSuites/frontend/onapUiSanity.xml

index 1115620..e936042 100644 (file)
@@ -41,7 +41,7 @@
         <ng-container *ngFor="let instanceId of feAttributesMap | keys; trackBy:vspId">
             <!-- Icon & Instance Name -->
             <div class="table-rows-header white-sub-header" *ngIf="feInstanceNamesMap">
-                <span [ngClass]="['prop-instance-icon', feInstanceNamesMap[instanceId].iconClass, 'small']"></span>
+                <span [ngClass]="['attrib-instance-icon', feInstanceNamesMap[instanceId].iconClass, 'small']"></span>
                 {{feInstanceNamesMap[instanceId].name}}
                 <div class="sprite-new archive-label" *ngIf="feInstanceNamesMap[instanceId].originArchived == true"></div>
             </div>
index 26ae0d4..0a20bfa 100644 (file)
         }
     }
 
-    .prop-instance-icon {
+    .attrib-instance-icon {
         vertical-align: middle;
         margin-right: 7px;
         &.defaulticon.small {
index fbae0e4..e0e7e2e 100644 (file)
@@ -87,8 +87,7 @@
                            [constraints]="getConstraints(output)">
           </dynamic-element>
           <div class="delete-button-container">
-            <span *ngIf="output.instanceUniqueId && !readonly" class="sprite-new delete-btn"
-                  (click)="openDeleteModal(output)"></span>
+            <span [attr.data-tests-id]="'delete-'+output.name" *ngIf="output.instanceUniqueId && !readonly" class="sprite-new delete-btn" (click)="openDeleteModal(output)"></span>
           </div>
         </div>
       </div>
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/AddOutputsUiTest.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/AddOutputsUiTest.java
new file mode 100644 (file)
index 0000000..c077313
--- /dev/null
@@ -0,0 +1,312 @@
+/*
+ * ============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.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.anEmptyMap;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.emptyString;
+import static org.hamcrest.Matchers.not;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import com.aventstack.extentreports.Status;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Optional;
+import org.onap.sdc.backend.ci.tests.datatypes.enums.ComponentType;
+import org.onap.sdc.backend.ci.tests.datatypes.enums.ResourceCategoryEnum;
+import org.onap.sdc.backend.ci.tests.utils.general.ElementFactory;
+import org.onap.sdc.frontend.ci.tests.datatypes.ComponentData;
+import org.onap.sdc.frontend.ci.tests.datatypes.ResourceCreateData;
+import org.onap.sdc.frontend.ci.tests.exception.UnzipException;
+import org.onap.sdc.frontend.ci.tests.execute.setup.DriverFactory;
+import org.onap.sdc.frontend.ci.tests.execute.setup.ExtentTestActions;
+import org.onap.sdc.frontend.ci.tests.execute.setup.SetupCDTest;
+import org.onap.sdc.frontend.ci.tests.flow.AddNodeToCompositionFlow;
+import org.onap.sdc.frontend.ci.tests.flow.CreateVfFlow;
+import org.onap.sdc.frontend.ci.tests.flow.CreateVfcFlow;
+import org.onap.sdc.frontend.ci.tests.flow.DownloadCsarArtifactFlow;
+import org.onap.sdc.frontend.ci.tests.flow.exception.UiTestFlowRuntimeException;
+import org.onap.sdc.frontend.ci.tests.pages.AttributesOutputsPage;
+import org.onap.sdc.frontend.ci.tests.pages.ComponentPage;
+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.openecomp.sdc.be.model.ComponentInstance;
+import org.openqa.selenium.WebDriver;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.yaml.snakeyaml.Yaml;
+
+public class AddOutputsUiTest extends SetupCDTest {
+
+    private String filePath;
+    private WebDriver webDriver;
+    private HomePage homePage;
+    private ResourceCreateData vfcCreateData;
+    private ResourceCreateData vfCreateData;
+
+    @BeforeClass
+    public void beforeClass() throws IOException {
+        filePath = FileHandling.getFilePath("VFCs/");
+    }
+
+    @Test
+    public void addOutputsToVF_test() throws UnzipException, IOException {
+        ComponentPage resourceCreatePage;
+        webDriver = DriverFactory.getDriver();
+        homePage = new HomePage(webDriver);
+        // TC - Import VFC with root namespace
+        String fileName = "org.openecomp.resource.VFC-root.yml";
+        CreateVfcFlow createVfcFlow = createVFC(fileName);
+
+        resourceCreatePage = createVfcFlow.getLandedPage().orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a ResourceCreatePage"));
+        resourceCreatePage.isLoaded();
+        resourceCreatePage.certifyComponent();
+        resourceCreatePage.isLoaded();
+
+        Map<String, Object> yamlObject = downloadToscaArtifact(resourceCreatePage);
+        checkMetadata(yamlObject, vfcCreateData);
+        checkNodeTypes(yamlObject);
+
+        homePage = homePage.getTopNavComponent().clickOnHome();
+        homePage.isLoaded();
+
+        // TC - Import hierarchy of VFCs
+        fileName = "org.openecomp.resource.VFC-child.yml";
+        createVfcFlow = createVFC(fileName);
+        resourceCreatePage = createVfcFlow.getLandedPage().orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a ResourceCreatePage"));
+        resourceCreatePage.isLoaded();
+        resourceCreatePage.certifyComponent();
+        resourceCreatePage.isLoaded();
+
+        yamlObject = downloadToscaArtifact(resourceCreatePage);
+        checkMetadata(yamlObject, vfcCreateData);
+        checkNodeTypes(yamlObject);
+
+        homePage = homePage.getTopNavComponent().clickOnHome();
+        homePage.isLoaded();
+
+        // TC - Import VFC with interface inputs
+        // TC - Import VFC with attributes
+        final CreateVfFlow createVfFlow = createVF();
+
+        final AddNodeToCompositionFlow addNodeToCompositionFlow = addNodeToCompositionFlow(resourceCreatePage);
+        final CompositionPage compositionPage = addNodeToCompositionFlow.getLandedPage()
+            .orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a CompositionPage"));
+        compositionPage.isLoaded();
+        resourceCreatePage = compositionPage.goToGeneral();
+        resourceCreatePage.isLoaded();
+
+        final AttributesOutputsPage attributesOutputsPage = resourceCreatePage.goToAttributesOutputs();
+        attributesOutputsPage.isLoaded();
+
+        final ComponentInstance createdComponentInstance = addNodeToCompositionFlow.getCreatedComponentInstance()
+            .orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a ComponentInstance"));
+
+        attributesOutputsPage.clickOnAttributeNavigation(createdComponentInstance.getName());
+        assertTrue(attributesOutputsPage.isAttributePresent("test_1"));
+        attributesOutputsPage.declareOutput("test_1");
+        attributesOutputsPage.clickOnOutputsTab();
+        assertTrue(attributesOutputsPage.isOutputPresent("test_1"));
+
+        attributesOutputsPage.clickOnAttributesTab();
+        assertTrue(attributesOutputsPage.isAttributePresent("test_2"));
+        attributesOutputsPage.declareOutput("test_2");
+        attributesOutputsPage.clickOnOutputsTab();
+        assertTrue(attributesOutputsPage.isOutputPresent("test_2"));
+
+        attributesOutputsPage.clickOnAttributesTab();
+        assertTrue(attributesOutputsPage.isAttributePresent("test_3"));
+        attributesOutputsPage.declareOutput("test_3");
+        attributesOutputsPage.clickOnOutputsTab();
+        assertTrue(attributesOutputsPage.isOutputPresent("test_3"));
+
+        attributesOutputsPage.deleteOutput(createdComponentInstance.getName() + "_test_2");
+        attributesOutputsPage.clickOnAttributesTab();
+        assertTrue(attributesOutputsPage.isAttributePresent("test_2"));
+        attributesOutputsPage.clickOnOutputsTab();
+        assertTrue(attributesOutputsPage.isOutputDeleted("test_2"));
+
+        attributesOutputsPage.clickOnAttributesTab();
+        ExtentTestActions.addScreenshot(Status.INFO, "AttributesTab", "The Attribute's list : ");
+
+        attributesOutputsPage.clickOnOutputsTab();
+        ExtentTestActions.addScreenshot(Status.INFO, "OutputsTab", "The Output's list : ");
+
+        attributesOutputsPage.certifyComponent();
+        attributesOutputsPage.isLoaded();
+
+        yamlObject = downloadToscaArtifact(attributesOutputsPage);
+        checkMetadata(yamlObject, vfCreateData);
+        checkTopologyTemplate(yamlObject);
+
+    }
+
+    private AddNodeToCompositionFlow addNodeToCompositionFlow(final ComponentPage componentPage) {
+        componentPage.isLoaded();
+        final ComponentData parentComponent = new ComponentData();
+        parentComponent.setName(vfCreateData.getName());
+        parentComponent.setVersion("0.1");
+        parentComponent.setComponentType(ComponentType.RESOURCE);
+        final ComponentData componentToAdd = new ComponentData();
+        componentToAdd.setName(vfcCreateData.getName());
+        componentToAdd.setVersion("1.0");
+        componentToAdd.setComponentType(ComponentType.RESOURCE);
+        final AddNodeToCompositionFlow addNodeToCompositionFlow = new AddNodeToCompositionFlow(webDriver, parentComponent, componentToAdd);
+        addNodeToCompositionFlow.run(componentPage.goToComposition());
+        return addNodeToCompositionFlow;
+    }
+
+    private Map<String, Object> downloadToscaArtifact(final ComponentPage resourceCreatePage) throws UnzipException {
+        final DownloadCsarArtifactFlow downloadCsarArtifactFlow = downloadCsarArtifact(resourceCreatePage);
+        final ToscaArtifactsPage toscaArtifactsPage = downloadCsarArtifactFlow.getLandedPage()
+            .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ToscaArtifactsPage"));
+
+        assertThat("No artifact download was found", toscaArtifactsPage.getDownloadedArtifactList(), not(empty()));
+        final String downloadedCsarName = toscaArtifactsPage.getDownloadedArtifactList().get(0);
+        final String downloadFolderPath = getConfig().getDownloadAutomationFolder();
+        final Map<String, byte[]> filesFromZip = FileHandling.getFilesFromZip(downloadFolderPath, downloadedCsarName);
+        final Optional<String> resourceEntryOpt = filesFromZip.keySet().stream()
+            .filter(s -> s.equals("Definitions/" + downloadedCsarName.replace("-csar.csar", "-template.yml")))
+            .findFirst();
+        if (resourceEntryOpt.isEmpty()) {
+            fail("Could not find the resource package in Definitions");
+        }
+        return loadYamlObject(filesFromZip.get(resourceEntryOpt.get()));
+    }
+
+    private Map<String, Object> getMapEntry(final Map<String, Object> yamlObj, final String entryName) {
+        try {
+            return (Map<String, Object>) yamlObj.get(entryName);
+        } catch (final Exception e) {
+            final String errorMsg = String.format("Could not get the '%s' entry.", entryName);
+            fail(errorMsg + "Error message: " + e.getMessage());
+        }
+        return null;
+    }
+
+    private Map<String, Object> loadYamlObject(final byte[] mainDefinitionFileBytes) {
+        return new Yaml().load(new String(mainDefinitionFileBytes));
+    }
+
+    private DownloadCsarArtifactFlow downloadCsarArtifact(final ComponentPage resourceCreatePage) {
+        final DownloadCsarArtifactFlow downloadCsarArtifactFlow = new DownloadCsarArtifactFlow(webDriver);
+        downloadCsarArtifactFlow.setWaitBeforeGetTheFile(5L);
+        downloadCsarArtifactFlow.run(resourceCreatePage);
+        return downloadCsarArtifactFlow;
+    }
+
+    private CreateVfcFlow createVFC(final String fileName) {
+        vfcCreateData = createVfcFormData();
+        final CreateVfcFlow createVfcFlow = new CreateVfcFlow(webDriver, vfcCreateData, filePath + fileName);
+        createVfcFlow.run(homePage);
+        return createVfcFlow;
+    }
+
+    private CreateVfFlow createVF() {
+        vfCreateData = createVfFormData();
+        final CreateVfFlow createVfFlow = new CreateVfFlow(webDriver, vfCreateData);
+        createVfFlow.run(homePage);
+        return createVfFlow;
+    }
+
+    private ResourceCreateData createVfcFormData() {
+        final ResourceCreateData vfcCreateData = new ResourceCreateData();
+        vfcCreateData.setRandomName(ElementFactory.getResourcePrefix() + "-VFC");
+        vfcCreateData.setCategory(ResourceCategoryEnum.NETWORK_L4.getSubCategory());
+        vfcCreateData.setTagList(Arrays.asList(vfcCreateData.getName(), "importVFC"));
+        vfcCreateData.setDescription("aDescription");
+        vfcCreateData.setVendorName("Ericsson");
+        vfcCreateData.setVendorRelease("1.2.3");
+        vfcCreateData.setVendorModelNumber("4.5.6");
+        return vfcCreateData;
+    }
+
+    private ResourceCreateData createVfFormData() {
+        final ResourceCreateData vfCreateData = new ResourceCreateData();
+        vfCreateData.setRandomName(ElementFactory.getResourcePrefix() + "-VF");
+        vfCreateData.setCategory(ResourceCategoryEnum.NETWORK_L4.getSubCategory());
+        vfCreateData.setTagList(Arrays.asList(vfCreateData.getName(), "createVF"));
+        vfCreateData.setDescription("aDescription");
+        vfCreateData.setVendorName("Ericsson");
+        vfCreateData.setVendorRelease("6.5.4");
+        vfCreateData.setVendorModelNumber("3.2.1");
+        return vfCreateData;
+    }
+
+    private void checkMetadata(final Map<String, Object> map, final ResourceCreateData createdData) {
+        final Map<String, Object> metadata = getMapEntry(map, "metadata");
+
+        assertEquals(createdData.getName(), metadata.get("name"));
+        assertEquals(createdData.getDescription(), metadata.get("description"));
+        assertEquals("Network L4+", metadata.get("category"));
+        assertThat((String) metadata.get("type"), not(emptyString()));
+        assertEquals(createdData.getCategory(), metadata.get("subcategory"));
+        assertEquals(createdData.getVendorName(), metadata.get("resourceVendor"));
+        assertEquals(createdData.getVendorRelease(), metadata.get("resourceVendorRelease"));
+        assertEquals(createdData.getVendorModelNumber(), metadata.get("reourceVendorModelNumber"));
+    }
+
+    private void checkNodeTypes(final Map<String, Object> map) {
+        final Map<String, Object> mapEntry = getMapEntry(map, "node_types");
+        final Map<String, Object> nodeTypes = getMapEntry(mapEntry, mapEntry.keySet().iterator().next());
+
+        assertNotNull(nodeTypes);
+        assertEquals("aDescription", nodeTypes.get("description"));
+
+        final Map<String, Object> properties = getMapEntry(nodeTypes, "properties");
+        assertThat(properties, not(anEmptyMap()));
+
+        final Map<String, Object> attributes = getMapEntry(nodeTypes, "attributes");
+        assertThat(attributes, not(anEmptyMap()));
+
+        final Map<String, Object> interfaces = getMapEntry(nodeTypes, "interfaces");
+        assertThat(interfaces, not(anEmptyMap()));
+
+    }
+
+    private void checkTopologyTemplate(final Map<String, Object> map) {
+        final Map<String, Object> mapEntry = getMapEntry(map, "topology_template");
+        assertNotNull(mapEntry);
+
+        final Map<String, Object> inputs = getMapEntry(mapEntry, "inputs");
+        assertThat(inputs, not(anEmptyMap()));
+
+        final Map<String, Object> outputs = getMapEntry(mapEntry, "outputs");
+        assertThat(outputs, not(anEmptyMap()));
+        assertEquals(2, outputs.keySet().stream().filter(s -> (s.contains("_test_1") || s.contains("_test_3")) && !s.contains("_test_2")).count());
+
+        final Map<String, Object> nodeTemplates = getMapEntry(mapEntry, "node_templates");
+        assertThat(nodeTemplates, not(anEmptyMap()));
+
+        final Map<String, Object> substitutionMappings = getMapEntry(mapEntry, "substitution_mappings");
+        assertThat(substitutionMappings, not(anEmptyMap()));
+
+        final Map<String, Object> attributes = getMapEntry(substitutionMappings, "attributes");
+        assertThat(attributes, not(anEmptyMap()));
+        assertEquals(2, attributes.keySet().stream().filter(s -> (s.contains("_test_1") || s.contains("_test_3")) && !s.contains("_test_2")).count());
+
+    }
+}
index bbef8fb..0ab0ae3 100644 (file)
@@ -43,7 +43,7 @@ import org.onap.sdc.frontend.ci.tests.flow.CreateResourceFromVspFlow;
 import org.onap.sdc.frontend.ci.tests.flow.CreateServiceFlow;
 import org.onap.sdc.frontend.ci.tests.flow.CreateVlmFlow;
 import org.onap.sdc.frontend.ci.tests.flow.CreateVspFlow;
-import org.onap.sdc.frontend.ci.tests.flow.DownloadToscaCsarFlow;
+import org.onap.sdc.frontend.ci.tests.flow.DownloadCsarArtifactFlow;
 import org.onap.sdc.frontend.ci.tests.flow.ImportVspFlow;
 import org.onap.sdc.frontend.ci.tests.flow.exception.UiTestFlowRuntimeException;
 import org.onap.sdc.frontend.ci.tests.pages.ComponentPage;
@@ -92,8 +92,8 @@ public class EtsiOnboardVnfCnfUiTests extends SetupCDTest {
      * Runs ETSI onboarding VNF/CNF UI flow
      *
      * @param resourceName VSP name
-     * @param rootFolder VNF/CNF package location
-     * @param vnfCnfFile file to be onboarded
+     * @param rootFolder   VNF/CNF package location
+     * @param vnfCnfFile   file to be onboarded
      */
     private void runOnboardEtsiVnfCnf(final String resourceName, final String rootFolder, final String vnfCnfFile) {
         final CreateVspFlow createVspFlow = new CreateVspFlow(webDriver, resourceName, vnfCnfFile, rootFolder);
@@ -139,7 +139,7 @@ public class EtsiOnboardVnfCnfUiTests extends SetupCDTest {
     }
 
     private void downloadAndVerifyOnboardedPackage(final ComponentPage componentPage) {
-        final DownloadToscaCsarFlow downloadToscaCsarFlow = downloadToscaCsar(componentPage);
+        final DownloadCsarArtifactFlow downloadToscaCsarFlow = downloadToscaCsar(componentPage);
         final ToscaArtifactsPage toscaArtifactsPage = downloadToscaCsarFlow.getLandedPage()
             .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ToscaArtifactsPage"));
         assertThat("No artifact download was found", toscaArtifactsPage.getDownloadedArtifactList(), not(empty()));
@@ -181,7 +181,7 @@ public class EtsiOnboardVnfCnfUiTests extends SetupCDTest {
      */
     private ComponentPage loadComponentPage() {
         final ComponentPage componentPage = Optional.of(new ComponentPage(webDriver))
-               .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ComponentPage"));
+            .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ComponentPage"));
         componentPage.isLoaded();
         return componentPage;
     }
@@ -191,8 +191,8 @@ public class EtsiOnboardVnfCnfUiTests extends SetupCDTest {
      *
      * @return DownloadToscaCsarFlow
      */
-    private DownloadToscaCsarFlow downloadToscaCsar(final ComponentPage componentPage) {
-        final DownloadToscaCsarFlow downloadToscaCsarFlow = new DownloadToscaCsarFlow(webDriver);
+    private DownloadCsarArtifactFlow downloadToscaCsar(final ComponentPage componentPage) {
+        final DownloadCsarArtifactFlow downloadToscaCsarFlow = new DownloadCsarArtifactFlow(webDriver);
         downloadToscaCsarFlow.run(componentPage);
         return downloadToscaCsarFlow;
     }
index 6823c3e..8636101 100644 (file)
@@ -27,6 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.fail;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
@@ -62,20 +63,20 @@ public class ImportVfcUiTest extends SetupCDTest {
     private ResourceCreateData vfCreateData;
 
     @BeforeClass
-    public void beforeClass() {
+    public void beforeClass() throws IOException {
         filePath = FileHandling.getFilePath("VFCs/");
     }
 
     @Test
     public void importVFC_createVF_addVFC2VF_test() throws UnzipException {
+        ComponentPage componentPage;
         webDriver = DriverFactory.getDriver();
         homePage = new HomePage(webDriver);
         // TC - Import VFC with root namespace
         String fileName = "org.openecomp.resource.VFC-root.yml";
         CreateVfcFlow createVfcFlow = createVFC(fileName);
 
-        ComponentPage componentPage = createVfcFlow.getLandedPage()
-            .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
+        componentPage = createVfcFlow.getLandedPage().orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
         componentPage.isLoaded();
         componentPage.certifyComponent();
         componentPage.isLoaded();
@@ -88,7 +89,8 @@ public class ImportVfcUiTest extends SetupCDTest {
         // TC - Import hierarchy of VFCs
         fileName = "org.openecomp.resource.VFC-child.yml";
         createVfcFlow = createVFC(fileName);
-        componentPage = createVfcFlow.getLandedPage().orElseThrow();
+        componentPage = createVfcFlow.getLandedPage().orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
+        componentPage.isLoaded();
         componentPage.certifyComponent();
         componentPage.isLoaded();
 
@@ -100,8 +102,7 @@ public class ImportVfcUiTest extends SetupCDTest {
         // TC - Import VFC with interface inputs
         // TC - Import VFC with attributes
         final CreateVfFlow createVfFlow = createVF();
-        componentPage = createVfFlow.getLandedPage()
-            .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
+        componentPage = createVfFlow.getLandedPage().orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
         componentPage.isLoaded();
 
         final AddNodeToCompositionFlow addNodeToCompositionFlow = addNodeToCompositionFlow(componentPage);
index ee453bf..1acf1e6 100644 (file)
 package org.onap.sdc.frontend.ci.tests.execute.sanity;
 
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.anEmptyMap;
 import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.emptyString;
 import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
 import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
 import com.aventstack.extentreports.Status;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.stream.Collectors;
+import org.onap.sdc.backend.ci.tests.config.Config;
 import org.onap.sdc.backend.ci.tests.data.providers.OnboardingDataProviders;
 import org.onap.sdc.backend.ci.tests.datatypes.enums.ComponentType;
 import org.onap.sdc.backend.ci.tests.datatypes.enums.ResourceCategoryEnum;
@@ -48,9 +56,10 @@ import org.onap.sdc.frontend.ci.tests.execute.setup.SetupCDTest;
 import org.onap.sdc.frontend.ci.tests.flow.AddNodeToCompositionFlow;
 import org.onap.sdc.frontend.ci.tests.flow.CreateVfFlow;
 import org.onap.sdc.frontend.ci.tests.flow.CreateVfcFlow;
-import org.onap.sdc.frontend.ci.tests.flow.DownloadToscaCsarFlow;
+import org.onap.sdc.frontend.ci.tests.flow.DownloadCsarArtifactFlow;
 import org.onap.sdc.frontend.ci.tests.flow.composition.CreateRelationshipFlow;
 import org.onap.sdc.frontend.ci.tests.flow.exception.UiTestFlowRuntimeException;
+import org.onap.sdc.frontend.ci.tests.pages.AttributesOutputsPage;
 import org.onap.sdc.frontend.ci.tests.pages.ComponentPage;
 import org.onap.sdc.frontend.ci.tests.pages.ResourceCreatePage;
 import org.onap.sdc.frontend.ci.tests.pages.TopNavComponent;
@@ -62,6 +71,7 @@ import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openqa.selenium.WebDriver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import org.yaml.snakeyaml.Yaml;
@@ -77,6 +87,7 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
     private ResourceCreateData vfResourceCreateData;
     private ComponentInstance networkFunctionInstance;
     private ComponentInstance networkServiceInstance;
+    private AddNodeToCompositionFlow addNodeToCompositionFlow;
 
     @BeforeMethod
     public void init() {
@@ -103,7 +114,7 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
     @Test(dependsOnMethods = "importAndCertifyVfc")
     public void runServiceDesign() throws UnzipException {
         final CreateVfFlow createVfFlow = createVF();
-        final AddNodeToCompositionFlow addNodeToCompositionFlow = addNodeToCompositionAndCreateRelationship(createVfFlow);
+        addNodeToCompositionFlow = addNodeToCompositionAndCreateRelationship(createVfFlow);
         final CompositionPage compositionPage = addNodeToCompositionFlow.getLandedPage()
             .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return CompositionPage"));
         compositionPage.isLoaded();
@@ -112,6 +123,111 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
         downloadAndVerifyCsarPackage(componentPage);
     }
 
+    @Test(dependsOnMethods = "runServiceDesign")
+    public void addOutputsToVF_test() throws UnzipException, IOException {
+        homePage.isLoaded();
+        final ComponentPage resourceCreatePage = (ComponentPage) homePage.clickOnComponent(vfResourceCreateData.getName());
+        resourceCreatePage.isLoaded();
+
+        final AttributesOutputsPage attributesOutputsPage = resourceCreatePage.goToAttributesOutputs();
+        attributesOutputsPage.isLoaded();
+
+        final ComponentInstance createdComponentInstance = addNodeToCompositionFlow.getCreatedComponentInstance()
+            .orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a ComponentInstance"));
+
+        attributesOutputsPage.clickOnAttributeNavigation(createdComponentInstance.getName());
+        assertTrue(attributesOutputsPage.isAttributePresent("attr_1"));
+        attributesOutputsPage.declareOutput("attr_1");
+        attributesOutputsPage.clickOnOutputsTab();
+        assertTrue(attributesOutputsPage.isOutputPresent("attr_1"));
+
+        attributesOutputsPage.clickOnAttributesTab();
+        assertTrue(attributesOutputsPage.isAttributePresent("attr_2"));
+        attributesOutputsPage.declareOutput("attr_2");
+        attributesOutputsPage.clickOnOutputsTab();
+        assertTrue(attributesOutputsPage.isOutputPresent("attr_2"));
+
+        attributesOutputsPage.clickOnAttributesTab();
+        assertTrue(attributesOutputsPage.isAttributePresent("attr_3"));
+        attributesOutputsPage.declareOutput("attr_3");
+        attributesOutputsPage.clickOnOutputsTab();
+        assertTrue(attributesOutputsPage.isOutputPresent("attr_3"));
+
+        attributesOutputsPage.deleteOutput(createdComponentInstance.getName() + "_attr_2");
+        attributesOutputsPage.clickOnAttributesTab();
+        assertTrue(attributesOutputsPage.isAttributePresent("attr_2"));
+        attributesOutputsPage.clickOnOutputsTab();
+        assertTrue(attributesOutputsPage.isOutputDeleted("attr_2"));
+
+        attributesOutputsPage.clickOnAttributesTab();
+        ExtentTestActions.addScreenshot(Status.INFO, "AttributesTab", "The Attribute's list : ");
+
+        attributesOutputsPage.clickOnOutputsTab();
+        ExtentTestActions.addScreenshot(Status.INFO, "OutputsTab", "The Output's list : ");
+
+        attributesOutputsPage.certifyComponent();
+        attributesOutputsPage.isLoaded();
+
+        Map<String, Object> yamlObject = downloadToscaArtifact(attributesOutputsPage);
+        checkMetadata(yamlObject, vfResourceCreateData);
+        checkTopologyTemplate(yamlObject);
+
+    }
+
+    private void checkMetadata(final Map<String, Object> map, final ResourceCreateData createdData) {
+        final Map<String, Object> metadata = getMapEntry(map, "metadata");
+
+        assertEquals(createdData.getName(), metadata.get("name"));
+        assertEquals(createdData.getDescription(), metadata.get("description"));
+        assertEquals("Generic", metadata.get("category"));
+        assertThat((String) metadata.get("type"), not(emptyString()));
+        assertEquals(createdData.getCategory(), metadata.get("subcategory"));
+        assertEquals(createdData.getVendorName(), metadata.get("resourceVendor"));
+        assertEquals(createdData.getVendorRelease(), metadata.get("resourceVendorRelease"));
+        assertEquals(createdData.getVendorModelNumber(), metadata.get("reourceVendorModelNumber"));
+    }
+
+    private void checkTopologyTemplate(final Map<String, Object> map) {
+        final Map<String, Object> mapEntry = getMapEntry(map, "topology_template");
+        assertNotNull(mapEntry);
+
+        final Map<String, Object> inputs = getMapEntry(mapEntry, "inputs");
+        assertThat(inputs, not(anEmptyMap()));
+
+        final Map<String, Object> outputs = getMapEntry(mapEntry, "outputs");
+        assertThat(outputs, not(anEmptyMap()));
+        assertEquals(2, outputs.keySet().stream().filter(s -> (s.contains("_attr_1") || s.contains("_attr_3")) && !s.contains("_attr_2")).count());
+
+        final Map<String, Object> nodeTemplates = getMapEntry(mapEntry, "node_templates");
+        assertThat(nodeTemplates, not(anEmptyMap()));
+
+        final Map<String, Object> substitutionMappings = getMapEntry(mapEntry, "substitution_mappings");
+        assertThat(substitutionMappings, not(anEmptyMap()));
+
+        final Map<String, Object> attributes = getMapEntry(substitutionMappings, "attributes");
+        assertThat(attributes, not(anEmptyMap()));
+        assertEquals(2, attributes.keySet().stream().filter(s -> (s.contains("_attr_1") || s.contains("_attr_3")) && !s.contains("_attr_2")).count());
+
+    }
+
+    private Map<String, Object> downloadToscaArtifact(final ComponentPage resourceCreatePage) throws UnzipException {
+        final DownloadCsarArtifactFlow downloadCsarArtifactFlow = downloadToscaCsar(resourceCreatePage);
+        final ToscaArtifactsPage toscaArtifactsPage = downloadCsarArtifactFlow.getLandedPage()
+            .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ToscaArtifactsPage"));
+
+        assertThat("No artifact download was found", toscaArtifactsPage.getDownloadedArtifactList(), not(empty()));
+        final String downloadedCsarName = toscaArtifactsPage.getDownloadedArtifactList().get(0);
+        final String downloadFolderPath = getConfig().getDownloadAutomationFolder();
+        final Map<String, byte[]> filesFromZip = FileHandling.getFilesFromZip(downloadFolderPath, downloadedCsarName);
+        final Optional<String> resourceEntryOpt = filesFromZip.keySet().stream()
+            .filter(s -> s.equals("Definitions/" + downloadedCsarName.replace("-csar.csar", "-template.yml")))
+            .findFirst();
+        if (resourceEntryOpt.isEmpty()) {
+            fail("Could not find the resource package in Definitions");
+        }
+        return loadYamlObject(filesFromZip.get(resourceEntryOpt.get()));
+    }
+
     private CreateVfFlow createVF() {
         final ResourceCreateData vfCreateData = createVfFormData();
         final CreateVfFlow createVfFlow = new CreateVfFlow(webDriver, vfCreateData);
@@ -204,11 +320,12 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
 
     /**
      * Creates a DependsOn relationship between the imported VFCs
-     * @param compositionPage Composition Page
+     *
+     * @param compositionPage           Composition Page
      * @param fromComponentInstanceName VFC - Network Function
-     * @param fromCapability Node Capability
-     * @param toComponentInstanceName  VFC - Network Service
-     * @param toRequirement Node Requirement
+     * @param fromCapability            Node Capability
+     * @param toComponentInstanceName   VFC - Network Service
+     * @param toRequirement             Node Requirement
      */
     private void createRelationship(final CompositionPage compositionPage, final String fromComponentInstanceName,
                                     final String fromCapability, final String toComponentInstanceName, final String toRequirement) {
@@ -222,7 +339,7 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
     }
 
     private void downloadAndVerifyCsarPackage(final ComponentPage componentPage) throws UnzipException {
-        final DownloadToscaCsarFlow downloadToscaCsarFlow = downloadToscaCsar(componentPage);
+        final DownloadCsarArtifactFlow downloadToscaCsarFlow = downloadToscaCsar(componentPage);
         final ToscaArtifactsPage toscaArtifactsPage = downloadToscaCsarFlow.getLandedPage()
             .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ToscaArtifactsPage"));
         assertThat("No artifact download was found", toscaArtifactsPage.getDownloadedArtifactList(), not(empty()));
@@ -233,10 +350,11 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
     /**
      * Download the generated package
      *
-     * @return DownloadToscaCsarFlow
+     * @return DownloadCsarArtifactFlow
      */
-    private DownloadToscaCsarFlow downloadToscaCsar(final ComponentPage componentPage) {
-        final DownloadToscaCsarFlow downloadToscaCsarFlow = new DownloadToscaCsarFlow(webDriver);
+    private DownloadCsarArtifactFlow downloadToscaCsar(final ComponentPage componentPage) {
+        final DownloadCsarArtifactFlow downloadToscaCsarFlow = new DownloadCsarArtifactFlow(webDriver);
+        downloadToscaCsarFlow.setWaitBeforeGetTheFile(5);
         downloadToscaCsarFlow.run(componentPage);
         return downloadToscaCsarFlow;
     }
@@ -246,7 +364,7 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
      * the generated service template declared “tosca_simple_yaml_1_3” as its Tosca version,
      * the generated csar contains the node type definitions for the added VFCs in the Definitions directory,
      * the interface template contains the relationship declaration
-     * @param vfResourceName VF created
+     * @param vfResourceName     VF created
      * @param downloadedCsarName download Tosca CSAR filename
      * @throws UnzipException
      */
@@ -255,9 +373,10 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
         final Map<String, byte[]> filesFromZip = FileHandling.getFilesFromZip(downloadFolderPath, downloadedCsarName);
         final String virtualFunctionName = vfResourceName.replace("-", "").toLowerCase();
         final List<String> expectedDefinitionFolderFileList = getExpectedDefinitionFolderFileList(virtualFunctionName);
-        final Map<String, byte[]> expectedFilesFromZipMap = filesFromZip.entrySet().parallelStream().filter(key -> expectedDefinitionFolderFileList.stream()
-            .anyMatch(filename -> filename.equalsIgnoreCase(key.getKey()))).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
-        final String vfResourceTemplateFile = "Definitions/resource-"+ virtualFunctionName +"-template.yml";
+        final Map<String, byte[]> expectedFilesFromZipMap = filesFromZip.entrySet().parallelStream()
+            .filter(key -> expectedDefinitionFolderFileList.stream()
+                .anyMatch(filename -> filename.equalsIgnoreCase(key.getKey()))).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
+        final String vfResourceTemplateFile = "Definitions/resource-" + virtualFunctionName + "-template.yml";
         final String generatedTemplateFile = expectedFilesFromZipMap.keySet().stream()
             .filter(filename -> filename.equalsIgnoreCase(vfResourceTemplateFile)).findFirst()
             .orElseThrow(() -> new UiTestFlowRuntimeException(String.format("Resource template file not found %s", vfResourceTemplateFile)));
@@ -270,7 +389,8 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
     private void verifyGeneratedTemplate(final byte[] generatedTemplateData, final String generatedTemplateFile) {
         final Map<String, Object> templateYamlMap = loadYamlObject(generatedTemplateData);
         final boolean hasToscaDefinitionVersionEntry = templateYamlMap.containsKey("tosca_definitions_version");
-        assertThat(String.format("'%s' should contain tosca_definitions_version entry", generatedTemplateFile), hasToscaDefinitionVersionEntry, is(true));
+        assertThat(String.format("'%s' should contain tosca_definitions_version entry", generatedTemplateFile), hasToscaDefinitionVersionEntry,
+            is(true));
         final String toscaVersion = (String) templateYamlMap.get("tosca_definitions_version");
         assertThat(String.format("'%s' tosca_definitions_version entry should have tosca_simple_yaml_1_3 value", generatedTemplateFile),
             toscaVersion.equalsIgnoreCase("tosca_simple_yaml_1_3"));
@@ -280,12 +400,13 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
         assertThat(String.format("'%s' should contain a node_templates entry", generatedTemplateFile), nodeTemplatesTosca, is(notNullValue()));
         final List<String> nodeTemplateFound = nodeTemplatesTosca.keySet().parallelStream().filter(s -> vfcs.stream()
             .anyMatch(vfc -> s.startsWith(vfc.getName()))).collect(Collectors.toList());
-        assertThat(String.format("'%s' should contain the node type definitions for the added VFCs '%s'", nodeTemplatesTosca, vfcs), nodeTemplateFound, hasSize(vfcs.size()));
+        assertThat(String.format("'%s' should contain the node type definitions for the added VFCs '%s'", nodeTemplatesTosca, vfcs),
+            nodeTemplateFound, hasSize(vfcs.size()));
     }
 
     private void verifyNodesRelationship(final Map<String, byte[]> expectedFilesFromZipMap, final String virtualFunctionName,
                                          final Map<String, byte[]> filesFromZip) {
-        final String vfResourceTemplateFile = "Definitions/resource-"+ virtualFunctionName +"-template-interface.yml";
+        final String vfResourceTemplateFile = "Definitions/resource-" + virtualFunctionName + "-template-interface.yml";
         final String interfaceTemplateFile = expectedFilesFromZipMap.keySet().stream()
             .filter(filename -> filename.equalsIgnoreCase(vfResourceTemplateFile)).findFirst()
             .orElseThrow(() -> new UiTestFlowRuntimeException(String.format("Resource template file not found %s", vfResourceTemplateFile)));
@@ -304,9 +425,9 @@ public class ServiceTemplateDesignUiTests extends SetupCDTest {
 
     private List<String> getExpectedDefinitionFolderFileList(final String vfResourceName) {
         final List<String> expectedDefinitionFolderFileList = new ArrayList<>();
-        vfcs.forEach(vfc -> expectedDefinitionFolderFileList.add("Definitions/resource-"+ vfc.getName() +"-template.yml"));
-        expectedDefinitionFolderFileList.add("Definitions/resource-"+ vfResourceName +"-template.yml");
-        expectedDefinitionFolderFileList.add("Definitions/resource-"+ vfResourceName +"-template-interface.yml");
+        vfcs.forEach(vfc -> expectedDefinitionFolderFileList.add("Definitions/resource-" + vfc.getName() + "-template.yml"));
+        expectedDefinitionFolderFileList.add("Definitions/resource-" + vfResourceName + "-template.yml");
+        expectedDefinitionFolderFileList.add("Definitions/resource-" + vfResourceName + "-template-interface.yml");
         return expectedDefinitionFolderFileList;
     }
 
index b93266e..e4fec34 100644 (file)
@@ -37,6 +37,9 @@ import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.interactions.Actions;
 import org.openqa.selenium.support.ui.FluentWait;
 
+/**
+ * UI Flow for downloading Tosca CSAR from a component
+ */
 public class DownloadCsarArtifactFlow extends AbstractUiTestFlow {
 
     private ToscaArtifactsPage toscaArtifactsPage;
@@ -49,15 +52,18 @@ public class DownloadCsarArtifactFlow extends AbstractUiTestFlow {
 
     @Override
     public Optional<PageObject> run(final PageObject... pageObjects) {
+        extendTest.log(Status.INFO, "Downloading Tosca CSAR generated");
         final ComponentPage componentPage = findParameter(pageObjects, ComponentPage.class);
+        componentPage.isLoaded();
         toscaArtifactsPage = componentPage.goToToscaArtifacts();
         toscaArtifactsPage.isLoaded();
 
         toscaArtifactsPage.clickOnDownload("Tosca Model");
-        final File downloadedCsar = waitAndGetDowloadedCsar();
+        final File downloadedCsar = waitAndGetDownloadedCsar();
         assertThat("The downloaded CSAR should exist", downloadedCsar, is(notNullValue()));
         assertThat("The downloaded CSAR should exist", downloadedCsar.exists(), is(true));
         toscaArtifactsPage.addToDownloadedArtifactList(downloadedCsar.getName());
+        extendTest.log(Status.INFO, "Tosca CSAR was successfully downloaded");
         ExtentTestActions.takeScreenshot(Status.INFO, "tosca-artifact-csar-download", "TOSCA Artifact downloaded");
 
         return Optional.of(toscaArtifactsPage);
@@ -68,7 +74,7 @@ public class DownloadCsarArtifactFlow extends AbstractUiTestFlow {
         return Optional.ofNullable(toscaArtifactsPage);
     }
 
-    private File waitAndGetDowloadedCsar() {
+    private File waitAndGetDownloadedCsar() {
         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);
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/DownloadToscaCsarFlow.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/flow/DownloadToscaCsarFlow.java
deleted file mode 100644 (file)
index f503d4f..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * ============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 com.aventstack.extentreports.Status;
-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.support.ui.FluentWait;
-
-/**
- * UI Flow for downloading Tosca CSAR from a component
- */
-public class DownloadToscaCsarFlow extends AbstractUiTestFlow {
-
-    private ToscaArtifactsPage toscaArtifactsPage;
-
-    public DownloadToscaCsarFlow(final WebDriver webDriver) {
-        super(webDriver);
-    }
-
-    @Override
-    public Optional<PageObject> run(final PageObject... pageObjects) {
-        extendTest.log(Status.INFO, "Downloading Tosca CSAR generated");
-        final ComponentPage componentPage = findParameter(pageObjects, ComponentPage.class);
-        componentPage.isLoaded();
-        toscaArtifactsPage = componentPage.goToToscaArtifacts();
-        toscaArtifactsPage.isLoaded();
-        toscaArtifactsPage.clickOnDownload("Tosca Model");
-
-        final File downloadedCsar = waitAndGetDownloadedCsar();
-        assertThat("The downloaded CSAR should exist", downloadedCsar, is(notNullValue()));
-        assertThat("The downloaded CSAR should exist", downloadedCsar.exists(), is(true));
-        toscaArtifactsPage.addToDownloadedArtifactList(downloadedCsar.getName());
-        extendTest.log(Status.INFO, "Tosca CSAR was successfully downloaded");
-        ExtentTestActions.takeScreenshot(Status.INFO, "tosca-csar-downloaded", "TOSCA CSAR Downloaded");
-        return Optional.of(toscaArtifactsPage);
-    }
-
-    @Override
-    public Optional<ToscaArtifactsPage> getLandedPage() {
-        return Optional.ofNullable(toscaArtifactsPage);
-    }
-
-    private File waitAndGetDownloadedCsar() {
-        final FluentWait<String> fluentWait = new FluentWait<>("")
-            .withTimeout(Duration.ofSeconds(5)).pollingEvery(Duration.ofSeconds(1));
-        fluentWait.until(s -> FileHandling.getLastModifiedFileNameFromDir() != null);
-        return FileHandling.getLastModifiedFileNameFromDir();
-    }
-
-}
index 1ad4706..6c69974 100644 (file)
@@ -23,10 +23,11 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
 
+import com.aventstack.extentreports.Status;
 import java.io.File;
 import java.time.Duration;
 import java.util.Optional;
-
+import lombok.Setter;
 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;
@@ -36,10 +37,6 @@ 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;
@@ -53,7 +50,7 @@ public class DownloadToscaTemplateFlow extends AbstractUiTestFlow {
     @Override
     public Optional<PageObject> run(final PageObject... pageObjects) {
         final ComponentPage componentPage = findParameter(pageObjects, ComponentPage.class);
-        toscaArtifactsPage = (ToscaArtifactsPage) componentPage.goToToscaArtifacts();
+        toscaArtifactsPage = componentPage.goToToscaArtifacts();
         toscaArtifactsPage.isLoaded();
 
         toscaArtifactsPage.clickOnDownload("Tosca Template");
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesOutputsPage.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesOutputsPage.java
new file mode 100644 (file)
index 0000000..1c3bac9
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * ============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 com.aventstack.extentreports.Status;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.onap.sdc.frontend.ci.tests.execute.setup.ExtentTestActions;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionHierarchyComponent;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * Handles the 'Attributes & Outputs' Page UI actions
+ */
+public class AttributesOutputsPage extends ComponentPage {
+
+    private final AttributesTabComponent attributesTabComponent;
+    private final OutputsTabComponent outputsTabComponent;
+    private final CompositionHierarchyComponent compositionHierarchyComponent;
+
+    public AttributesOutputsPage(final WebDriver webDriver) {
+        super(webDriver);
+        attributesTabComponent = new AttributesTabComponent(webDriver);
+        outputsTabComponent = new OutputsTabComponent(webDriver);
+        compositionHierarchyComponent = new CompositionHierarchyComponent(webDriver);
+        setTimeout(5);
+    }
+
+    @Override
+    public void isLoaded() {
+        super.isLoaded();
+        waitForElementVisibility(By.xpath(XpathSelector.MAIN_DIV.getXpath()));
+        waitForElementVisibility(By.xpath(XpathSelector.TITLE_DIV.getXpath()));
+        attributesTabComponent.isLoaded();
+        compositionHierarchyComponent.isLoaded();
+    }
+
+    public void clickOnAttributeNavigation(final String id) {
+        compositionHierarchyComponent.clickOnAttributeNavigation(id);
+        assertTrue(attributesTabComponent.isInstanceSelected(id));
+    }
+
+    /**
+     * Checks if a attribute exists.
+     *
+     * @return true if exists, false if not
+     */
+    public boolean isAttributePresent(final String attributeName) {
+        ExtentTestActions.log(Status.INFO, "Going to check if Attribute '" + attributeName + "' is present");
+        return attributesTabComponent.isAttributePresent(attributeName);
+    }
+
+    /**
+     * Checks if a output exists.
+     *
+     * @return true if exists, false if not
+     */
+    public boolean isOutputPresent(final String outputName) {
+        ExtentTestActions.log(Status.INFO, "Going to check if Output '" + outputName + "' is present");
+        return outputsTabComponent.isOutputPresent(outputName);
+    }
+
+    /**
+     * Checks if a output deleted.
+     *
+     * @return true if deleted, false if not
+     */
+    public boolean isOutputDeleted(final String outputName) {
+        ExtentTestActions.log(Status.INFO, "Going to check if Output '" + outputName + "' deleted");
+        return outputsTabComponent.isOutputDeleted(outputName);
+    }
+
+    public void declareOutput(final String attributeName) {
+        ExtentTestActions.log(Status.INFO, "Going to declare Attribute '" + attributeName + "' as Output");
+        attributesTabComponent.declareOutput(attributeName);
+    }
+
+    public void deleteOutput(final String outputName) {
+        ExtentTestActions.log(Status.INFO, "Going to delete Output '" + outputName + "'");
+        outputsTabComponent.deleteOutput(outputName);
+    }
+
+    public void clickOnOutputsTab() {
+        waitForElementVisibility(By.xpath(XpathSelector.OUTPUTS_TAB.getXpath())).click();
+        outputsTabComponent.isLoaded();
+    }
+
+    public void clickOnAttributesTab() {
+        waitForElementVisibility(By.xpath(XpathSelector.ATTRIBUTES_TAB.getXpath())).click();
+        attributesTabComponent.isLoaded();
+    }
+
+    /**
+     * 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']"),
+        TITLE_DIV("tab-title", "//div[contains(@class,'%s') and contains(text(), 'Attributes & Outputs')]"),
+        ATTRIBUTES_TAB("Attributes", "//*[@data-tests-id='%s']"),
+        OUTPUTS_TAB("Outputs", "//*[@data-tests-id='%s']");
+
+        @Getter
+        private final String id;
+        private final String xpathFormat;
+
+        public String getXpath() {
+            return String.format(xpathFormat, id);
+        }
+
+    }
+
+}
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesTabComponent.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesTabComponent.java
new file mode 100644 (file)
index 0000000..e06d702
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * ============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 lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+/**
+ * Handles the 'Attributes' Tab UI component on 'Attributes & Outputs' Page
+ */
+public class AttributesTabComponent extends AbstractPageObject {
+
+    public AttributesTabComponent(final WebDriver webDriver) {
+        super(webDriver);
+    }
+
+    @Override
+    public void isLoaded() {
+        waitForElementVisibility(By.xpath(XpathSelector.ATTRIBUTES_TABLE.getXpath()));
+        waitForElementInvisibility(By.xpath(XpathSelector.NO_DATA_MESSAGE.getXpath()));
+    }
+
+    public void declareOutput(final String attributeName) {
+        if (attributeName == null) {
+            return;
+        }
+        waitForElementVisibility(By.xpath(XpathSelector.ATTRIBUTES_CHECKBOX.getXpath(attributeName))).click();
+        waitToBeClickable(By.xpath(XpathSelector.DECLARE_OUTPUT_BTN.getXpath())).click();
+        waitForAddedOutputNotification();
+    }
+
+    private void waitForAddedOutputNotification() {
+        waitForElementVisibility(By.xpath(XpathSelector.ADDED_OUTPUT_NOTIFICATION.getXpath()));
+    }
+
+    /**
+     * Checks if a attribute exists.
+     *
+     * @return true if exists, false if not
+     */
+    public boolean isAttributePresent(final String attributeName) {
+        try {
+            waitForElementVisibility(By.xpath(XpathSelector.ATTRIBUTES_CHECKBOX.getXpath(attributeName)));
+        } catch (final Exception ignored) {
+            return false;
+        }
+        return true;
+    }
+
+    public boolean isInstanceSelected(final String id) {
+        final WebElement webElement = waitForElementVisibility(By.xpath(XpathSelector.INSTANCE_SPAN.getXpath()));
+        final String text = webElement.getText();
+        return text.equalsIgnoreCase(id);
+    }
+
+    /**
+     * Enum that contains identifiers and xpath expressions to elements related to the enclosing page object.
+     */
+    @AllArgsConstructor
+    private enum XpathSelector {
+        ATTRIBUTES_TABLE("attributes-table", "//div[contains(@class,'%s')]"),
+        NO_DATA_MESSAGE("no-data", "//div[contains(@class,'%s') and text()='No data to display']"),
+        ATTRIBUTES_CHECKBOX("//checkbox[@data-tests-id='%s']"),
+        DECLARE_OUTPUT_BTN("declare-button declare-output", "//button[@data-tests-id='%s']"),
+        INSTANCE_SPAN("//div[contains(@class,'table-rows-header')]"),
+        ADDED_OUTPUT_NOTIFICATION("tab-indication", "//div[@data-tests-id='Outputs']/div[contains(@class, '%s')]");
+
+        @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 String... xpathParams) {
+            return String.format(xpathFormat, xpathParams);
+        }
+    }
+}
index 3a95a6f..68087f6 100644 (file)
@@ -63,10 +63,9 @@ public class ComponentPage extends AbstractPageObject {
         return resourceLeftSideMenu.clickOnCompositionMenuItem();
     }
 
-    public ResourcePropertiesAssignmentPage goToPropertiesAssignment() {
-        return resourceLeftSideMenu.clickOnPropertiesAssignmentMenuItem();
-    }
-
+    /**
+     * Certifies the resource and wait for success notification.
+     */
     public void certifyComponent() {
         workspaceTopBarComponent.certifyResource();
     }
@@ -88,4 +87,11 @@ public class ComponentPage extends AbstractPageObject {
         return LifeCycleStateEnum.IN_DESIGN.getValue().equalsIgnoreCase(getLifecycleState());
     }
 
+    public AttributesOutputsPage goToAttributesOutputs() {
+        return resourceLeftSideMenu.clickOnAttributesOutputsMenuItem();
+    }
+
+    public ResourcePropertiesAssignmentPage goToPropertiesAssignment() {
+        return resourceLeftSideMenu.clickOnPropertiesAssignmentMenuItem();
+    }
 }
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/OutputsTabComponent.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/OutputsTabComponent.java
new file mode 100644 (file)
index 0000000..4b2b14d
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * ============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 lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * Handles the 'Outputs' Tab UI component on 'Attributes & Outputs' Page
+ */
+public class OutputsTabComponent extends AbstractPageObject {
+
+    public OutputsTabComponent(final WebDriver webDriver) {
+        super(webDriver);
+    }
+
+    @Override
+    public void isLoaded() {
+        waitForElementVisibility(By.xpath(XpathSelector.OUTPUT_ATTRIBUTES_TABLE.getXpath()));
+        waitForElementInvisibility(By.xpath(XpathSelector.NO_DATA_MESSAGE.getXpath()));
+    }
+
+    public void deleteOutput(final String outputName) {
+        if (outputName == null) {
+            return;
+        }
+        waitForElementVisibility(By.xpath(XpathSelector.DELETE_OUTPUT_BTN.getXpath(normalizeOutputName(outputName)))).click();
+        waitToBeClickable(By.xpath(XpathSelector.DELETE_OUTPUT_CONFIRM_BTN.getXpath())).click();
+        waitForElementInvisibility(By.xpath(XpathSelector.OUTPUT_NAME_SPAN.getXpath(normalizeOutputName(outputName))), 5);
+    }
+
+    /**
+     * Checks if a output exists.
+     *
+     * @return true if exists, false if not
+     */
+    public boolean isOutputPresent(final String outputName) {
+        try {
+            waitForElementVisibility(By.xpath(XpathSelector.OUTPUT_NAME_SPAN.getXpath(outputName)));
+        } catch (final Exception ignored) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Checks if a output deleted.
+     *
+     * @return true if deleted, false if not
+     */
+    public boolean isOutputDeleted(final String outputName) {
+        try {
+            findElement(By.xpath(XpathSelector.OUTPUT_NAME_SPAN.getXpath(outputName)));
+        } catch (final Exception ignored) {
+            return true;
+        }
+        return false;
+    }
+
+    private String normalizeOutputName(final String outputName) {
+        return outputName.replaceAll(" ", "").replaceAll("-", "").toLowerCase();
+    }
+
+    /**
+     * Enum that contains identifiers and xpath expressions to elements related to the enclosing page object.
+     */
+    @AllArgsConstructor
+    private enum XpathSelector {
+        DELETE_OUTPUT_BTN("//span[@data-tests-id='delete-%s']"),
+        OUTPUT_ATTRIBUTES_TABLE("output-attributes-table", "//div[contains(@class,'%s')]"),
+        NO_DATA_MESSAGE("no-data", "//div[contains(@class,'%s') and text()='No data to display']"),
+        DELETE_OUTPUT_CONFIRM_BTN("Delete", "//button[@data-tests-id='%s']"),
+        OUTPUT_NAME_SPAN("//span[contains(@class,'attribute-name') and contains(text(), '%s')]");
+
+        @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 String... xpathParams) {
+            return String.format(xpathFormat, xpathParams);
+        }
+    }
+}
index 83641d4..d6e023a 100644 (file)
@@ -23,19 +23,35 @@ import java.util.List;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import org.onap.sdc.frontend.ci.tests.datatypes.ResourceCreateData;
+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.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.Keys;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.ui.Select;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Handles the Resource Create Page UI actions
  */
 public class ResourceCreatePage extends ComponentPage {
 
+    private final LoaderHelper loaderHelper;
+    private final NotificationComponent notificationComponent;
+    private final ResourceWorkspaceTopBarComponent topBarComponent;
+    private final ResourceLeftSideMenu resourceLeftSideMenu;
+
     public ResourceCreatePage(final WebDriver webDriver) {
         super(webDriver);
+        this.loaderHelper = new LoaderHelper(webDriver);
+        this.notificationComponent = new NotificationComponent(webDriver);
+        this.resourceLeftSideMenu = new ResourceLeftSideMenu(webDriver);
+        this.topBarComponent = new ResourceWorkspaceTopBarComponent(webDriver);
         timeoutInSeconds = 5;
     }
 
index c6366b3..9b860d5 100644 (file)
@@ -64,6 +64,16 @@ public class ResourceLeftSideMenu extends AbstractPageObject {
         return new ResourcePropertiesAssignmentPage(webDriver);
     }
 
+    /**
+     * Clicks on the 'Attributes & Outputs' menu item.
+     *
+     * @return the next page object
+     */
+    public AttributesOutputsPage clickOnAttributesOutputsMenuItem() {
+        wrappingElement.findElement(By.xpath(XpathSelector.ATTRIBUTES_OUTPUTS_MENU.getXpath())).click();
+        return new AttributesOutputsPage(webDriver);
+    }
+
     /**
      * Clicks on the TOSCA artifacts menu item.
      *
@@ -96,6 +106,7 @@ public class ResourceLeftSideMenu extends AbstractPageObject {
     private enum XpathSelector {
         MAIN_DIV("w-sdc-left-sidebar", "//div[@class='%s']"),
         PROPERTIES_ASSIGNMENT_MENU("Properties AssignmentLeftSideMenu", "//*[@data-tests-id='%s']"),
+        ATTRIBUTES_OUTPUTS_MENU("Attributes & OutputsLeftSideMenu", "//*[@data-tests-id='%s']"),
         GENERAL_MENU("GeneralLeftSideMenu", "//*[@data-tests-id='%s']"),
         COMPOSITION_MENU("CompositionLeftSideMenu", "//*[@data-tests-id='%s']"),
         TOSCA_ARTIFACTS_MENU("TOSCA ArtifactsLeftSideMenu", "//*[@data-tests-id='%s']");
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/CompositionHierarchyComponent.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/CompositionHierarchyComponent.java
new file mode 100644 (file)
index 0000000..52f395c
--- /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.component.workspace;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.onap.sdc.frontend.ci.tests.pages.AbstractPageObject;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+public class CompositionHierarchyComponent extends AbstractPageObject {
+
+    private WebElement wrappingElement;
+
+    public CompositionHierarchyComponent(final WebDriver webDriver) {
+        super(webDriver);
+    }
+
+    @Override
+    public void isLoaded() {
+        wrappingElement = waitForElementVisibility(By.xpath(XpathSelector.MAIN_ELEMENT.getXpath()));
+        assertNotNull(wrappingElement);
+        wrappingElement.findElement(By.xpath(XpathSelector.COMPOSITION_TAB.getXpath()));
+        wrappingElement.findElement(By.xpath(XpathSelector.STRUCTURE_TAB.getXpath()));
+    }
+
+    public void clickOnAttributeNavigation(final String id) {
+        wrappingElement.findElement(By.xpath(XpathSelector.INSTANCE_SPAN.getXpath(id))).click();
+    }
+
+    /**
+     * Enum that contains identifiers and xpath expressions to elements related to the enclosing page object.
+     */
+    @AllArgsConstructor
+    private enum XpathSelector {
+        MAIN_ELEMENT("right-column", "//div[@class='%s']"),
+        COMPOSITION_TAB("Composition", "//div[contains(@class,'tab') and contains(text(), '%s')]"),
+        STRUCTURE_TAB(" Structure", "//div[contains(@class,'tab') and contains(text(), '%s')]"),
+        SELF_SPAN("SELF", "//span[@data-tests-id='%s']"),
+        INSTANCE_SPAN("//span[@data-tests-id='%s']");
+
+        @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 String... xpathParams) {
+            return String.format(xpathFormat, xpathParams);
+        }
+    }
+
+}
index 8dfc6e8..e7f37fd 100644 (file)
@@ -28,7 +28,7 @@ import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openqa.selenium.WebDriver;
 
 /**
- * Represents the Component (Service, VF, VFC, etc.) Composition Page
+ * Represents the Component (Service, VF, CR, PNF, etc.) Composition Page
  */
 public class CompositionPage extends AbstractPageObject {
 
@@ -57,12 +57,12 @@ public class CompositionPage extends AbstractPageObject {
     }
 
     public ComponentInstance addNodeToServiceCompositionUsingApi(final String serviceName, final String serviceVersion, final String resourceName,
-                                                          final String resourceVersion) {
+                                                                 final String resourceVersion) {
         return compositionCanvasComponent.createNodeOnServiceCanvas(serviceName, serviceVersion, resourceName, resourceVersion);
     }
 
     public ComponentInstance addNodeToResourceCompositionUsingApi(final String serviceName, final String serviceVersion, final String resourceName,
-                                                          final String resourceVersion) {
+                                                                  final String resourceVersion) {
         return compositionCanvasComponent.createNodeOnResourceCanvas(serviceName, serviceVersion, resourceName, resourceVersion);
     }
 
index c0d58e0..73c0bb4 100644 (file)
@@ -21,6 +21,7 @@ package org.onap.sdc.frontend.ci.tests.pages.home;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
+import static org.testng.Assert.assertNotNull;
 
 import java.time.Duration;
 import lombok.AllArgsConstructor;
@@ -120,15 +121,20 @@ public class HomePage extends AbstractPageObject {
     }
 
     public AbstractPageObject clickOnComponent(final String component) {
-        WebElement element = waitForElementVisibility(By.xpath(XpathSelector.COMPONENT.getXpath(component)));
+        final WebElement element = waitForElementVisibility(By.xpath(XpathSelector.COMPONENT.getXpath(component)));
         final WebElement componentTypeDiv = element.findElement(By.xpath("./../../../div[contains(@class, 'sdc-tile-header')]/div"));
         final String text = componentTypeDiv.getText();
         element.click();
-        if ("S".equals(text)) {
-            return new ServiceComponentPage(webDriver);
+        assertNotNull(text);
+        switch (text) {
+            case "S":
+                return new ServiceComponentPage(webDriver);
+            case "VF":
+            case "VFC":
+                return new ResourceCreatePage(webDriver);
+            default:
+                throw new UnsupportedOperationException("Not yet implemented for " + text);
         }
-
-        throw new UnsupportedOperationException("Return not yet implemented for " + text);
     }
 
     private void clickOnAdd(final By locator) {
index 7949abf..125235d 100644 (file)
@@ -10,7 +10,7 @@ node_types:
         type: string
         required: false
     attributes:
-      atttr_1:
+      attr_1:
         type: string
         default: 'Integration Test'
       attr_2:
index cb13708..6098303 100644 (file)
@@ -39,6 +39,7 @@
         <methods>
           <include name="importAndCertifyVfc"/>
           <include name="runServiceDesign"/>
+          <include name="addOutputsToVF_test"/>
         </methods>
       </class>
     </classes>