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
100 changes: 0 additions & 100 deletions src/test/java/school/redrover/api/APIFreestyleProjectTest.java

This file was deleted.

66 changes: 66 additions & 0 deletions src/test/java/school/redrover/api/FreestyleProjectTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package school.redrover.api;

import io.restassured.response.Response;
import org.testng.Assert;
import org.testng.annotations.Test;
import school.redrover.api.testdata.ProjectType;
import school.redrover.common.APIBaseTest;
import school.redrover.api.testdata.ProjectDataProvider;

import static school.redrover.api.endpoint.ProjectEndpoints.*;
import static school.redrover.common.TestUtils.getPayload;

public class FreestyleProjectTest extends APIBaseTest {
private static final String PROJECT_NAME = "FreestyleProject";

@Test(dataProvider = "projectNameList", dataProviderClass = ProjectDataProvider.class)
public void testCreateWithValidName(String projectName) {
Response createProjectResponse = createProjectWithXML(projectName,
getPayload("create-empty-freestyle-project.xml"));
Response getProjectResponse = getProjectByName(projectName);

String actualProjectName = getProjectResponse.jsonPath().getString("name");

softAssert.assertEquals(createProjectResponse.getStatusCode(), 200);

softAssert.assertEquals(actualProjectName, projectName);
softAssert.assertEquals(getProjectResponse.getStatusCode(), 200);
softAssert.assertTrue(getProjectResponse.time() <= 1500);
}

@Test(dataProvider = "renameProjectNameList", dataProviderClass = ProjectDataProvider.class)
public void testRenameProject(String oldName, String newName) {
createProjectWithXML(oldName, getPayload("create-empty-freestyle-project.xml"));

renameProject(oldName, newName);

Response getProjectResponse = getProjectByName(newName);

String actualProjectName = getProjectResponse.jsonPath().getString("name");
softAssert.assertEquals(actualProjectName, newName);
softAssert.assertEquals(getProjectResponse.statusCode(), 200);
softAssert.assertTrue(getProjectResponse.time() <= 1500);
}

@Test
public void testDeleteProject() {
createProject(PROJECT_NAME, ProjectType.FREESTYLE_PROJECT);

deleteProject(PROJECT_NAME);

Response afterDeletedResponse = getProjectByName(PROJECT_NAME);
Assert.assertEquals(afterDeletedResponse.statusCode(), 404, "Not found");
}

@Test(dataProvider = "providerUnsafeCharacters", dataProviderClass = ProjectDataProvider.class)
public void testCreateWithUnsafeCharacter(String unsafeCharacter) {
Response response = createProject(unsafeCharacter, ProjectType.FREESTYLE_PROJECT);

softAssert.assertEquals(response.statusCode(), 400);
softAssert.assertTrue(response.time() <= 1500);
softAssert.assertEquals(
response.getHeaders().getValue("X-Error"),
"%s is an unsafe character".formatted(unsafeCharacter));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import org.testng.Assert;
import org.testng.annotations.Test;
import school.redrover.common.APIBaseTest;
import school.redrover.api.endpoint.ProjectType;
import school.redrover.api.testdata.ProjectType;

import static school.redrover.api.endpoint.ProjectEndpoints.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

import io.restassured.http.ContentType;
import io.restassured.response.Response;
import school.redrover.api.testdata.ProjectType;

import static school.redrover.common.TestUtils.requestSpec;
import static school.redrover.common.TestUtils.responseSpec;

public class ProjectEndpoints {


public static Response createProject(String projectName, ProjectType projectType) {
return RestAssured.given()
.spec(requestSpec())
Expand Down Expand Up @@ -55,6 +55,7 @@ public static Response getProjectByName(String projectName) {
.when()
.get("job/%s/api/json".formatted(projectName))
.then()
.spec(responseSpec())
.extract().response();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package school.redrover.api.testdata;

import org.testng.annotations.DataProvider;

public class ProjectDataProvider {

private static final String maxProjectName = "A".repeat(255);

@DataProvider
public Object[][] projectNameList() {
return new Object[][]{
{"ValidProject"},
{"A"},
{maxProjectName}
};
}

@DataProvider
public static Object[][] renameProjectNameList() {
return new Object[][]{
{"ValidProject", "B".repeat(255)},
{"A", "B"},
{maxProjectName, "NewValidProject"}
};
}

@DataProvider
public Object[][] providerUnsafeCharacters() {
return new Object[][]{
{"\\"}, {"]"}, {":"}, {"#"}, {"&"}, {"?"}, {"!"}, {"@"},
{"$"}, {"%"}, {"^"}, {"*"}, {"|"}, {"/"}, {"<"}, {">"},
{"["}, {";"}
};
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package school.redrover.api.endpoint;
package school.redrover.api.testdata;

public enum ProjectType {

Expand Down
4 changes: 4 additions & 0 deletions src/test/java/school/redrover/common/APIBaseTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.asserts.SoftAssert;
import school.redrover.common.logging.Log;
import school.redrover.common.logging.RestAssuredLogFilter;

Expand All @@ -16,6 +17,7 @@ public abstract class APIBaseTest {
protected String apiToken;
protected String tokenUuid;
protected String userName = ProjectUtils.getUserName();
protected SoftAssert softAssert;

@BeforeClass
protected void setUpApi() {
Expand All @@ -32,11 +34,13 @@ protected void beforeMethod(Method method) {
Log.info("Clear data");
Log.info("Run %s.%s", this.getClass().getName(), method.getName());
JenkinsUtils.clearData();
softAssert = new SoftAssert();
}

@AfterClass
protected void tearDownApi() {
Log.info("Delete API token");
JenkinsUtils.deleteApiTokenByUuid(jenkinsUrl, tokenUuid, apiToken);
softAssert.assertAll();
}
}
23 changes: 23 additions & 0 deletions src/test/java/school/redrover/common/TestUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,31 @@
import io.restassured.filter.log.LogDetail;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
import school.redrover.common.logging.Log;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

import static io.restassured.RestAssured.preemptive;
import static org.hamcrest.Matchers.lessThan;

public class TestUtils {

private static final String PAYLOAD = "payload";

private static String readFileFromResources(String folder, String name) {
try (InputStream inputStream = TestUtils.class.getClassLoader().getResourceAsStream("%s/%s".formatted(folder, name))) {
if (inputStream == null) {
throw new IOException("File not found in resources");
}
return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
} catch (IOException e) {
Log.error("File not found");
throw new RuntimeException(e);
}
}

public static RequestSpecification requestSpec() {
return new RequestSpecBuilder()
.setAuth(preemptive().basic(ProjectUtils.getUserName(), JenkinsUtils.getApiTokenValue()))
Expand All @@ -32,4 +51,8 @@ public static ResponseSpecification responseSpec() {
.log(LogDetail.ALL)
.build();
}

public static String getPayload(String fileName) {
return readFileFromResources(PAYLOAD, fileName);
}
}
14 changes: 14 additions & 0 deletions src/test/resources/payload/create-empty-freestyle-project.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<project>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<canRoam>false</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers/>
<concurrentBuild>false</concurrentBuild>
<builders/>
<publishers/>
<buildWrappers/>
</project>