Перенес тестовые утилиты в новый модуль test-clearing.

This commit is contained in:
psemenkov 2023-04-06 18:35:13 +03:00
parent cf22ea1074
commit d7680f6bdf
24 changed files with 194 additions and 106 deletions

View file

@ -67,6 +67,11 @@
<artifactId>spring-test</artifactId> <artifactId>spring-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>test-clearing</artifactId>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.skyscreamer</groupId> <groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId> <artifactId>jsonassert</artifactId>

View file

@ -1,40 +1,15 @@
package ru.spcex.clearing.backendapi.controller.config; package ru.spcex.clearing.backendapi.controller.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import ru.spcex.clearing.imdg.JsonUtil;
@Configuration @Configuration
public class Jackson2HttpConverterTestConfig { public class Jackson2HttpConverterTestConfig {
@Bean("customJsonHttpConverter") @Bean("customJsonHttpConverter")
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return new MappingJackson2HttpMessageConverter(JacksonObjectMapper.getMapper()); return new MappingJackson2HttpMessageConverter(JsonUtil.JacksonObjectMapper.getMapper());
}
public static class JacksonObjectMapper extends ObjectMapper {
private static final ObjectMapper MAPPER = new JacksonObjectMapper();
private JacksonObjectMapper() {
//настройки Ильи
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
//модуль для корректной сериализации LocalDateTime в поля JSON - JavaTimeModule модуль библиотеки jackson-datatype-jsr310
registerModule(new JavaTimeModule());
configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//запрещаем доступ ко всем полям и методам класса и потом разрешаем доступ только к полям, нужны чтобы не было лишних полей из-за методов как: public ActionType getActionType() у BankAccountNewAction
setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
//не сериализуем null-поля
// setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
public static ObjectMapper getMapper() {
return MAPPER;
}
} }
} }

View file

@ -55,11 +55,11 @@ import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponseTest; import ru.spcex.clearing.backendapi.controller.response.cud.CudResponseTest;
import ru.spcex.clearing.backendapi.controller.response.cud.QueueSuccessResponse; import ru.spcex.clearing.backendapi.controller.response.cud.QueueSuccessResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse; import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.controller.utils.MatcherFactory;
import ru.spcex.clearing.backendapi.controller.utils.TestUtils;
import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.meta.GetResponseFactory; import ru.spcex.clearing.backendapi.meta.GetResponseFactory;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.MatcherFactoryImdg;
import ru.spcex.clearing.imdg.TestUtils;
import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
@ -80,9 +80,9 @@ import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.readValue; import static ru.spcex.clearing.imdg.JsonUtil.readValue;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
import static ru.spcex.clearing.backendapi.controller.utils.MatcherFactory.usingIgnoringFieldsComparator; import static ru.spcex.clearing.imdg.MatcherFactoryImdg.usingIgnoringFieldsComparator;
@ContextConfiguration(classes = { @ContextConfiguration(classes = {
@ -156,8 +156,8 @@ import static ru.spcex.clearing.backendapi.controller.utils.MatcherFactory.using
@WebMvcTest//(controllers = DeleteCompanyController.class) @WebMvcTest//(controllers = DeleteCompanyController.class)
//@TestPropertySource(properties = "spring.config.location=D:/repo/mfd/clearing/clearing-parent/backend-api/src/main/resources/") //@TestPropertySource(properties = "spring.config.location=D:/repo/mfd/clearing/clearing-parent/backend-api/src/main/resources/")
public abstract class AbstractControllerTest { public abstract class AbstractControllerTest {
protected static final MatcherFactory.Matcher<BaseRequest> BASE_REQUEST_MATCHER = usingIgnoringFieldsComparator(BaseRequest.class); protected static final MatcherFactoryImdg.Matcher<BaseRequest> BASE_REQUEST_MATCHER = usingIgnoringFieldsComparator(BaseRequest.class);
protected static final MatcherFactory.Matcher<CudResponse> CUD_RESPONSE_MATCHER = usingIgnoringFieldsComparator(CudResponse.class); protected static final MatcherFactoryImdg.Matcher<CudResponse> CUD_RESPONSE_MATCHER = usingIgnoringFieldsComparator(CudResponse.class);
protected static final AtomicLong currentId = new AtomicLong(); protected static final AtomicLong currentId = new AtomicLong();
private static final CharacterEncodingFilter CHARACTER_ENCODING_FILTER = new CharacterEncodingFilter(); private static final CharacterEncodingFilter CHARACTER_ENCODING_FILTER = new CharacterEncodingFilter();

View file

@ -22,7 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class BankAccountControllerTest extends AbstractControllerTest { class BankAccountControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/securities/bank-accounts/"; private static final String REST_URL = "/securities/bank-accounts/";

View file

@ -15,7 +15,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class EditClearingMemberCategoryControllerTest extends AbstractControllerTest { class EditClearingMemberCategoryControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/clearing-member-categories/"; private static final String REST_URL = "/clearing-member-categories/";

View file

@ -24,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class EditCompanyInfoControllerTest extends AbstractControllerTest { class EditCompanyInfoControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/company-infos/"; private static final String REST_URL = "/company-infos/";

View file

@ -14,7 +14,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class EditCompanySymbolControllerTest extends AbstractControllerTest { class EditCompanySymbolControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/company-symbols/"; private static final String REST_URL = "/company-symbols/";

View file

@ -15,7 +15,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class EditContactControllerTest extends AbstractControllerTest { class EditContactControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/contacts/"; private static final String REST_URL = "/contacts/";

View file

@ -14,7 +14,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class RelationControllerTest extends AbstractControllerTest { class RelationControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/relations/"; private static final String REST_URL = "/relations/";

View file

@ -17,7 +17,7 @@ import java.util.Map;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class NotificationControllerTest extends AbstractControllerTest { class NotificationControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/notifications/"; private static final String REST_URL = "/notifications/";

View file

@ -16,7 +16,7 @@ import java.util.Map;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class SessionControllerTest extends AbstractControllerTest { class SessionControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/sessions/"; private static final String REST_URL = "/sessions/";

View file

@ -17,7 +17,7 @@ import java.util.Map;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class PaymentInstructionControllerTest extends AbstractControllerTest { class PaymentInstructionControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/payment-instructions/"; private static final String REST_URL = "/payment-instructions/";

View file

@ -29,8 +29,8 @@ import java.util.Map;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.readValue; import static ru.spcex.clearing.imdg.JsonUtil.readValue;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class LauncherControllerTest extends AbstractControllerTest { class LauncherControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/launchers/"; private static final String REST_URL = "/launchers/";

View file

@ -17,7 +17,7 @@ import java.util.Map;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class PlannerAllTodayControllerTest extends AbstractControllerTest { class PlannerAllTodayControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/schedule/planners-all-today/"; private static final String REST_URL = "/schedule/planners-all-today/";

View file

@ -17,7 +17,7 @@ import java.util.Map;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class PlannerControllerTest extends AbstractControllerTest { class PlannerControllerTest extends AbstractControllerTest {
private static final String REST_URL = "/schedule/planners/"; private static final String REST_URL = "/schedule/planners/";

View file

@ -18,7 +18,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.readValue; import static ru.spcex.clearing.imdg.JsonUtil.readValue;
class UserControllerTest extends AbstractControllerTest { class UserControllerTest extends AbstractControllerTest {
public static final String REST_URL = "/users/"; public static final String REST_URL = "/users/";

View file

@ -16,7 +16,7 @@ import java.util.Map;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static ru.spcex.clearing.backendapi.controller.utils.JsonUtil.writeValue; import static ru.spcex.clearing.imdg.JsonUtil.writeValue;
class StatementControllerTest extends AbstractControllerTest { class StatementControllerTest extends AbstractControllerTest {
public static final String REST_URL = "/statements/"; public static final String REST_URL = "/statements/";

View file

@ -1,47 +0,0 @@
package ru.spcex.clearing.backendapi.controller.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectReader;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static ru.spcex.clearing.backendapi.controller.config.Jackson2HttpConverterTestConfig.JacksonObjectMapper.getMapper;
public class JsonUtil {
public static <T> List<T> readValues(String json, Class<T> clazz) {
ObjectReader reader = getMapper().readerFor(clazz);
try {
return reader.<T>readValues(json).readAll();
} catch (IOException e) {
throw new IllegalArgumentException("Invalid read array from JSON:\n'" + json + "'", e);
}
}
public static <T> T readValue(String json, Class<T> clazz) {
try {
return getMapper().readValue(json, clazz);
} catch (IOException e) {
throw new IllegalArgumentException("Invalid read from JSON:\n'" + json + "'", e);
}
}
public static <T> String writeValue(T obj) {
try {
return getMapper().writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new IllegalStateException("Invalid write to JSON:\n'" + obj + "'", e);
}
}
public static <T> String writeIgnoreProps(T obj, String... ignoreProps) {
Map<String, Object> map = getMapper().convertValue(obj, new TypeReference<>() {
});
map.keySet().removeAll(Set.of(ignoreProps));
return writeValue(map);
}
}

View file

@ -34,6 +34,7 @@
<module>scheduler-service</module> <module>scheduler-service</module>
<module>clearing-service</module> <module>clearing-service</module>
<module>registry-service</module> <module>registry-service</module>
<module>test-clearing</module>
</modules> </modules>
<properties> <properties>

View file

@ -0,0 +1,77 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId>
<version>SPCEX-1.0.0.0</version>
</parent>
<artifactId>test-clearing</artifactId>
<name>Test-clearing</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-messaging</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test-autoconfigure</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.23.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
</dependencies>
<version>SPCEX-1.0.0.0</version>
</project>

View file

@ -0,0 +1,73 @@
package ru.spcex.clearing.imdg;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class JsonUtil {
public static <T> List<T> readValues(String json, Class<T> clazz) {
ObjectReader reader = JacksonObjectMapper.getMapper().readerFor(clazz);
try {
return reader.<T>readValues(json).readAll();
} catch (IOException e) {
throw new IllegalArgumentException("Invalid read array from JSON:\n'" + json + "'", e);
}
}
public static <T> T readValue(String json, Class<T> clazz) {
try {
return JacksonObjectMapper.getMapper().readValue(json, clazz);
} catch (IOException e) {
throw new IllegalArgumentException("Invalid read from JSON:\n'" + json + "'", e);
}
}
public static <T> String writeValue(T obj) {
try {
return JacksonObjectMapper.getMapper().writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new IllegalStateException("Invalid write to JSON:\n'" + obj + "'", e);
}
}
public static <T> String writeIgnoreProps(T obj, String... ignoreProps) {
Map<String, Object> map = JacksonObjectMapper.getMapper().convertValue(obj, new TypeReference<>() {
});
map.keySet().removeAll(Set.of(ignoreProps));
return writeValue(map);
}
public static class JacksonObjectMapper extends ObjectMapper {
private static final ObjectMapper MAPPER = new JacksonObjectMapper();
private JacksonObjectMapper() {
//настройки Ильи
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
//модуль для корректной сериализации LocalDateTime в поля JSON - JavaTimeModule модуль библиотеки jackson-datatype-jsr310
registerModule(new JavaTimeModule());
configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//запрещаем доступ ко всем полям и методам класса и потом разрешаем доступ только к полям, нужны чтобы не было лишних полей из-за методов как: public ActionType getActionType() у BankAccountNewAction
setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
//не сериализуем null-поля
// setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
public static ObjectMapper getMapper() {
return MAPPER;
}
}
}

View file

@ -1,5 +1,6 @@
package ru.spcex.clearing.backendapi.controller.utils; package ru.spcex.clearing.imdg;
import org.assertj.core.api.Assertions;
import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.test.web.servlet.ResultMatcher;
@ -8,15 +9,13 @@ import java.io.UnsupportedEncodingException;
import java.util.List; import java.util.List;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import static org.assertj.core.api.Assertions.assertThat;
/** /**
* Factory for creating test matchers. * Factory for creating test matchers.
* <p> * <p>
* Comparing actual and expected objects via AssertJ * Comparing actual and expected objects via AssertJ
* Support converting json MvcResult to objects for comparation. * Support converting json MvcResult to objects for comparation.
*/ */
public class MatcherFactory { public class MatcherFactoryImdg {
public static <T> Matcher<T> usingAssertions(Class<T> clazz, BiConsumer<T, T> assertion, BiConsumer<Iterable<T>, Iterable<T>> iterableAssertion) { public static <T> Matcher<T> usingAssertions(Class<T> clazz, BiConsumer<T, T> assertion, BiConsumer<Iterable<T>, Iterable<T>> iterableAssertion) {
return new Matcher<>(clazz, assertion, iterableAssertion); return new Matcher<>(clazz, assertion, iterableAssertion);
@ -24,14 +23,14 @@ public class MatcherFactory {
public static <T> Matcher<T> usingEqualsComparator(Class<T> clazz) { public static <T> Matcher<T> usingEqualsComparator(Class<T> clazz) {
return usingAssertions(clazz, return usingAssertions(clazz,
(a, e) -> assertThat(a).isEqualTo(e), (a, e) -> Assertions.assertThat(a).isEqualTo(e),
(a, e) -> assertThat(a).isEqualTo(e)); (a, e) -> Assertions.assertThat(a).isEqualTo(e));
} }
public static <T> Matcher<T> usingIgnoringFieldsComparator(Class<T> clazz, String... fieldsToIgnore) { public static <T> Matcher<T> usingIgnoringFieldsComparator(Class<T> clazz, String... fieldsToIgnore) {
return usingAssertions(clazz, return usingAssertions(clazz,
(a, e) -> assertThat(a).usingRecursiveComparison().ignoringFields(fieldsToIgnore).isEqualTo(e), (a, e) -> Assertions.assertThat(a).usingRecursiveComparison().ignoringFields(fieldsToIgnore).isEqualTo(e),
(a, e) -> assertThat(a).usingRecursiveFieldByFieldElementComparatorIgnoringFields(fieldsToIgnore).isEqualTo(e)); (a, e) -> Assertions.assertThat(a).usingRecursiveFieldByFieldElementComparatorIgnoringFields(fieldsToIgnore).isEqualTo(e));
} }
public static class Matcher<T> { public static class Matcher<T> {

View file

@ -1,4 +1,4 @@
package ru.spcex.clearing.backendapi.controller.utils; package ru.spcex.clearing.imdg;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;

View file

@ -104,6 +104,11 @@
<artifactId>security-util</artifactId> <artifactId>security-util</artifactId>
<version>${global.project.version}</version> <version>${global.project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>test-clearing</artifactId>
<version>${global.project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>ru.spcex.platform</groupId> <groupId>ru.spcex.platform</groupId>