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
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,7 @@ mvn -Dallure.results.directory=/tmp/allure allure:serve
# Открыть отчёт в браузере
firefox target/site/allure-maven-plugin/index.html
```

## Взаимодействие по протоколам
Пример (REST): GET /repos/{owner}/{repo}/issues -> HTTP 200, массив объектов JSON
Пример (GraphQL): POST /graphql -> HTTP 200, объект JSON с обязательным ключом data (или errors)
12 changes: 9 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<lombok.version>1.18.48</lombok.version>
<maven-surefire.version>3.6.0</maven-surefire.version>
<maven-compiler.version>3.16.0</maven-compiler.version>
<exec-maven.version>3.6.4</exec-maven.version>
<jackson.version>3.2.2</jackson.version>
<junit.version>6.1.3</junit.version>
<okhttp-logging-interceptor.version>4.12.0</okhttp-logging-interceptor.version>
Expand Down Expand Up @@ -110,10 +111,15 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire.version}</version>
</plugin>

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>${exec-maven.version}</version>
<configuration>
<excludes>
<exclude>**/CleanupRunner.java</exclude>
</excludes>
<mainClass>org.nokhrin.github.cleanup.CleanupRunner</mainClass>
<classpathScope>test</classpathScope>
</configuration>
</plugin>

Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/nokhrin/github/config/Endpoints.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ private Endpoints() {

public static final String REPO = "/repos/{owner}/{repo}";
public static final String ISSUES = "/repos/{owner}/{repo}/issues";
public static final String GRAPHQL = "/graphql";
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,41 @@
package org.nokhrin.github.restassured.utils;
package org.nokhrin.github.cleanup;

import io.restassured.RestAssured;
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.config.LogConfig;
import io.restassured.specification.RequestSpecification;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
import org.nokhrin.github.config.TestConfig;
import org.nokhrin.github.utils.IssueUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class CleanupRunner {
private RequestSpecification rwAuthSpec;
private static final Logger LOGGER = LoggerFactory.getLogger(CleanupRunner.class);
private static String baseUrl, owner, repo;
private static TestConfig config;
private static RequestSpecification rwAuthSpec;


static void main() {
LOGGER.debug("Clean");
config = TestConfig.fromEnv();

baseUrl = config.githubBaseUrl();
owner = config.githubOwner();
repo = config.githubRepo();

@BeforeAll
void setUp() {
TestConfig config = TestConfig.fromEnv();

RestAssured.config = RestAssured.config()
.logConfig(LogConfig.logConfig().blacklistHeader("Authorization"));

RequestSpecification baseSpec = new RequestSpecBuilder()
.setBaseUri(config.githubBaseUrl())
.setBaseUri(baseUrl)
.addHeader("Accept", "application/vnd.github+json")
.addHeader("X-GitHub-Api-Version", "2022-11-28")
.addHeader("User-Agent", "sqa-lab-tests/1.0")
.addHeader("X-GitHub-Api-Version", "2026-03-10")
.addHeader("User-Agent", owner)
.build();

rwAuthSpec = new RequestSpecBuilder()
Expand All @@ -34,11 +44,8 @@ void setUp() {
.addPathParam("repo", config.githubRepo())
.addHeader("Authorization", "Bearer " + config.readAndWriteToken())
.build();
}

@Test
@EnabledIfSystemProperty(named = "cleanup", matches = "true")
void runCleanup() {

IssueUtils.closeOpenIssues(rwAuthSpec);
}
}
55 changes: 55 additions & 0 deletions src/test/java/org/nokhrin/github/graphql/GraphQLBaseTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.nokhrin.github.graphql;

import io.restassured.RestAssured;
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.config.LogConfig;
import io.restassured.specification.RequestSpecification;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.TestInstance;
import org.nokhrin.github.config.TestConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public abstract class GraphQLBaseTest {
protected final Logger LOGGER = LoggerFactory.getLogger(GraphQLBaseTest.class);

protected String baseUrl, owner, repo;
protected TestConfig config;
protected RequestSpecification baseSpec, unAuthSpec, rwAuthSpec, roAuthSpec;

@BeforeAll
void setUp() {
config = TestConfig.fromEnv();
LOGGER.debug("Загружена конфигурация: " + config);

baseUrl = config.githubBaseUrl();
owner = config.githubOwner();
repo = config.githubRepo();

RestAssured.config = RestAssured.config()
.logConfig(LogConfig.logConfig().blacklistHeader("Authorization"));

baseSpec = new RequestSpecBuilder()
.setBaseUri(baseUrl)
.addHeader("Accept", "application/vnd.github+json")
.addHeader("X-GitHub-Api-Version", "2026-03-10")
.addHeader("User-Agent", owner)
.build();

unAuthSpec = new RequestSpecBuilder()
.addRequestSpecification(baseSpec)
.build();

rwAuthSpec = new RequestSpecBuilder()
.addRequestSpecification(baseSpec)
.addHeader("Authorization", "Bearer " + config.readAndWriteToken())
.build();

roAuthSpec = new RequestSpecBuilder()
.addRequestSpecification(baseSpec)
.addHeader("Authorization", "Bearer " + config.readToken())
.build();

}
}
46 changes: 46 additions & 0 deletions src/test/java/org/nokhrin/github/graphql/IssueTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package org.nokhrin.github.graphql;

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;
import org.nokhrin.github.utils.ReadResource;

import java.util.Map;

import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;
import static org.hamcrest.Matchers.nullValue;
import static org.nokhrin.github.config.Endpoints.GRAPHQL;

public class IssueTest extends GraphQLBaseTest {

@Test
public void verifyIssuesQueryReturnsValidIssues() {
String query = ReadResource.readResource("graphql/get-issues.graphql");

Map<String, Object> variables = Map.of(
"owner", config.githubOwner(),
"name", config.githubRepo(),
"limit", 5
);
Map<String, Object> requestBody = Map.of(
"query", query,
"variables", variables
);
RestAssured.given()
.spec(roAuthSpec)
.contentType(ContentType.JSON)
.accept(ContentType.JSON)
.body(requestBody)
.when()
.post(GRAPHQL)
.then()
.statusCode(200)
.log().all()
.body("errors", nullValue())
.body(matchesJsonSchemaInClasspath(
"schemas/get-issues-response.json"
))
;
}

}
48 changes: 48 additions & 0 deletions src/test/java/org/nokhrin/github/graphql/ZenTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package org.nokhrin.github.graphql;

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.nokhrin.github.utils.ReadResource;

import java.util.Map;

import static org.hamcrest.Matchers.nullValue;
import static org.junit.jupiter.api.Assertions.*;
import static org.nokhrin.github.config.Endpoints.GRAPHQL;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class ZenTest extends GraphQLBaseTest {

@Test
public void verify_GraphQLendPointAvailable_tokenValid_gqlRequestValid() {
String query = ReadResource.readResource("graphql/healthcheck.graphql");

Response response = RestAssured.given()
.spec(roAuthSpec)
.contentType(ContentType.JSON)
.accept(ContentType.JSON)
.body(Map.of("query", query))
.when()
.post(GRAPHQL)
.then()
.statusCode(200)
.log().ifValidationFails()
.body("errors", nullValue())
.extract()
.response();
int limit = response.path("data.rateLimit.limit");
int remaining = response.path("data.rateLimit.remaining");
int used = response.path("data.rateLimit.used");

assertAll(
() -> assertTrue(limit >= 0),
() -> assertTrue(remaining >= 0),
() -> assertTrue(used >= 0),
() -> assertTrue(remaining <= limit),
() -> assertEquals(limit, remaining + used)
);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.nokhrin.github.restassured;
package org.nokhrin.github.rest;

import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
Expand All @@ -9,7 +9,7 @@
import static org.nokhrin.github.config.Endpoints.ISSUES;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class AccessTest extends BaseTest {
public class AccessTest extends RestBaseTest {


@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.nokhrin.github.restassured;
package org.nokhrin.github.rest;

import io.qameta.allure.Feature;
import io.qameta.allure.Severity;
Expand All @@ -13,9 +13,8 @@
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.nokhrin.github.model.Issue;
import org.nokhrin.github.restassured.utils.IssueUtils;
import org.nokhrin.github.restassured.utils.PaginationResult;
import org.nokhrin.github.restassured.utils.WaitUtil;
import org.nokhrin.github.utils.IssueUtils;
import org.nokhrin.github.utils.WaitUtil;

import java.time.Duration;
import java.time.Instant;
Expand All @@ -28,10 +27,10 @@
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.nokhrin.github.config.Endpoints.ISSUES;
import static org.nokhrin.github.restassured.utils.IssueUtils.closeOpenIssues;
import static org.nokhrin.github.utils.IssueUtils.closeOpenIssues;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class IssueTest extends BaseTest {
public class IssueTest extends RestBaseTest {

@AfterAll
void tearDown() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.nokhrin.github.restassured.utils;
package org.nokhrin.github.rest;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.nokhrin.github.restassured;
package org.nokhrin.github.rest;

import io.qameta.allure.Feature;
import io.qameta.allure.Severity;
Expand All @@ -12,7 +12,7 @@
import static org.nokhrin.github.config.Endpoints.REPO;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class RepoTest extends BaseTest {
public class RepoTest extends RestBaseTest {

@Feature("GitHub Issues API")
@Severity(SeverityLevel.CRITICAL)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.nokhrin.github.restassured;
package org.nokhrin.github.rest;

import io.restassured.RestAssured;
import io.restassured.builder.RequestSpecBuilder;
Expand All @@ -18,8 +18,8 @@
import static org.nokhrin.github.config.Endpoints.ISSUES;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public abstract class BaseTest {
protected final Logger LOGGER = LoggerFactory.getLogger(BaseTest.class);
public abstract class RestBaseTest {
protected final Logger LOGGER = LoggerFactory.getLogger(RestBaseTest.class);

protected String baseUrl, owner, repo;
protected TestConfig config;
Expand Down
36 changes: 36 additions & 0 deletions src/test/java/org/nokhrin/github/rest/ZenTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.nokhrin.github.rest;

import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;

import static org.hamcrest.Matchers.emptyString;
import static org.hamcrest.Matchers.not;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class ZenTest extends RestBaseTest {

@Test
public void verifyHealthcheck200Test() {
RestAssured.given()
.spec(baseSpec)
.when()
.get("/zen")
.then()
.statusCode(200)
.log().ifValidationFails();
}

@Test
public void verifyHealthcheckNotEmptyBodyTest() {
RestAssured.given()
.spec(baseSpec)
.when()
.get("/zen")
.then()
.statusCode(200)
.body(not(emptyString()))
.log().ifValidationFails()
;
}
}
Loading
Loading