diff options
Diffstat (limited to 'src')
17 files changed, 552 insertions, 0 deletions
diff --git a/src/main/java/com/mavlushechka/a1qa/framework/constants/RequestMethod.java b/src/main/java/com/mavlushechka/a1qa/framework/constants/RequestMethod.java new file mode 100644 index 0000000..85316c9 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/constants/RequestMethod.java @@ -0,0 +1,7 @@ +package com.mavlushechka.a1qa.framework.constants; + +public enum RequestMethod { + + GET, POST + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/constants/Status.java b/src/main/java/com/mavlushechka/a1qa/framework/constants/Status.java new file mode 100644 index 0000000..63fbc9a --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/constants/Status.java @@ -0,0 +1,13 @@ +package com.mavlushechka.a1qa.framework.constants; + +public enum Status { + + OK(200), CREATED(201), NOT_FOUND(404); + + public final int code; + + Status(int code) { + this.code = code; + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/pages/BaseForm.java b/src/main/java/com/mavlushechka/a1qa/framework/pages/BaseForm.java new file mode 100644 index 0000000..6584879 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/pages/BaseForm.java @@ -0,0 +1,25 @@ +package com.mavlushechka.a1qa.framework.pages; + +import aquality.selenium.elements.interfaces.IElement; +import aquality.selenium.elements.interfaces.ILabel; + +public abstract class BaseForm { + + private final IElement uniqueElement; + private final String name; + + + public BaseForm(ILabel uniqueElement, String name) { + this.uniqueElement = uniqueElement; + this.name = name; + } + + public boolean isOpened() { + return uniqueElement.getElement().isDisplayed(); + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/DoubleUtils.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/DoubleUtils.java new file mode 100644 index 0000000..1865715 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/DoubleUtils.java @@ -0,0 +1,9 @@ +package com.mavlushechka.a1qa.framework.utils; + +public class DoubleUtils { + + public static double getPercentageOf(double number, double percentage) { + return number / 100 * percentage; + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/FileParser.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/FileParser.java new file mode 100644 index 0000000..40ea62d --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/FileParser.java @@ -0,0 +1,22 @@ +package com.mavlushechka.a1qa.framework.utils; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class FileParser { + + public static String parse(String filename) { + StringBuilder stringBuilder = new StringBuilder(); + + try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filename))) { + while (bufferedReader.ready()) { + stringBuilder.append(bufferedReader.readLine()); + } + } catch (IOException ioException) { + throw new IllegalArgumentException("Cannot find required file."); + } + return stringBuilder.toString(); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/HttpUrlConnectionFactory.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/HttpUrlConnectionFactory.java new file mode 100644 index 0000000..cfa0628 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/HttpUrlConnectionFactory.java @@ -0,0 +1,25 @@ +package com.mavlushechka.a1qa.framework.utils; + +import com.mavlushechka.a1qa.framework.constants.RequestMethod; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +public class HttpUrlConnectionFactory { + + private HttpUrlConnectionFactory() { + } + + public static HttpURLConnection createHttpUrlConnection(String spec, RequestMethod requestMethod, boolean doOutput) throws IOException { + HttpURLConnection httpUrlConnection = (HttpURLConnection) new URL(spec).openConnection(); + + httpUrlConnection.setRequestMethod(requestMethod.name()); + httpUrlConnection.setConnectTimeout(Integer.parseInt(JsonParser.parseData("config", "httpUrlConnection.connectTimeout"))); + httpUrlConnection.setReadTimeout(Integer.parseInt(JsonParser.parseData("config", "httpUrlConnection.readTimeout"))); + httpUrlConnection.setDoOutput(doOutput); + httpUrlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + return httpUrlConnection; + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/IntegerUtils.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/IntegerUtils.java new file mode 100644 index 0000000..76280cc --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/IntegerUtils.java @@ -0,0 +1,21 @@ +package com.mavlushechka.a1qa.framework.utils; + +import java.util.OptionalInt; +import java.util.Random; + +public class IntegerUtils { + + private IntegerUtils() { + } + + public static int getRandomNumber(int min, int max) { + OptionalInt randomNumber = new Random().ints(min, max).findFirst(); + + if (randomNumber.isPresent()) { + return randomNumber.getAsInt(); + } + LoggerUtils.error("Incorrect min and max arguments."); + throw new IllegalArgumentException("Incorrect min and max arguments."); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/JsonParser.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/JsonParser.java new file mode 100644 index 0000000..4f89e12 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/JsonParser.java @@ -0,0 +1,94 @@ +package com.mavlushechka.a1qa.framework.utils; + +import com.google.gson.Gson; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Map; +import java.util.TreeMap; + +public class JsonParser { + + private final static TreeMap<String, JSONObject> parsedJSON = new TreeMap<>(); + + + public static String parseData(String filename, String key) { + return parse(filename, key, false); + } + + public static String parseObject(String filename, String key) { + return parse(filename, key, true); + } + + public static boolean isJson(String json) { + try { + new JSONObject(json); + } catch (JSONException jsonObjectException) { + try { + new JSONArray(json); + } catch (JSONException jsonArrayException) { + return false; + } + } + return true; + } + + public static boolean isBodyEmpty(String json) { + return json.equals("{}"); + } + + public static <T> T convertToObject(String json, Class<T> classToConvert) { + return new Gson().fromJson(json, classToConvert); + } + + public static <T> String convertToJson(T object) { + return new Gson().toJson(object); + } + + public static <T> T[] convertArray(String json, Class<T> classToConvert) { + Gson gson = new Gson(); + JSONArray jsonArray = new JSONArray(json); + ArrayList<T> objects = new ArrayList<>(); + + for (int i = 0; i < jsonArray.length(); i++) { + objects.add(gson.fromJson(jsonArray.getJSONObject(i).toString(), classToConvert)); + } + return (T[]) objects.toArray(); + } + + private static String parse(String filename, String key, boolean isObject) { + Map.Entry<String, JSONObject> ceilingEntry = parsedJSON.ceilingEntry(filename); + + if (ceilingEntry == null || !ceilingEntry.getKey().startsWith(filename)) { + parseFile(filename); + } + return parseData(filename, key, isObject); + } + + private static void parseFile(String filename) { + parsedJSON.put(filename, new JSONObject(FileParser.parse("src/main/resources/" + filename + ".json"))); + } + + private static String parseData(String jsonName, String key, boolean isObject) { + JSONObject jsonObject = new JSONObject(parsedJSON.get(jsonName).toString()); + String[] keys = key.split("\\."); + + for (int i = 0; i < keys.length - 1; i++) { + if (keys[i].contains("[") && keys[i].contains("]")) { + String splitKey = keys[i].split("\\[")[0]; + int index = Integer.parseInt(keys[i].split("\\[")[1].replaceAll("[\\[\\]]", "")); + + jsonObject = jsonObject.getJSONArray(splitKey).getJSONObject(index); + } else { + jsonObject = jsonObject.getJSONObject(keys[i]); + } + } + if (isObject) { + return jsonObject.getJSONObject(keys[keys.length - 1]).toString(); + } + return jsonObject.getString(keys[keys.length - 1]); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/LoggerUtils.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/LoggerUtils.java new file mode 100644 index 0000000..8675d92 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/LoggerUtils.java @@ -0,0 +1,46 @@ +package com.mavlushechka.a1qa.framework.utils; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import org.apache.logging.log4j.core.config.xml.XmlConfiguration; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class LoggerUtils { + + private final static File CONFIGURATION_FILE = new File("src/main/resources/log4j2.xml"); + private static Logger logger; + private static int step = 0; + + + private LoggerUtils() { + } + + public static void initialize() { + try { + Configurator.initialize(new XmlConfiguration(null, new ConfigurationSource(new FileInputStream(CONFIGURATION_FILE)))); + } catch (IOException ioException) { + throw new RuntimeException(ioException); + } + logger = LogManager.getLogger(); + } + + public static void step(String text) { + step++; + info("Step %d: %s".formatted(step, text)); + } + + public static void info(String text) { + logger.log(Level.INFO, text); + } + + public static void error(String text) { + logger.log(Level.ERROR, text); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/StringUtils.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/StringUtils.java new file mode 100644 index 0000000..ae699d1 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/StringUtils.java @@ -0,0 +1,43 @@ +package com.mavlushechka.a1qa.framework.utils; + +import java.util.Random; + +public class StringUtils { + + private StringUtils() { + } + + public static String convertToConstantCase(String text) { + StringBuilder stringBuilder = new StringBuilder(); + String[] words = text.split(" "); + + for (int i = 0; i < words.length; i++) { + stringBuilder.append(words[i].toUpperCase()); + if (i != words.length - 1) { + stringBuilder.append("_"); + } + } + + return stringBuilder.toString(); + } + + public static String capitalizeFirstLetter(String text) { + return text.substring(0, 1).toUpperCase() + text.substring(1); + } + + public static int removeNonDigits(String text) { + return Integer.parseInt(text.replaceAll("[^0-9]+", "")); + } + + public static String generateRandomText(int lettersLowerBound, int lettersUpperBound, int length) { + return new Random().ints(lettersLowerBound, lettersUpperBound + 1) + .limit(length) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + } + + public static String replaceByStars(String text) { + return "*".repeat(text.length()); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/UrlConnectionManager.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/UrlConnectionManager.java new file mode 100644 index 0000000..b8dad83 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/UrlConnectionManager.java @@ -0,0 +1,50 @@ +package com.mavlushechka.a1qa.framework.utils; + +import com.mavlushechka.a1qa.framework.constants.RequestMethod; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; + +public class UrlConnectionManager { + + public static String get(String spec) throws IOException { + StringBuilder stringBuilder = new StringBuilder(); + + try (BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(HttpUrlConnectionFactory.createHttpUrlConnection(spec, RequestMethod.GET, false).getInputStream())) + ) { + String inputLine; + + while ((inputLine = bufferedReader.readLine()) != null) { + stringBuilder.append(inputLine); + } + } + return stringBuilder.toString(); + } + + public static String post(String spec, String content) throws IOException { + HttpURLConnection httpUrlConnection = HttpUrlConnectionFactory.createHttpUrlConnection(spec, RequestMethod.POST, true); + StringBuilder stringBuilder = new StringBuilder(); + + try (DataOutputStream dataOutputStream = new DataOutputStream(httpUrlConnection.getOutputStream())) { + dataOutputStream.writeBytes(content); + dataOutputStream.flush(); + } + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()))) { + String inputLine; + + while ((inputLine = bufferedReader.readLine()) != null) { + stringBuilder.append(inputLine); + } + } + return stringBuilder.toString(); + } + + public static int getResponseCode(String spec, RequestMethod requestMethod) throws IOException { + return HttpUrlConnectionFactory.createHttpUrlConnection(spec, requestMethod, false).getResponseCode(); + } + +} diff --git a/src/main/resources/config.json b/src/main/resources/config.json new file mode 100644 index 0000000..efac2e4 --- /dev/null +++ b/src/main/resources/config.json @@ -0,0 +1,18 @@ +{ + "browser": { + "url": "http://localhost:8080" + }, + "randomTextGenerator": { + "lettersLowerBound": "97", + "lettersUpperBound": "122", + "length": "10" + }, + "integerUtils": { + "randomNumberMin": "0", + "randomNumberMax": "101" + }, + "httpUrlConnection": { + "connectTimeout": "5000", + "readTimeout": "5000" + } +}
\ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml new file mode 100644 index 0000000..756a521 --- /dev/null +++ b/src/main/resources/log4j2.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration status="INFO"> + <Appenders> + <Console name="consoleAppender" target="SYSTEM_OUT"> + <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> + </Console> + <File name="fileAppender" fileName="target/logFile.log"> + <PatternLayout> + <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> + </PatternLayout> + </File> + </Appenders> + <Loggers> + <Logger name="FILE_APPENDER" + level="INFO" additivity="false"> + <AppenderRef ref="fileAppender" /> + </Logger> + <Root level="TRACE"> + <AppenderRef ref="consoleAppender"/> + <AppenderRef ref="fileAppender"/> + </Root> + </Loggers> +</Configuration>
\ No newline at end of file diff --git a/src/main/resources/settings.json b/src/main/resources/settings.json new file mode 100644 index 0000000..4e41432 --- /dev/null +++ b/src/main/resources/settings.json @@ -0,0 +1,118 @@ +{ + "browserName" : "firefox", + "isRemote": false, + "remoteConnectionUrl": "http://localhost:4444/wd/hub", + "isElementHighlightEnabled" : true, + + "driverSettings": { + "chrome": { + "webDriverVersion": "latest", + "capabilities": { + }, + "options": { + "intl.accept_languages": "en", + "safebrowsing.enabled": "true", + "profile.default_content_settings.popups": "0", + "disable-popup-blocking": "true", + "download.prompt_for_download": "false", + "download.default_directory": "//home//selenium//downloads" + }, + "pageLoadStrategy": "Normal", + "startArguments": [] + }, + "edge": { + "webDriverVersion": "latest", + "capabilities": { + }, + "options": { + "intl.accept_languages": "en", + "safebrowsing.enabled": "true", + "profile.default_content_settings.popups": "0", + "disable-popup-blocking": "true", + "download.prompt_for_download": "false", + "download.default_directory": "//home//selenium//downloads" + }, + "startArguments": [] + }, + "firefox": { + "webDriverVersion": "latest", + "capabilities": { + }, + "options": { + "intl.accept_languages": "en", + "browser.download.dir": "//home//selenium//downloads", + "browser.download.folderList": 2, + "browser.helperApps.neverAsk.saveToDisk": "application/octet-stream, application/x-debian-package, application/x-www-form-urlencod, application/json, application/x-compressed, application/x-zip-compressed, application/zip, multipart/x-zip, text/plain, text/csv", + "browser.helperApps.alwaysAsk.force": false, + "browser.download.manager.alertOnEXEOpen": false, + "browser.download.manager.focusWhenStarting": false, + "browser.download.useDownloadDir": true, + "browser.download.manager.showWhenStarting": false, + "browser.download.manager.closeWhenDone": true, + "browser.download.manager.showAlertOnComplete": false, + "browser.download.manager.useWindow": false, + "browser.download.panel.shown": false + }, + "startArguments": ["--private", "--kiosk"] + }, + "iexplorer": { + "webDriverVersion": "latest", + "systemArchitecture": "X32", + "capabilities": { + "ignoreProtectedModeSettings": true + } + }, + "opera": { + "webDriverVersion": "latest", + "binaryLocation": "%USERPROFILE%\\AppData\\Local\\Programs\\Opera\\launcher.exe", + "capabilities": { + }, + "options": { + "intl.accept_languages": "en", + "safebrowsing.enabled": "true", + "profile.default_content_settings.popups": "0", + "disable-popup-blocking": "true", + "download.prompt_for_download": "false", + "download.default_directory": "./downloads" + }, + "startArguments": ["--remote-debugging-port=9222", "--no-sandbox", "--disable-dev-shm-usage"] + }, + "safari": { + "downloadDir": "/Users/username/Downloads" + }, + "yandex": { + "webDriverVersion": "102.0.5005.61", + "binaryLocation": "%USERPROFILE%\\AppData\\Local\\Yandex\\YandexBrowser\\Application\\browser.exe", + "capabilities": { + }, + "options": { + "intl.accept_languages": "en", + "safebrowsing.enabled": "true", + "profile.default_content_settings.popups": "0", + "disable-popup-blocking": "true", + "download.prompt_for_download": "false", + "download.default_directory": "./downloads" + }, + "startArguments": [] + } + }, + "timeouts": { + "timeoutImplicit" : 0, + "timeoutCondition" : 30, + "timeoutScript" : 10, + "timeoutPageLoad" : 15, + "timeoutPollingInterval": 300, + "timeoutCommand":120 + }, + "retry": { + "number": 2, + "pollingInterval": 300 + }, + "logger": { + "language": "en", + "logPageSource": true + }, + "elementCache": { + "isEnabled": false + } +}
\ No newline at end of file diff --git a/src/main/resources/testData.json b/src/main/resources/testData.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/src/main/resources/testData.json @@ -0,0 +1,3 @@ +{ + +}
\ No newline at end of file diff --git a/src/test/java/com/mavlushechka/a1qa/framework/BaseTest.java b/src/test/java/com/mavlushechka/a1qa/framework/BaseTest.java new file mode 100644 index 0000000..c4240d5 --- /dev/null +++ b/src/test/java/com/mavlushechka/a1qa/framework/BaseTest.java @@ -0,0 +1,22 @@ +package com.mavlushechka.a1qa.framework; + +import aquality.selenium.browser.AqualityServices; +import com.mavlushechka.a1qa.framework.utils.JsonParser; +import com.mavlushechka.a1qa.framework.utils.LoggerUtils; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeSuite; + +public class BaseTest { + + @BeforeSuite + public void setUp() { + LoggerUtils.initialize(); + AqualityServices.getBrowser().goTo(JsonParser.parseData("config", "browser.url")); + } + + @AfterTest + public void tearDown() { + AqualityServices.getBrowser().quit(); + } + +} diff --git a/src/test/java/com/mavlushechka/a1qa/project/TestCase1.java b/src/test/java/com/mavlushechka/a1qa/project/TestCase1.java new file mode 100644 index 0000000..599e651 --- /dev/null +++ b/src/test/java/com/mavlushechka/a1qa/project/TestCase1.java @@ -0,0 +1,13 @@ +package com.mavlushechka.a1qa.project; + +import com.mavlushechka.a1qa.framework.BaseTest; +import org.testng.annotations.Test; + +public class TestCase1 extends BaseTest { + + @Test + public void test1() { + + } + +} |