From 5aca0cd99a2176282f54877123aa823dcfaeb979 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Mon, 3 Oct 2022 13:03:28 +0300 Subject: [PATCH 1/4] fixing bug --- .../account/BankAccountControllerTest.java | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) 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 e0705f548..792d57ff6 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 @@ -1,15 +1,19 @@ package ru.spcex.clearing.backendapi.controller.queue.account; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.NestedExceptionUtils; import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; 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.clearing.classes.statics.data.account.BankAccount; import ru.spcex.clearing.backendapi.config.WebConfig; import ru.spcex.clearing.backendapi.controller.queue.config.*; import ru.spcex.clearing.backendapi.controller.queue.utils.MatcherFactory; @@ -17,8 +21,10 @@ import ru.spcex.clearing.backendapi.controller.request.cud.account.BankAccountNe import ru.spcex.clearing.backendapi.controller.request.cud.account.BankAccountUpdateAction; import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse; import ru.spcex.clearing.backendapi.controller.response.cud.QueueSuccessResponse; +import ru.spcex.clearing.backendapi.controller.response.entity.account.BankAccountBackendGetById; import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.backendapi.errors.ActionValidationException; +import ru.spcex.clearing.backendapi.service.impl.StateLoaderImpl; import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest; @@ -31,13 +37,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static ru.spcex.clearing.backendapi.controller.queue.utils.JsonUtil.writeValue; -@SpringJUnitWebConfig(classes = { +@ContextConfiguration(classes = { WebConfig.class, IOperator.class, BankAccountControllerConfig.class, KafkaConfig.class, HazelcastServiceTestConfiguration.class, + StateLoaderImplConfig.class, Jackson2HttpConverterConfig.class}) +@ExtendWith(SpringExtension.class) class BankAccountControllerTest { public static final MatcherFactory.Matcher CUD_RESPONSE_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(CudResponse.class); @@ -52,6 +60,10 @@ class BankAccountControllerTest { private MockMvc mockMvc; + @Autowired + @Qualifier("stateLoaderImpl") + private StateLoaderImpl stateLoader; + @Autowired private WebApplicationContext webApplicationContext; @@ -200,6 +212,40 @@ class BankAccountControllerTest { .andExpect(content().json(writeValue(extended))); } + @Test + void getById() throws Exception { + //ARRANGE + 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"); + predictableResult.setId(currentId.getAndIncrement()); + +// IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_ClearingMemberCategory); +// iMap.put(ID, existsСlearingMemberCategory); + + BankAccountBackendGetById extended = new BankAccountBackendGetById(); + + //ACT + mockMvc.perform(MockMvcRequestBuilders.get(REST_URL + "0") + .contentType(MediaType.APPLICATION_JSON)) + .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 + void getAll() { + } + private void assertThrowsFor(IAction iAction) { assertThrows(ActionValidationException.class, () -> { try { From aef9556b56cf96ac6097b9c0c540a59388179dd7 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Mon, 14 Nov 2022 13:07:01 +0300 Subject: [PATCH 2/4] add AccountServiceTast --- .../HazelcastServiceTestConfiguration.java | 2 + .../account/config/KafkaConfigTest.java | 48 +++++ .../account/service/AccountServiceTest.java | 140 ++++++++++++++ .../service/BankAccountServiceTest.java | 178 ++++++++---------- .../clearing/account/utils/ImapEvent.java | 50 +++++ .../queue/AbstractControllerTest.java | 0 .../account/BankAccountControllerTest.java | 0 .../company/DeleteCompanyControllerTest.java | 0 .../config/BankAccountControllerConfig.java | 2 +- .../config/DeleteCompanyControllerConfig.java | 2 +- .../HazelcastServiceTestConfiguration.java | 0 .../controller/queue/config/IOperator.java | 5 +- .../config/Jackson2HttpConverterConfig.java | 0 .../controller/queue/config/KafkaConfig.java | 0 .../queue/config/StateLoaderImplConfig.java | 0 .../controller/queue/utils/JsonUtil.java | 0 .../queue/utils/MatcherFactory.java | 0 17 files changed, 322 insertions(+), 105 deletions(-) create mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/KafkaConfigTest.java create mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java create mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java (100%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java (100%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyControllerTest.java (100%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java (96%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/config/DeleteCompanyControllerConfig.java (96%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java (100%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java (76%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/config/Jackson2HttpConverterConfig.java (100%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/config/KafkaConfig.java (100%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/config/StateLoaderImplConfig.java (100%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/utils/JsonUtil.java (100%) rename clearing-parent/backend-api/src/test/{ => java}/ru/spcex/clearing/backendapi/controller/queue/utils/MatcherFactory.java (100%) 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 index 60f94af16..826001db9 100644 --- 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 @@ -13,9 +13,11 @@ import ru.spcex.platform.imdg.iml.hazelcast.util.HazelcastHelper; import java.util.List; import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; @Configuration public class HazelcastServiceTestConfiguration { + public static final AtomicLong currentID = new AtomicLong(0L); private HazelcastInstance hazelcastInstance; private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/KafkaConfigTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/KafkaConfigTest.java new file mode 100644 index 000000000..78c210602 --- /dev/null +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/config/KafkaConfigTest.java @@ -0,0 +1,48 @@ +package ru.spcex.clearing.account.config; + + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.consumer.OffsetResetStrategy; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.common.serialization.StringSerializer; +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.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.serialization.JsonSerializer; +import ru.spcex.clearing.platform.messaging.service.RequestInfo; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; + +@Configuration +public class KafkaConfigTest { + + @Autowired + @Bean(name = "kafkaSenderTest") + public KafkaSender kafkaSender(@Qualifier("mockProducerTest") Producer kafkaProducer, @Qualifier("hazelcastServiceTest") ImdgProvider imdgProvider) { + ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + return KafkaSender + .setup() + .producer(kafkaProducer) + .idGenerator(imdgIdGenerator::nextId) + .imdgProvider(s -> { + Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + return imdg::insert; + }) + .build(); + } + + @Bean(name = "mockConsumerTest") + public MockConsumer createConsumer() { + return new MockConsumer<>(OffsetResetStrategy.EARLIEST); + } + + @Bean(name = "mockProducerTest") + public MockProducer createProducer() { + return new MockProducer<>(true, new StringSerializer(), new JsonSerializer()); + } +} diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java new file mode 100644 index 000000000..bfb3eb9f3 --- /dev/null +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -0,0 +1,140 @@ +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.common.TopicPartition; +import org.junit.jupiter.api.Test; +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.Account; +import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.account.config.KafkaConfigTest; +import ru.spcex.clearing.account.utils.ImapEvent; +import ru.spcex.clearing.account.utils.MatcherFactory; +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.sdf01.AccountSdf01Request; +import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.platform.messaging.service.RequestInfo; +import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import static ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration.currentID; +import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + HazelcastServiceTestConfiguration.class, + KafkaConfigTest.class}) +class AccountServiceTest { + public static final MatcherFactory.Matcher ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); + public static final MatcherFactory.Matcher REQUEST_INFO_MATCHER_MATCHER = usingIgnoringFieldsComparator("created"); + private static final int PARTITION = 0; + private static final String TOPIC_ACCOUNT_NEW = Consts.ACCOUNT_NEW; + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + + @Autowired + @Qualifier("kafkaSenderTest") + private KafkaSender kafkaSender; + + @Autowired + @Qualifier("mockConsumerTest") + private MockConsumer mockConsumer; + + @Test + void accountNew() throws InterruptedException { + //arrange + Long firstID = currentID.getAndIncrement(); + Long secondID = currentID.getAndIncrement(); + AccountSdfRequestPart accountSdfRequestPart = new AccountSdfRequestPart(); + accountSdfRequestPart.setSdfId(firstID); + accountSdfRequestPart.setAccount("123456789123"); + accountSdfRequestPart.setCompanyId(firstID); + AccountSdf01Request accountSdf01Request = new AccountSdf01Request(); + accountSdf01Request.setGroupingSdf01Id(firstID); + accountSdf01Request.setAccounts(Collections.singletonList(accountSdfRequestPart)); + + BaseRequest baseNewRequest = new BaseRequest<>(); + baseNewRequest.setRequestPayload(accountSdf01Request); + baseNewRequest.setId(firstID); + baseNewRequest.setActionType(ActionType.NEW); + String jsonBaseNewRequest; + ObjectMapper objectMapper = new ObjectMapper(); + try { + jsonBaseNewRequest = objectMapper.writeValueAsString(baseNewRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart(); + responsePart.setSdfId(firstID); + responsePart.setErrorCode(null); + responsePart.setErrorText(null); + List accountToStatement = Collections.singletonList(responsePart); + StatementRequest statementRequest = new StatementRequest(); + statementRequest.setGroupId(firstID); + statementRequest.setAccountCreationResults(accountToStatement); + + BaseRequest baseRequest = new BaseRequest<>(); + baseRequest.setId(secondID); + baseRequest.setActionType(ActionType.SYSTEM); + baseRequest.setRequestPayload(statementRequest); + + Account predictableAccount = new Account(); + predictableAccount.setAccount("123456789123"); + predictableAccount.setId(firstID); + + RequestInfo predictableRequestInfo = new RequestInfo(); + predictableRequestInfo.setId(secondID); + predictableRequestInfo.setStatus(Status.Processing); + + + //ACT + + hazelcastServiceTest.waitTillReadyState(); + //service set up + AccountService accountService = new AccountService(mockConsumer, hazelcastServiceTest, kafkaSender); + //callbacks set up + accountService.afterPropertiesSet(); + + //KAFKA + mockConsumer.schedulePollTask(() -> { + mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_ACCOUNT_NEW, PARTITION))); + mockConsumer.addRecord(new ConsumerRecord<>(TOPIC_ACCOUNT_NEW, PARTITION, 0, "key", jsonBaseNewRequest)); + }); + HashMap startOffsets = new HashMap<>(); + TopicPartition tp = new TopicPartition(TOPIC_ACCOUNT_NEW, PARTITION); + startOffsets.put(tp, 0L); + mockConsumer.updateBeginningOffsets(startOffsets); + + IMap accountIMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_Account); + IMap requestInfoIMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_RequestInfo); + + ImapEvent imapEvent = new ImapEvent(requestInfoIMap); + imapEvent.waitHappened(); + //ASSERT + Account accountResult = accountIMap.get(firstID); + RequestInfo requestInfoResult = requestInfoIMap.get(secondID); + + ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount); + REQUEST_INFO_MATCHER_MATCHER.assertMatch(requestInfoResult, predictableRequestInfo); + } +} \ No newline at end of file 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 14077bfac..59e2a1304 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 @@ -18,6 +18,8 @@ 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.account.config.KafkaConfigTest; +import ru.spcex.clearing.account.utils.ImapEvent; import ru.spcex.clearing.account.utils.MatcherFactory.Matcher; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; @@ -31,29 +33,36 @@ import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import java.util.Collections; import java.util.HashMap; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration.currentID; import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { - HazelcastServiceTestConfiguration.class}) + HazelcastServiceTestConfiguration.class, + KafkaConfigTest.class}) public class BankAccountServiceTest { public static final Matcher BANK_ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); private static final int PARTITION = 0; private static final String TOPIC_ACCOUNT_NEW = Consts.DESTINATION_BANK_ACCOUNT_NEW; private static final String TOPIC_ACCOUNT_UPDATE = Consts.DESTINATION_BANK_ACCOUNT_UPDATE; private static final String TOPIC_ACCOUNT_DELETE = Consts.DESTINATION_BANK_ACCOUNT_DELETE; - private static Long currentId = 0L; + private static final Long ID = currentID.getAndIncrement(); @Autowired @Qualifier("hazelcastServiceTest") private HazelcastService hazelcastServiceTest; + private MockConsumer mockConsumer; + + @Autowired + @Qualifier("mockProducerTest") private MockProducer mockProducer; + @BeforeEach void setUp() { mockConsumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST); - mockProducer = new MockProducer<>(); } /** @@ -86,7 +95,7 @@ public class BankAccountServiceTest { BaseRequest baseNewRequest = new BaseRequest<>(); baseNewRequest.setRequestPayload(bankAccountNewRequest); - baseNewRequest.setId(currentId); + baseNewRequest.setId(ID); baseNewRequest.setActionType(ActionType.NEW); String jsonBaseNewRequest; ObjectMapper objectMapper = new ObjectMapper(); @@ -105,7 +114,15 @@ public class BankAccountServiceTest { predictableResult.setTaxpayerIdentificationNumber("848484848484"); predictableResult.setTaxRegistrationReasonCode("886886"); predictableResult.setAccount("123456789123"); - predictableResult.setId(currentId); + predictableResult.setId(ID); + + //ACT + hazelcastServiceTest.waitTillReadyState(); + //service set up + BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); + //callbacks set up + bankAccountService.afterPropertiesSet(); + //KAFKA mockConsumer.schedulePollTask(() -> { mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_ACCOUNT_NEW, PARTITION))); @@ -118,24 +135,17 @@ public class BankAccountServiceTest { startOffsets.put(tp, 0L); mockConsumer.updateBeginningOffsets(startOffsets); - //ACT + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_BankAccount); - //service set up - BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); - Thread.sleep(10000); - //callbacks set up - bankAccountService.afterPropertiesSet(); - Thread.sleep(10000); + //waiting for hazelcast map item updates + ImapEvent imapEvent = new ImapEvent(iMap); + imapEvent.waitHappened(); //ASSERT - IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_BankAccount); - BankAccount result = iMap.get(currentId); + BankAccount result = iMap.get(ID); BANK_ACCOUNT_MATCHER.assertMatch(result, predictableResult); - - //reset hazelcastService for next test - iMap.clear(); - currentId++; + assertTrue(mockProducer.history().get(0).topic().equalsIgnoreCase(Consts.REQUEST_INFO_UPDATE)); } /** @@ -155,30 +165,20 @@ public class BankAccountServiceTest { @Test void bankAccountUpdate() throws InterruptedException { //arrange - BankAccountNewRequest bankAccountNewRequest = new BankAccountNewRequest(); - 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"); + BankAccount bankAccountExists = new BankAccount(); + bankAccountExists.setId(ID); + bankAccountExists.setBankName("ooo tinkoff"); + bankAccountExists.setBankIdentificationCode("99999"); + bankAccountExists.setCorrespondentAccount("9294189285498598598"); + bankAccountExists.setCorrespondentAccountName("BIK OF TINKOFF"); + bankAccountExists.setCurrency("RUB"); + bankAccountExists.setDestination("OOO ROGA I KOPITA"); + bankAccountExists.setTaxpayerIdentificationNumber("848484848484"); + bankAccountExists.setTaxRegistrationReasonCode("886886"); + bankAccountExists.setAccount("123456789123"); - BaseRequest baseNewRequest = new BaseRequest<>(); - baseNewRequest.setRequestPayload(bankAccountNewRequest); - baseNewRequest.setId(currentId); - baseNewRequest.setActionType(ActionType.NEW); - String jsonBaseNewRequest; - ObjectMapper objectMapper = new ObjectMapper(); - try { - jsonBaseNewRequest = objectMapper.writeValueAsString(baseNewRequest); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } BankAccountUpdateRequest bankAccountUpdateRequest = new BankAccountUpdateRequest(); - bankAccountUpdateRequest.setId(currentId); + bankAccountUpdateRequest.setId(ID); bankAccountUpdateRequest.setBankName("NEW BUNK NAME"); bankAccountUpdateRequest.setBankIdentificationCode("88888"); bankAccountUpdateRequest.setCorrespondentAccount("894984646541316"); @@ -191,9 +191,10 @@ public class BankAccountServiceTest { BaseRequest baseUpdateRequest = new BaseRequest<>(); baseUpdateRequest.setRequestPayload(bankAccountUpdateRequest); - baseUpdateRequest.setId(currentId); + baseUpdateRequest.setId(ID); baseUpdateRequest.setActionType(ActionType.UPDATE); String jsonBaseUpdateRequest; + ObjectMapper objectMapper = new ObjectMapper(); try { jsonBaseUpdateRequest = objectMapper.writeValueAsString(baseUpdateRequest); } catch (JsonProcessingException e) { @@ -209,25 +210,19 @@ public class BankAccountServiceTest { predictableUpdateResult.setTaxpayerIdentificationNumber("65468461321"); predictableUpdateResult.setTaxRegistrationReasonCode("532137"); predictableUpdateResult.setAccount("326984656514"); - predictableUpdateResult.setId(currentId); - - //KAFKA - mockConsumer.schedulePollTask(() -> { - mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_ACCOUNT_NEW, PARTITION))); - mockConsumer.addRecord(new ConsumerRecord<>(TOPIC_ACCOUNT_NEW, PARTITION, 0, "key", jsonBaseNewRequest)); - }); - HashMap startOffsets = new HashMap<>(); - TopicPartition tp = new TopicPartition(TOPIC_ACCOUNT_NEW, PARTITION); - startOffsets.put(tp, 0L); - mockConsumer.updateBeginningOffsets(startOffsets); + predictableUpdateResult.setId(ID); //ACT + + hazelcastServiceTest.waitTillReadyState(); //service set up BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); - Thread.sleep(10000); //callbacks set up bankAccountService.afterPropertiesSet(); - Thread.sleep(10000); + + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_BankAccount); + iMap.put(ID, bankAccountExists); + ImapEvent imapEvent = new ImapEvent(iMap); //KAFKA mockConsumer.schedulePollTask(() -> { @@ -239,16 +234,14 @@ public class BankAccountServiceTest { startOffsetsUpdating.put(tpUpdating, 0L); mockConsumer.updateBeginningOffsets(startOffsetsUpdating); - //ASSERT - Thread.sleep(10000); - IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_BankAccount); - BankAccount resultUpdating = iMap.get(currentId); + //waiting for hazelcast map item updates + imapEvent.waitHappened(); + //ASSERT + BankAccount resultUpdating = iMap.get(ID); BANK_ACCOUNT_MATCHER.assertMatch(resultUpdating, predictableUpdateResult); - //reset hazelcastService for next test - iMap.clear(); - currentId++; + assertTrue(mockProducer.history().get(0).topic().equalsIgnoreCase(Consts.REQUEST_INFO_UPDATE)); } /** @@ -260,58 +253,42 @@ public class BankAccountServiceTest { @Test void bankAccountDelete() throws InterruptedException { //arrange - BankAccountNewRequest bankAccountNewRequest = new BankAccountNewRequest(); - 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 baseNewRequest = new BaseRequest<>(); - baseNewRequest.setRequestPayload(bankAccountNewRequest); - baseNewRequest.setId(currentId); - baseNewRequest.setActionType(ActionType.NEW); - String jsonBaseNewRequest; - ObjectMapper objectMapper = new ObjectMapper(); - try { - jsonBaseNewRequest = objectMapper.writeValueAsString(baseNewRequest); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + BankAccount bankAccountExists = new BankAccount(); + bankAccountExists.setId(ID); + bankAccountExists.setBankName("ooo tinkoff"); + bankAccountExists.setBankIdentificationCode("99999"); + bankAccountExists.setCorrespondentAccount("9294189285498598598"); + bankAccountExists.setCorrespondentAccountName("BIK OF TINKOFF"); + bankAccountExists.setCurrency("RUB"); + bankAccountExists.setDestination("OOO ROGA I KOPITA"); + bankAccountExists.setTaxpayerIdentificationNumber("848484848484"); + bankAccountExists.setTaxRegistrationReasonCode("886886"); + bankAccountExists.setAccount("123456789123"); CommonDeleteRequest commonDeleteRequest = new CommonDeleteRequest(); - commonDeleteRequest.setId(currentId); + commonDeleteRequest.setId(ID); BaseRequest baseDeleteRequest = new BaseRequest<>(); baseDeleteRequest.setRequestPayload(commonDeleteRequest); - baseDeleteRequest.setId(currentId); + baseDeleteRequest.setId(ID); baseDeleteRequest.setActionType(ActionType.DELETE); + ObjectMapper objectMapper = new ObjectMapper(); String jsonDeleteNewRequest; try { jsonDeleteNewRequest = objectMapper.writeValueAsString(baseDeleteRequest); } catch (JsonProcessingException e) { throw new RuntimeException(e); } - //KAFKA - mockConsumer.schedulePollTask(() -> { - mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_ACCOUNT_NEW, PARTITION))); - mockConsumer.addRecord(new ConsumerRecord<>(TOPIC_ACCOUNT_NEW, PARTITION, 0, "key", jsonBaseNewRequest)); - }); - HashMap startOffsets = new HashMap<>(); - TopicPartition tp = new TopicPartition(TOPIC_ACCOUNT_NEW, PARTITION); - startOffsets.put(tp, 0L); - mockConsumer.updateBeginningOffsets(startOffsets); //ACT //service set up + hazelcastServiceTest.waitTillReadyState(); BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); - Thread.sleep(10000); //callbacks set up bankAccountService.afterPropertiesSet(); - Thread.sleep(10000); + + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_BankAccount); + iMap.put(ID, bankAccountExists); + ImapEvent imapEvent = new ImapEvent(iMap); //KAFKA mockConsumer.schedulePollTask(() -> { @@ -323,13 +300,12 @@ public class BankAccountServiceTest { startOffsetsDeleting.put(tpDeleting, 0L); mockConsumer.updateBeginningOffsets(startOffsetsDeleting); + //waiting for hazelcast map item updates + imapEvent.waitHappened(); + //ASSERT - Thread.sleep(10000); - IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_BankAccount); Assertions.assertEquals(0, iMap.size()); - //reset hazelcastService for next test - iMap.clear(); - currentId++; + assertTrue(mockProducer.history().get(0).topic().equalsIgnoreCase(Consts.REQUEST_INFO_UPDATE)); } } \ No newline at end of file diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java new file mode 100644 index 000000000..a59e6d06b --- /dev/null +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java @@ -0,0 +1,50 @@ +package ru.spcex.clearing.account.utils; + +import com.hazelcast.core.IMap; +import com.hazelcast.map.listener.EntryAddedListener; +import com.hazelcast.map.listener.EntryRemovedListener; +import com.hazelcast.map.listener.EntryUpdatedListener; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class ImapEvent { + private final IMap iMap; + private final String listenerAdding; + private final String listenerUpdating; + private final String listenerRemoving; + private final AtomicBoolean checkEventHappened = new AtomicBoolean(false); + + public ImapEvent(IMap iMap) { + this.iMap = iMap; + listenerAdding = iMap.addEntryListener((EntryAddedListener) entryEvent -> { + synchronized (checkEventHappened) { + checkEventHappened.set(true); + checkEventHappened.notify(); + } + }, false); + listenerUpdating = iMap.addEntryListener((EntryUpdatedListener) entryEvent -> { + synchronized (checkEventHappened) { + checkEventHappened.set(true); + checkEventHappened.notify(); + } + }, false); + listenerRemoving = iMap.addEntryListener((EntryRemovedListener) entryEvent -> { + synchronized (checkEventHappened) { + checkEventHappened.set(true); + checkEventHappened.notify(); + } + }, false); + } + + public void waitHappened() throws InterruptedException { + synchronized (checkEventHappened) { + while (!checkEventHappened.get()) { + checkEventHappened.wait(100); + } + } + //preparing hazelcastImdgProvider for next test + iMap.removeEntryListener(listenerAdding); + iMap.removeEntryListener(listenerUpdating); + iMap.removeEntryListener(listenerRemoving); + } +} diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java 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/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyControllerTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyControllerTest.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyControllerTest.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyControllerTest.java 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/java/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java similarity index 96% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java index 02d79864d..93b262279 100644 --- a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java +++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java @@ -14,7 +14,7 @@ public class BankAccountControllerConfig { @Autowired - @Qualifier("iOperator") + @Qualifier("iOperatorTest") private IOperator operator; @Autowired diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/DeleteCompanyControllerConfig.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/DeleteCompanyControllerConfig.java similarity index 96% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/DeleteCompanyControllerConfig.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/DeleteCompanyControllerConfig.java index 5a5aab4c0..791fad885 100644 --- a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/DeleteCompanyControllerConfig.java +++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/DeleteCompanyControllerConfig.java @@ -11,7 +11,7 @@ import ru.spcex.clearing.backendapi.service.impl.StateLoaderImpl; @Configuration public class DeleteCompanyControllerConfig { @Autowired - @Qualifier("iOperator") + @Qualifier("iOperatorTest") private IOperator operator; @Autowired 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/java/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java 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/java/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java similarity index 76% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java index 065785269..9c72ff30c 100644 --- a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java +++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java @@ -6,6 +6,7 @@ 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.clearing.backendapi.service.validation.ActionValidationProvider; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @Configuration @@ -16,9 +17,9 @@ public class IOperator { private HazelcastService hazelcastServiceTest; @Autowired - @Bean + @Bean(name = "iOperatorTest") public OperatorImpl createIOperator(Producer kafka) { - return new OperatorImpl(kafka, hazelcastServiceTest); + return new OperatorImpl(kafka, hazelcastServiceTest, new ActionValidationProvider(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/java/ru/spcex/clearing/backendapi/controller/queue/config/Jackson2HttpConverterConfig.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/Jackson2HttpConverterConfig.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/Jackson2HttpConverterConfig.java 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/java/ru/spcex/clearing/backendapi/controller/queue/config/KafkaConfig.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/KafkaConfig.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/KafkaConfig.java diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/StateLoaderImplConfig.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/StateLoaderImplConfig.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/StateLoaderImplConfig.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/config/StateLoaderImplConfig.java 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/java/ru/spcex/clearing/backendapi/controller/queue/utils/JsonUtil.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/utils/JsonUtil.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/utils/JsonUtil.java diff --git a/clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/utils/MatcherFactory.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/utils/MatcherFactory.java similarity index 100% rename from clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/utils/MatcherFactory.java rename to clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/utils/MatcherFactory.java From 614b78534425dc7ffa9c5406b3b7bf6a9ec67e8c Mon Sep 17 00:00:00 2001 From: psemenkov Date: Mon, 14 Nov 2022 14:01:39 +0300 Subject: [PATCH 3/4] fixing bug wit waiter imap --- .../ru/spcex/clearing/account/utils/ImapEvent.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java index a59e6d06b..095e18a2b 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java @@ -5,6 +5,8 @@ import com.hazelcast.map.listener.EntryAddedListener; import com.hazelcast.map.listener.EntryRemovedListener; import com.hazelcast.map.listener.EntryUpdatedListener; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.atomic.AtomicBoolean; public class ImapEvent { @@ -37,6 +39,14 @@ public class ImapEvent { } public void waitHappened() throws InterruptedException { + //running timer task as daemon thread + Timer timer = new Timer(true); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + checkEventHappened.set(true);//если что-то пойдет не так не тормозить основной поток + } + }, 0, 60 * 1000); synchronized (checkEventHappened) { while (!checkEventHappened.get()) { checkEventHappened.wait(100); From 4fc3b9b4f56fbc1abe5e8d0f74d6d92ecebbd88b Mon Sep 17 00:00:00 2001 From: psemenkov Date: Wed, 23 Nov 2022 10:38:15 +0300 Subject: [PATCH 4/4] Correction of the error in the service-account and the service-company has been completed. Both service are successfully launched in maven. --- .../account/service/AccountServiceTest.java | 12 +- .../service/BankAccountServiceTest.java | 6 +- .../clearing/account/utils/ImapEvent.java | 7 +- .../HazelcastServiceTestConfiguration.java | 3 + .../ClearingMemberCategoryServiceTest.java | 103 ++++++++++-------- .../service/CompanyInfoServiceTest.java | 37 ++----- .../company/service/CompanyServiceTest.java | 25 +---- .../service/CompanySymbolServiceTest.java | 25 +---- .../company/service/ContactServiceTest.java | 24 +--- .../clearing/company/utils/ImapEvent.java | 63 +++++++++++ 10 files changed, 164 insertions(+), 141 deletions(-) create mode 100644 clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/utils/ImapEvent.java diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index bfb3eb9f3..3cd2088b4 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -59,6 +59,16 @@ class AccountServiceTest { @Qualifier("mockConsumerTest") private MockConsumer mockConsumer; + /** + * {@link AccountService#accountNew(BaseRequest)}
+ * Тест проверяет создание сущности {@link BaseRequest} в Hazelcast при передаче из Apache Kafka.
+ * Входной запрос {@link AccountSdf01Request}:
+ * {@link AccountSdfRequestPart#setSdfId} - текущий Id
+ * {@link AccountSdfRequestPart#setAccount} - 123456789123
+ * {@link AccountSdfRequestPart#setCompanyId} - текущий Id
+ * {@link AccountSdf01Request#setGroupingSdf01Id} - текущий Id
+ * {@link AccountSdf01Request#setAccounts} - Collections.singletonList(AccountSdfRequestPart)
+ */ @Test void accountNew() throws InterruptedException { //arrange @@ -129,7 +139,7 @@ class AccountServiceTest { IMap requestInfoIMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_RequestInfo); ImapEvent imapEvent = new ImapEvent(requestInfoIMap); - imapEvent.waitHappened(); + imapEvent.waitWhenHappened(); //ASSERT Account accountResult = accountIMap.get(firstID); RequestInfo requestInfoResult = requestInfoIMap.get(secondID); 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 59e2a1304..cccf8e390 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 @@ -139,7 +139,7 @@ public class BankAccountServiceTest { //waiting for hazelcast map item updates ImapEvent imapEvent = new ImapEvent(iMap); - imapEvent.waitHappened(); + imapEvent.waitWhenHappened(); //ASSERT BankAccount result = iMap.get(ID); @@ -235,7 +235,7 @@ public class BankAccountServiceTest { mockConsumer.updateBeginningOffsets(startOffsetsUpdating); //waiting for hazelcast map item updates - imapEvent.waitHappened(); + imapEvent.waitWhenHappened(); //ASSERT BankAccount resultUpdating = iMap.get(ID); @@ -301,7 +301,7 @@ public class BankAccountServiceTest { mockConsumer.updateBeginningOffsets(startOffsetsDeleting); //waiting for hazelcast map item updates - imapEvent.waitHappened(); + imapEvent.waitWhenHappened(); //ASSERT Assertions.assertEquals(0, iMap.size()); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java index 095e18a2b..84c4f798c 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java @@ -38,13 +38,16 @@ public class ImapEvent { }, false); } - public void waitHappened() throws InterruptedException { + public void waitWhenHappened() throws InterruptedException { //running timer task as daemon thread Timer timer = new Timer(true); timer.scheduleAtFixedRate(new TimerTask() { + boolean secondRan; + @Override public void run() { - checkEventHappened.set(true);//если что-то пойдет не так не тормозить основной поток + checkEventHappened.set(secondRan);//если что-то пойдет не так не тормозить основной поток + secondRan = true; } }, 0, 60 * 1000); synchronized (checkEventHappened) { diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/config/HazelcastServiceTestConfiguration.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/config/HazelcastServiceTestConfiguration.java index 0c7ca4069..f7c808768 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/config/HazelcastServiceTestConfiguration.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/config/HazelcastServiceTestConfiguration.java @@ -13,9 +13,12 @@ import ru.spcex.platform.imdg.iml.hazelcast.util.HazelcastHelper; import java.util.List; import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; @Configuration public class HazelcastServiceTestConfiguration { + + public static final AtomicLong currentID = new AtomicLong(0L); private HazelcastInstance hazelcastInstance; private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ClearingMemberCategoryServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ClearingMemberCategoryServiceTest.java index 97ee984ff..6d73e05a5 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ClearingMemberCategoryServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ClearingMemberCategoryServiceTest.java @@ -3,8 +3,6 @@ package ru.spcex.clearing.company.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.hazelcast.core.IMap; -import com.hazelcast.map.listener.EntryRemovedListener; -import com.hazelcast.map.listener.EntryUpdatedListener; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.consumer.OffsetResetStrategy; @@ -19,20 +17,22 @@ 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.generated.ClearingMemberCategory; -import ru.clearing.classes.statics.data.profile.Contact; import ru.spcex.clearing.company.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.company.utils.ImapEvent; import ru.spcex.clearing.company.utils.MatcherFactory.Matcher; 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.common.CommonDeleteRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.company.ClearingMemberCategoryNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.ClearingMemberCategoryUpdateRequest; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import java.util.Collections; import java.util.HashMap; +import static ru.spcex.clearing.company.config.HazelcastServiceTestConfiguration.currentID; import static ru.spcex.clearing.company.utils.MatcherFactory.usingIgnoringFieldsComparator; @ExtendWith(SpringExtension.class) @@ -42,9 +42,10 @@ class ClearingMemberCategoryServiceTest { public static final Matcher MEMBER_CATEGORY_MATCHER = usingIgnoringFieldsComparator(); private static final int PARTITION = 0; + private static final String TOPIC_MEMBER_CATEGORY_NEW = Consts.DESTINATION_CLEARING_MEMBER_CATEGORY_NEW; private static final String TOPIC_MEMBER_CATEGORY_UPDATE = Consts.DESTINATION_CLEARING_MEMBER_CATEGORY_UPDATE; private static final String TOPIC_MEMBER_CATEGORY_DELETE = Consts.DESTINATION_CLEARING_MEMBER_CATEGORY_DELETE; - private static final Long ID = 0L; + private static final Long ID = currentID.getAndIncrement(); @Autowired @Qualifier("hazelcastServiceTest") @@ -58,6 +59,56 @@ class ClearingMemberCategoryServiceTest { mockProducer = new MockProducer<>(); } + @Test + void clearingMemberCategoryNew() throws InterruptedException { + //ARRANGE + + ClearingMemberCategoryNewRequest memberCategoryNewRequest = new ClearingMemberCategoryNewRequest(); + memberCategoryNewRequest.setClearingMemberCategory("1234"); + BaseRequest baseUpdateRequest = new BaseRequest<>(); + baseUpdateRequest.setRequestPayload(memberCategoryNewRequest); + baseUpdateRequest.setId(ID); + baseUpdateRequest.setActionType(ActionType.NEW); + String jsonBaseForNewRequest; + ObjectMapper objectMapper = new ObjectMapper(); + try { + jsonBaseForNewRequest = objectMapper.writeValueAsString(baseUpdateRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + ClearingMemberCategory predictableClearingMemberCategory = new ClearingMemberCategory(); + predictableClearingMemberCategory.setId(ID); + predictableClearingMemberCategory.setClearingMemberCategory("1234"); + + //ACT + //service set up + ClearingMemberCategoryService clearingMemberCategoryService = new ClearingMemberCategoryService(mockConsumer, mockProducer, hazelcastServiceTest); + + //callbacks set up + clearingMemberCategoryService.afterPropertiesSet(); + + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_ClearingMemberCategory); + ImapEvent imapEvent = new ImapEvent(iMap); + + //KAFKA + mockConsumer.schedulePollTask(() -> { + mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_MEMBER_CATEGORY_NEW, PARTITION))); + mockConsumer.addRecord(new ConsumerRecord<>(TOPIC_MEMBER_CATEGORY_NEW, PARTITION, 0, "key", jsonBaseForNewRequest)); + }); + HashMap startOffsetsUpdating = new HashMap<>(); + TopicPartition tpUpdating = new TopicPartition(TOPIC_MEMBER_CATEGORY_NEW, PARTITION); + startOffsetsUpdating.put(tpUpdating, 0L); + mockConsumer.updateBeginningOffsets(startOffsetsUpdating); + + //waiting for hazelcast map item updates + imapEvent.waitWhenHappened(); + + //ASSERT + ClearingMemberCategory resultUpdating = iMap.get(ID); + MEMBER_CATEGORY_MATCHER.assertMatch(resultUpdating, predictableClearingMemberCategory); + } + /** * {@link ClearingMemberCategoryService#clearingMemberCategoryUpdate(BaseRequest)}
* Тест проверяет обновление сущности {@link ClearingMemberCategory} в Hazelcast при передаче из Apache Kafka.
@@ -100,6 +151,7 @@ class ClearingMemberCategoryServiceTest { IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_ClearingMemberCategory); iMap.put(ID, existsСlearingMemberCategory); + ImapEvent imapEvent = new ImapEvent(iMap); //KAFKA mockConsumer.schedulePollTask(() -> { @@ -112,30 +164,11 @@ class ClearingMemberCategoryServiceTest { mockConsumer.updateBeginningOffsets(startOffsetsUpdating); //waiting for hazelcast map item updates - Object waiter = new Object(); - String listenerID = iMap.addEntryListener((EntryUpdatedListener) entryEvent -> { - System.out.println("Checking If removed.."); - - synchronized (waiter) { - try { - waiter.wait(100); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - waiter.notify(); - } - }, false); - - synchronized (waiter) { - waiter.wait(100); - } + imapEvent.waitWhenHappened(); //ASSERT ClearingMemberCategory resultUpdating = iMap.get(ID); MEMBER_CATEGORY_MATCHER.assertMatch(resultUpdating, predictableClearingMemberCategory); - - //preparing hazelcastImdgProvider for next test - iMap.removeEntryListener(listenerID); } /** @@ -175,6 +208,7 @@ class ClearingMemberCategoryServiceTest { IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_ClearingMemberCategory); iMap.put(ID, existsСlearingMemberCategory); + ImapEvent imapEvent = new ImapEvent(iMap); //KAFKA mockConsumer.schedulePollTask(() -> { @@ -187,28 +221,9 @@ class ClearingMemberCategoryServiceTest { mockConsumer.updateBeginningOffsets(startOffsetsUpdating); //waiting for hazelcast map item removes - Object waiter = new Object(); - String listenerID = iMap.addEntryListener((EntryRemovedListener) entryEvent -> { - System.out.println("Checking If removed.."); - - try { - waiter.wait(100); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - synchronized (waiter) { - waiter.notify(); - } - }, false); - - synchronized (waiter) { - waiter.wait(100); - } + imapEvent.waitWhenHappened(); //ASSERT Assertions.assertEquals(0, iMap.size()); - - //preparing hazelcastImdgProvider for next test - iMap.removeEntryListener(listenerID); } } \ No newline at end of file diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyInfoServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyInfoServiceTest.java index c383a4ec7..cc380908b 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyInfoServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyInfoServiceTest.java @@ -3,7 +3,6 @@ package ru.spcex.clearing.company.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.hazelcast.core.IMap; -import com.hazelcast.map.listener.EntryUpdatedListener; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.consumer.OffsetResetStrategy; @@ -16,9 +15,10 @@ 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.company.Company; import ru.clearing.classes.statics.data.profile.CompanyInfo; -import ru.clearing.classes.statics.data.profile.Contact; import ru.spcex.clearing.company.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.company.utils.ImapEvent; import ru.spcex.clearing.company.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; @@ -88,6 +88,9 @@ class CompanyInfoServiceTest { existsCompanyInfo.setFullNameEng("exists fullNameEng"); existsCompanyInfo.setShortName("exists shortName"); existsCompanyInfo.setFullName("exists fullName"); + Company existsCompany = new Company(); + existsCompany.setId(ID); + existsCompany.setProfile(existsCompanyInfo); CompanyInfoUpdateRequest companyInfoUpdateRequest = new CompanyInfoUpdateRequest(); companyInfoUpdateRequest.setId(ID); @@ -137,8 +140,9 @@ class CompanyInfoServiceTest { //callbacks set up clearingMemberCategoryService.afterPropertiesSet(); - IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_Company); - iMap.put(ID, existsCompanyInfo); + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_Company); + iMap.put(ID, existsCompany); + ImapEvent imapEvent = new ImapEvent(iMap); //KAFKA mockConsumer.schedulePollTask(() -> { @@ -151,29 +155,10 @@ class CompanyInfoServiceTest { mockConsumer.updateBeginningOffsets(startOffsetsUpdating); //waiting for hazelcast map updates - Object waiter = new Object(); - String listenerID = iMap.addEntryListener((EntryUpdatedListener) entryEvent -> { - System.out.println("Checking If removed.."); - - try { - waiter.wait(100); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - synchronized (waiter) { - waiter.notify(); - } - }, false); - - synchronized (waiter) { - waiter.wait(100); - } + imapEvent.waitWhenHappened(); //ASSERT - CompanyInfo resultUpdating = iMap.get(ID); - COMPANY_INFO_MATCHER.assertMatch(resultUpdating, predictableCompanyInfo); - - //preparing hazelcastImdgProvider for next test - iMap.removeEntryListener(listenerID); + Company resultUpdating = iMap.get(ID); + COMPANY_INFO_MATCHER.assertMatch(resultUpdating.getProfile(), predictableCompanyInfo); } } \ No newline at end of file diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java index 7df5c8164..2d68b438a 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java @@ -3,7 +3,6 @@ package ru.spcex.clearing.company.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.hazelcast.core.IMap; -import com.hazelcast.map.listener.EntryRemovedListener; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.consumer.OffsetResetStrategy; @@ -19,8 +18,8 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; -import ru.clearing.classes.statics.data.profile.Contact; import ru.spcex.clearing.company.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.company.utils.ImapEvent; import ru.spcex.clearing.company.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; @@ -92,6 +91,7 @@ class CompanyServiceTest { IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_Company); iMap.put(ID, existsCompany); + ImapEvent imapEvent = new ImapEvent(iMap); //KAFKA mockConsumer.schedulePollTask(() -> { @@ -104,28 +104,9 @@ class CompanyServiceTest { mockConsumer.updateBeginningOffsets(startOffsetsUpdating); //waiting for hazelcast map item removes - Object waiter = new Object(); - String listenerID = iMap.addEntryListener((EntryRemovedListener) entryEvent -> { - System.out.println("Checking If removed.."); - - try { - waiter.wait(100); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - synchronized (waiter) { - waiter.notify(); - } - }, false); - - synchronized (waiter) { - waiter.wait(100); - } + imapEvent.waitWhenHappened(); //ASSERT Assertions.assertEquals(0, iMap.size()); - - //preparing hazelcastImdgProvider for next test - iMap.removeEntryListener(listenerID); } } \ No newline at end of file diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java index 13530012d..e381cacd3 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java @@ -3,7 +3,6 @@ package ru.spcex.clearing.company.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.hazelcast.core.IMap; -import com.hazelcast.map.listener.EntryUpdatedListener; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.consumer.OffsetResetStrategy; @@ -17,8 +16,8 @@ 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.company.CompanySymbols; -import ru.clearing.classes.statics.data.profile.Contact; import ru.spcex.clearing.company.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.company.utils.ImapEvent; import ru.spcex.clearing.company.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; @@ -105,6 +104,7 @@ class CompanySymbolServiceTest { IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_CompanySymbols); iMap.put(ID, existsCompanySymbols); + ImapEvent imapEvent = new ImapEvent(iMap); //KAFKA mockConsumer.schedulePollTask(() -> { @@ -117,29 +117,10 @@ class CompanySymbolServiceTest { mockConsumer.updateBeginningOffsets(startOffsetsUpdating); //waiting for hazelcast map item updates - Object waiter = new Object(); - String listenerID = iMap.addEntryListener((EntryUpdatedListener) entryEvent -> { - System.out.println("Checking If removed.."); - - try { - waiter.wait(100); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - synchronized (waiter) { - waiter.notify(); - } - }, false); - - synchronized (waiter) { - waiter.wait(100); - } + imapEvent.waitWhenHappened(); //ASSERT CompanySymbols resultUpdating = iMap.get(ID); COMPANY_SYMBOL_MATCHER.assertMatch(resultUpdating, predictableCompanySymbols); - - //preparing hazelcastImdgProvider for next test - iMap.removeEntryListener(listenerID); } } \ No newline at end of file diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ContactServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ContactServiceTest.java index b7974643c..368715f70 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ContactServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ContactServiceTest.java @@ -3,7 +3,6 @@ package ru.spcex.clearing.company.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.hazelcast.core.IMap; -import com.hazelcast.map.listener.EntryUpdatedListener; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.consumer.OffsetResetStrategy; @@ -18,6 +17,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.profile.Contact; import ru.spcex.clearing.company.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.company.utils.ImapEvent; import ru.spcex.clearing.company.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; @@ -103,6 +103,7 @@ class ContactServiceTest { //callbacks set up IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_Contact); iMap.put(ID, existsContact); + ImapEvent imapEvent = new ImapEvent(iMap); //KAFKA mockConsumer.schedulePollTask(() -> { @@ -115,29 +116,10 @@ class ContactServiceTest { mockConsumer.updateBeginningOffsets(startOffsetsUpdating); //waiting for hazelcast map updates - Object waiter = new Object(); - String listenerID = iMap.addEntryListener((EntryUpdatedListener) entryEvent -> { - System.out.println("Checking If removed.."); - - try { - waiter.wait(100); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - synchronized (waiter) { - waiter.notify(); - } - }, false); - - synchronized (waiter) { - waiter.wait(100); - } + imapEvent.waitWhenHappened(); //ASSERT Contact resultUpdating = iMap.get(ID); CONTACT_MATCHER.assertMatch(resultUpdating, predictableContact); - - //preparing hazelcastImdgProvider for next test - iMap.removeEntryListener(listenerID); } } \ No newline at end of file diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/utils/ImapEvent.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/utils/ImapEvent.java new file mode 100644 index 000000000..44a613cd0 --- /dev/null +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/utils/ImapEvent.java @@ -0,0 +1,63 @@ +package ru.spcex.clearing.company.utils; + +import com.hazelcast.core.IMap; +import com.hazelcast.map.listener.EntryAddedListener; +import com.hazelcast.map.listener.EntryRemovedListener; +import com.hazelcast.map.listener.EntryUpdatedListener; + +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicBoolean; + +public class ImapEvent { + private final IMap iMap; + private final String listenerAdding; + private final String listenerUpdating; + private final String listenerRemoving; + private final AtomicBoolean checkEventHappened = new AtomicBoolean(false); + + public ImapEvent(IMap iMap) { + this.iMap = iMap; + listenerAdding = iMap.addEntryListener((EntryAddedListener) entryEvent -> { + synchronized (checkEventHappened) { + checkEventHappened.set(true); + checkEventHappened.notify(); + } + }, false); + listenerUpdating = iMap.addEntryListener((EntryUpdatedListener) entryEvent -> { + synchronized (checkEventHappened) { + checkEventHappened.set(true); + checkEventHappened.notify(); + } + }, false); + listenerRemoving = iMap.addEntryListener((EntryRemovedListener) entryEvent -> { + synchronized (checkEventHappened) { + checkEventHappened.set(true); + checkEventHappened.notify(); + } + }, false); + } + + public void waitWhenHappened() throws InterruptedException { + //running timer task as daemon thread + Timer timer = new Timer(true); + timer.scheduleAtFixedRate(new TimerTask() { + boolean secondRan; + + @Override + public void run() { + checkEventHappened.set(secondRan);//если что-то пойдет не так не тормозить основной поток + secondRan = true; + } + }, 0, 30 * 1000); + synchronized (checkEventHappened) { + while (!checkEventHappened.get()) { + checkEventHappened.wait(100); + } + } + //preparing hazelcastImdgProvider for next test + iMap.removeEntryListener(listenerAdding); + iMap.removeEntryListener(listenerUpdating); + iMap.removeEntryListener(listenerRemoving); + } +}