Block interface operation edit in checkedin VFC
[sdc.git] / integration-tests / src / test / java / org / onap / sdc / frontend / ci / tests / execute / sanity / ImportVfcUiTest.java
index a571c1b..ba4b6d7 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.not;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 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.util.Arrays;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import org.apache.commons.collections.MapUtils;
 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.ModelName;
 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;
@@ -45,14 +48,20 @@ 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.GoToInterfaceDefinitionPageFlow;
 import org.onap.sdc.frontend.ci.tests.flow.exception.UiTestFlowRuntimeException;
+import org.onap.sdc.frontend.ci.tests.pages.AttributeModal;
+import org.onap.sdc.frontend.ci.tests.pages.AttributesPage;
 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.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.CompositionInformationTab;
-import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionInterfaceOperationsModal;
 import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionInterfaceOperationsTab;
 import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionPage;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.InterfaceDefinitionOperationsModal;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.InterfaceDefinitionOperationsModal.InterfaceOperationsData.InputData;
+import org.onap.sdc.frontend.ci.tests.pages.component.workspace.InterfaceDefinitionPage;
 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;
@@ -69,20 +78,22 @@ public class ImportVfcUiTest extends SetupCDTest {
     private HomePage homePage;
     private ResourceCreateData vfcCreateData;
     private ResourceCreateData vfCreateData;
+    private ComponentInstance createdComponentInstance;
+    private final String vfcCategory = ResourceCategoryEnum.NETWORK_L4.getSubCategory();
 
     @BeforeClass
     public void beforeClass() {
         filePath = FileHandling.getFilePath("VFCs/");
+        webDriver = DriverFactory.getDriver();
+        homePage = new HomePage(webDriver);
     }
 
     @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);
+        CreateVfcFlow createVfcFlow = createVFC(fileName, ModelName.DEFAULT_MODEL_NAME.getName(), vfcCategory);
 
         componentPage = createVfcFlow.getLandedPage().orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
         componentPage.isLoaded();
@@ -96,16 +107,22 @@ public class ImportVfcUiTest extends SetupCDTest {
 
         // TC - Import hierarchy of VFCs
         fileName = "org.openecomp.resource.VFC-child.yml";
-        createVfcFlow = createVFC(fileName);
-        componentPage = createVfcFlow.getLandedPage()
-            .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
+        createVfcFlow = createVFC(fileName, ModelName.DEFAULT_MODEL_NAME.getName(), vfcCategory);
+        componentPage = createVfcFlow.getLandedPage().orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
+        componentPage.isLoaded();
+
+        componentPage = manageAttributes(componentPage);
         componentPage.isLoaded();
         componentPage.certifyComponent();
         componentPage.isLoaded();
 
-        yamlObject = downloadToscaArtifact(createVfcFlow.getLandedPage().get());
+        yamlObject = downloadToscaArtifact(componentPage);
         checkMetadata(yamlObject, vfcCreateData);
         checkNodeTypes(yamlObject);
+
+        componentPage = viewInterfaceDefinitionFromVFC(componentPage);
+        componentPage.isLoaded();
+
         homePage.getTopNavComponent().clickOnHome();
 
         // TC - Import VFC with interface inputs
@@ -126,6 +143,67 @@ public class ImportVfcUiTest extends SetupCDTest {
 
     }
 
+    private ComponentPage viewInterfaceDefinitionFromVFC(final ComponentPage componentPage) {
+        final GoToInterfaceDefinitionPageFlow goToInterfaceDefinitionPageFlow = new GoToInterfaceDefinitionPageFlow(webDriver);
+        goToInterfaceDefinitionPageFlow.run(componentPage);
+        final InterfaceDefinitionPage interfaceDefinitionPage = goToInterfaceDefinitionPageFlow.getLandedPage()
+            .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return InterfaceDefinitionPage"));
+        final var operationName = "create";
+        assertTrue(interfaceDefinitionPage.isInterfaceDefinitionOperationPresent(operationName));
+        final InterfaceDefinitionOperationsModal interfaceDefinitionOperationsModal =
+            interfaceDefinitionPage.clickOnInterfaceDefinitionOperation(operationName);
+        interfaceDefinitionOperationsModal.isLoaded(true);
+        ExtentTestActions
+            .takeScreenshot(Status.INFO, "clickOnOInterfaceOperation", "Interface Definition Operation Modal opened");
+        checkInterfaceDefinitionData(interfaceDefinitionOperationsModal);
+        interfaceDefinitionOperationsModal.clickOnCancel();
+        return interfaceDefinitionPage;
+    }
+
+    @Test
+    public void importVfcWithModel() {
+        final String fileName = "VFC-For-Model.yaml";
+        final CreateVfcFlow createVfcFlow = createVFC(fileName, ModelName.ETSI_SOL001_v2_5_1.getName(), vfcCategory);
+        final ComponentPage componentPage = createVfcFlow.getLandedPage()
+            .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
+        componentPage.isLoaded();
+        componentPage.certifyComponent();
+        componentPage.isLoaded();
+    }
+
+    private void checkInterfaceDefinitionData(final InterfaceDefinitionOperationsModal interfaceDefinitionOperationsModal) {
+        assertTrue(interfaceDefinitionOperationsModal.getDescription().isEmpty());
+        assertEquals("path/to/my/implementation.sh", interfaceDefinitionOperationsModal.getImplementationName());
+        final List<InputData> inputList = interfaceDefinitionOperationsModal.getInputs();
+        assertTrue(inputList.stream().anyMatch(inputData -> "first".equals(inputData.getName())), "Input of name 'first' expected");
+    }
+
+    private ComponentPage manageAttributes(final ComponentPage componentPage) {
+        final AttributesPage attributesPage = componentPage.goToAttributes();
+        attributesPage.isLoaded();
+
+        assertTrue(attributesPage.isAttributePresent("test_1"));
+        assertTrue(attributesPage.isAttributePresent("test_2"));
+        assertTrue(attributesPage.isAttributePresent("test_3"));
+        assertTrue(attributesPage.isAttributePresent("test_4"));
+
+        attributesPage.deleteAttribute("test_2");
+        assertFalse(attributesPage.isAttributePresent("test_2"));
+        ExtentTestActions.takeScreenshot(Status.INFO, "attributesPage.deleteAttribute", "Attribute 'test_2' successfully deleted");
+        attributesPage.addAttribute(new AttributeModal.AttributeData("test_9", "Additional attribute added from UI", "string", "one More Attribute"));
+        attributesPage.isLoaded();
+        assertTrue(attributesPage.isAttributePresent("test_9"));
+        ExtentTestActions.takeScreenshot(Status.INFO, "attributesPage.addAttribute", "Additional Attribute 'test_9' successfully added");
+
+        attributesPage.editAttribute(new AttributeModal.AttributeData("test_9", "Additional attribute added from UI".toUpperCase(), "string",
+            "one More Attribute".toUpperCase()));
+        attributesPage.isLoaded();
+        assertTrue(attributesPage.isAttributePresent("test_9"));
+        ExtentTestActions.takeScreenshot(Status.INFO, "attributesPage.editAttribute", "Additional Attribute 'test_9' successfully altered");
+
+        return attributesPage.clickOnGeneralMenuItem(ResourceCreatePage.class);
+    }
+
     private CompositionPage addInterfaceOperations(final ComponentPage componentPage) {
         final AddNodeToCompositionFlow addNodeToCompositionFlow = addNodeToCompositionFlow(componentPage);
         final CompositionPage compositionPage = addNodeToCompositionFlow.getLandedPage()
@@ -133,7 +211,7 @@ public class ImportVfcUiTest extends SetupCDTest {
         final CompositionDetailSideBarComponent detailSideBar = compositionPage.getDetailSideBar();
         detailSideBar.isLoaded();
 
-        final ComponentInstance createdComponentInstance = addNodeToCompositionFlow.getCreatedComponentInstance()
+        createdComponentInstance = addNodeToCompositionFlow.getCreatedComponentInstance()
             .orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a ComponentInstance"));
 
         compositionPage.selectNode(createdComponentInstance.getName());
@@ -143,17 +221,22 @@ public class ImportVfcUiTest extends SetupCDTest {
         compositionInterfaceOperationsTab.isLoaded();
         ExtentTestActions.takeScreenshot(Status.INFO, "compositionInterfaceOperationsTab", "Composition Interface Operations Tab opened");
         assertTrue(compositionInterfaceOperationsTab.isOperationPresent("create"));
-        CompositionInterfaceOperationsModal compositionInterfaceOperationsModal = compositionInterfaceOperationsTab.clickOnOperation("create");
+        InterfaceDefinitionOperationsModal compositionInterfaceOperationsModal = compositionInterfaceOperationsTab.clickOnOperation("create");
         compositionInterfaceOperationsModal.isLoaded();
         ExtentTestActions
             .takeScreenshot(Status.INFO, "compositionInterfaceOperationsTab.clickOnOperation", "Composition Interface Operations Modal opened");
-        compositionInterfaceOperationsModal.clickOnDelete();
+        compositionInterfaceOperationsModal.deleteInput("first");
         ExtentTestActions.takeScreenshot(Status.INFO, "compositionInterfaceOperationsModal.clickOnDelete", "Input deleted");
-        compositionInterfaceOperationsModal.addInput();
-        ExtentTestActions.takeScreenshot(Status.INFO, "compositionInterfaceOperationsModal.addInput", "Adding Input");
 
-        final CompositionInterfaceOperationsModal.InterfaceOperationsData interfaceOperationsData = new CompositionInterfaceOperationsModal.InterfaceOperationsData
-            ("This is CREATE operation", "fullPath/to/my/newImplementation.sh", "second", "9876");
+        List<InputData> inputDataList = List.of(
+            new InputData("stringInput", "string", "1"),
+            new InputData("booleanInput", "boolean", true),
+            new InputData("integerInput", "integer", 1)
+        );
+        final InterfaceDefinitionOperationsModal.InterfaceOperationsData interfaceOperationsData =
+            new InterfaceDefinitionOperationsModal.InterfaceOperationsData(
+                "This is CREATE operation", "fullPath/to/my/newImplementation.sh", inputDataList
+            );
         compositionInterfaceOperationsModal.updateInterfaceOperation(interfaceOperationsData);
         compositionInterfaceOperationsTab.isLoaded();
 
@@ -233,8 +316,8 @@ public class ImportVfcUiTest extends SetupCDTest {
         return downloadCsarArtifactFlow;
     }
 
-    private CreateVfcFlow createVFC(final String fileName) {
-        vfcCreateData = createVfcFormData();
+    private CreateVfcFlow createVFC(final String fileName, final String model, final String category) {
+        vfcCreateData = createVfcFormData(model, category);
         final CreateVfcFlow createVfcFlow = new CreateVfcFlow(webDriver, vfcCreateData, filePath + fileName);
         createVfcFlow.run(homePage);
         return createVfcFlow;
@@ -247,10 +330,11 @@ public class ImportVfcUiTest extends SetupCDTest {
         return createVfFlow;
     }
 
-    private ResourceCreateData createVfcFormData() {
+    private ResourceCreateData createVfcFormData(final String model, final String category) {
         final ResourceCreateData vfcCreateData = new ResourceCreateData();
         vfcCreateData.setRandomName(ElementFactory.getResourcePrefix() + "-VFC");
-        vfcCreateData.setCategory(ResourceCategoryEnum.NETWORK_L4.getSubCategory());
+        vfcCreateData.setModel(model);
+        vfcCreateData.setCategory(category);
         vfcCreateData.setTagList(Arrays.asList(vfcCreateData.getName(), "importVFC"));
         vfcCreateData.setDescription("aDescription");
         vfcCreateData.setVendorName("Ericsson");
@@ -288,40 +372,49 @@ public class ImportVfcUiTest extends SetupCDTest {
         final Map<String, Object> mapEntry = getMapEntry(map, "node_types");
         final Map<String, Object> nodeTypes = getMapEntry(mapEntry, mapEntry.keySet().iterator().next());
 
-        assertNotNull(nodeTypes);
+        assertFalse(MapUtils.isEmpty(nodeTypes));
         assertEquals("aDescription", nodeTypes.get("description"));
 
         final Map<String, Object> properties = getMapEntry(nodeTypes, "properties");
-        assertThat(properties, not(anEmptyMap()));
+        assertFalse(MapUtils.isEmpty(properties));
 
         final Map<String, Object> attributes = getMapEntry(nodeTypes, "attributes");
-        assertThat(attributes, not(anEmptyMap()));
+        assertFalse(MapUtils.isEmpty(attributes));
 
         final Map<String, Object> interfaces = getMapEntry(nodeTypes, "interfaces");
-        assertThat(interfaces, not(anEmptyMap()));
+        assertFalse(MapUtils.isEmpty(interfaces));
 
     }
 
     private void checkTopologyTemplate(final Map<String, Object> map) {
-        final Map<String, Object> mapEntry = getMapEntry(map, "topology_template");
-        assertNotNull(mapEntry);
+        final Map<String, Object> topologyTemplate = getMapEntry(map, "topology_template");
+        assertNotNull(topologyTemplate);
+
+        final Map<String, Object> inputs = getMapEntry(topologyTemplate, "inputs");
+        assertFalse(MapUtils.isEmpty(inputs));
 
-        final Map<String, Object> properties = getMapEntry(mapEntry, "inputs");
-        assertThat(properties, not(anEmptyMap()));
+        final Map<String, Object> nodeTemplates = getMapEntry(topologyTemplate, "node_templates");
+        assertFalse(MapUtils.isEmpty(nodeTemplates));
 
-        final Map<String, Object> attributes = getMapEntry(mapEntry, "node_templates");
-        assertThat(attributes, not(anEmptyMap()));
+        final Map<String, Object> attributes = getMapEntry((Map<String, Object>) nodeTemplates.get(createdComponentInstance.getName()), "attributes");
+        assertFalse(MapUtils.isEmpty(attributes));
+        assertEquals(4, attributes.keySet().stream()
+            .filter(s -> (s.contains("test_1") || s.contains("test_3") || s.contains("test_4") || s.contains("test_9")) && !s.contains("test_2"))
+            .count());
 
-        final Map<String, Object> interfaces = getMapEntry(mapEntry, "substitution_mappings");
-        assertThat(interfaces, not(anEmptyMap()));
+        final Map<String, Object> substitutionMappings = getMapEntry(topologyTemplate, "substitution_mappings");
+        assertFalse(MapUtils.isEmpty(substitutionMappings));
 
     }
 
-    private void checkCompositionInterfaceOperations(final CompositionInterfaceOperationsModal compositionInterfaceOperationsModal,
-                                                     final CompositionInterfaceOperationsModal.InterfaceOperationsData interfaceOperationsData) {
+    private void checkCompositionInterfaceOperations(final InterfaceDefinitionOperationsModal compositionInterfaceOperationsModal,
+                                                     final InterfaceDefinitionOperationsModal.InterfaceOperationsData interfaceOperationsData) {
         assertEquals(interfaceOperationsData.getDescription(), compositionInterfaceOperationsModal.getDescription());
         assertEquals(interfaceOperationsData.getImplementationName(), compositionInterfaceOperationsModal.getImplementationName());
-        assertEquals(interfaceOperationsData.getInputName(), compositionInterfaceOperationsModal.getInputName());
-        assertEquals(interfaceOperationsData.getInputValue(), compositionInterfaceOperationsModal.getInputValue());
+        interfaceOperationsData.getInputList().forEach(inputData -> {
+            final boolean hasInput = compositionInterfaceOperationsModal.getInputs().stream()
+                .anyMatch(inputData1 -> inputData1.getName().equals(inputData.getName()));
+            assertTrue(hasInput, String.format("Expecting input '%s'", inputData.getName()));
+        });
     }
 }