diff --git a/config.properties b/config.properties new file mode 100644 index 000000000..0e44f9755 --- /dev/null +++ b/config.properties @@ -0,0 +1,35 @@ +maqs.global.timeout = 500 +maqs.global.waitTime = 100 +maqs.global.log = true +maqs.global.log.level = VERBOSE +maqs.global.log.type = TXT +maqs.global.log.path = ./target/logs + +maqs.selenium.screenshot.softAssertOnFailure = true +maqs.selenium.screenshot.format = jpeg +maqs.selenium.pageSource.OnFailure = true + + +maqs.selenium.browser = HEADLESSCHROME +maqs.selenium.browser.waitTime = 1000 +maqs.selenium.browser.timeout = 20000 +maqs.selenium.browser.size = 1920x1080 + + +maqs.selenium.browser.remote = Chrome +maqs.selenium.browser.remote.name = Chrome +maqs.selenium.browser.remote.url = http://ondemand.saucelabs.com:80/wd/hub +maqs.selenium.browser.remote.platform = OS X 10.11 +maqs.selenium.website.url = http://magenicautomation.azurewebsites.net/ + +maqs.selenium.remote.capabilities + +maqs.webservices.url = http://localhost:8080/maqs/services/ + +maqs.appium.url = http://localhost:4723/wd/hub + +maqs.database.url = jdbc:mysql://localhost:3306/maqs + +maqs.cucumber.features = features + +maqs.accessibility.url = http://localhost:8080/maqs/accessibility/ \ No newline at end of file diff --git a/maqs-appium/src/main/java/com/cognizantsoftvision/maqs/appium/AppiumConfig.java b/maqs-appium/src/main/java/com/cognizantsoftvision/maqs/appium/AppiumConfig.java index 7f1a719c3..fdee55c19 100644 --- a/maqs-appium/src/main/java/com/cognizantsoftvision/maqs/appium/AppiumConfig.java +++ b/maqs-appium/src/main/java/com/cognizantsoftvision/maqs/appium/AppiumConfig.java @@ -8,10 +8,12 @@ import com.cognizantsoftvision.maqs.appium.exceptions.AppiumConfigException; import com.cognizantsoftvision.maqs.utilities.helper.Config; import com.cognizantsoftvision.maqs.utilities.helper.ConfigSection; +import com.cognizantsoftvision.maqs.utilities.helper.ConfigValidation; import com.cognizantsoftvision.maqs.utilities.helper.StringProcessor; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -31,7 +33,19 @@ public class AppiumConfig { private static final ConfigSection APPIUM_CAPS_SECTION = ConfigSection.APPIUM_CAPS_MAQS; private AppiumConfig() { + } + + static { + checkConfig(); + } + /** + * Ensure required fields are in the config + */ + private static void checkConfig() { + var validator = new ConfigValidation(); + validator.setRequiredOneOfFields(Arrays.asList("App", "BrowserName")); + Config.validate(ConfigSection.APPIUM_MAQS, validator); } /** diff --git a/maqs-database/src/main/java/com/cognizantsoftvision/maqs/database/DatabaseConfig.java b/maqs-database/src/main/java/com/cognizantsoftvision/maqs/database/DatabaseConfig.java index 9b8bdc4ce..02c7a1402 100644 --- a/maqs-database/src/main/java/com/cognizantsoftvision/maqs/database/DatabaseConfig.java +++ b/maqs-database/src/main/java/com/cognizantsoftvision/maqs/database/DatabaseConfig.java @@ -10,17 +10,32 @@ import com.cognizantsoftvision.maqs.database.providers.SQLiteProvider; import com.cognizantsoftvision.maqs.utilities.helper.Config; import com.cognizantsoftvision.maqs.utilities.helper.ConfigSection; +import com.cognizantsoftvision.maqs.utilities.helper.ConfigValidation; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** - * The type Database config. + * The Database Config class. */ public class DatabaseConfig { private DatabaseConfig() { } + static { + checkConfig(); + } + + /** + * Ensure required fields are in the config + */ + private static void checkConfig() { + var validator = new ConfigValidation(); + validator.setRequiredOneOfFields(Arrays.asList("DataBaseConnectionString", "DataBaseProviderType")); + Config.validate(ConfigSection.DATABASE_MAQS, validator); + } + /** * The Database section. */ diff --git a/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseConfigUnitTest.java b/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseConfigUnitTest.java index b6b844bf7..cc80cdc9e 100644 --- a/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseConfigUnitTest.java +++ b/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseConfigUnitTest.java @@ -4,7 +4,6 @@ package com.cognizantsoftvision.maqs.database; -import com.cognizantsoftvision.maqs.base.BaseGenericTest; import com.cognizantsoftvision.maqs.database.constants.DataProviderType; import com.cognizantsoftvision.maqs.database.providers.IDataSourceProvider; import com.cognizantsoftvision.maqs.database.providers.SQLProvider; diff --git a/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseDriverUnitTest.java b/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseDriverUnitTest.java index e939d3437..449cdb51e 100644 --- a/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseDriverUnitTest.java +++ b/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseDriverUnitTest.java @@ -4,7 +4,6 @@ package com.cognizantsoftvision.maqs.database; -import com.cognizantsoftvision.maqs.base.BaseGenericTest; import com.cognizantsoftvision.maqs.database.entities.StatesEntity; import com.cognizantsoftvision.maqs.utilities.helper.TestCategories; import java.util.List; diff --git a/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseTestObjectUnitTest.java b/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseTestObjectUnitTest.java index 345bac603..3ae609609 100644 --- a/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseTestObjectUnitTest.java +++ b/maqs-database/src/test/java/com/cognizantsoftvision/maqs/database/DatabaseTestObjectUnitTest.java @@ -4,7 +4,6 @@ package com.cognizantsoftvision.maqs.database; -import com.cognizantsoftvision.maqs.base.BaseGenericTest; import com.cognizantsoftvision.maqs.utilities.helper.TestCategories; import org.testng.Assert; import org.testng.annotations.Test; diff --git a/maqs-playwright/src/main/java/com/cognizantsoftvision/maqs/playwright/PlaywrightConfig.java b/maqs-playwright/src/main/java/com/cognizantsoftvision/maqs/playwright/PlaywrightConfig.java index b783df2a7..fda35f4a0 100644 --- a/maqs-playwright/src/main/java/com/cognizantsoftvision/maqs/playwright/PlaywrightConfig.java +++ b/maqs-playwright/src/main/java/com/cognizantsoftvision/maqs/playwright/PlaywrightConfig.java @@ -6,7 +6,9 @@ import com.cognizantsoftvision.maqs.utilities.helper.Config; import com.cognizantsoftvision.maqs.utilities.helper.ConfigSection; +import com.cognizantsoftvision.maqs.utilities.helper.ConfigValidation; import java.awt.Dimension; +import java.util.Collections; /** * The Playwright Config class. @@ -19,6 +21,19 @@ public class PlaywrightConfig { protected PlaywrightConfig() { } + static { + checkConfig(); + } + + /** + * Ensure required fields are in the config. + */ + private static void checkConfig() { + var validator = new ConfigValidation(); + validator.setRequiredOneOfFields(Collections.singletonList("Timeout")); + Config.validate(ConfigSection.PLAYWRIGHT_MAQS, validator); + } + /** * Get the website base url. * @return The website base url diff --git a/maqs-selenium/src/main/java/com/cognizantsoftvision/maqs/selenium/SeleniumConfig.java b/maqs-selenium/src/main/java/com/cognizantsoftvision/maqs/selenium/SeleniumConfig.java index 84c1e2453..dd931a4de 100644 --- a/maqs-selenium/src/main/java/com/cognizantsoftvision/maqs/selenium/SeleniumConfig.java +++ b/maqs-selenium/src/main/java/com/cognizantsoftvision/maqs/selenium/SeleniumConfig.java @@ -8,8 +8,10 @@ import com.cognizantsoftvision.maqs.selenium.constants.RemoteBrowserType; import com.cognizantsoftvision.maqs.utilities.helper.Config; import com.cognizantsoftvision.maqs.utilities.helper.ConfigSection; +import com.cognizantsoftvision.maqs.utilities.helper.ConfigValidation; import com.cognizantsoftvision.maqs.utilities.helper.StringProcessor; import java.time.Duration; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -22,7 +24,19 @@ public final class SeleniumConfig { * Private constructor. */ private SeleniumConfig() { + } + + static { + checkConfig(); + } + /** + * Ensure required fields are in the config. + */ + private static void checkConfig() { + ConfigValidation validator = new ConfigValidation(); + validator.setRequiredFields(Collections.singletonList("BrowserTimeout")); + Config.validate(ConfigSection.SELENIUM_MAQS, validator); } /** diff --git a/maqs-utilities/appsettings.json b/maqs-utilities/appsettings.json new file mode 100644 index 000000000..726195a0d --- /dev/null +++ b/maqs-utilities/appsettings.json @@ -0,0 +1,53 @@ +{ + "GlobalMaqs": { + "WaitTime": "100", + "Timeout": "1000", + "Log": "OnFail", + "LogLevel": "INFORMATION", + "LogType": "TXT", + "Grog": "WillFailWithoutRunSettingOverride", + "SectionOverrideCore": "WillFailWithoutRunSettingOverride", + "SimpleOverride": "simple", + "Override": "base", + "Override2": "base2", + "ConfigJsonEnvRunOverride": "JSON", + "ConfigJsonEnvRun": "JSON", + "ConfigJsonEnv": "JSON", + "ConfigJson": "JSON", + "JsonOnly": "JSON", + "low": { "JSON": "lowerJson" }, + "compound:key": "compound", + "compound:key:lower": "compoundEvenLower" + }, + "RemoteSeleniumCapsMaqs": { + "MultiLevel": { + "MoreLevels": { + "seven": "7", + "lowest": { + "nine": "9" + } + } + }, + "MuliLevel:MoreLevels": { + "four": "4", + "five": "5" + }, + "MuliLevel:MoreLevels:six": "6" + }, + "TopTest": { + "MidTest": [ + { + "LowerTest": "A", + "Lower": { + "LowestTest": "Lowest" + } + }, + { + "LowerTest": "B" + } + ], + "AnotherMid": { + "Lowerest": "AnotherLow" + } + } +} \ No newline at end of file diff --git a/maqs-utilities/config.properties b/maqs-utilities/config.properties new file mode 100644 index 000000000..0ea29cb06 --- /dev/null +++ b/maqs-utilities/config.properties @@ -0,0 +1,35 @@ +maqs.global.timeout = 500 +maqs.global.waitTime = 100 +maqs.global.log = true +maqs.global.log.level = VERBOSE +maqs.global.log.type = TXT +maqs.global.log.path = ./target/logs + +maqs.selenium.screenshot.softAssertOnFailure = true +maqs.selenium.screenshot.format = jpeg +maqs.selenium.pageSource.OnFailure = true + + +maqs.selenium.browser = HEADLESSCHROME +maqs.selenium.browser.waitTime = 1000 +maqs.selenium.browser.timeout = 20000 +maqs.selenium.browser.size = 1920x1080 + + +maqs.selenium.browser.remote = Chrome +maqs.selenium.browser.remote.name = Chrome +maqs.selenium.browser.remote.url = http://ondemand.saucelabs.com:80/wd/hub +maqs.selenium.browser.remote.platform = OS X 10.11 +maqs.selenium.website.url = https://cognizantopensource.github.io/maqs-dotnet-templates/Static/Automation/ + +maqs.selenium.remote.capabilities + +maqs.webservices.url = http://localhost:8080/maqs/services/ + +maqs.appium.url = http://localhost:4723/wd/hub + +maqs.database.url = jdbc:mysql://localhost:3306/maqs + +maqs.cucumber.features = features + +maqs.accessibility.url = http://localhost:8080/maqs/accessibility/ \ No newline at end of file diff --git a/maqs-utilities/config.yml b/maqs-utilities/config.yml new file mode 100644 index 000000000..ea4107ef3 --- /dev/null +++ b/maqs-utilities/config.yml @@ -0,0 +1,34 @@ + +GlobalMaqs: + timeout: 500 + waitTime: 100 + log: true + level: "VERBOSE" + type: "TXT" + path: "./target/logs" + +SeleniumMaqs: + softAssertOnFailure: true + format: "jpeg" + OnFailure: true + browser: "HEADLESSCHROME" + waitTime: 1000 + browser.timeout: 20000 + browser.size: 1920x1080 + remote: "Chrome" + remote.name: "Chrome" + remote.url: "http://ondemand.saucelabs.com:80/wd/hub" + remote.platform: "OS X 10.11" + website.url: "https://cognizantopensource.github.io/maqs-dotnet-templates/Static/Automation/" + +#maqs.selenium.remote.capabilities + +WebServiceMaqs: + url: http://localhost:8080/maqs/services/ + + +AppiumCapsMaqs: + url: http://localhost:4723/wd/hub + +DatabaseMaqs: + url: jdbc:mysql://localhost:3306/maqs diff --git a/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/Config.java b/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/Config.java index 706551e05..2929f8e67 100644 --- a/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/Config.java +++ b/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/Config.java @@ -4,11 +4,10 @@ package com.cognizantsoftvision.maqs.utilities.helper; -import com.cognizantsoftvision.maqs.utilities.helper.exceptions.FrameworkConfigurationException; +import com.cognizantsoftvision.maqs.utilities.helper.exceptions.MaqsConfigException; import java.io.File; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; +import java.util.*; + import org.apache.commons.configuration2.XMLConfiguration; import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; import org.apache.commons.configuration2.builder.fluent.Configurations; @@ -61,11 +60,56 @@ private Config() { overrideConfig = new XMLConfiguration(); overrideConfig.setSynchronizer(new ReadWriteSynchronizer()); } catch (ConfigurationException exception) { - throw new FrameworkConfigurationException(StringProcessor.safeFormatter( + throw new MaqsConfigException(StringProcessor.safeFormatter( "Exception creating the xml configuration object from the file : %s", exception)); } } + /** + * Validates the app config section by ensuring required values are present. + * @param configSection The config section to be validated + * @param configValidation A list of strings containing the required field names + */ + public static void validate(ConfigSection configSection, ConfigValidation configValidation) { + // Don't run the validation if the user has decided to skip the validation + if (getGeneralValue("SkipConfigValidation").equals("Yes")) { + return; + } + + if (configValidation == null) { + throw new MaqsConfigException("The value passed in for configValidation (required fields in a config) is null"); + } + + var configSectionPassed = getSection(configSection); + List exceptions = new ArrayList<>(); + + // Check if we have any required fields + if (configValidation.getRequiredFields() != null && !configValidation.getRequiredFields().isEmpty()) { + for(var requiredField : configValidation.getRequiredFields()) { + if (!configSectionPassed.containsKey(requiredField)) { + exceptions.add("Key missing: " + requiredField); + } + } + } + + // Check if we have any one of required fields + if (configValidation.getRequiredOneOfFields() != null && configValidation.getRequiredOneOfFields().size() > 0) { + // && !configValidation.getRequiredOneOfFields().Any(x -> configSectionPassed.containsKey(x))){ + // We have one of fields and didn't find any of them + exceptions.add("Need at least one of the following keys: " + String.join(", ", configValidation.getRequiredOneOfFields())); + } + + if (!exceptions.isEmpty()) { + StringBuilder message = new StringBuilder(); + for (var exception : exceptions) { + message.append(exception); + } + + message.append("*This check can be skipped by setting the 'SkipConfigValidation' configuration value to 'Yes'."); + throw new MaqsConfigException(message.toString()); + } + } + /** * Gets a section from the configuration. * @@ -276,4 +320,8 @@ public static boolean doesKeyExist(String key, String section) { public static boolean doesGeneralKeyExist(String key) { return doesKeyExist(key, DEFAULT_MAQS_SECTION); } + + private static String getConfigFile() { + PropertyManager.get("maqs.config.location", "config.xml"); + } } diff --git a/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/ConfigValidation.java b/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/ConfigValidation.java new file mode 100644 index 000000000..41f365391 --- /dev/null +++ b/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/ConfigValidation.java @@ -0,0 +1,37 @@ +/* + * Copyright 2022 (C) Cognizant SoftVision, All rights Reserved + */ + +package com.cognizantsoftvision.maqs.utilities.helper; + +import java.util.List; + +public class ConfigValidation { + + List requiredFields; + + List requiredOneOfFields; + + /// + /// Gets or sets the list of required fields for a config + /// + public List getRequiredFields() { + return requiredFields; + } + + + public void setRequiredFields(List requiredFields) { + this.requiredFields = requiredFields; + } + + /// + /// Gets or sets the list of fields you need at least one of for a config + /// + public List getRequiredOneOfFields() { + return this.requiredOneOfFields; + } + + public void setRequiredOneOfFields(List requiredFields) { + requiredOneOfFields = requiredFields; + } +} diff --git a/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/exceptions/FrameworkConfigurationException.java b/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/exceptions/MaqsConfigException.java similarity index 71% rename from maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/exceptions/FrameworkConfigurationException.java rename to maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/exceptions/MaqsConfigException.java index d946a75aa..9b70487f5 100644 --- a/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/exceptions/FrameworkConfigurationException.java +++ b/maqs-utilities/src/main/java/com/cognizantsoftvision/maqs/utilities/helper/exceptions/MaqsConfigException.java @@ -7,14 +7,14 @@ /** * The Framework Configuration Exception class. */ -public class FrameworkConfigurationException extends RuntimeException { +public class MaqsConfigException extends RuntimeException { /** * Instantiates a new Framework configuration exception. * * @param message the message */ - public FrameworkConfigurationException(String message) { + public MaqsConfigException(String message) { super(message); } } diff --git a/maqs-webservices/src/main/java/com/cognizantsoftvision/maqs/webservices/WebServiceConfig.java b/maqs-webservices/src/main/java/com/cognizantsoftvision/maqs/webservices/WebServiceConfig.java index bfa07af29..37ddbb90c 100644 --- a/maqs-webservices/src/main/java/com/cognizantsoftvision/maqs/webservices/WebServiceConfig.java +++ b/maqs-webservices/src/main/java/com/cognizantsoftvision/maqs/webservices/WebServiceConfig.java @@ -6,6 +6,9 @@ import com.cognizantsoftvision.maqs.utilities.helper.Config; import com.cognizantsoftvision.maqs.utilities.helper.ConfigSection; +import com.cognizantsoftvision.maqs.utilities.helper.ConfigValidation; + +import java.util.Arrays; /** * The Web Service Configuration class. @@ -15,6 +18,19 @@ public final class WebServiceConfig { private WebServiceConfig() { } + static { + checkConfig(); + } + + /** + * Ensure required fields are in the config. + */ + private static void checkConfig() { + var validator = new ConfigValidation(); + validator.setRequiredOneOfFields(Arrays.asList("WebServiceTimeout", "WebServiceUri")); + Config.validate(ConfigSection.WEB_SERVICE_MAQS, validator); + } + /** * The web service configuration section. */ diff --git a/maqs-webservices/src/test/java/com/cognizantsoftvision/maqs/webservices/WebServiceDriverRequestUnitTest/WebServiceDriverDeleteUnitTest.java b/maqs-webservices/src/test/java/com/cognizantsoftvision/maqs/webservices/WebServiceDriverRequestUnitTest/WebServiceDriverDeleteUnitTest.java index ee69141b9..7efde5870 100644 --- a/maqs-webservices/src/test/java/com/cognizantsoftvision/maqs/webservices/WebServiceDriverRequestUnitTest/WebServiceDriverDeleteUnitTest.java +++ b/maqs-webservices/src/test/java/com/cognizantsoftvision/maqs/webservices/WebServiceDriverRequestUnitTest/WebServiceDriverDeleteUnitTest.java @@ -10,14 +10,14 @@ import com.cognizantsoftvision.maqs.webservices.WebServiceConfig; import com.cognizantsoftvision.maqs.webservices.WebServiceDriver; import com.cognizantsoftvision.maqs.webservices.models.Product; -import org.springframework.http.HttpStatus; -import org.testng.Assert; -import org.testng.annotations.Ignore; -import org.testng.annotations.Test; import java.io.IOException; import java.lang.reflect.Type; import java.net.http.HttpResponse; import java.util.Collections; +import org.springframework.http.HttpStatus; +import org.testng.Assert; +import org.testng.annotations.Ignore; +import org.testng.annotations.Test; /** * The Web Driver Service Driver Delete unit test class. diff --git a/maqs-webservices/src/test/java/com/cognizantsoftvision/maqs/webservices/WebServiceUtilitiesUnitTest.java b/maqs-webservices/src/test/java/com/cognizantsoftvision/maqs/webservices/WebServiceUtilitiesUnitTest.java index 3cf51a4f1..65a6a89d2 100644 --- a/maqs-webservices/src/test/java/com/cognizantsoftvision/maqs/webservices/WebServiceUtilitiesUnitTest.java +++ b/maqs-webservices/src/test/java/com/cognizantsoftvision/maqs/webservices/WebServiceUtilitiesUnitTest.java @@ -4,9 +4,9 @@ package com.cognizantsoftvision.maqs.webservices; +import com.cognizantsoftvision.maqs.utilities.helper.TestCategories; import com.cognizantsoftvision.maqs.webservices.models.Product; import com.fasterxml.jackson.core.JsonProcessingException; -import com.cognizantsoftvision.maqs.utilities.helper.TestCategories; import java.math.BigDecimal; import java.net.http.HttpResponse; import org.testng.Assert;