diff --git a/src/test/java/school/redrover/api/MultiConfigurationProjectTest.java b/src/test/java/school/redrover/api/MultiConfigurationProjectTest.java index 3211c7e60..aa8349ab4 100644 --- a/src/test/java/school/redrover/api/MultiConfigurationProjectTest.java +++ b/src/test/java/school/redrover/api/MultiConfigurationProjectTest.java @@ -5,9 +5,12 @@ import org.testng.annotations.Test; import school.redrover.common.APIBaseTest; +import static school.redrover.api.endpoint.ProjectEndpoints.*; + public class MultiConfigurationProjectTest extends APIBaseTest { private static final String PROJECT_NAME = "MultiConfigProject"; + private static final String PROJECT_NEW_NAME = "MultiConfigProjectRenamed"; private static final String bodyXML = """ @@ -32,42 +35,33 @@ public class MultiConfigurationProjectTest extends APIBaseTest { @Test public void testCreateProject() { - Response createdResponse = createProject(PROJECT_NAME, bodyXML); - Assert.assertEquals(createdResponse.statusCode(), 200); - - Response getProjectResponse = getProject(PROJECT_NAME); - Assert.assertEquals(getProjectResponse.statusCode(), 200); + createProjectWithXML(PROJECT_NAME, bodyXML); - String actualProjectName = getProjectResponse.jsonPath().getString("name"); - Assert.assertEquals(actualProjectName, PROJECT_NAME); + Response afterCreateResponse = getProjectByName(PROJECT_NAME); + Assert.assertEquals(afterCreateResponse.statusCode(), 200); + Assert.assertEquals(afterCreateResponse.jsonPath().getString("name"), PROJECT_NAME); } @Test() public void testDeleteProject() { - createProject(PROJECT_NAME, bodyXML); - String createdProjectName = getProject(PROJECT_NAME) - .jsonPath().getString("name"); + createProjectWithXML(PROJECT_NAME, bodyXML); + String createdProjectName = getProjectByName(PROJECT_NAME).jsonPath().getString("name"); - Response deletedResponse = deleteProject(createdProjectName); - Assert.assertEquals(deletedResponse.statusCode(), 302); + deleteProject(createdProjectName); - Integer deletedProjectStatusCode = getProject(createdProjectName).statusCode(); - Assert.assertEquals(deletedProjectStatusCode, 404, "Not found"); + Response afterDeletedResponse = getProjectByName(createdProjectName); + Assert.assertEquals(afterDeletedResponse.statusCode(), 404, "Not found"); } @Test() public void testRenameProject() { - String newProjectName = "MultiConfig"; - - createProject(PROJECT_NAME, bodyXML); - String createdProjectName = getProject(PROJECT_NAME) - .jsonPath().getString("name"); + createProjectWithXML(PROJECT_NAME, bodyXML); + String createdProjectName = getProjectByName(PROJECT_NAME).jsonPath().getString("name"); - Response renamedResponse = renameProject(createdProjectName, newProjectName); - Assert.assertEquals(renamedResponse.statusCode(), 302); + renameProject(createdProjectName, PROJECT_NEW_NAME); - String actualProjectName = getProject(newProjectName) - .jsonPath().getString("name"); - Assert.assertEquals(actualProjectName, newProjectName); + Response afterRenameResponse = getProjectByName(PROJECT_NEW_NAME); + Assert.assertEquals(afterRenameResponse.statusCode(), 200); + Assert.assertEquals(afterRenameResponse.jsonPath().getString("name"), PROJECT_NEW_NAME); } } diff --git a/src/test/java/school/redrover/api/MultibranchPipelineTest.java b/src/test/java/school/redrover/api/MultibranchPipelineTest.java new file mode 100644 index 000000000..6b716904f --- /dev/null +++ b/src/test/java/school/redrover/api/MultibranchPipelineTest.java @@ -0,0 +1,38 @@ +package school.redrover.api; +import io.restassured.response.Response; +import org.testng.Assert; +import org.testng.annotations.Test; +import school.redrover.common.APIBaseTest; +import school.redrover.api.endpoint.ProjectType; + +import static school.redrover.api.endpoint.ProjectEndpoints.*; + +public class MultibranchPipelineTest extends APIBaseTest { + + private static final String PROJECT_NAME = "MultibranchPipeline"; + private static final String PROJECT_NEW_NAME = "MultibranchPipelineRenamed"; + + @Test + public void testMultibranchPipelineCRUD() { + + Response response = createProject(PROJECT_NAME, ProjectType.MULTIBRANCH_PIPELINE); + Assert.assertTrue(response.getHeader("Location").contains("/configure")); + + Response afterCreate = getProjectByName(PROJECT_NAME); + Assert.assertEquals(afterCreate.statusCode(), 200); + Assert.assertEquals(afterCreate.jsonPath().getString("name"), PROJECT_NAME); + + renameProject(PROJECT_NAME, PROJECT_NEW_NAME); + + Response afterRename = getProjectByName(PROJECT_NEW_NAME); + Assert.assertEquals(afterRename.statusCode(), 200); + Assert.assertEquals(afterRename.jsonPath().getString("name"), PROJECT_NEW_NAME); + + deleteProject(PROJECT_NEW_NAME); + + Response afterDelete = getProjectByName(PROJECT_NEW_NAME); + Assert.assertEquals(afterDelete.statusCode(), 404, "Not found"); + } +} + + diff --git a/src/test/java/school/redrover/api/endpoint/ProjectEndpoints.java b/src/test/java/school/redrover/api/endpoint/ProjectEndpoints.java new file mode 100644 index 000000000..64046dd9f --- /dev/null +++ b/src/test/java/school/redrover/api/endpoint/ProjectEndpoints.java @@ -0,0 +1,82 @@ +package school.redrover.api.endpoint; + +import io.restassured.RestAssured; + +import io.restassured.http.ContentType; +import io.restassured.response.Response; + +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()) + .contentType(ContentType.URLENC) + .queryParam("name", projectName) + .formParam("mode", projectType.mode()) + .when() + .post("/createItem") + .then() + .spec(responseSpec()) + .extract().response(); + } + + public static Response createProjectWithXML(String projectName, String bodyXML) { + return RestAssured.given() + .spec(requestSpec()) + .contentType(ContentType.XML) + .queryParams("name", projectName) + .body(bodyXML) + .when() + .post("/createItem") + .then() + .spec(responseSpec()) + .extract().response(); + } + + public static Response updateProjectWithXML(String projectName, String bodyXML) { + return RestAssured.given() + .spec(requestSpec()) + .contentType(ContentType.XML) + .body(bodyXML) + .when() + .post("/job/%s/config.xml".formatted(projectName)) + .then() + .spec(responseSpec(200, 1500L)) + .extract().response(); + } + + public static Response getProjectByName(String projectName) { + return RestAssured.given() + .spec(requestSpec()) + .when() + .get("job/%s/api/json".formatted(projectName)) + .then() + .extract().response(); + } + + public static Response renameProject(String projectName, String newProjectName) { + return RestAssured.given() + .spec(requestSpec()) + .queryParam("newName", newProjectName) + .when() + .post("job/%s/confirmRename".formatted(projectName)) + .then() + .spec(responseSpec(302, 1500L)) + .extract().response(); + } + + public static Response deleteProject(String projectName) { + return RestAssured.given() + .spec(requestSpec()) + .when() + .post("/job/%s/doDelete".formatted(projectName)) + .then() + .spec(responseSpec(302, 1500L)) + .extract().response(); + } +} + diff --git a/src/test/java/school/redrover/api/endpoint/ProjectType.java b/src/test/java/school/redrover/api/endpoint/ProjectType.java new file mode 100644 index 000000000..9401fea9f --- /dev/null +++ b/src/test/java/school/redrover/api/endpoint/ProjectType.java @@ -0,0 +1,21 @@ +package school.redrover.api.endpoint; + +public enum ProjectType { + + FREESTYLE_PROJECT("hudson.model.FreeStyleProject"), + PIPELINE("org.jenkinsci.plugins.workflow.job.WorkflowJob"), + MULTIBRANCH_PIPELINE("org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject"), + FOLDER("com.cloudbees.hudson.plugins.folder.Folder"), + ORGANIZATION_FOLDER("jenkins.branch.OrganizationFolder"), + MULTI_CONFIGURATION_PROJECT("hudson.matrix.MatrixProject"); + + private final String mode; + + ProjectType(String mode) { + this.mode = mode; + } + + public String mode() { + return mode; + } +} diff --git a/src/test/java/school/redrover/common/APIBaseTest.java b/src/test/java/school/redrover/common/APIBaseTest.java index c3c370636..2c7c10928 100644 --- a/src/test/java/school/redrover/common/APIBaseTest.java +++ b/src/test/java/school/redrover/common/APIBaseTest.java @@ -1,8 +1,6 @@ package school.redrover.common; import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import io.restassured.response.Response; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; @@ -10,8 +8,7 @@ import school.redrover.common.logging.RestAssuredLogFilter; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; + public abstract class APIBaseTest { @@ -42,51 +39,4 @@ protected void tearDownApi() { Log.info("Delete API token"); JenkinsUtils.deleteApiTokenByUuid(jenkinsUrl, tokenUuid, apiToken); } - - public Response createProject(String name, String bodyXML) { - Map projectName = new HashMap<>(); - projectName.put("name", name); - - return RestAssured.given() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) - .contentType(ContentType.XML) - .queryParams(projectName) - .body(bodyXML) - .when() - .post("/createItem") - .then() - .extract().response(); - } - - public Response getProject(String projectName) { - return RestAssured.given() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) - .when() - .get("/job/%s/api/json".formatted(projectName)) - .then() - .extract().response(); - } - - public Response deleteProject(String projectName) { - return RestAssured.given() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) - .when() - .post("/job/%s/doDelete".formatted(projectName)) - .then() - .extract().response(); - } - - public Response renameProject(String projectName, String newProjectName) { - return RestAssured.given() - .auth().preemptive().basic(userName, apiToken) - .baseUri(jenkinsUrl) - .queryParams("newName", newProjectName) - .when() - .post("/job/%s/confirmRename".formatted(projectName)) - .then() - .extract().response(); - } } \ No newline at end of file diff --git a/src/test/java/school/redrover/common/TestUtils.java b/src/test/java/school/redrover/common/TestUtils.java index eb6fb1a6a..7f782b34b 100644 --- a/src/test/java/school/redrover/common/TestUtils.java +++ b/src/test/java/school/redrover/common/TestUtils.java @@ -32,5 +32,4 @@ public static ResponseSpecification responseSpec() { .log(LogDetail.ALL) .build(); } - }