From 6fe3a4e5d9d80b93bb7976534f8f8e67fa692bc2 Mon Sep 17 00:00:00 2001 From: tstyev Date: Sat, 31 Jan 2026 20:40:57 +0300 Subject: [PATCH 1/4] RF | Add specification for API #1925 --- .../redrover/api/APIFreestyleProjectTest.java | 34 ++++-------------- .../school/redrover/common/APIBaseTest.java | 11 +++--- .../school/redrover/common/JenkinsUtils.java | 26 +++++++++----- .../school/redrover/common/TestUtils.java | 36 +++++++++++++++++++ 4 files changed, 65 insertions(+), 42 deletions(-) create mode 100644 src/test/java/school/redrover/common/TestUtils.java diff --git a/src/test/java/school/redrover/api/APIFreestyleProjectTest.java b/src/test/java/school/redrover/api/APIFreestyleProjectTest.java index 15cf0e3fa..cd102b9d4 100644 --- a/src/test/java/school/redrover/api/APIFreestyleProjectTest.java +++ b/src/test/java/school/redrover/api/APIFreestyleProjectTest.java @@ -10,6 +10,8 @@ import java.util.HashMap; import java.util.Map; +import static school.redrover.common.TestUtils.responseSpec; + public class APIFreestyleProjectTest extends APIBaseTest { private static final String PROJECT_NAME = "FreestyleProject"; @@ -38,33 +40,23 @@ public void testCreateWithValidName() { projectName.put("name", PROJECT_NAME); RestAssured.given() - .log().all() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) .contentType(ContentType.XML) .queryParams(projectName) .body(bodyXML) .when() .post("/createItem") .then() - .log().all() - .statusCode(200); + .spec(responseSpec(200, 1500L)); Response response = RestAssured.given() - .log().all() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) .when() .get("job/%s/api/json".formatted(projectName.get("name"))) .then() - .log().all() + .spec(responseSpec(200, 1500L)) .extract().response(); String actualProjectName = response.jsonPath().getString("name"); Assert.assertEquals(actualProjectName, projectName.get("name")); - - Integer statusCode = response.getStatusCode(); - Assert.assertEquals(statusCode, 200); } @Test @@ -73,39 +65,27 @@ public void testRenameProject() { projectName.put("name", PROJECT_NAME); RestAssured.given() - .log().all() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) .contentType(ContentType.XML) .queryParams(projectName) .body(bodyXML) .when() .post("/createItem") .then() - .log().all() - .statusCode(200); + .spec(responseSpec(200, 1500L)); RestAssured.given() - .log().all() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) .contentType("application/x-www-form-urlencoded") .queryParam("newName", NEW_PROJECT_NAME) .when() .post("job/%s/confirmRename".formatted(projectName.get("name"))) .then() - .log().all() - .statusCode(302); + .spec(responseSpec(302, 1500L)); Response response = RestAssured.given() - .log().all() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) .when() .get("job/%s/api/json".formatted(NEW_PROJECT_NAME)) .then() - .log().all() - .statusCode(200) + .spec(responseSpec(200, 1500L)) .extract().response(); String actualProjectName = response.jsonPath().getString("name"); diff --git a/src/test/java/school/redrover/common/APIBaseTest.java b/src/test/java/school/redrover/common/APIBaseTest.java index 46fde6647..3e4a91b48 100644 --- a/src/test/java/school/redrover/common/APIBaseTest.java +++ b/src/test/java/school/redrover/common/APIBaseTest.java @@ -12,21 +12,20 @@ public abstract class APIBaseTest { protected String jenkinsUrl; - protected String userName; protected String apiToken; protected String tokenUuid; + protected String userName = ProjectUtils.getUserName(); @BeforeClass protected void setUpApi() { RestAssured.filters(new RestAssuredLogFilter()); + RestAssured.requestSpecification = TestUtils.requestSpec(); + Log.info("Generate API token for tests"); jenkinsUrl = ProjectUtils.getUrl(); - userName = ProjectUtils.getUserName(); - - JenkinsUtils.ApiToken token = JenkinsUtils.generateApiToken("api-test-token-" + System.currentTimeMillis()); - apiToken = token.value; - tokenUuid = token.uuid; + apiToken = JenkinsUtils.getApiTokenValue(); + tokenUuid = JenkinsUtils.getApiTokenUuid(); } @BeforeMethod diff --git a/src/test/java/school/redrover/common/JenkinsUtils.java b/src/test/java/school/redrover/common/JenkinsUtils.java index f3efdf504..7b00061f5 100644 --- a/src/test/java/school/redrover/common/JenkinsUtils.java +++ b/src/test/java/school/redrover/common/JenkinsUtils.java @@ -25,6 +25,8 @@ public final class JenkinsUtils { private static String sessionId; + private static ApiToken apiToken; + private JenkinsUtils() { throw new UnsupportedOperationException(); } @@ -229,6 +231,13 @@ private static void deleteSystemMessage() { getCrumbFromPage(mainPage))); } + private synchronized static ApiToken getApiToken() { + if (apiToken == null) { + apiToken = generateApiToken("api-test-token-" + System.currentTimeMillis()); + } + return apiToken; + } + static void clearData() { JenkinsUtils.deleteViews(); JenkinsUtils.deleteJobs(); @@ -255,16 +264,15 @@ public static void logout(WebDriver driver) { driver.get(ProjectUtils.getUrl() + "logout"); } - public static class ApiToken { - public final String name; - public final String value; - public final String uuid; + public synchronized static String getApiTokenValue() { + return getApiToken().value(); + } - public ApiToken(String name, String value, String uuid) { - this.name = name; - this.value = value; - this.uuid = uuid; - } + public synchronized static String getApiTokenUuid() { + return getApiToken().uuid(); + } + + public record ApiToken(String name, String value, String uuid) { } static ApiToken generateApiToken(String tokenName) { diff --git a/src/test/java/school/redrover/common/TestUtils.java b/src/test/java/school/redrover/common/TestUtils.java new file mode 100644 index 000000000..eb6fb1a6a --- /dev/null +++ b/src/test/java/school/redrover/common/TestUtils.java @@ -0,0 +1,36 @@ +package school.redrover.common; + +import io.restassured.builder.RequestSpecBuilder; +import io.restassured.builder.ResponseSpecBuilder; +import io.restassured.filter.log.LogDetail; +import io.restassured.specification.RequestSpecification; +import io.restassured.specification.ResponseSpecification; + +import static io.restassured.RestAssured.preemptive; +import static org.hamcrest.Matchers.lessThan; + +public class TestUtils { + + public static RequestSpecification requestSpec() { + return new RequestSpecBuilder() + .setAuth(preemptive().basic(ProjectUtils.getUserName(), JenkinsUtils.getApiTokenValue())) + .setBaseUri(ProjectUtils.getUrl()) + .log(LogDetail.ALL) + .build(); + } + + public static ResponseSpecification responseSpec(Integer statusCode, Long responseTime) { + return new ResponseSpecBuilder() + .expectStatusCode(statusCode) + .expectResponseTime(lessThan(responseTime)) + .log(LogDetail.ALL) + .build(); + } + + public static ResponseSpecification responseSpec() { + return new ResponseSpecBuilder() + .log(LogDetail.ALL) + .build(); + } + +} From 30a274adda1a8842e98f2cf756175f4ad3433ea8 Mon Sep 17 00:00:00 2001 From: tstyev Date: Sat, 31 Jan 2026 21:05:32 +0300 Subject: [PATCH 2/4] RF | Add specification for API #1925 --- .../java/school/redrover/api/APIFreestyleProjectTest.java | 6 ++++++ src/test/java/school/redrover/common/APIBaseTest.java | 2 -- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/school/redrover/api/APIFreestyleProjectTest.java b/src/test/java/school/redrover/api/APIFreestyleProjectTest.java index cd102b9d4..17d43f8e4 100644 --- a/src/test/java/school/redrover/api/APIFreestyleProjectTest.java +++ b/src/test/java/school/redrover/api/APIFreestyleProjectTest.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.Map; +import static school.redrover.common.TestUtils.requestSpec; import static school.redrover.common.TestUtils.responseSpec; public class APIFreestyleProjectTest extends APIBaseTest { @@ -40,6 +41,7 @@ public void testCreateWithValidName() { projectName.put("name", PROJECT_NAME); RestAssured.given() + .spec(requestSpec()) .contentType(ContentType.XML) .queryParams(projectName) .body(bodyXML) @@ -49,6 +51,7 @@ public void testCreateWithValidName() { .spec(responseSpec(200, 1500L)); Response response = RestAssured.given() + .spec(requestSpec()) .when() .get("job/%s/api/json".formatted(projectName.get("name"))) .then() @@ -65,6 +68,7 @@ public void testRenameProject() { projectName.put("name", PROJECT_NAME); RestAssured.given() + .spec(requestSpec()) .contentType(ContentType.XML) .queryParams(projectName) .body(bodyXML) @@ -74,6 +78,7 @@ public void testRenameProject() { .spec(responseSpec(200, 1500L)); RestAssured.given() + .spec(requestSpec()) .contentType("application/x-www-form-urlencoded") .queryParam("newName", NEW_PROJECT_NAME) .when() @@ -82,6 +87,7 @@ public void testRenameProject() { .spec(responseSpec(302, 1500L)); Response response = RestAssured.given() + .spec(requestSpec()) .when() .get("job/%s/api/json".formatted(NEW_PROJECT_NAME)) .then() diff --git a/src/test/java/school/redrover/common/APIBaseTest.java b/src/test/java/school/redrover/common/APIBaseTest.java index 3e4a91b48..e502f5524 100644 --- a/src/test/java/school/redrover/common/APIBaseTest.java +++ b/src/test/java/school/redrover/common/APIBaseTest.java @@ -20,8 +20,6 @@ public abstract class APIBaseTest { protected void setUpApi() { RestAssured.filters(new RestAssuredLogFilter()); - RestAssured.requestSpecification = TestUtils.requestSpec(); - Log.info("Generate API token for tests"); jenkinsUrl = ProjectUtils.getUrl(); apiToken = JenkinsUtils.getApiTokenValue(); From 9891c24b53a8df226c1a423330775efe34f96f5e Mon Sep 17 00:00:00 2001 From: tstyev Date: Sat, 31 Jan 2026 21:34:47 +0300 Subject: [PATCH 3/4] RF | Add specification for API #1925 --- src/test/java/school/redrover/common/JenkinsUtils.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/school/redrover/common/JenkinsUtils.java b/src/test/java/school/redrover/common/JenkinsUtils.java index 7b00061f5..7c669e160 100644 --- a/src/test/java/school/redrover/common/JenkinsUtils.java +++ b/src/test/java/school/redrover/common/JenkinsUtils.java @@ -232,9 +232,8 @@ private static void deleteSystemMessage() { } private synchronized static ApiToken getApiToken() { - if (apiToken == null) { - apiToken = generateApiToken("api-test-token-" + System.currentTimeMillis()); - } + apiToken = generateApiToken("api-test-token-" + System.currentTimeMillis()); + return apiToken; } From f433202097d9c3e24b48366afbf2c43de4bd4e24 Mon Sep 17 00:00:00 2001 From: tstyev Date: Mon, 2 Feb 2026 15:24:31 +0300 Subject: [PATCH 4/4] RF | Add specification for API #1925 --- .../java/school/redrover/common/JenkinsUtils.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/test/java/school/redrover/common/JenkinsUtils.java b/src/test/java/school/redrover/common/JenkinsUtils.java index 7c669e160..546b97145 100644 --- a/src/test/java/school/redrover/common/JenkinsUtils.java +++ b/src/test/java/school/redrover/common/JenkinsUtils.java @@ -25,12 +25,13 @@ public final class JenkinsUtils { private static String sessionId; - private static ApiToken apiToken; - private JenkinsUtils() { throw new UnsupportedOperationException(); } + private record ApiToken(String name, String value, String uuid) { + } + private static String getCrumbFromPage(String page) { final String CRUMB_TAG = "data-crumb-value=\""; @@ -232,9 +233,7 @@ private static void deleteSystemMessage() { } private synchronized static ApiToken getApiToken() { - apiToken = generateApiToken("api-test-token-" + System.currentTimeMillis()); - - return apiToken; + return generateApiToken("api-test-token-" + System.currentTimeMillis()); } static void clearData() { @@ -271,10 +270,7 @@ public synchronized static String getApiTokenUuid() { return getApiToken().uuid(); } - public record ApiToken(String name, String value, String uuid) { - } - - static ApiToken generateApiToken(String tokenName) { + private static ApiToken generateApiToken(String tokenName) { String mainPage = getPage(""); String crumb = getCrumbFromPage(mainPage);