[SDC-29] rebase continue work to align source
[sdc.git] / ui-ci-dev / src / main / java / org / openecomp / sdc / uici / tests / datatypes / CanvasManager.java
1 package org.openecomp.sdc.uici.tests.datatypes;
2
3 import java.util.HashMap;
4 import java.util.List;
5 import java.util.Map;
6 import java.util.Random;
7 import java.util.UUID;
8 import java.util.stream.Collectors;
9
10 import org.apache.commons.lang3.tuple.ImmutablePair;
11 import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.LeftPanelCanvasItems;
12 import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
13 import org.openqa.selenium.WebElement;
14 import org.openqa.selenium.interactions.Actions;
15
16 public final class CanvasManager {
17         private Map<String, CanvasElement> canvasElements;
18         private Actions actions;
19         private WebElement canvas;
20         private int reduceCanvasWidthFactor;
21         // Offsets Are used to find upper right corner of canvas element in order to
22         // connect links
23         private static final int CANVAS_ELEMENT_Y_OFFSET = 40;
24         private static final int CANVAS_ELEMENT_X_OFFSET = 21; // 14 - 27
25
26         private CanvasManager() {
27                 canvasElements = new HashMap<>();
28                 actions = new Actions(GeneralUIUtils.getDriver());
29                 canvas = GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.GeneralCanvasItems.CANVAS.getValue());
30                 try {
31                         WebElement webElement = GeneralUIUtils
32                                         .getWebElementWaitForVisible(DataTestIdEnum.GeneralCanvasItems.CANVAS_RIGHT_PANEL.getValue());
33                         reduceCanvasWidthFactor = webElement.getSize().width;
34                 } catch (Exception e) {
35                         reduceCanvasWidthFactor = 0;
36                 }
37         }
38
39         public static CanvasManager getCanvasManager() {
40                 return new CanvasManager();
41         }
42
43         public List<CanvasElement> getCanvasElements() {
44                 return canvasElements.values().stream().collect(Collectors.toList());
45         }
46
47         private void addCanvasElement(CanvasElement element) {
48                 canvasElements.put(element.getUniqueId(), element);
49         }
50
51         private void moveElementOnCanvas(CanvasElement canvasElement, ImmutablePair<Integer, Integer> newLocation) {
52                 GeneralUIUtils.waitForLoader();
53                 GeneralUIUtils.sleep(500);
54                 actions.moveToElement(canvas, canvasElement.getLocation().left, canvasElement.getLocation().right);
55                 actions.clickAndHold();
56                 actions.moveToElement(canvas, newLocation.left, newLocation.right);
57                 actions.release();
58                 actions.perform();
59                 canvasElement.setLocation(newLocation);
60                 GeneralUIUtils.waitForLoader();
61
62         }
63
64         public void moveElementOnCanvas(CanvasElement canvasElement) {
65                 moveElementOnCanvas(canvasElement, getFreePosition());
66         }
67
68         public void deleteElementFromCanvas(CanvasElement canvasElement) {
69                 GeneralUIUtils.waitForLoader();
70                 actions.moveToElement(canvas, canvasElement.getLocation().left, canvasElement.getLocation().right);
71                 actions.click();
72                 actions.perform();
73                 GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.GeneralCanvasItems.DELETE_INSTANCE_BUTTON.getValue())
74                                 .click();
75                 GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.OK.getValue()).click();
76                 canvasElements.remove(canvasElement.getUniqueId());
77                 GeneralUIUtils.waitForLoader();
78         }
79
80         public void selectElementFromCanvas(CanvasElement canvasElement) {
81                 GeneralUIUtils.waitForLoader();
82                 actions.moveToElement(canvas, canvasElement.getLocation().left, canvasElement.getLocation().right);
83                 actions.click();
84                 actions.perform();
85                 GeneralUIUtils.waitForLoader();
86         }
87
88         public CanvasElement createElementOnCanvas(LeftPanelCanvasItems canvasItem) {
89                 return createElementOnCanvas(canvasItem.getValue(), false);
90         }
91
92         /**
93          * Creates Element on the Canvas - use the element name.
94          * 
95          * @param elementName
96          * @return
97          */
98         public CanvasElement createElementOnCanvas(String elementName) {
99                 return createElementOnCanvas(elementName, true);
100         }
101
102         private CanvasElement createElementOnCanvas(String elementName, boolean addPrefix) {
103                 if (addPrefix) {
104                         elementName = DataTestIdEnum.LEFT_PANEL_PREFIX + elementName;
105                 }
106                 GeneralUIUtils.waitForLoader();
107                 WebElement element = GeneralUIUtils.getWebElementWaitForVisible(elementName);
108                 ImmutablePair<Integer, Integer> freePosition = getFreePosition();
109                 actions.moveToElement(element, 0, 0);
110                 actions.clickAndHold();
111                 actions.moveToElement(canvas, freePosition.left, freePosition.right);
112                 actions.release();
113                 actions.perform();
114
115                 String uniqueId = elementName + "_" + UUID.randomUUID().toString();
116                 CanvasElement canvasElement = new CanvasElement(uniqueId, elementName, freePosition);
117                 addCanvasElement(canvasElement);
118                 GeneralUIUtils.waitForLoader();
119                 return canvasElement;
120         }
121
122         public CanvasElement createUniqueVFOnCanvas(LeftPanelCanvasItems canvasItem) {
123                 GeneralUIUtils.waitForLoader();
124                 WebElement element = GeneralUIUtils.getWebElementWaitForVisible(canvasItem.getValue());
125                 ImmutablePair<Integer, Integer> freePosition = getFreePosition();
126                 actions.moveToElement(element, 0, 0);
127                 actions.clickAndHold();
128                 actions.moveToElement(canvas, freePosition.left, freePosition.right);
129                 actions.release();
130                 actions.perform();
131
132                 String uniqueId = canvasItem.name() + "_" + UUID.randomUUID().toString();
133                 CanvasElement canvasElement = new CanvasElement(uniqueId, canvasItem.getValue(), freePosition);
134                 addCanvasElement(canvasElement);
135                 GeneralUIUtils.waitForLoader();
136                 return canvasElement;
137         }
138
139         private ImmutablePair<Integer, Integer> getFreePosition() {
140                 // TODO ui-ci use better method
141                 ImmutablePair<Integer, Integer> randomPosition = null;
142                 boolean freePosition = false;
143                 int minSpace = 150;
144                 while (!freePosition) {
145                         ImmutablePair<Integer, Integer> tempRandomPosition = getRandomPosition();
146                         freePosition = !canvasElements.values().stream().map(e -> e.getLocation())
147                                         .filter(e -> Math.abs(e.left - tempRandomPosition.left) < minSpace
148                                                         && Math.abs(e.right - tempRandomPosition.right) < minSpace)
149                                         .findAny().isPresent();
150                         randomPosition = tempRandomPosition;
151                 }
152                 return randomPosition;
153         }
154
155         private ImmutablePair<Integer, Integer> getRandomPosition() {
156                 int edgeBuffer = 50;
157                 Random random = new Random();
158                 int xElement = random.nextInt(canvas.getSize().width - 2 * edgeBuffer - reduceCanvasWidthFactor) + edgeBuffer;
159                 int yElement = random.nextInt(canvas.getSize().height - 2 * edgeBuffer) + edgeBuffer;
160                 return new ImmutablePair<Integer, Integer>(xElement, yElement);
161         }
162
163         /**
164          * Links two elements on canvas.<br>
165          * Currently Supports Only elements in the default size.<br>
166          * Will not work for container type or smaller elements (cp, vl etc...)<br>
167          * 
168          * @param firstElement
169          * @param secondElement
170          */
171         public void linkElements(CanvasElement firstElement, CanvasElement secondElement) {
172                 GeneralUIUtils.waitForLoader();
173                 drawSimpleLink(firstElement, secondElement);
174                 selectReqAndCapAndConnect();
175
176                 GeneralUIUtils.waitForLoader();
177
178         }
179
180         private void selectReqAndCapAndConnect() {
181                 // Select First Cap
182                 GeneralUIUtils.getWebElementsListWaitForVisible(DataTestIdEnum.LinkMenuItems.LINK_ITEM_CAP.getValue()).get(0)
183                                 .click();
184                 // Select First Req
185                 GeneralUIUtils.getWebElementsListWaitForVisible(DataTestIdEnum.LinkMenuItems.LINK_ITEM_REQ.getValue()).get(0)
186                                 .click();
187                 // Connect
188                 GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.LinkMenuItems.CONNECT_BUTTON.getValue()).click();
189
190         }
191
192         private void drawSimpleLink(CanvasElement firstElement, CanvasElement secondElement) {
193
194                 int yOffset = CANVAS_ELEMENT_Y_OFFSET;
195                 int xOffset = CANVAS_ELEMENT_X_OFFSET;
196                 actions.moveToElement(canvas, firstElement.getLocation().left + xOffset,
197                                 firstElement.getLocation().right - yOffset);
198
199                 actions.clickAndHold();
200                 actions.moveToElement(canvas, secondElement.getLocation().left + xOffset,
201                                 secondElement.getLocation().right - yOffset);
202                 actions.release();
203                 actions.perform();
204                 GeneralUIUtils.waitForLoader();
205         }
206 }