aboutsummaryrefslogtreecommitdiffstats
path: root/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/component/workspace/InterfaceOperationInputListComponent.java
blob: c023401deba5f1ab19f8c2ff7cf586e0b82f7f7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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);
        }
    }
}