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