Skip to content
This repository has been archived by the owner on Aug 1, 2022. It is now read-only.

Commit

Permalink
fix: integration tests improvements (#1037)
Browse files Browse the repository at this point in the history
  • Loading branch information
vmutafov committed Jan 20, 2022
1 parent ac39db2 commit dd53b89
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 96 deletions.
1 change: 1 addition & 0 deletions integration-tests/.gitignore
@@ -0,0 +1 @@
ui/selenium
107 changes: 54 additions & 53 deletions integration-tests/ui/pom.xml
@@ -1,64 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.sap.xsk</groupId>
<artifactId>xsk-integration-tests-parent</artifactId>
<version>0.13.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<name>XSK - Integration Tests - UI</name>
<artifactId>xsk-integration-tests-ui</artifactId>
<parent>
<groupId>com.sap.xsk</groupId>
<artifactId>xsk-integration-tests-parent</artifactId>
<version>0.13.0-SNAPSHOT</version>
<packaging>jar</packaging>
<relativePath>../pom.xml</relativePath>
</parent>

<name>XSK - Integration Tests - UI</name>
<artifactId>xsk-integration-tests-ui</artifactId>
<version>0.13.0-SNAPSHOT</version>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${selenium.version}</version>
<scope>test</scope>
</dependency>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${selenium.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>${selenium.webdriver.manager.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>${selenium.webdriver.manager.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>pl.pragmatists</groupId>
<artifactId>JUnitParams</artifactId>
<version>${junitparams.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>pl.pragmatists</groupId>
<artifactId>JUnitParams</artifactId>
<version>${junitparams.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.eclipse.dirigible</groupId>
<artifactId>dirigible-commons-api</artifactId>
<version>${dirigible.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependency>
<groupId>org.eclipse.dirigible</groupId>
<artifactId>dirigible-commons-api</artifactId>
<version>${dirigible.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<properties>
<license.header.location>../../licensing-header.txt</license.header.location>
</properties>
<properties>
<license.header.location>../../licensing-header.txt</license.header.location>
</properties>

</project>
Expand Up @@ -25,47 +25,44 @@ class ExpectedContentProvider {
private static final String deliveryUnitPath = "/migration";
private static final String getDeliveryUnitName = "MIGR_TOOLS";
private static final String projectName = "xsk-test-app";
private static final String workspaceName = "workspace";
private static final String contentPath = deliveryUnitPath + "/" + getDeliveryUnitName + "/" + projectName;

private final List<ExpectedContent> expectedContentList;

private ExpectedContentProvider() {
expectedContentList = new ArrayList<>();

try {
loadValidationProjectFiles();
} catch (IOException e) {
throw new ExceptionInInitializerError(e);
}
}

static List<ExpectedContent> getExpectedContentList() {
return contentProvider.expectedContentList;
}
private static ExpectedContentProvider instance;

static String getExpectedDeliveryUnitName() {
return getDeliveryUnitName;
private ExpectedContentProvider() {
expectedContentList = getValidationProjectFiles();
}

static String getExpectedProjectName() {
return projectName;
static ExpectedContentProvider getInstance() {
if (instance == null) {
instance = new ExpectedContentProvider();
}
return instance;
}

private void loadValidationProjectFiles() throws IOException {
var files = getResourceFilePaths(contentPath);
for (var fileName : files) {
var trimmedFileName = fileName.replace(contentPath, "");
ExpectedContent file = new ExpectedContent(trimmedFileName, getResourceFileContent(fileName));
expectedContentList.add(file);
private ArrayList<ExpectedContent> getValidationProjectFiles() {
var expectedContentList = new ArrayList<ExpectedContent>();
try {
for (var fileName : getResourceFilePaths(contentPath)) {
var trimmedFileName = fileName.replace(contentPath, "");
ExpectedContent file = new ExpectedContent(trimmedFileName, getResourceFileContent(fileName));
expectedContentList.add(file);
}
} catch (IOException e) {
throw new RuntimeException("Could not load expected files", e);
}
return expectedContentList;
}

private List<String> getResourceFilePaths(String path) throws IOException {
List<String> filenames = new ArrayList<>();

try (
InputStream in = getResourceAsStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
InputStream in = getResourceAsStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
String resource;

while ((resource = reader.readLine()) != null) {
Expand All @@ -83,9 +80,9 @@ private List<String> getResourceFilePaths(String path) throws IOException {
}

private byte[] getResourceFileContent(String path) throws IOException {
InputStream in = getResourceAsStream(path);
BufferedInputStream bis = new BufferedInputStream(in);
return bis.readAllBytes();
InputStream in = getResourceAsStream(path);
BufferedInputStream bis = new BufferedInputStream(in);
return bis.readAllBytes();
}

private InputStream getResourceAsStream(String resource) {
Expand All @@ -96,4 +93,20 @@ private InputStream getResourceAsStream(String resource) {
private ClassLoader getContextClassLoader() {
return Thread.currentThread().getContextClassLoader();
}

List<ExpectedContent> getExpectedContentList() {
return contentProvider.expectedContentList;
}

String getExpectedDeliveryUnitName() {
return getDeliveryUnitName;
}

String getExpectedProjectName() {
return projectName;
}

String getExpectedWorkspaceName() {
return workspaceName;
}
}
Expand Up @@ -11,6 +11,7 @@
*/
package com.xsk.integration.tests.migration;

import com.google.common.base.Strings;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import org.junit.After;
Expand All @@ -26,14 +27,22 @@
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RunWith(JUnitParamsRunner.class)
public class MigrationITest {

private ExpectedContentProvider expectedContentProvider = ExpectedContentProvider.getInstance();
private WebBrowser webBrowser;
private MigrationCredentials credentials;
private List<ExpectedContent> expectedContentList;
Expand All @@ -54,7 +63,7 @@ public void migrationTest(String param) throws IOException {
private void setup(String param) {
webBrowser = new WebBrowser(param, DirigibleConnectionProperties.BASE_URL, true);
credentials = new MigrationCredentials(param.contains("Hana2"));
expectedContentList = ExpectedContentProvider.getExpectedContentList();
expectedContentList = expectedContentProvider.getExpectedContentList();
}

private void navigateToMigrationPerspective() {
Expand All @@ -68,24 +77,24 @@ private void navigateToMigrationPerspective() {

private void enterNeoDBTunnelCredentials() {
webBrowser.enterAndAssertField(By.id("subaccount"), credentials.getSubaccount());
webBrowser.selectAndAssertDropdown("regionList", credentials.getRegion());
webBrowser.selectAndAssertDropdown("regionList", (item) -> item.contains(credentials.getRegion()));
webBrowser.enterAndAssertField(By.id("neo-username"), credentials.getUsername());
webBrowser.enterAndAssertField(By.id("neo-password"), credentials.getPassword());
webBrowser.log();
webBrowser.clickItem(By.xpath("//*[@ng-click='nextClicked()']"));
}

private void enterHanaCredentials() {
webBrowser.selectAndAssertDropdown("databasesList", credentials.getSchema());
webBrowser.selectAndAssertDropdown("databasesList", (item) -> item.equals(credentials.getSchema()));
webBrowser.enterAndAssertField(By.id("username"), credentials.getHanaUsername());
webBrowser.enterAndAssertField(By.id("password"), credentials.getHanaPassword());
webBrowser.log();
webBrowser.clickItem(By.xpath("//*[@ng-click='nextClicked()']"));
}

private void selectDeliveryUnits() {
webBrowser.selectAndAssertDropdown("workspacesList", "workspace");
webBrowser.selectAndAssertDropdown("deliveryUnitList", ExpectedContentProvider.getExpectedDeliveryUnitName());
webBrowser.selectAndAssertDropdown("workspacesList", (item) -> item.equals(expectedContentProvider.getExpectedWorkspaceName()));
webBrowser.selectAndAssertDropdown("deliveryUnitList", (item) -> item.equals(expectedContentProvider.getExpectedDeliveryUnitName()));
webBrowser.clickItem(By.xpath("//*[@ng-disabled=\"duDropdownDisabled\"]"));
webBrowser.log();
webBrowser.clickItem(By.xpath("//*[@ng-click=\"finishClicked()\"]"));
Expand All @@ -107,7 +116,7 @@ private void openFilesFromJstree() {
webBrowser.executeJavascript("$(\".jstree\").jstree(\"open_all\")");

// Double-click all jstree anchors by their file name (text content).
for(var expectedContent : expectedContentList) {
for (var expectedContent : expectedContentList) {
var fileName = Paths.get(expectedContent.getFilePath()).getFileName();
By anchorXpath = By.xpath("//*[text()='" + fileName + "']");
webBrowser.doubleClickVisibleElementBy(anchorXpath);
Expand All @@ -122,20 +131,25 @@ private void validateAllMigratedFileContents() throws IOException {
var workspaceUrl = "http://"
+ DirigibleConnectionProperties.HOST
+ ":" + DirigibleConnectionProperties.PORT
+ "/services/v4/ide/workspaces/workspace/";
+ "/services/v4/ide/workspaces/"
+ expectedContentProvider.getExpectedWorkspaceName()
+ "/";

var projectUrl = workspaceUrl + ExpectedContentProvider.getExpectedProjectName();
var projectUrl = workspaceUrl + expectedContentProvider.getExpectedProjectName();
var iframes = webBrowser.findElementsBy(By.tagName("iframe"));
int assertedFilesCount = 0;

for(var expectedContent : expectedContentList) {
for (var expectedContent : expectedContentList) {
var expectedFilePath = expectedContent.getFilePath();
var expectedFileContent = expectedContent.getContent();
var expectedFileName = Paths.get(expectedFilePath).getFileName().toString();

for (var iframe : iframes) {
if (iframe.getAttribute("src").contains(expectedFilePath)) {
if(isImageFile(expectedFileName)) {
var srcAttribute = iframe.getAttribute("src");
var parsedSrc = splitQuery(new URL(srcAttribute));
var fileQueryParameter = parsedSrc.get("file");
if (collectionHasElementEndingWith(fileQueryParameter, expectedFilePath)) {
if (isImageFile(expectedFileName)) {
var imageUrl = projectUrl + expectedFilePath;
assertImageFileEquals(imageUrl, expectedFileContent);
} else {
Expand All @@ -149,6 +163,26 @@ private void validateAllMigratedFileContents() throws IOException {
assertEquals(assertedFilesCount, expectedContentList.size());
}

private Map<String, List<String>> splitQuery(URL url) {
if (Strings.isNullOrEmpty(url.getQuery())) {
return Collections.emptyMap();
}
return Arrays.stream(url.getQuery().split("&"))
.map(this::splitQueryParameter)
.collect(Collectors
.groupingBy(SimpleImmutableEntry::getKey, LinkedHashMap::new, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
}

private SimpleImmutableEntry<String, String> splitQueryParameter(String it) {
final int idx = it.indexOf("=");
final String key = idx > 0 ? it.substring(0, idx) : it;
final String value = idx > 0 && it.length() > idx + 1 ? it.substring(idx + 1) : null;
return new SimpleImmutableEntry<>(
URLDecoder.decode(key, StandardCharsets.UTF_8),
URLDecoder.decode(value, StandardCharsets.UTF_8)
);
}

private boolean isImageFile(String fileName) {
return fileName.toLowerCase().endsWith(".jpg")
|| fileName.toLowerCase().endsWith(".png")
Expand Down Expand Up @@ -191,6 +225,14 @@ String getTextFileContent(WebElement iframe) {
return migratedText;
}

private static <T> boolean collectionHasElementEndingWith(List<String> list, String endingWith) {
if (list == null || list.isEmpty()) {
return false;
}

return list.stream().anyMatch(x -> x.endsWith(endingWith));
}

@After
public void afterTest() {
webBrowser.quit();
Expand Down

0 comments on commit dd53b89

Please sign in to comment.