diff options
Diffstat (limited to 'src/main/java/com/mavlushechka')
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) + ); + } + +} |