From 58c2ca66b1742a79ab107c32e09ca069edf7637d Mon Sep 17 00:00:00 2001 From: valerpan Date: Thu, 6 Aug 2026 20:17:11 +0300 Subject: [PATCH] Initial commit api-develop --- helpdesk-api-test-main/.gitignore | 4 + helpdesk-api-test-main/pom.xml | 47 ++++++ .../src/main/java/model/AuthToken.java | 23 +++ .../src/main/java/model/Status.java | 18 +++ .../src/main/java/model/Ticket.java | 146 ++++++++++++++++++ .../src/test/java/api/BaseTest.java | 113 ++++++++++++++ .../src/test/java/api/CreateTicketTest.java | 53 +++++++ .../src/test/java/api/UpdateTicketTest.java | 40 +++++ .../src/test/resources/config.properties | 5 + 9 files changed, 449 insertions(+) create mode 100644 helpdesk-api-test-main/.gitignore create mode 100644 helpdesk-api-test-main/pom.xml create mode 100644 helpdesk-api-test-main/src/main/java/model/AuthToken.java create mode 100644 helpdesk-api-test-main/src/main/java/model/Status.java create mode 100644 helpdesk-api-test-main/src/main/java/model/Ticket.java create mode 100644 helpdesk-api-test-main/src/test/java/api/BaseTest.java create mode 100644 helpdesk-api-test-main/src/test/java/api/CreateTicketTest.java create mode 100644 helpdesk-api-test-main/src/test/java/api/UpdateTicketTest.java create mode 100644 helpdesk-api-test-main/src/test/resources/config.properties diff --git a/helpdesk-api-test-main/.gitignore b/helpdesk-api-test-main/.gitignore new file mode 100644 index 0000000..3667d6f --- /dev/null +++ b/helpdesk-api-test-main/.gitignore @@ -0,0 +1,4 @@ +# Project exclude paths +/target/ +/.idea/ +*.iml diff --git a/helpdesk-api-test-main/pom.xml b/helpdesk-api-test-main/pom.xml new file mode 100644 index 0000000..d62cf4f --- /dev/null +++ b/helpdesk-api-test-main/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + org.example + helpdesk-api-test + 1.0-SNAPSHOT + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + + com.fasterxml.jackson.core + jackson-annotations + 2.22 + + + io.rest-assured + rest-assured + 4.3.0 + + + com.google.code.gson + gson + 2.8.6 + + + org.testng + testng + 6.9.6 + + + + \ No newline at end of file diff --git a/helpdesk-api-test-main/src/main/java/model/AuthToken.java b/helpdesk-api-test-main/src/main/java/model/AuthToken.java new file mode 100644 index 0000000..f3423bf --- /dev/null +++ b/helpdesk-api-test-main/src/main/java/model/AuthToken.java @@ -0,0 +1,23 @@ +package model; + +import com.google.gson.annotations.SerializedName; + +public class AuthToken { + @SerializedName("username") + private String username; + + @SerializedName("password") + private String password; + + @SerializedName("token") + private String token; + + public void setUsername(String username) { this.username = username; } + public String getUsername() { return username; } + + public void setPassword(String password) { this.password = password; } + public String getPassword() { return password; } + + public void setToken(String token) { this.token = token; } + public String getToken() { return token; } +} diff --git a/helpdesk-api-test-main/src/main/java/model/Status.java b/helpdesk-api-test-main/src/main/java/model/Status.java new file mode 100644 index 0000000..5539116 --- /dev/null +++ b/helpdesk-api-test-main/src/main/java/model/Status.java @@ -0,0 +1,18 @@ +package model; + +/** Статусы тикета, используемые в тестах */ +public enum Status { + OPEN(1), + CLOSED(4), + ; + + private final int code; + + Status(int code) { + this.code=code; + } + + public int getCode() { + return code; + } +} diff --git a/helpdesk-api-test-main/src/main/java/model/Ticket.java b/helpdesk-api-test-main/src/main/java/model/Ticket.java new file mode 100644 index 0000000..6fe13ed --- /dev/null +++ b/helpdesk-api-test-main/src/main/java/model/Ticket.java @@ -0,0 +1,146 @@ +package model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.google.gson.annotations.SerializedName; + +import java.util.Objects; + +/** Объект тикета (POJO) */ +public class Ticket { + + @SerializedName("id") + private Integer id; + + @JsonIgnore + @SerializedName("due_date") + private String due_date; + + @SerializedName("assigned_to") + private String assigned_to; + + @SerializedName("title") + private String title; + + @JsonIgnore + @SerializedName("created") + private String created; + + @JsonIgnore + @SerializedName("modified") + private String modified; + + @SerializedName("submitter_email") + private String submitter_email; + + @SerializedName("status") + private Integer status; + + @SerializedName("on_hold") + private Boolean on_hold; + + @SerializedName("description") + private String description; + + @SerializedName("resolution") + private String resolution; + + @SerializedName("priority") + private Integer priority; + + @SerializedName("last_escalation") + private String last_escalation; + + @SerializedName("secret_key") + private String secret_key; + + @SerializedName("queue") + private Integer queue; + + @SerializedName("kbitem") + private Integer kbitem; + + @SerializedName("merged_to") + private Integer merged_to; + + public void setId(Integer id) { this.id = id; } + public Integer getId() { return id; } + + public void setDue_date(String due_date) { this.due_date = due_date; } + public String getDue_date() { return due_date; } + + public void setAssigned_to(String assigned_to) { this.assigned_to = assigned_to; } + public String getAssigned_to() { return assigned_to; } + + public void setTitle(String title) { this.title = title; } + public String getTitle() { return title; } + + public void setCreated(String created) { this.created = created; } + public String getCreated() { return created; } + + public void setModified(String modified) { this.modified = modified; } + public String getModified() { return modified; } + + public void setSubmitter_email(String submitter_email) { this.submitter_email = submitter_email; } + public String getSubmitter_email() { return submitter_email; } + + public void setStatus(Integer status) { this.status = status; } + public Integer getStatus() { return status; } + + public void setOn_hold(boolean on_hold) { this.on_hold = on_hold; } + public boolean isOn_hold() { return on_hold; } + + public void setDescription(String description) { this.description = description; } + public String getDescription() { return description; } + + public void setResolution(String resolution) { this.resolution = resolution; } + public String getResolution() { return resolution; } + + public void setPriority(Integer priority) { this.priority = priority; } + public Integer getPriority() { return priority; } + + public void setLast_escalation(String last_escalation) { this.last_escalation = last_escalation; } + public String getLast_escalation() { return last_escalation; } + + public void setSecret_key(String secret_key) { this.secret_key = secret_key; } + public String getSecret_key() { return secret_key; } + + public void setQueue(Integer queue) { this.queue = queue; } + public Integer getQueue() { return queue; } + + public void setKbitem(Integer kbitem) { this.kbitem = kbitem; } + public Integer getKbitem() { return kbitem; } + + public void setMerged_to(Integer merged_to) { this.merged_to = merged_to; } + public Integer getMerged_to() { return merged_to; } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (getClass() != o.getClass()) return false; + + Ticket other = (Ticket) o; + + return Objects.equals(due_date, other.due_date) && + Objects.equals(assigned_to, other.assigned_to) && + Objects.equals(title, other.title) && + Objects.equals(submitter_email, other.submitter_email) && + Objects.equals(status, other.status) && + Objects.equals(on_hold, other.on_hold) && + Objects.equals(description, other.description) && + Objects.equals(resolution, other.resolution) && + Objects.equals(priority, other.priority) && + Objects.equals(last_escalation, other.last_escalation) && + Objects.equals(secret_key, other.secret_key) && + Objects.equals(queue, other.queue) && + Objects.equals(kbitem, other.kbitem) && + Objects.equals(merged_to, other.merged_to); + } + + @Override + public int hashCode() { + return Objects.hash(due_date, assigned_to, title, + submitter_email, status, on_hold, description, resolution, + priority, last_escalation, secret_key, queue, kbitem, merged_to); + } +} diff --git a/helpdesk-api-test-main/src/test/java/api/BaseTest.java b/helpdesk-api-test-main/src/test/java/api/BaseTest.java new file mode 100644 index 0000000..d5392f4 --- /dev/null +++ b/helpdesk-api-test-main/src/test/java/api/BaseTest.java @@ -0,0 +1,113 @@ +package api; +import io.restassured.RestAssured; +import io.restassured.builder.RequestSpecBuilder; +import io.restassured.filter.log.LogDetail; +import io.restassured.filter.log.ResponseLoggingFilter; +import io.restassured.http.ContentType; +import model.AuthToken; +import model.Status; +import model.Ticket; +import org.testng.annotations.BeforeClass; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Random; +import java.util.UUID; + +import static io.restassured.RestAssured.given; + +/** Абстрактный класс, содержащий общие для всех тестов методы */ +public abstract class BaseTest { + @BeforeClass + public void prepare() throws IOException{ + + System.getProperties().load(ClassLoader.getSystemResourceAsStream("config.properties")); + + String baseUri = System.getProperty("base.uri"); + if (baseUri == null || baseUri.isEmpty()) { + throw new RuntimeException("В файле \"config.properties\" отсутствует значение \"base.uri\""); + } + + RestAssured.requestSpecification = new RequestSpecBuilder() + .setBaseUri(baseUri) + .setAccept(ContentType.JSON) + .setContentType(ContentType.JSON) + .log(LogDetail.ALL) + .build(); + + RestAssured.filters(new ResponseLoggingFilter()); + } + + protected AuthToken login() { + + String username = System.getProperty("username"); + if (username == null || username.isEmpty()) { + throw new RuntimeException("В файле \"config.properties\" отсутствует значение \"username\""); + } + + String password = System.getProperty("password"); + if (password == null || password.isEmpty()) { + throw new RuntimeException("В файле \"config.properties\" отсутствует значение \"password\""); + } + + AuthToken auth = new AuthToken(); + auth.setUsername(username); + auth.setPassword(password); + + + AuthToken actual = + given() + .body(auth) + .when() + .post("/api/login") + .then() + .statusCode(200) + .extract().as(AuthToken.class); + + auth.setToken(actual.getToken()); + + return auth; + } + + protected Ticket buildNewTicket(Status status, int priority) { + LocalDateTime now = LocalDateTime.now(); + Random random = new Random(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); + + Ticket ticket = new Ticket(); + + String title = "Проверка rest-assured " + UUID.randomUUID(); + String secret_key = UUID.randomUUID().toString(); + boolean on_hold = random.nextBoolean(); + String due_date = now.format(formatter); + int queue = 1; + + //ticket.setDue_date(due_date); + ticket.setAssigned_to("admin"); + ticket.setTitle(title); + ticket.setStatus(status.getCode()); + ticket.setPriority(priority); + ticket.setSecret_key(secret_key); + ticket.setOn_hold(on_hold); + ticket.setQueue(queue); + + return ticket; + } + + protected Ticket createTicket(Ticket ticket) { + AuthToken authToken = login(); + String token = authToken.getToken(); + + Ticket actual = + given() + .header("Authorization", "Token " + token) + .body(ticket) + .when() + .post("/api/tickets") + .then() + .statusCode(201) + .extract().as(Ticket.class); + + return actual; + } +} diff --git a/helpdesk-api-test-main/src/test/java/api/CreateTicketTest.java b/helpdesk-api-test-main/src/test/java/api/CreateTicketTest.java new file mode 100644 index 0000000..f888d93 --- /dev/null +++ b/helpdesk-api-test-main/src/test/java/api/CreateTicketTest.java @@ -0,0 +1,53 @@ +package api; + +import model.AuthToken; +import model.Status; +import model.Ticket; +import org.testng.Assert; +import org.testng.annotations.Test; + +import static io.restassured.RestAssured.given; + + +/** Создание и проверка тикета */ +public class CreateTicketTest extends BaseTest { +// @Test +// public void loginTest() { +// AuthToken token = login(); +// } +// +// @Test +// public void ticketTest() { +// Ticket ticket = buildNewTicket(Status.OPEN, 3); +// } + + @Test + public void createTicketTest() { + Ticket ticket1 = createTicket(buildNewTicket(Status.OPEN, 3)); + int id = ticket1.getId(); + Ticket ticket2 = getTicket(id); + Assert.assertEquals(ticket1, ticket2); + } + + protected Ticket getTicket(int id) { + AuthToken authToken = login(); + String token = authToken.getToken(); + + Ticket actual = + given() + .header("Authorization", "Token " + token) + .pathParam("ticketId", id) + .when() + .get("api/tickets/{ticketId}") + .then() + .statusCode(200) + .extract().as(Ticket.class); + + return actual; + } + +// @Test +// public void getTicketTest(){ +// getTicket(1); +// } +} diff --git a/helpdesk-api-test-main/src/test/java/api/UpdateTicketTest.java b/helpdesk-api-test-main/src/test/java/api/UpdateTicketTest.java new file mode 100644 index 0000000..16c43b3 --- /dev/null +++ b/helpdesk-api-test-main/src/test/java/api/UpdateTicketTest.java @@ -0,0 +1,40 @@ +package api; + +import model.AuthToken; +import model.Status; +import model.Ticket; +import org.testng.annotations.Test; +import static io.restassured.RestAssured.given; + +/** Обновление тикета */ +public class UpdateTicketTest extends BaseTest { + + + @Test + public void updateTicketTest() { + Ticket ticket = buildNewTicket(Status.CLOSED, 1); + Ticket posted = createTicket(ticket); + + posted.setStatus(Status.OPEN.getCode()); + updateTicketNegative(posted); + + } + + private void updateTicketNegative(Ticket ticket) { + AuthToken authToken = login(); + String token = authToken.getToken(); + + int id = ticket.getId(); + + + given() + .header("Authorization", "Token " + token) + .pathParam("ticketId", id) + .body(ticket) + .when() + .put("/api/tickets/{ticketId}") + .then() + .statusCode(200) //helpdesk дает сенять тикет со статусом closed + .extract().as(Ticket.class); + } +} diff --git a/helpdesk-api-test-main/src/test/resources/config.properties b/helpdesk-api-test-main/src/test/resources/config.properties new file mode 100644 index 0000000..61db74e --- /dev/null +++ b/helpdesk-api-test-main/src/test/resources/config.properties @@ -0,0 +1,5 @@ +base.uri=https://at-sandbox.workbench.lanit.ru/ +token=ad9e96f7199e808dffc307832da5c3ee0a7351a2 + +username=admin +password=adminat