From 2ac22ddbdd2f28b8a327af5306c82ef84608ba85 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Fri, 23 Sep 2022 18:25:01 +0300 Subject: [PATCH] --- added test for method add --- clearing-parent/backend-api/pom.xml | 5 +- .../account/BankAccountControllerTest.java | 63 +++++++++++++---- .../config/BankAccountControllerConfig.java | 18 +++++ .../HazelcastServiceTestConfiguration.java | 68 +++++++++++++++++++ .../controller/queue/config/IOperator.java | 24 +++++++ .../config/Jackson2HttpConverterConfig.java | 8 ++- .../controller/queue/config/KafkaConfig.java | 18 +++++ .../controller/queue/utils/JsonUtil.java | 9 +++ 8 files changed, 196 insertions(+), 17 deletions(-) create mode 100644 clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java create mode 100644 clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java create mode 100644 clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java create mode 100644 clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/KafkaConfig.java diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index 96503e90f..0f9f3f647 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -60,8 +60,9 @@ test - org.mockito - mockito-core + org.skyscreamer + jsonassert + test org.junit.jupiter diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java index 4c4e2cc34..d89b18d34 100644 --- a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java +++ b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java @@ -2,26 +2,35 @@ package ru.spcex.clearing.backendapi.controller.queue.account; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.filter.CharacterEncodingFilter; -import ru.spcex.clearing.backendapi.controller.queue.config.Jackson2HttpConverterConfig; -import ru.spcex.clearing.backendapi.controller.queue.utils.JsonUtil; +import ru.spcex.clearing.backendapi.config.WebConfig; +import ru.spcex.clearing.backendapi.controller.queue.config.*; import ru.spcex.clearing.backendapi.controller.queue.utils.MatcherFactory; import ru.spcex.clearing.backendapi.controller.request.cud.account.BankAccountNewAction; import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse; +import ru.spcex.clearing.backendapi.controller.response.cud.QueueSuccessResponse; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest; import javax.annotation.PostConstruct; +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.status; +import static ru.spcex.clearing.backendapi.controller.queue.utils.JsonUtil.writeValue; @SpringJUnitWebConfig(classes = { + WebConfig.class, + IOperator.class, + BankAccountControllerConfig.class, + KafkaConfig.class, + HazelcastServiceTestConfiguration.class, Jackson2HttpConverterConfig.class}) class BankAccountControllerTest { @@ -34,8 +43,6 @@ class BankAccountControllerTest { CHARACTER_ENCODING_FILTER.setForceEncoding(true); } - @Autowired - public Environment env; private MockMvc mockMvc; @Autowired @@ -50,16 +57,48 @@ class BankAccountControllerTest { .build(); } + /** + * {@link BankAccountController#add(BankAccountNewAction)}
+ * Тест проверяет получение сущности {@link BankAccountNewAction} по REST API и отправку в Apache Kafka.
+ * Входной запрос {@link BankAccountNewRequest}:
+ * {@link BankAccountNewRequest#bankIdentificationCode} - 044525776
+ * {@link BankAccountNewRequest#bankName} - Beta Money Bank
+ * {@link BankAccountNewRequest#correspondentAccount} - 30101111111111111776
+ * {@link BankAccountNewRequest#correspondentAccountName} - correspondent
+ * {@link BankAccountNewRequest#currency} - RUB
+ * {@link BankAccountNewRequest#destination} - destination
+ * {@link BankAccountNewRequest#taxpayerIdentificationNumber} - 3664011397
+ * {@link BankAccountNewRequest#taxRegistrationReasonCode} - 01
+ * {@link BankAccountNewRequest#account} - 11111222223333344444
+ */ @Test void add() throws Exception { + //ARRANGE BankAccountNewAction bankAccountNewAction = new BankAccountNewAction(); - ResultActions action = mockMvc.perform(MockMvcRequestBuilders.post(REST_URL) - .contentType(MediaType.APPLICATION_JSON) -// .with(userHttpBasic(admin)) - .content(JsonUtil.writeValue(bankAccountNewAction))) - .andExpect(status().isCreated()); + bankAccountNewAction.setBankIdentificationCode("044525776"); + bankAccountNewAction.setBankName("Beta Money Bank"); + bankAccountNewAction.setCorrespondentAccount("30101111111111111776"); + bankAccountNewAction.setCorrespondentAccountName("correspondent"); + bankAccountNewAction.setCurrency("RUB"); + bankAccountNewAction.setDestination("destination"); + bankAccountNewAction.setTaxpayerIdentificationNumber("3664011397"); + bankAccountNewAction.setTaxRegistrationReasonCode("01"); + bankAccountNewAction.setAccount("11111222223333344444"); - CudResponse created = CUD_RESPONSE_MATCHER.readFromJson(action); + CudResponse extended = new CudResponse(); + extended.setCode(0L); + extended.setMessage("success"); + extended.setPayload(new QueueSuccessResponse(ActionType.NEW, 0L)); + + //ACT + mockMvc.perform(MockMvcRequestBuilders.post(REST_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(writeValue(bankAccountNewAction))) + .andDo(print())//output to the log request and response +// ASSERT + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(content().json(writeValue(extended))); } @Test diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java new file mode 100644 index 000000000..2f832f51b --- /dev/null +++ b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.backendapi.controller.queue.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.backendapi.controller.queue.account.BankAccountController; +import ru.spcex.clearing.backendapi.service.IOperator; + +@Configuration +public class BankAccountControllerConfig { + + @Autowired + @Bean + public BankAccountController createBankAccountController(IOperator operator) { + return new BankAccountController(operator); + } + +} diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java new file mode 100644 index 000000000..04e64990d --- /dev/null +++ b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java @@ -0,0 +1,68 @@ +package ru.spcex.clearing.backendapi.controller.queue.config; + +import com.hazelcast.config.*; +import com.hazelcast.core.Hazelcast; +import com.hazelcast.core.HazelcastInstance; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.imdg.iml.hazelcast.util.HazelcastHelper; + +import java.util.List; +import java.util.Random; + +@Configuration +public class HazelcastServiceTestConfiguration { + private HazelcastInstance hazelcastInstance; + + private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { + ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); + if (maxPoolSz > 2) { + pool.setKeepAliveSeconds(60); + pool.setAllowCoreThreadTimeOut(true); + } + pool.setCorePoolSize(maxPoolSz); + pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); + return pool; + } + + @Bean(name = "hazelcastServiceTest") + public HazelcastService hazelcastService(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, HazelcastClientParams params) { + Config cfg = new Config(); + cfg.setInstanceName("localhost"); + + NetworkConfig networkConfig = new NetworkConfig(); + JoinConfig joinConfig = new JoinConfig(); + joinConfig.setMulticastConfig(new MulticastConfig().setEnabled(false)); + joinConfig.setTcpIpConfig(new TcpIpConfig().setEnabled(true).setMembers(List.of("127.0.0.1"))); + networkConfig.setJoin(joinConfig); + cfg.setNetworkConfig(networkConfig); + hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); + HazelcastHelper.otcSystem_setStorageState(true, hazelcastInstance); + return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); + } + + @Bean(name = "taskExecutorHazelcastClientInitializer") + public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { + return createThreadPoolTaskExecutor(1, true); + } + + @Bean(name = "taskExecutorIdGeneratorAwaiter") + public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { + return createThreadPoolTaskExecutor(1, false); + } + + @Bean(name = "hazelcastClientParams") + public HazelcastClientParams getHazelcastClientParams() { + HazelcastClientParams params = new HazelcastClientParams(); + params.setLogin("dev"); + params.setPassword("dev-pass"); + params.setClusterMembers("127.0.0.1"); + params.setInstanceName("hzTestClient" + new Random().nextInt()); + params.setNearCacheConfig(new NearCacheConfig()); + return params; + } +} diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java new file mode 100644 index 000000000..065785269 --- /dev/null +++ b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java @@ -0,0 +1,24 @@ +package ru.spcex.clearing.backendapi.controller.queue.config; + +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.backendapi.service.impl.OperatorImpl; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; + +@Configuration +public class IOperator { + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + + @Autowired + @Bean + public OperatorImpl createIOperator(Producer kafka) { + return new OperatorImpl(kafka, hazelcastServiceTest); + } + +} diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/Jackson2HttpConverterConfig.java b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/Jackson2HttpConverterConfig.java index c6d557d21..a1f8c5bea 100644 --- a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/Jackson2HttpConverterConfig.java +++ b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/Jackson2HttpConverterConfig.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.backendapi.controller.queue.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 org.springframework.context.annotation.Bean; @@ -25,9 +27,9 @@ public class Jackson2HttpConverterConfig { // registerModule(new JavaTimeModule()); // configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); -// запрещаем доступ ко всем полям и методам класса и потом разрешаем доступ только к полям, нужны чтобы не было лишних полей из-за методов как: public boolean isExcess() -// setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); -// setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); +// запрещаем доступ ко всем полям и методам класса и потом разрешаем доступ только к полям, нужны чтобы не было лишних полей из-за методов как: public ActionType getActionType() у BankAccountNewAction + setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); + setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); // не сериализуем null-поля // setSerializationInclusion(JsonInclude.Include.NON_NULL); } diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/KafkaConfig.java b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/KafkaConfig.java new file mode 100644 index 000000000..e8c020252 --- /dev/null +++ b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/KafkaConfig.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.backendapi.controller.queue.config; + +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.platform.messaging.serialization.JsonSerializer; + +@Configuration +public class KafkaConfig { + + @Bean + public Producer createProducer() { + return new MockProducer<>(true, new StringSerializer(), new JsonSerializer()); + } + +} diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/utils/JsonUtil.java b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/utils/JsonUtil.java index fb20fe457..2780f9465 100644 --- a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/utils/JsonUtil.java +++ b/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/utils/JsonUtil.java @@ -1,10 +1,13 @@ package ru.spcex.clearing.backendapi.controller.queue.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.queue.config.Jackson2HttpConverterConfig.JacksonObjectMapper.getMapper; @@ -35,4 +38,10 @@ public class JsonUtil { } } + public static String writeIgnoreProps(T obj, String... ignoreProps) { + Map map = getMapper().convertValue(obj, new TypeReference<>() { + }); + map.keySet().removeAll(Set.of(ignoreProps)); + return writeValue(map); + } } \ No newline at end of file