From b6780affc0cff26eb7bbdb3c4ddfcc9b14b24edc Mon Sep 17 00:00:00 2001 From: psemenkov Date: Wed, 14 Sep 2022 15:20:28 +0300 Subject: [PATCH] http://git.mfd.msk/dashboard/issues?assignee_id=30 --- adding hazelcast client --- clearing-parent/account-service/pom.xml | 5 + .../HazelcastInstanceTestConfiguration.java | 29 +++++ .../HazelcastServiceTestConfiguration.java | 73 ++++++++++++ .../service/BankAccountServiceTest.java | 106 ++++++++++++++---- 4 files changed, 194 insertions(+), 19 deletions(-) create mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/HazelcastInstanceTestConfiguration.java create mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/HazelcastServiceTestConfiguration.java diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index 01f40da8d..683aff67d 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -37,6 +37,11 @@ jackson-databind + + org.springframework + spring-test + test + org.mockito mockito-core diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/HazelcastInstanceTestConfiguration.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/HazelcastInstanceTestConfiguration.java new file mode 100644 index 000000000..410d8392d --- /dev/null +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/HazelcastInstanceTestConfiguration.java @@ -0,0 +1,29 @@ +package ru.spcex.clearing.account.config; + +import com.hazelcast.config.Config; +import com.hazelcast.config.JoinConfig; +import com.hazelcast.config.MulticastConfig; +import com.hazelcast.config.NetworkConfig; +import com.hazelcast.core.Hazelcast; +import com.hazelcast.core.HazelcastInstance; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Random; + +@Configuration +public class HazelcastInstanceTestConfiguration { + + @Bean(name = "hazelcastInstance") + public HazelcastInstance hazelcastInstance() { + Config cfg = new Config(); + cfg.setInstanceName("unittest_test_" + new Random().nextInt()); + NetworkConfig networkConfig = new NetworkConfig(); + JoinConfig joinConfig = new JoinConfig(); + joinConfig.setMulticastConfig(new MulticastConfig().setEnabled(false)); + networkConfig.setJoin(joinConfig); + cfg.setNetworkConfig(networkConfig); + return Hazelcast.newHazelcastInstance(cfg); + } + +} diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/HazelcastServiceTestConfiguration.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/HazelcastServiceTestConfiguration.java new file mode 100644 index 000000000..2dbc81965 --- /dev/null +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/HazelcastServiceTestConfiguration.java @@ -0,0 +1,73 @@ +package ru.spcex.clearing.account.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 java.util.List; + +@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); +// .setPort(configRoot.getHazelcast().getListenPort()) +// .setJoin(new JoinConfig() +// .setMulticastConfig(new MulticastConfig() +// .setEnabled(false)) +// .setTcpIpConfig(new TcpIpConfig() +// .setEnabled(true).setMembers(hzSettings.getClusterMembers()) +// ) + cfg.setNetworkConfig(networkConfig); + hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); + 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("localhost"); + params.setNearCacheConfig(new NearCacheConfig()); + + return params; + } +} diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index a3572d8db..d7c11a50c 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -1,41 +1,81 @@ package ru.spcex.clearing.account.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.hazelcast.core.IMap; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.consumer.OffsetResetStrategy; import org.apache.kafka.common.TopicPartition; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.BankAccount; +import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import java.util.Collections; import java.util.HashMap; -import static org.mockito.Mockito.doReturn; - -class BankAccountServiceTest { +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + HazelcastServiceTestConfiguration.class}) +public class BankAccountServiceTest { private static final int PARTITION = 0; private static final String TOPIC = Consts.DESTINATION_BANK_ACCOUNT_NEW; + private final String jsonBaseRequest; + private final ObjectMapper objectMapper = new ObjectMapper(); + private final BankAccountNewRequest bankAccountNewRequest = new BankAccountNewRequest(); + private final BaseRequest baseRequest = new BaseRequest<>(); + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; private MockConsumer mockConsumer; + { + bankAccountNewRequest.setBankName("ooo tinkoff"); + bankAccountNewRequest.setBankIdentificationCode("99999"); + bankAccountNewRequest.setCorrespondentAccount("9294189285498598598"); + bankAccountNewRequest.setCorrespondentAccountName("BIK OF TINKOFF"); + bankAccountNewRequest.setCurrency("RUB"); + bankAccountNewRequest.setDestination("OOO ROGA I KOPITA"); + bankAccountNewRequest.setTaxpayerIdentificationNumber("848484848484"); + bankAccountNewRequest.setTaxRegistrationReasonCode("886886"); + bankAccountNewRequest.setAccount("123456789123"); + + baseRequest.setRequestPayload(bankAccountNewRequest); + baseRequest.setId(0L); + baseRequest.setActionType(ActionType.NEW); + try { + jsonBaseRequest = objectMapper.writeValueAsString(baseRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + @BeforeEach void setUp() { mockConsumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST); } @Test - public void bankAccountNew() { + public void bankAccountNew() throws InterruptedException { //arrange mockConsumer.schedulePollTask(() -> { mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC, PARTITION))); - mockConsumer.addRecord(new ConsumerRecord<>(TOPIC, PARTITION, 0, "key", "test-value")); + mockConsumer.addRecord(new ConsumerRecord<>(TOPIC, PARTITION, 0, "key", jsonBaseRequest)); }); mockConsumer.schedulePollTask(() -> mockConsumer.wakeup()); @@ -43,24 +83,52 @@ class BankAccountServiceTest { TopicPartition tp = new TopicPartition(TOPIC, PARTITION); startOffsets.put(tp, 0L); mockConsumer.updateBeginningOffsets(startOffsets); - ImdgProvider imdgProvider = Mockito.mock(ImdgProvider.class); - Imdg bankAccountMap = new ImdgHazelcast(); - doReturn(bankAccountMap).when(imdgProvider).getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); - BankAccountService bankAccountService = new BankAccountService(mockConsumer, imdgProvider); -// Map>> records = new LinkedHashMap<>(); + +// ImdgProvider imdgProvider = Mockito.mock(ImdgProvider.class); // -// String topic = Consts.DESTINATION_BANK_ACCOUNT_NEW; -// ConsumerRecord record1 = new ConsumerRecord<>(topic, 1, 0, 0L, TimestampType.CREATE_TIME, 0L, 0, 0, 1, "value1"); -// records.put(new TopicPartition(topic, 0), Arrays.asList(record1)); - - //doReturn(records).when(kafkaQueue).poll(Duration.of(10, ChronoUnit.SECONDS)); +// ImdgHazelcast bankAccountMap = Mockito.mock(ImdgHazelcast.class); +// +// ArgumentCaptor bankAccountCaptor = ArgumentCaptor.forClass(BankAccount.class); +// +// doReturn(bankAccountMap).when(imdgProvider).getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); - //act + try { + hazelcastServiceTest.init(); + Thread.sleep(10000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + //мапа которую проверял Илья + IMap map = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_KeyRate); + Imdg imdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); +// IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_BankAccount); + BankAccountService bankAccountService = new BankAccountService(mockConsumer, hazelcastServiceTest); bankAccountService.afterPropertiesSet(); + + Thread.sleep(10000); + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_BankAccount); + + BankAccount predictableResult = new BankAccount(); + predictableResult.setBankName("ooo tinkoff"); + predictableResult.setBankIdentificationCode("99999"); + predictableResult.setCorrespondentAccount("9294189285498598598"); + predictableResult.setCorrespondentAccountName("BIK OF TINKOFF"); + predictableResult.setCurrency("RUB"); + predictableResult.setDestination("OOO ROGA I KOPITA"); + predictableResult.setTaxpayerIdentificationNumber("848484848484"); + predictableResult.setTaxRegistrationReasonCode("886886"); + predictableResult.setAccount("123456789123"); + + +// Mockito.verify(bankAccountMap).insert(bankAccountCaptor.capture()); + +// BankAccount bankAccount = bankAccountCaptor.getValue(); //assert + +// assertThat(bankAccount).isEqualTo(predictableResult); } } \ No newline at end of file