Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions common/configuration/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.knubisoft</groupId>
<artifactId>common</artifactId>
<version>1.0.2</version>
<relativePath>../pom.xml</relativePath>
</parent>

<artifactId>configuration</artifactId>

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>

<dependency>
<groupId>com.knubisoft</groupId>
<artifactId>testlum-log</artifactId>
</dependency>

<dependency>
<groupId>com.knubisoft</groupId>
<artifactId>xml-parser</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.vault</groupId>
<artifactId>spring-vault-core</artifactId>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

<dependency>
<groupId>com.knubisoft</groupId>
<artifactId>exception</artifactId>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.knubisoft.testlum.testing.framework;

import com.knubisoft.testlum.testing.model.global_config.Integrations;

import java.util.HashMap;
import java.util.Map;

public class EnvToIntegrationMap extends HashMap<String, Integrations> {
public EnvToIntegrationMap(final Map<? extends String, ? extends Integrations> m) {
super(m);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.knubisoft.testlum.testing.framework.constant.ExceptionMessage;
import com.knubisoft.testlum.testing.framework.constant.LogMessage;
import com.knubisoft.testlum.testing.framework.exception.DefaultFrameworkException;
import com.knubisoft.testlum.testing.framework.util.InjectionUtil;
import com.knubisoft.testlum.testing.framework.util.InjectionService;
import com.knubisoft.testlum.testing.framework.validator.IntegrationsValidator;
import com.knubisoft.testlum.testing.framework.validator.UiConfigValidator;
import com.knubisoft.testlum.testing.framework.vault.VaultService;
Expand All @@ -16,7 +16,6 @@
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
Expand All @@ -33,7 +32,7 @@ public class GlobalTestConfigurationProvider {
private final XMLParsers xmlParsers;
private final UiConfigValidator validator;
private final IntegrationsValidator integrationsValidator;
private final InjectionUtil injectionUtil;
private final InjectionService injectionService;

@Bean
public GlobalTestConfiguration globalTestConfiguration() {
Expand All @@ -57,18 +56,6 @@ public EnvToIntegrationMap getIntegrations(final List<Environment> environments,
return collectIntegrations(environments, vaultService);
}

public static class EnvToIntegrationMap extends HashMap<String, Integrations> {
public EnvToIntegrationMap(final Map<? extends String, ? extends Integrations> m) {
super(m);
}
}

public static class UIConfiguration extends HashMap<String, UiConfig> {
public UIConfiguration(final Map<? extends String, ? extends UiConfig> m) {
super(m);
}
}

@Bean("uiConfig")
public UIConfiguration getUiConfigs(final List<Environment> environments,
final Optional<VaultService> vaultService) {
Expand Down Expand Up @@ -105,7 +92,7 @@ private Integrations initIntegration(final Environment env, final Optional<Vault
.searchFileFromEnvFolder(env.getFolder(), TestResourceSettings.INTEGRATION_CONFIG_FILENAME)
.map(configFile -> xmlParsers.forIntegrations().process(configFile))
.map(e -> injectFromVaultIfPresent(vaultService, e))
.map(injectionUtil::injectFromSystem)
.map(injectionService::injectFromSystem)
.orElseGet(() -> {
log.warn(LogMessage.DISABLED_CONFIGURATION, Integrations.class.getSimpleName());
return new Integrations();
Expand All @@ -125,15 +112,15 @@ private UiConfig initUiConfig(final Environment env,
return fileSearcher.searchFileFromEnvFolder(env.getFolder(), TestResourceSettings.UI_CONFIG_FILENAME)
.map(configFile -> xmlParsers.forUiConfig().process(configFile))
.map(e -> injectFromVaultIfPresent(vaultService, e))
.map(injectionUtil::injectFromSystem)
.map(injectionService::injectFromSystem)
.orElseGet(() -> {
log.warn(LogMessage.DISABLED_CONFIGURATION, UiConfig.class.getSimpleName());
return new UiConfig();
});
}

private <T> T injectFromVaultIfPresent(final Optional<VaultService> vaultService, final T t) {
return vaultService.map(service -> injectionUtil.injectFromVault(service, t)).orElse(t);
return vaultService.map(service -> injectionService.injectFromVault(service, t)).orElse(t);
}

private String getDefaultEnabledEnvironment(final List<Environment> environments) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,13 @@

import com.google.common.base.Preconditions;
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.Optional;

@Getter
@Component
@Setter
public class TestResourceSettings {

public static final String SCENARIO_FILENAME = "scenario.xml";
Expand All @@ -23,21 +21,7 @@ public class TestResourceSettings {
public static final String XML_SUFFIX = ".xml";

public static final String SCREENSHOT_FOLDER = "screenshots";
public static final String SCHEMAS_FOLDER = "schema";
public static final String REPORT_FOLDER = "report";
public static final String LOCATORS_PAGES_FOLDER = "locators" + File.separator + "pages";
public static final String LOCATORS_COMPONENTS_FOLDER = "locators" + File.separator + "component";
public static final String SCENARIOS_FOLDER = "scenarios";
public static final String DATA_FOLDER = "data";
public static final String ENV_CONFIG_FOLDER = "config";
public static final String FOLDER_LOCATION_ERROR_MESSAGE = "%s. Expected location -> %s";

private static final String SCENARIOS_FOLDER_NOT_EXIST = "[scenarios] folder does not exist";
private static final String SPECIFIED_SCENARIOS_FOLDER_NOT_EXIST = "[specified scenarios] folder does not exist";
private static final String PAGES_FOLDER_NOT_EXIST = "[locators/pages] folder does not exist";
private static final String COMPONENTS_FOLDER_NOT_EXIST = "[locators/component] folder does not exist";
private static final String DATA_FOLDER_NOT_EXIST = "[data] folder does not exist";
private static final String ENV_CONFIG_FOLDER_NOT_EXIST = "[config] folder does not exist";

@Getter
private static String configFileName;
Expand All @@ -48,30 +32,29 @@ public class TestResourceSettings {
private static boolean initialized;

private final File testResourcesFolder;

@Getter
private final File configFile;
private final File envConfigFolder;
private final File scenariosFolder;
private final File dataFolder;
private final Optional<File> scenarioScopeFolder;
private File pagesFolder;
private File componentsFolder;
private final File pagesFolder;
private final File componentsFolder;

public TestResourceSettings() {
if (!initialized) {
throw new RuntimeException("TestResourceSettings not initialized. Use init()");
}

this.testResourcesFolder = new File(pathToTestResources);
this.configFile = new File(testResourcesFolder, configFileName);
this.envConfigFolder = subFolder(testResourcesFolder, ENV_CONFIG_FOLDER, ENV_CONFIG_FOLDER_NOT_EXIST);
this.scenariosFolder = subFolder(testResourcesFolder, SCENARIOS_FOLDER, SCENARIOS_FOLDER_NOT_EXIST);
this.dataFolder = subFolder(testResourcesFolder, DATA_FOLDER, DATA_FOLDER_NOT_EXIST);
this.scenarioScopeFolder = scenarioScope
.map(s -> subFolder(scenariosFolder, s, SPECIFIED_SCENARIOS_FOLDER_NOT_EXIST));
this.pagesFolder = subFolder(testResourcesFolder, LOCATORS_PAGES_FOLDER, PAGES_FOLDER_NOT_EXIST);
this.componentsFolder = subFolder(testResourcesFolder, LOCATORS_COMPONENTS_FOLDER, COMPONENTS_FOLDER_NOT_EXIST);
Preconditions.checkArgument(testResourcesFolder.exists(), pathToTestResources + " does not exist");

this.configFile = subFile(testResourcesFolder, configFileName);
this.envConfigFolder = subFile(testResourcesFolder, "config");
this.scenariosFolder = subFile(testResourcesFolder, "scenarios");
this.dataFolder = subFile(testResourcesFolder, "data");
this.scenarioScopeFolder = scenarioScope.map(name -> subFile(scenariosFolder, name));
this.pagesFolder = subFile(testResourcesFolder, "locators" + File.separator + "pages");
this.componentsFolder = subFile(testResourcesFolder, "locators" + File.separator + "component");
}

public static void init(
Expand All @@ -84,9 +67,11 @@ public static void init(
TestResourceSettings.scenarioScope = scenarioScope;
}

private File subFolder(final File sourceDirectory, final String name, final String errorMessage) {
private File subFile(final File sourceDirectory, final String name) {
File folder = new File(sourceDirectory, name);
String message = String.format(FOLDER_LOCATION_ERROR_MESSAGE, errorMessage, folder.getAbsolutePath());
String message = String.format("%s. Expected location -> %s",
"[" + name + "] folder does not exist",
folder.getAbsolutePath());
Preconditions.checkArgument(folder.exists(), message);
return folder;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.knubisoft.testlum.testing.framework;

import com.knubisoft.testlum.testing.model.global_config.UiConfig;

import java.util.HashMap;
import java.util.Map;

public class UIConfiguration extends HashMap<String, UiConfig> {
public UIConfiguration(final Map<? extends String, ? extends UiConfig> m) {
super(m);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.knubisoft.testlum.testing.framework.util;

import com.knubisoft.testlum.testing.framework.vault.VaultService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;

import java.util.function.Function;

@RequiredArgsConstructor
@Component
public class InjectionService {

private final JacksonService jacksonService;
private final SystemVariableService systemVariableService;

@SneakyThrows
public <T> T injectFromVault(final VaultService vaultService, final T t) {
return inject(t, vaultService::inject);
}

public <T> T injectFromSystem(final T t) {
return inject(t, systemVariableService::inject);
}

@SuppressWarnings("unchecked")
public <T> T inject(final T t, final Function<String, String> injector) {
String asJson = jacksonService.writeValueToCopiedString(t);
String injected = injector.apply(asJson);
return jacksonService.readCopiedValue(injected, (Class<T>) t.getClass());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.knubisoft.testlum.testing.framework.util;

import com.knubisoft.testlum.testing.framework.GlobalTestConfigurationProvider;
import com.knubisoft.testlum.testing.framework.EnvToIntegrationMap;
import com.knubisoft.testlum.testing.framework.constant.ExceptionMessage;
import com.knubisoft.testlum.testing.framework.env.AliasEnv;
import com.knubisoft.testlum.testing.framework.exception.DefaultFrameworkException;
Expand All @@ -19,10 +19,10 @@
@Slf4j
public class IntegrationsUtil {

private final GlobalTestConfigurationProvider.EnvToIntegrationMap envToIntegrations;
private final EnvToIntegrationMap envToIntegrations;
private final Map<IntegrationsPredicate, IntegrationListMethod> configToIntegrationListMap;

public IntegrationsUtil(final GlobalTestConfigurationProvider.EnvToIntegrationMap envToIntegrations) {
public IntegrationsUtil(final EnvToIntegrationMap envToIntegrations) {
this.envToIntegrations = envToIntegrations;
this.configToIntegrationListMap = createConfigToIntegratonMap();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.knubisoft.testlum.testing.framework.constant.DelimiterConstant;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
Expand All @@ -19,7 +18,7 @@
public final class JacksonService {

private final ObjectMapper mapper = buildObjectMapper();
private final ObjectMapper dynamodbMapper = createObjectMapperWithFieldVisibility();
private final ObjectMapper mapperFieldVisibility = createObjectMapperWithFieldVisibility();
private final ObjectMapper deepCopy = createObjectMapperForDeepCopy();

@SneakyThrows
Expand All @@ -43,8 +42,8 @@ public String writeValueAsStringWithDefaultPrettyPrinter(final Object value) {
}

@SneakyThrows
public String writeAsStringForDynamoDbOnly(final Object value) {
return dynamodbMapper.writeValueAsString(value);
public String writeAsStringFieldVisibility(final Object value) {
return mapperFieldVisibility.writeValueAsString(value);
}

@SneakyThrows
Expand All @@ -64,13 +63,10 @@ public <T> T deepCopy(final Object value, final Class<T> valueType) {

public Object toJsonObject(final String content) {
if (StringUtils.isNotBlank(content)) {
boolean isObject = content.startsWith(DelimiterConstant.OPEN_BRACE)
&&
content.endsWith(DelimiterConstant.CLOSE_BRACE);
boolean isArray = content.startsWith(DelimiterConstant.OPEN_SQUARE_BRACKET)
&&
content.endsWith(DelimiterConstant.CLOSE_SQUARE_BRACKET);
if (isObject || isArray) {
if (content.startsWith("{") && content.endsWith("}")) {
return readValue(content, Object.class);
}
if (content.startsWith("[") && content.endsWith("]")) {
return readValue(content, Object.class);
}
}
Expand Down
Loading
Loading