From 6ddef79444fc019d45b060715680d0385c0053dc Mon Sep 17 00:00:00 2001 From: Kirill Saigin Date: Thu, 3 Jul 2025 01:35:00 +0400 Subject: [PATCH] added tests API for /api/user --- pom.xml | 145 ++++++++++++++++++ src/test/java/endpoints/UserEndpoint.java | 73 +++++++++ src/test/java/helpers/PropertyProvider.java | 26 ++++ src/test/java/helpers/Specifications.java | 23 +++ src/test/java/pojo/UserRequest.java | 19 +++ src/test/java/tests/BaseTest.java | 33 ++++ src/test/java/tests/GetAndDeleteUserTest.java | 59 +++++++ src/test/java/tests/PostUserTest.java | 22 +++ src/test/java/tests/PutUserTest.java | 41 +++++ src/test/resources/config.properties | 9 ++ src/test/resources/suites/tests.xml | 11 ++ 11 files changed, 461 insertions(+) create mode 100644 pom.xml create mode 100644 src/test/java/endpoints/UserEndpoint.java create mode 100644 src/test/java/helpers/PropertyProvider.java create mode 100644 src/test/java/helpers/Specifications.java create mode 100644 src/test/java/pojo/UserRequest.java create mode 100644 src/test/java/tests/BaseTest.java create mode 100644 src/test/java/tests/GetAndDeleteUserTest.java create mode 100644 src/test/java/tests/PostUserTest.java create mode 100644 src/test/java/tests/PutUserTest.java create mode 100644 src/test/resources/config.properties create mode 100644 src/test/resources/suites/tests.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d35136a --- /dev/null +++ b/pom.xml @@ -0,0 +1,145 @@ + + + 4.0.0 + + org.example + Test + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + 1.9.23 + 1.18.36 + 5.5.1 + 7.10.2 + 2.29.1 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + io.qameta.allure + allure-maven + 2.15.2 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + -javaagent:"${settings.localRepository}"/org/aspectj/aspectjweaver/1.9.23/aspectjweaver-1.9.23.jar + + + + src/test/resources/suites/tests.xml + + + + + + + + + + + io.qameta.allure + allure-bom + ${allure.version} + pom + import + + + + + + + + org.testng + testng + ${testng.version} + test + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + io.rest-assured + rest-assured + ${rest.assured.version} + test + + + + + io.qameta.allure + allure-testng + test + + + + io.qameta.allure + allure-rest-assured + test + + + + + com.fasterxml.jackson.core + jackson-databind + 2.18.3 + + + + + org.aspectj + aspectjweaver + ${aspectj.version} + runtime + + + + + com.codeborne + selenide + 7.6.1 + + + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + + diff --git a/src/test/java/endpoints/UserEndpoint.java b/src/test/java/endpoints/UserEndpoint.java new file mode 100644 index 0000000..c5eb784 --- /dev/null +++ b/src/test/java/endpoints/UserEndpoint.java @@ -0,0 +1,73 @@ +package endpoints; + +import helpers.PropertyProvider; +import io.qameta.allure.Step; +import io.restassured.response.Response; +import io.restassured.specification.RequestSpecification; +import pojo.UserRequest; + +import static io.restassured.RestAssured.given; + +public class UserEndpoint { + private static final String ENDPOINT = PropertyProvider.getProperty("endpoint.user"); + + @Step("Создание запроса о информации пользователя") + public static UserRequest addUser() { + return UserRequest.builder() + .id(PropertyProvider.getProperty("test.id")) + .username(PropertyProvider.getProperty("test.username")) + .firstName(PropertyProvider.getProperty("test.firstname")) + .lastName(PropertyProvider.getProperty("test.lastname")) + .email(PropertyProvider.getProperty("test.email")) + .build(); + } + + @Step("Добавить информацию о пользователе и вернуть его ID") + public static Response addUserId(RequestSpecification spec, UserRequest userRequest) { + return given(spec) + .body(userRequest) + .when() + .post(ENDPOINT) + .then() + .statusCode(200) + .extract().response(); + } + + @Step("Получить информацию о текущем пользователе") + public static Response getUser(RequestSpecification spec) { + return given(spec) + .when() + .get(ENDPOINT); + } + + @Step("Получить информацию о пользователе по ID: {userId}") + public static Response getUserById(RequestSpecification spec, String userId) { + return given(spec) + .pathParam("id", userId) + .when() + .get(ENDPOINT + "/{id}"); + } + + @Step("Обновить информацию о пользователе: {user}") + public static Response updateUser(RequestSpecification spec, UserRequest userRequest) { + return given(spec) + .body(userRequest) + .when() + .put(ENDPOINT); + } + + @Step("Удалить текущего пользователя") + public static Response deleteUser(RequestSpecification spec) { + return given(spec) + .when() + .delete(ENDPOINT); + } + + @Step("Удалить пользователя по ID: {userId}") + public static Response deleteUserById(RequestSpecification spec, String userId) { + return given(spec) + .pathParam("id", userId) + .when() + .delete(ENDPOINT + "/{id}"); + } +} diff --git a/src/test/java/helpers/PropertyProvider.java b/src/test/java/helpers/PropertyProvider.java new file mode 100644 index 0000000..6647b88 --- /dev/null +++ b/src/test/java/helpers/PropertyProvider.java @@ -0,0 +1,26 @@ +package helpers; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class PropertyProvider { + private static final Properties properties = new Properties(); + private static final String CONFIG_FILE = "config.properties"; + + static { + try (InputStream input = PropertyProvider.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) { + if (input == null) { + throw new RuntimeException("Не найден файл конфигурации" + CONFIG_FILE); + } + properties.load(input); + } catch (IOException e) { + throw new RuntimeException("Ошибка загрузки конфигурационного файла", e); + } + } + + public static String getProperty(String key) { + return properties.getProperty(key); + } +} + diff --git a/src/test/java/helpers/Specifications.java b/src/test/java/helpers/Specifications.java new file mode 100644 index 0000000..e8525d2 --- /dev/null +++ b/src/test/java/helpers/Specifications.java @@ -0,0 +1,23 @@ +package helpers; + +import io.qameta.allure.restassured.AllureRestAssured; +import io.restassured.RestAssured; +import io.restassured.builder.RequestSpecBuilder; +import io.restassured.http.ContentType; +import io.restassured.specification.RequestSpecification; + +public class Specifications { + protected static final String BASE_URL = PropertyProvider.getProperty("base.url"); + + public static RequestSpecification initRequestSpecification(String authToken) { + RestAssured.enableLoggingOfRequestAndResponseIfValidationFails(); + RequestSpecBuilder requestSpecBuilder = new RequestSpecBuilder(); + requestSpecBuilder + .setBaseUri(BASE_URL) + .setContentType(ContentType.JSON) + .setAccept(ContentType.JSON) + .addHeader("Authorization", "Bearer " + authToken) + .addFilter(new AllureRestAssured()); + return requestSpecBuilder.build(); + } +} \ No newline at end of file diff --git a/src/test/java/pojo/UserRequest.java b/src/test/java/pojo/UserRequest.java new file mode 100644 index 0000000..d33650c --- /dev/null +++ b/src/test/java/pojo/UserRequest.java @@ -0,0 +1,19 @@ +package pojo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder + +public class UserRequest { + private String id; + private String username; + private String firstName; + private String lastName; + private String email; +} diff --git a/src/test/java/tests/BaseTest.java b/src/test/java/tests/BaseTest.java new file mode 100644 index 0000000..b12ebd8 --- /dev/null +++ b/src/test/java/tests/BaseTest.java @@ -0,0 +1,33 @@ +package tests; + +import endpoints.UserEndpoint; +import helpers.PropertyProvider; +import helpers.Specifications; +import io.restassured.specification.RequestSpecification; +import org.testng.annotations.*; +import pojo.UserRequest; + +import java.io.IOException; + +public class BaseTest { + protected static RequestSpecification spec; + protected static String authToken; + protected static UserRequest testUserRequest; + protected String addUserId; + + @BeforeClass + public void setupTestData() { + authToken = PropertyProvider.getProperty("auth.token"); + } + + @BeforeMethod + public void setup() throws IOException { + spec = Specifications.initRequestSpecification(authToken); + } + + @AfterMethod + public void tearDown() { + UserEndpoint.deleteUserById(spec, addUserId); + } +} + diff --git a/src/test/java/tests/GetAndDeleteUserTest.java b/src/test/java/tests/GetAndDeleteUserTest.java new file mode 100644 index 0000000..9c681f2 --- /dev/null +++ b/src/test/java/tests/GetAndDeleteUserTest.java @@ -0,0 +1,59 @@ +package tests; + +import endpoints.UserEndpoint; +import helpers.PropertyProvider; +import io.qameta.allure.Epic; +import io.qameta.allure.Feature; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import static org.hamcrest.Matchers.equalTo; + +@Epic("Управление сценариями GET") +public class GetAndDeleteUserTest extends BaseTest { + + @Feature("Сценарий с GET") + @Test(description = "Проверить, информацию о текущем пользователе и удалить текущего пользователя.") + public void testGetCurrentAndDeleteUser() { + + var request = UserEndpoint.addUser(); + addUserId = request.getId(); + + UserEndpoint.addUserId(spec, request); + + var response = UserEndpoint.getUser(spec); + response + .then() + .statusCode(200) + .body("username", equalTo(PropertyProvider.getProperty("test.username")), + "firstName", equalTo(PropertyProvider.getProperty("test.firstname")), + "lastName", equalTo(PropertyProvider.getProperty("test.lastname")), + "email", equalTo(PropertyProvider.getProperty("test.email"))); + + UserEndpoint.deleteUser(spec) + .then() + .statusCode(200); + } + + @Test(description = "Проверить, информацию пользователя по его ID {userId} и удалить по ID") + public void testGetUserById() { + var softAssert = new SoftAssert(); + + var request = UserEndpoint.addUser(); + addUserId = request.getId(); + + UserEndpoint.addUserId(spec, request); + + var userId = PropertyProvider.getProperty("test.id"); + var response = UserEndpoint.getUserById(spec, userId); + + softAssert.assertNotNull(userId, "ID пользователя не должен быть нулевым"); + softAssert.assertFalse(userId.trim().isEmpty(), "ID пользователя не должен быть пустым"); + + response + .then() + .statusCode(200) + .body("id", equalTo(userId), + "username", equalTo(PropertyProvider.getProperty("test.username"))); + } +} diff --git a/src/test/java/tests/PostUserTest.java b/src/test/java/tests/PostUserTest.java new file mode 100644 index 0000000..701e8c1 --- /dev/null +++ b/src/test/java/tests/PostUserTest.java @@ -0,0 +1,22 @@ +package tests; + +import endpoints.UserEndpoint; +import io.qameta.allure.Epic; +import io.qameta.allure.Feature; +import org.testng.annotations.Test; + +@Epic("POST") +public class PostUserTest extends BaseTest { + + @Feature("Сценарий с POST") + @Test(description = "Проверить создание нового пользователя и его удаление") + public void testAddUserSuccessfully() { + var request = UserEndpoint + .addUser(); + + var response = UserEndpoint.addUserId(spec, request); + + addUserId = response.asString(); + } +} + diff --git a/src/test/java/tests/PutUserTest.java b/src/test/java/tests/PutUserTest.java new file mode 100644 index 0000000..919ef34 --- /dev/null +++ b/src/test/java/tests/PutUserTest.java @@ -0,0 +1,41 @@ +package tests; + +import endpoints.UserEndpoint; +import io.qameta.allure.Epic; +import io.qameta.allure.Feature; +import org.testng.annotations.Test; +import pojo.UserRequest; + +@Epic("PUT") +public class PutUserTest extends BaseTest{ + + @Feature("Сценарий с PUT (создание - обновление - удаление)") + @Test(description = "Проверить, обновление информации о текущем пользователе и удалить его") + public void testUpdateUser() { + + var request = UserEndpoint. + addUser(); + addUserId = request.getId(); + + UserEndpoint + .addUserId(spec, request); + + var updateUser = UserRequest.builder() + .username("itc1205" + request.getUsername()) + .firstName("Kamil" + request.getFirstName()) + .lastName("Vonuchka" + request.getLastName()) + .email("kamilka@mail.ru" + request.getEmail()) + .build(); + + UserEndpoint.updateUser(spec, updateUser) + .then() + .statusCode(200); + + UserEndpoint.getUser(spec) + .then() + .statusCode(200); + //эти проверки нужны будут потом +// .body("firstName", equalTo(updateUser.getFirstName()), +// "email", equalTo(updateUser.getEmail()); + } +} diff --git a/src/test/resources/config.properties b/src/test/resources/config.properties new file mode 100644 index 0000000..3842187 --- /dev/null +++ b/src/test/resources/config.properties @@ -0,0 +1,9 @@ +base.url=https://6c61743f-4c3c-4db0-bd41-75698e213f2c.mock.pstmn.io +auth.token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.KMUFsIDTnFmyG3nMiGM6H9FNFUROf3wh7SmqJp-QV30 +test.id=35790af5-b2fc-2bbd-5d7c-3f83e7f0645f +test.username=ivan1205 +test.firstname=Ivan +test.lastname=Aksenov +test.email=itc@ya.ru + +endpoint.user = /api/user \ No newline at end of file diff --git a/src/test/resources/suites/tests.xml b/src/test/resources/suites/tests.xml new file mode 100644 index 0000000..107bac3 --- /dev/null +++ b/src/test/resources/suites/tests.xml @@ -0,0 +1,11 @@ + + + + + + + + + + +