summaryrefslogtreecommitdiff
path: root/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/mavlushechka/a1qa/framework/utils/Collections.java20
-rw-r--r--src/main/java/com/mavlushechka/a1qa/framework/utils/IntegerUtils.java25
-rw-r--r--src/main/java/com/mavlushechka/a1qa/framework/utils/StringUtils.java47
-rw-r--r--src/main/java/com/mavlushechka/a1qa/framework/utils/UrlConnectionManager.java65
-rw-r--r--src/main/java/com/mavlushechka/a1qa/project/constants/Result.java7
-rw-r--r--src/main/java/com/mavlushechka/a1qa/project/constants/SiteApiMethod.java16
-rw-r--r--src/main/java/com/mavlushechka/a1qa/project/models/Test.java40
-rw-r--r--src/main/java/com/mavlushechka/a1qa/project/models/User.java4
-rw-r--r--src/main/java/com/mavlushechka/a1qa/project/pages/AddProjectPage.java35
-rw-r--r--src/main/java/com/mavlushechka/a1qa/project/pages/ProjectsPage.java65
-rw-r--r--src/main/java/com/mavlushechka/a1qa/project/pages/TestsPage.java51
-rw-r--r--src/main/java/com/mavlushechka/a1qa/project/utils/SiteApiUtils.java47
12 files changed, 422 insertions, 0 deletions
diff --git a/src/main/java/com/mavlushechka/a1qa/framework/utils/Collections.java b/src/main/java/com/mavlushechka/a1qa/framework/utils/Collections.java
new file mode 100644
index 0000000..7a1cd1a
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/Collections.java
@@ -0,0 +1,20 @@
+package com.mavlushechka.a1qa.framework.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public class Collections {
+
+ private Collections() {
+ }
+
+ public static boolean isSortedDescending(List<?> list) {
+ List<?> descendingSortedList = new ArrayList<>(list);
+
+ descendingSortedList.sort(java.util.Collections.reverseOrder());
+
+ return Objects.equals(list, descendingSortedList);
+ }
+
+}
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..5b6b7da
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/IntegerUtils.java
@@ -0,0 +1,25 @@
+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.");
+ }
+
+ public static int parseInt(String text) {
+ return Integer.parseInt(text.replaceAll("[^0-9.]", ""));
+ }
+
+}
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..29323d0
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/StringUtils.java
@@ -0,0 +1,47 @@
+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());
+ }
+
+ public static String removeHttpProtocol(String url) {
+ return url.split("http://", 2)[1];
+ }
+
+}
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..fd7508b
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/framework/utils/UrlConnectionManager.java
@@ -0,0 +1,65 @@
+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) throws IOException {
+ StringBuilder stringBuilder = new StringBuilder();
+
+ try (BufferedReader bufferedReader = new BufferedReader(
+ new InputStreamReader(HttpUrlConnectionFactory.createHttpUrlConnection(spec, RequestMethod.POST, 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/java/com/mavlushechka/a1qa/project/constants/Result.java b/src/main/java/com/mavlushechka/a1qa/project/constants/Result.java
new file mode 100644
index 0000000..3fea54f
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/project/constants/Result.java
@@ -0,0 +1,7 @@
+package com.mavlushechka.a1qa.project.constants;
+
+public enum Result {
+
+ FAILED, SKIPPED, IN_PROGRESS, PASSED
+
+}
diff --git a/src/main/java/com/mavlushechka/a1qa/project/constants/SiteApiMethod.java b/src/main/java/com/mavlushechka/a1qa/project/constants/SiteApiMethod.java
new file mode 100644
index 0000000..f90c85e
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/project/constants/SiteApiMethod.java
@@ -0,0 +1,16 @@
+package com.mavlushechka.a1qa.project.constants;
+
+public enum SiteApiMethod {
+
+ TOKEN_GET("/token/get"), TEST_GET_JSON("/test/get/json"), TEST_PUT("/test/put"), TEST_PUT_LOG("/test/put/log"),
+ TEST_PUT_ATTACHMENT("/test/put/attachment");
+
+
+ public final String url;
+
+
+ SiteApiMethod(String url) {
+ this.url = url;
+ }
+
+}
diff --git a/src/main/java/com/mavlushechka/a1qa/project/models/Test.java b/src/main/java/com/mavlushechka/a1qa/project/models/Test.java
new file mode 100644
index 0000000..8011157
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/project/models/Test.java
@@ -0,0 +1,40 @@
+package com.mavlushechka.a1qa.project.models;
+
+import com.mavlushechka.a1qa.project.constants.Result;
+import org.checkerframework.checker.nullness.qual.NonNull;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Objects;
+
+public record Test(String name, String method, Result status, String startTime, String endTime, String duration)
+ implements Comparable<Test> {
+
+ public Test {
+ if (status == Result.IN_PROGRESS) {
+ status = null;
+ }
+ if (Objects.equals(startTime, "")) {
+ startTime = null;
+ }
+ if (Objects.equals(endTime, "")) {
+ endTime = null;
+ }
+ }
+
+ @Override
+ public int compareTo(@NonNull Test test) {
+ if (startTime == null && test.startTime == null) {
+ return 0;
+ }
+ if (startTime == null) {
+ return -1;
+ }
+ if (test.startTime == null) {
+ return 1;
+ }
+ return LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"))
+ .compareTo(LocalDateTime.parse(test.startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S")));
+ }
+
+}
diff --git a/src/main/java/com/mavlushechka/a1qa/project/models/User.java b/src/main/java/com/mavlushechka/a1qa/project/models/User.java
new file mode 100644
index 0000000..b3f3ea2
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/project/models/User.java
@@ -0,0 +1,4 @@
+package com.mavlushechka.a1qa.project.models;
+
+public record User(String login, String password) {
+}
diff --git a/src/main/java/com/mavlushechka/a1qa/project/pages/AddProjectPage.java b/src/main/java/com/mavlushechka/a1qa/project/pages/AddProjectPage.java
new file mode 100644
index 0000000..b817d46
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/project/pages/AddProjectPage.java
@@ -0,0 +1,35 @@
+package com.mavlushechka.a1qa.project.pages;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.elements.interfaces.IButton;
+import aquality.selenium.elements.interfaces.ILabel;
+import aquality.selenium.elements.interfaces.ITextBox;
+import aquality.selenium.forms.Form;
+import org.openqa.selenium.By;
+
+public class AddProjectPage extends Form {
+
+
+ private final ITextBox projectNameBox = AqualityServices.getElementFactory().getTextBox(By.id("projectName"), "Project name");
+ private final IButton saveProjectButton = AqualityServices.getElementFactory().getButton(
+ By.xpath("//*[@id='addProjectForm']//button[contains(@class, 'btn-primary')]"), "Save project"
+ );
+ private final ILabel projectSavedLabel = AqualityServices.getElementFactory().getLabel(
+ By.xpath("//*[@id='addProjectForm']//*[contains(@class, 'alert-success')]"), "Project saved"
+ );
+
+
+ public AddProjectPage() {
+ super(By.id("addProjectForm"), "Add project");
+ }
+
+ public void saveProject(String name) {
+ projectNameBox.clearAndType(name);
+ saveProjectButton.click();
+ }
+
+ public boolean isProjectSaved(String projectName) {
+ return projectSavedLabel.state().waitForDisplayed() && projectSavedLabel.getText().contains(projectName);
+ }
+
+}
diff --git a/src/main/java/com/mavlushechka/a1qa/project/pages/ProjectsPage.java b/src/main/java/com/mavlushechka/a1qa/project/pages/ProjectsPage.java
new file mode 100644
index 0000000..bf670fc
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/project/pages/ProjectsPage.java
@@ -0,0 +1,65 @@
+package com.mavlushechka.a1qa.project.pages;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.elements.ElementType;
+import aquality.selenium.elements.interfaces.IButton;
+import aquality.selenium.forms.Form;
+import com.mavlushechka.a1qa.framework.utils.IntegerUtils;
+import com.mavlushechka.a1qa.framework.utils.JsonParser;
+import com.mavlushechka.a1qa.framework.utils.StringUtils;
+import com.mavlushechka.a1qa.project.models.User;
+import org.openqa.selenium.By;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProjectsPage extends Form {
+
+
+ private final IButton addButton = AqualityServices.getElementFactory().getButton(By.xpath("//*[contains(@class, 'panel-heading')]//a[@href='addProject']"), "Add project");
+
+ private final String url = JsonParser.parseData("config", "browser.url") + "/web/projects";
+
+
+ public ProjectsPage() {
+ super(By.xpath("//*[contains(@class, 'panel')]"), "Projects");
+ }
+
+ public void performAuthorization(User user) {
+ AqualityServices.getBrowser().goTo("%s:%s@%s".formatted(user.login(), user.password(), StringUtils.removeHttpProtocol(url)));
+ AqualityServices.getBrowser().goTo(url);
+ }
+
+ public int getVersion() {
+ return IntegerUtils.parseInt(
+ AqualityServices.getElementFactory().get(
+ ElementType.LABEL,
+ By.xpath("//*[contains(@class, 'footer-text')]//span"),
+ "Version"
+ ).getText()
+ );
+ }
+
+ public List<String> getProjects() {
+ List<String> projects = new ArrayList<>();
+
+ AqualityServices.getElementFactory().findElements(
+ By.xpath("//*[contains(@class, 'list-group')]//a[contains(@class, 'list-group-item')]"), ElementType.LABEL
+ ).forEach(element -> projects.add(element.getText()));
+
+ return projects;
+ }
+
+ public void openProject(String projectName) {
+ AqualityServices.getElementFactory().get(
+ ElementType.BUTTON,
+ By.xpath("//*[contains(@class, 'panel')]//a[contains(@class, 'list-group-item') and text()='%s']".formatted(projectName)),
+ "Project"
+ ).clickAndWait();
+ }
+
+ public void clickOnAddButton() {
+ addButton.click();
+ }
+
+}
diff --git a/src/main/java/com/mavlushechka/a1qa/project/pages/TestsPage.java b/src/main/java/com/mavlushechka/a1qa/project/pages/TestsPage.java
new file mode 100644
index 0000000..6d09203
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/project/pages/TestsPage.java
@@ -0,0 +1,51 @@
+package com.mavlushechka.a1qa.project.pages;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.elements.ElementType;
+import aquality.selenium.elements.interfaces.IElement;
+import aquality.selenium.forms.Form;
+import com.mavlushechka.a1qa.framework.utils.StringUtils;
+import com.mavlushechka.a1qa.project.constants.Result;
+import com.mavlushechka.a1qa.project.models.Test;
+import org.openqa.selenium.By;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestsPage extends Form {
+
+
+ public TestsPage() {
+ super(By.id("pie"), "Tests");
+ }
+
+ public List<Test> getAllRunningTests() {
+ AqualityServices.getConditionalWait().waitFor(
+ () -> AqualityServices.getElementFactory().findElements(
+ By.xpath("//*[contains(@class, 'panel')]//table[contains(@class, 'table')]//tbody//td"), ElementType.LABEL
+ ).size() > 5
+ );
+ List<IElement> testsData = AqualityServices.getElementFactory().findElements(
+ By.xpath("//*[contains(@class, 'panel')]//table[contains(@class, 'table')]//tbody//td"),
+ ElementType.LABEL
+ );
+ List<Test> runningTests = new ArrayList<>();
+
+ for (int i = 0; i < testsData.size(); i += 7) {
+ runningTests.add(
+ new Test(
+ testsData.get(i).getText(),
+ testsData.get(i + 1).getText(),
+ Result.valueOf(StringUtils.convertToConstantCase(testsData.get(i + 2).getText())),
+ testsData.get(i + 3).getText(),
+ testsData.get(i + 4).getText(),
+ testsData.get(i + 5).getText()
+ )
+ );
+ }
+
+ return runningTests;
+ }
+
+
+}
diff --git a/src/main/java/com/mavlushechka/a1qa/project/utils/SiteApiUtils.java b/src/main/java/com/mavlushechka/a1qa/project/utils/SiteApiUtils.java
new file mode 100644
index 0000000..a739e00
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/project/utils/SiteApiUtils.java
@@ -0,0 +1,47 @@
+package com.mavlushechka.a1qa.project.utils;
+
+import com.mavlushechka.a1qa.framework.utils.JsonParser;
+import com.mavlushechka.a1qa.framework.utils.UrlConnectionManager;
+import com.mavlushechka.a1qa.project.constants.SiteApiMethod;
+
+import java.io.IOException;
+import java.util.Base64;
+
+public class SiteApiUtils {
+
+
+ private static final String url = "%s/api".formatted(JsonParser.parseData("config", "browser.url"));
+
+
+ private SiteApiUtils() {
+ }
+
+ public static String generateToken(int variant) throws IOException {
+ return UrlConnectionManager.post("%s%s?variant=%d".formatted(url, SiteApiMethod.TOKEN_GET.url, variant));
+ }
+
+ public static String getTestsJson(int projectId) throws IOException {
+ return UrlConnectionManager.post("%s%s?projectId=%d".formatted(url, SiteApiMethod.TEST_GET_JSON.url, projectId));
+ }
+
+ public static int putTest(String sid, String projectName, String testName, String methodName, String env) throws IOException {
+ return Integer.parseInt(
+ UrlConnectionManager.post(
+ "%s%s?SID=%s&projectName=%s&testName=%s&methodName=%s&env=%s"
+ .formatted(url, SiteApiMethod.TEST_PUT.url, sid, projectName, testName, methodName, env)
+ )
+ );
+ }
+
+ public static void putLogToTest(int testId, String content) throws IOException {
+ UrlConnectionManager.post("%s%s?testId=%d&content=%s".formatted(url, SiteApiMethod.TEST_PUT_LOG.url, testId, content));
+ }
+
+ public static void putAttachmentToTest(int testId, byte[] content, String contentType) throws IOException {
+ UrlConnectionManager.post(
+ "%s%s?testId=%d&content=%s&contentType=%s"
+ .formatted(url, SiteApiMethod.TEST_PUT_ATTACHMENT.url, testId, Base64.getEncoder().encodeToString(content), contentType)
+ );
+ }
+
+}