diff options
Diffstat (limited to 'integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component')
3 files changed, 355 insertions, 39 deletions
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceDefinitionOperationsModal.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceDefinitionOperationsModal.java index c8af405411..5a2cb2f5d5 100644 --- a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceDefinitionOperationsModal.java +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceDefinitionOperationsModal.java @@ -21,10 +21,12 @@ package org.onap.sdc.frontend.ci.tests.pages.component.workspace; import com.aventstack.extentreports.Status; import java.time.Duration; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import org.onap.sdc.frontend.ci.tests.execute.setup.ExtentTestActions; import org.onap.sdc.frontend.ci.tests.pages.AbstractPageObject; +import org.onap.sdc.frontend.ci.tests.pages.component.workspace.InterfaceDefinitionOperationsModal.InterfaceOperationsData.InputData; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -35,23 +37,33 @@ import org.openqa.selenium.interactions.Actions; */ public class InterfaceDefinitionOperationsModal extends AbstractPageObject { + private InterfaceOperationInputListComponent inputListComponent; + private InterfaceOperationAddInputComponent addInputComponent; + public InterfaceDefinitionOperationsModal(final WebDriver webDriver) { super(webDriver); } @Override public void isLoaded() { + isLoaded(false); + } + + public void isLoaded(boolean isInViewMode) { waitForElementVisibility(By.xpath(XpathSelector.TITLE_SPAN.getXPath())); waitForElementVisibility(By.xpath(XpathSelector.INTERFACE_NAME_LABEL.getXPath())); waitForElementVisibility(By.xpath(XpathSelector.OPERATION_NAME_LABEL.getXPath())); - waitForElementVisibility(By.xpath(XpathSelector.INPUT_NAME_SPAN.getXPath())); - waitForElementVisibility(By.xpath(XpathSelector.INPUT_VALUE_SPAN.getXPath())); - waitForElementVisibility(By.xpath(XpathSelector.ADD_INPUT_BTN.getXPath())); waitForElementVisibility(By.xpath(XpathSelector.SAVE_BTN.getXPath())); waitToBeClickable(By.xpath(XpathSelector.CANCEL_BTN.getXPath())); + this.inputListComponent = new InterfaceOperationInputListComponent(webDriver); + this.inputListComponent.isLoaded(); + if (!isInViewMode) { + this.addInputComponent = new InterfaceOperationAddInputComponent(webDriver); + this.addInputComponent.isLoaded(); + } } - public void clickOnSave() { + private void clickOnSave() { waitToBeClickable(By.xpath(XpathSelector.SAVE_BTN.getXPath())).click(); } @@ -63,11 +75,26 @@ public class InterfaceDefinitionOperationsModal extends AbstractPageObject { waitToBeClickable(By.xpath(XpathSelector.DELETE_BTN.getXPath())).click(); } + public void deleteInput(String inputName) { + inputListComponent.loadInputList(); + inputListComponent.deleteInput(inputName); + } + public void updateInterfaceOperation(final InterfaceOperationsData interfaceOperationsData) { fillDescription(interfaceOperationsData.getDescription()); fillImplementationName(interfaceOperationsData.getImplementationName()); - fillInputName(interfaceOperationsData.getInputName()); - fillInputValue(interfaceOperationsData.getInputValue()); + interfaceOperationsData.getInputList().forEach(inputData -> { + final InterfaceOperationAddInputComponent addInputComponent = new InterfaceOperationAddInputComponent(webDriver); + addInputComponent.isLoaded(); + addInputComponent.clickOnAddInputLink(); + addInputComponent.fillInput(inputData); + addInputComponent.clickOnAddButton(); + ExtentTestActions.takeScreenshot(Status.INFO, + "compositionInterfaceOperationsModal.addInput." + inputData.getName(), + String.format("Input '%s' added", inputData.getName()) + ); + addInputComponent.fillValue(inputData); + }); clickOnSave(); //there is no feedback from the UI to check if the update was successful. Forcing a wait time trying to guarantee that, // although time is never a guarantee in this case. @@ -82,14 +109,6 @@ public class InterfaceDefinitionOperationsModal extends AbstractPageObject { setInputField(By.xpath(XpathSelector.INTERFACE_OPERATION_IMPLEMENTATION_NAME_INPUT.getXPath()), implementationName); } - private void fillInputName(final String inputName) { - setInputField(By.xpath(XpathSelector.FIELD_INPUT_NAME_INPUT.getXPath()), inputName); - } - - private void fillInputValue(final String inputValue) { - setInputField(By.xpath(XpathSelector.FIELD_INPUT_VALUE_INPUT.getXPath()), inputValue); - } - private void setInputField(final By locator, final String value) { if (value == null) { return; @@ -97,11 +116,12 @@ public class InterfaceDefinitionOperationsModal extends AbstractPageObject { final WebElement webElement = findElement(locator); webElement.clear(); webElement.sendKeys(value); + ExtentTestActions.takeScreenshot(Status.INFO, value, value); } - public void addInput() { - waitToBeClickable(By.xpath(XpathSelector.ADD_INPUT_BTN.getXPath())).click(); + public void clickOnAddInput() { + addInputComponent.clickOnAddInputLink(); } public String getDescription() { @@ -112,42 +132,44 @@ public class InterfaceDefinitionOperationsModal extends AbstractPageObject { return findElement(By.xpath(XpathSelector.INTERFACE_OPERATION_IMPLEMENTATION_NAME_INPUT.getXPath())).getAttribute("value"); } - public String getInputName() { - return findElement(By.xpath(XpathSelector.FIELD_INPUT_NAME_INPUT.getXPath())).getAttribute("value"); - } - - public String getInputValue() { - return findElement(By.xpath(XpathSelector.FIELD_INPUT_VALUE_INPUT.getXPath())).getAttribute("value"); - } - - @Getter - @AllArgsConstructor - public static class InterfaceOperationsData { - - private final String description; - private final String implementationName; - private final String inputName; - private final String inputValue; + public List<InputData> getInputs() { + inputListComponent.loadInputList(); + return inputListComponent.getInputList(); } @AllArgsConstructor private enum XpathSelector { TITLE_SPAN("//span[@class='title' and contains(text(), 'Edit Operation')]"), - ADD_INPUT_BTN("//a[contains(@class,'add-param-link add-btn') and contains(text(), 'Add Input')]"), DELETE_BTN("//svg-icon[@name='trash-o']"), SAVE_BTN("//button[@data-tests-id='Save']"), CANCEL_BTN("//button[@data-tests-id='Cancel']"), INTERFACE_NAME_LABEL("//label[contains(@class,'sdc-input') and contains(text(), 'Interface Name')]"), OPERATION_NAME_LABEL("//label[contains(@class,'sdc-input') and contains(text(), 'Operation Name')]"), INTERFACE_OPERATION_DESCRIPTION_INPUT("//input[@data-tests-id='interface-operation-description']"), - INTERFACE_OPERATION_IMPLEMENTATION_NAME_INPUT("//input[@data-tests-id='interface-operation-implementation-name']"), - INPUT_NAME_SPAN("//span[contains(@class,'field-input-name') and contains(text(), 'Name')]"), - INPUT_VALUE_SPAN("//span[contains(@class,'field-input-value') and contains(text(), 'Value')]"), - FIELD_INPUT_NAME_INPUT("//input[@data-tests-id='interface-operation-input-name']"), - FIELD_INPUT_VALUE_INPUT("//input[@data-tests-id='interface-operation-input-value']"); + INTERFACE_OPERATION_IMPLEMENTATION_NAME_INPUT("//input[@data-tests-id='interface-operation-implementation-name']"); - @Getter private final String xPath; + public String getXPath(final String... xpathParams) { + return String.format(xPath, xpathParams); + } + } + + @Getter + @AllArgsConstructor + public static class InterfaceOperationsData { + + private final String description; + private final String implementationName; + private final List<InputData> inputList; + + @Getter + @AllArgsConstructor + public static class InputData { + + private final String name; + private final String type; + private final Object value; + } } } diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceOperationAddInputComponent.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceOperationAddInputComponent.java new file mode 100644 index 0000000000..f28d98d3c7 --- /dev/null +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceOperationAddInputComponent.java @@ -0,0 +1,134 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 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 lombok.AllArgsConstructor; +import org.onap.sdc.frontend.ci.tests.pages.AbstractPageObject; +import org.onap.sdc.frontend.ci.tests.pages.component.workspace.InterfaceDefinitionOperationsModal.InterfaceOperationsData.InputData; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +/** + * Handles the add input inside the interface operation modal. + * + * @see "catalog-ui app-add-input component" + */ +public class InterfaceOperationAddInputComponent extends AbstractPageObject { + + public InterfaceOperationAddInputComponent(final WebDriver webDriver) { + super(webDriver); + } + + @Override + public void isLoaded() { + waitForElementVisibility(XpathSelector.ADD_INPUT_LINK.getXPath()); + } + + /** + * Clicks on the add input link, that opens the add input form. + */ + public void clickOnAddInputLink() { + waitToBeClickable(By.xpath(XpathSelector.ADD_INPUT_LINK.getXPath())).click(); + waitForElementVisibility(XpathSelector.NAME_INPUT.getXPath()); + waitForElementVisibility(XpathSelector.TYPE_INPUT.getXPath()); + waitForElementVisibility(XpathSelector.ADD_BTN.getXPath()); + waitForElementVisibility(XpathSelector.CANCEL_BTN.getXPath()); + } + + /** + * Clicks on the add button that submits the input form. + */ + public void clickOnAddButton() { + waitToBeClickable(By.xpath(XpathSelector.ADD_BTN.getXPath())).click(); + } + + /** + * Fills the input form fields with the given data. + * + * @param inputData the input information + */ + public void fillInput(final InputData inputData) { + fillName(inputData.getName()); + fillType(inputData.getType()); + } + + /** + * Fills an input value, in the input list, based on the given input data. + * + * @param inputData the input information + */ + public void fillValue(final InputData inputData) { + var interfaceOperationInputListComponent = new InterfaceOperationInputListComponent(webDriver); + interfaceOperationInputListComponent.isLoaded(); + interfaceOperationInputListComponent.fillInputValue(inputData.getName(), inputData.getValue()); + } + + /** + * Fills the input name field. + * + * @param name the name to fill + */ + public void fillName(final String name) { + setInputValue(By.xpath(XpathSelector.NAME_INPUT.getXPath()), name); + } + + /** + * Fills the input type field. + * + * @param type the type to fill + */ + public void fillType(final String type) { + final WebElement inputElement = findElement(By.xpath(XpathSelector.TYPE_INPUT.getXPath())); + inputElement.click(); + waitForElementVisibility(By.xpath(XpathSelector.DROPDOWN_RESULTS.getXPath())); + inputElement.sendKeys(type); + waitForElementVisibility(By.xpath(XpathSelector.DROPDOWN_OPTION.getXPath(type))).click(); + } + + private void setInputValue(final By locator, final String value) { + if (value == null) { + return; + } + + final WebElement webElement = findElement(locator); + webElement.clear(); + webElement.sendKeys(value); + } + + @AllArgsConstructor + private enum XpathSelector { + ADD_INPUT_LINK("//a[@data-tests-id='add-input.add-input-link']"), + NAME_INPUT("//input[@data-tests-id='add-input.input-name']"), + TYPE_INPUT("//input[starts-with(@data-tests-id, 'add-input.input-type')]"), + ADD_BTN("//button[@data-tests-id='add-input.add-input-btn']"), + CANCEL_BTN("//button[@data-tests-id='add-input.cancel-btn']"), + DROPDOWN_RESULTS("//dropdown-results"), + DROPDOWN_OPTION("//li[@data-tests-id='%s']"); + + private final String xPath; + + public String getXPath(final String... xpathParams) { + return String.format(xPath, xpathParams); + } + } +} diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceOperationInputListComponent.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceOperationInputListComponent.java new file mode 100644 index 0000000000..c023401deb --- /dev/null +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceOperationInputListComponent.java @@ -0,0 +1,160 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 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.assertTrue; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import lombok.AllArgsConstructor; +import org.onap.sdc.frontend.ci.tests.pages.AbstractPageObject; +import org.onap.sdc.frontend.ci.tests.pages.component.workspace.InterfaceDefinitionOperationsModal.InterfaceOperationsData.InputData; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +/** + * Handles the input list inside the interface operation modal. + * + * @see "catalog-ui app-input-list and app-input-list-item ui components" + */ +public class InterfaceOperationInputListComponent extends AbstractPageObject { + + private WebElement wrappingElement; + private List<WebElement> inputList = new ArrayList<>(); + + public InterfaceOperationInputListComponent(final WebDriver webDriver) { + super(webDriver); + } + + @Override + public void isLoaded() { + this.wrappingElement = waitForElementVisibility(XpathSelector.WRAPPING_ELEMENT.getXPath()); + loadInputList(); + } + + /** + * Loads the input list + */ + public void loadInputList() { + this.inputList = findSubElements(wrappingElement, XpathSelector.INPUT_LIST.getXPath()); + } + + /** + * Fill an input value. + * + * @param inputName the input name + * @param value the value + */ + public void fillInputValue(final String inputName, final Object value) { + if (value == null) { + return; + } + if (value instanceof String || value instanceof Integer || value instanceof Boolean) { + fillSimpleValue(inputName, String.valueOf(value)); + return; + } + throw new UnsupportedOperationException("Set input value not yet implemented for value type: " + value.getClass().getName()); + } + + /** + * Expands or retracts an input in the input list. + * + * @param name the input name + */ + public void toggleInputExpansion(final String name) { + final Optional<WebElement> inputOpt = findInput(name); + final By expandIconSelector = By.xpath(XpathSelector.EXPAND_ICON.getXPath()); + inputOpt.ifPresent(webElement -> + webElement.findElement(expandIconSelector).click() + ); + } + + /** + * Deletes an input from the input list. + * + * @param name the name of the input to delete + */ + public void deleteInput(final String name) { + final Optional<WebElement> inputOpt = findInput(name); + final By deleteIconSelector = By.xpath(XpathSelector.DELETE_ICON.getXPath()); + inputOpt.ifPresent(webElement -> + webElement.findElement(deleteIconSelector).click() + ); + loadInputList(); + assertTrue(findInput(name).isEmpty()); + } + + public List<InputData> getInputList() { + if (inputList.isEmpty()) { + return Collections.emptyList(); + } + final List<InputData> inputDataList = new ArrayList<>(); + final By inputLabelSelector = By.xpath(XpathSelector.INPUT_LABEL.getXPath()); + final By inputTypeSelector = By.xpath(XpathSelector.INPUT_TYPE.getXPath()); + inputList.forEach(inputWebElement -> { + String inputLabel = inputWebElement.findElement(inputLabelSelector).getText(); + inputLabel = inputLabel.substring(0, inputLabel.length() -1); + final String inputType = inputWebElement.findElement(inputTypeSelector).getText(); + var inputData = new InputData(inputLabel, inputType, null); + inputDataList.add(inputData); + }); + + return inputDataList; + } + + private Optional<WebElement> findInput(final String name) { + final String label = name + ":"; + final By inputLabelSelector = By.xpath(XpathSelector.INPUT_LABEL.getXPath()); + return inputList.stream().filter(webElement -> { + final WebElement inputLabel = webElement.findElement(inputLabelSelector); + return label.equals(inputLabel.getText()); + }).findFirst(); + } + + private void fillSimpleValue(final String inputName, final String inputValue) { + toggleInputExpansion(inputName); + final Optional<WebElement> inputOpt = findInput(inputName); + assertTrue(inputOpt.isPresent(), String.format("Could not set value for input '%s'. The input was not found.", inputName)); + final By simpleInputValueSelector = By.xpath(XpathSelector.SIMPLE_VALUE_INPUT_RELATIVE_FROM_INPUT_INFO.getXPath()); + inputOpt.ifPresent(webElement -> webElement.findElement(simpleInputValueSelector).sendKeys(inputValue)); + } + + @AllArgsConstructor + private enum XpathSelector { + WRAPPING_ELEMENT("//div[@class='input-tree']"), + INPUT_LIST("//div[@class='input-tree']/*/*/*/span[@class='input-info']"), + INPUT_LABEL("label[@class='input-label']"), + INPUT_TYPE("em[@data-tests-id='input-type']"), + SIMPLE_VALUE_INPUT_RELATIVE_FROM_INPUT_INFO("..//li[@class='input-value']/input"), + EXPAND_ICON("em[contains(concat(' ',normalize-space(@class),' '),' round-expand-icon ')]"), + DELETE_ICON("span[contains(concat(' ',normalize-space(@class),' '),' delete-btn ')]"); + + private final String xPath; + + public String getXPath(final String... xpathParams) { + return String.format(xPath, xpathParams); + } + } +} |