From 34371067287d7ed0c39a7c570d112afdf2711634 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Wed, 25 Oct 2023 10:52:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D1=8B.=20=D0=A1=D0=BA=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=80=D0=B5=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20=D0=BD=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D1=85=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20ImdgTransactionalHazelcast=20=D0=B8?= =?UTF-8?q?=D0=B7=20ImdgHazelcast.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/service/AccountServiceTest.java | 19 +-- .../service/BankAccountServiceTest.java | 52 ++---- .../service/ClearingAccountServiceTest.java | 161 ++++++++---------- .../service/ClientCodeServiceTest.java | 4 +- .../service/DepoAccountServiceTest.java | 25 +-- .../InformationAccountServiceTest.java | 32 +--- .../service/SDFProcessServiceTest.java | 11 +- .../TradingClearingRegistryServiceTest.java | 70 ++++---- .../clearing/account/utils/ImapEvent.java | 63 ------- .../account/utils/MatcherFactory.java | 38 ----- .../clearing/test/config/ImdgTestConfig.java | 3 +- .../clearing/test/config/KafkaTestConfig.java | 18 ++ .../adapter/ImdgTransactionalHazelcast.java | 48 ++++++ 13 files changed, 215 insertions(+), 329 deletions(-) delete mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java delete mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/MatcherFactory.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 20df4f957..7c8d046c1 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 @@ -1,7 +1,5 @@ package ru.spcex.clearing.account.service; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.Producer; @@ -25,39 +23,26 @@ import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.validation.AccountValidationConfig; import ru.spcex.clearing.account.config.validation.InformationAccountValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; -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.CorrespondentAccountNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountUpdateRequest; -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.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.service.RequestInfo; -import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.test.MatcherFactory; import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import javax.annotation.PostConstruct; -import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.UUID; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; -import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator; import static ru.spcex.clearing.test.TestUtils.*; -import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { 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 e499ac5a8..53e99fd29 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,17 +1,13 @@ package ru.spcex.clearing.account.service; import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; @@ -25,7 +21,6 @@ import ru.spcex.clearing.account.config.validation.AccountValidationConfig; import ru.spcex.clearing.account.config.validation.BankAccountValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; import ru.spcex.clearing.account.errors.AccountError; -import ru.spcex.clearing.account.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; @@ -34,12 +29,13 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.test.MatcherFactory.Matcher; import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; @@ -49,9 +45,10 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; -import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; import static ru.spcex.clearing.platform.messaging.service.Status.Error; +import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator; import static ru.spcex.clearing.test.TestUtils.*; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { @@ -97,15 +94,11 @@ public class BankAccountServiceTest { @Autowired @Qualifier("hazelcastServiceTest") - private HazelcastService hazelcastServiceTest; + private ImdgProvider hazelcastServiceTest; @Autowired private BankAccountService bankAccountService; - @Captor - private ArgumentCaptor producerRecord; - @SpyBean - private MockProducer producer; @Autowired @Qualifier("mockProducer") protected Producer mockProducer; @@ -216,11 +209,11 @@ public class BankAccountServiceTest { //AccountValidationRule.RequiredFields //WrongFieldValue bankAccountNewRequest.setCurrency(null); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "currency")); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "null, currency")); checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setCurrency("TT0"); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "currency")); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.DictionaryNotFound, "TT0, CurrencyCodeDictionary")); checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setCurrency(currency); @@ -239,36 +232,20 @@ public class BankAccountServiceTest { checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setAccount(acc); - bankAccountNewRequest.setDestination(null); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "destination")); - checkError(errMsg, bankAccountNewRequest); - - bankAccountNewRequest.setDestination(destination); - bankAccountNewRequest.setCompanyId(null); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "companyId")); - checkError(errMsg, bankAccountNewRequest); - bankAccountNewRequest.setCompanyId(addresseeIdNew); //AccountValidationRule.CompanyPresent //CompanyNotFound bankAccountNewRequest.setCompanyId(999924535239L); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyNotFound, "companyId")); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyNotFound, bankAccountNewRequest.getCompanyId()+", companyId")); checkError(errMsg, bankAccountNewRequest); - //CompanyNotActive - company.setWorkflowStatus(Status.Blocked.getKey()); - companyImdg.insert(company); bankAccountNewRequest.setCompanyId(company.getId()); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyNotActive, "companyId")); - checkError(errMsg, bankAccountNewRequest); //AccountValidationRule.AccountIsNew //AccountAlreadyExist - company.setWorkflowStatus(Status.Active.getKey()); - companyImdg.insert(company); Account existAccount = getTestAccount(accountId, acc); accountImdg.insert(existAccount); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.AccountAlreadyExist, "account")); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.AccountAlreadyExist, existAccount.getAccount())); checkError(errMsg, bankAccountNewRequest); accountImdg.delete(existAccount); } @@ -291,8 +268,9 @@ public class BankAccountServiceTest { //ACT addRecordToKafka((MockConsumer) bankAccountService.getConsumer(), TOPIC_ACCOUNT_NEW, PARTITION, currentOffset, jsonString); + ArgumentCaptor producerRecord = getCaptor(mockProducer); //waiting for kafka producer send message (finale event) - verify(producer, timeout(30_000L).times(currentTime)) + verify(mockProducer, timeout(30_000L).times(currentTime)) .send(producerRecord.capture()); BaseRequest baseRequestResult = (BaseRequest) producerRecord.getValue().value(); @@ -368,13 +346,13 @@ public class BankAccountServiceTest { } /** - * {@link BankAccountService#bankAccountDelete(BaseRequest)} + * {@link BankAccountService#bankAccountBlock(BaseRequest)} * Тест проверяет удаление сущности {@link BankAccount} в Hazelcast при передаче из Apache Kafka. * Входной запрос {@link CommonDeleteRequest}: * {@link CommonDeleteRequest#id} - Идентификатор записи */ @Test - void bankAccountDelete() { + void bankAccountBlock() { //ARRANGE BankAccount bankAccountExists = getBankAccount(); bankAccountImdg.insert(bankAccountExists); @@ -393,8 +371,8 @@ public class BankAccountServiceTest { //ASSERT waitingSendAndCheckRecord(ID, mockProducer); - BankAccount bankAccount = bankAccountImdg.getSingleObjectByID(ID); - Assertions.assertNull(bankAccount); + Account bankAccount = accountImdg.getSingleObjectByID(accountId); + assertEquals(bankAccount.getStatus(), WorkflowStatus.Blocked.getKey()); } private Company getTestCompany() { diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java index 5e218ed39..21f959ee2 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java @@ -1,17 +1,13 @@ package ru.spcex.clearing.account.service; import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerRecord; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.kafka.core.KafkaTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; @@ -26,25 +22,30 @@ import ru.spcex.clearing.account.config.validation.AccountValidationConfig; import ru.spcex.clearing.account.config.validation.ClearingAccountValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; import ru.spcex.clearing.account.errors.AccountError; -import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; +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.ClearingAccountNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest; +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.test.MatcherFactory; import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast; import javax.annotation.PostConstruct; +import java.util.Collections; import java.util.Map; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; -import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator; import static ru.spcex.clearing.test.TestUtils.*; +import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID; +import static ru.spcex.clearing.test.config.KafkaTestConfig.setMockFuture; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { @@ -72,16 +73,16 @@ class ClearingAccountServiceTest { @Autowired @Qualifier("hazelcastServiceTest") - private HazelcastService hazelcastServiceTest; + private ImdgProvider hazelcastServiceTest; - @Captor - private ArgumentCaptor producerRecord; - @SpyBean - private MockProducer producer; @Autowired @Qualifier("mockProducer") protected Producer mockProducer; + @Autowired + @Qualifier("kafkaTestTemplate") + protected KafkaTemplate kafkaTemplate; + private Imdg clearingAccountImdg; private Imdg accountImdg; private Imdg companyImdg; @@ -162,8 +163,7 @@ class ClearingAccountServiceTest { 0, jsonString); - verify(producer, timeout(30_000L).times(2)) - .send(producerRecord.capture()); + waitingSendAndCheckRecord(0L, mockProducer); Account predictableAccount = new Account(); predictableAccount.setAccount(ACCOUNT_VALUE); @@ -233,77 +233,58 @@ class ClearingAccountServiceTest { Assertions.assertEquals("2", clearingAccountService.makeSdfErrorText(null, SDFProcessService.SDF_STATUS_ERROR_COMPANY_NOT_FOUND)); } -// /** -// * {@link ClearingAccountService#accountNewSdf01(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 accountSdf01New() throws InterruptedException { -// //ARRANGE -// Long firstID = currentID.getAndIncrement(); -// Long secondID = currentID.getAndIncrement(); -// AccountSdfRequestPart accountSdfRequestPart = new AccountSdfRequestPart(); -// accountSdfRequestPart.setSdfId(firstID); -// accountSdfRequestPart.setAccount(account); -// 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(account); -// predictableAccount.setCompanyId(firstID); -// -// RequestInfo predictableRequestInfo = new RequestInfo(); -// predictableRequestInfo.setId(secondID); -// predictableRequestInfo.setStatus(Status.Processing); -// -// //KAFKA -// final String TOPIC_ACCOUNT_NEW = Consts.ACCOUNT_NEW_SDF01; -// addRecordToKafka((MockConsumer) accountService.getConsumer(), TOPIC_ACCOUNT_NEW, PARTITION, 0, jsonBaseNewRequest); -// -// //waiting for kafka producer send message (finale event) -// verify(producer, timeout(30_000L).times(2)) -// .send(producerRecord.capture()); -// //todo переписать валидацию ожидания на новые waitingSendAndCheckRecord / waitingWhenTryAddRecordAndCheckError -// -// ImdgHazelcast accountImdg = (ImdgHazelcast) hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Account, Account.class); -// -// //ASSERT -// Account accountResult = accountImdg.getSingleObjectBySQL(String.format("account = %s", account)); -// predictableAccount.setId(accountResult.getId()); -// ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount); -// accountImdg.delete(accountResult); -// } + /** + * {@link ClearingAccountService#accountNewSdf01(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 accountSdf01New() throws InterruptedException { + //ARRANGE + clearImdg(accountImdg); + setMockFuture(kafkaTemplate); + Long firstID = currentID.getAndIncrement(); + Long secondID = currentID.getAndIncrement(); + AccountSdfRequestPart accountSdfRequestPart = new AccountSdfRequestPart(); + accountSdfRequestPart.setSdfId(firstID); + accountSdfRequestPart.setAccount(ACCOUNT_VALUE); + accountSdfRequestPart.setCompanyId(firstID); + AccountSdf01Request accountSdf01Request = new AccountSdf01Request(); + accountSdf01Request.setGroupingSdf01Id(firstID); + accountSdf01Request.setAccounts(Collections.singletonList(accountSdfRequestPart)); + + String jsonString = getJsonStringForNew(accountSdf01Request, 0L); + + Account predictableAccount = new Account(); + predictableAccount.setAccount(ACCOUNT_VALUE); + predictableAccount.setCompanyId(firstID); + predictableAccount.setAccountType(AccountType.Clrn.getKey()); + predictableAccount.setStatus(ServiceStatus.Active.getKey()); + predictableAccount.setRelationId(relationId); + ClearingAccount predictableClearingAccount = new ClearingAccount(); + predictableClearingAccount.setCompanyId(companyId); +// predictableClearingAccount.setClearingAccountType(CLEARING_ACCOUNT_TYPE_DICT); + + //KAFKA + addRecordToKafka((MockConsumer) clearingAccountService.getConsumer(), Consts.ACCOUNT_NEW_SDF01, PARTITION, 0, jsonString); + waitingSendAndCheckRecord(0L, mockProducer); + + ImdgHazelcast accountImdg = (ImdgHazelcast) hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Account, Account.class); + + //ASSERT + Account accountResult = accountImdg.getSingleObjectBySQL(String.format("account = %s", ACCOUNT_VALUE)); + ClearingAccount resultClearingAccountNew = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", accountResult.getId())); + predictableAccount.setId(accountResult.getId()); + predictableClearingAccount.setAccountId(accountResult.getId()); + predictableClearingAccount.setId(resultClearingAccountNew.getId()); + predictableAccount.setId(accountResult.getId()); + ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount); + CLEARING_ACCOUNT_MATCHER.assertMatch(resultClearingAccountNew, predictableClearingAccount); + accountImdg.delete(accountResult); + } } \ No newline at end of file diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClientCodeServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClientCodeServiceTest.java index c362e1c41..54425683e 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClientCodeServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClientCodeServiceTest.java @@ -24,13 +24,13 @@ import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.validation.ClientCodeValidationConfig; import ru.spcex.clearing.account.config.validation.TradingClearingRegistryValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; -import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; 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.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.test.MatcherFactory; import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.TestUtils; import ru.spcex.clearing.test.config.ImdgTestConfig; @@ -376,7 +376,7 @@ class ClientCodeServiceTest { waitingSendAndCheckRecord(ID, mockProducer); ClientCode resultUpdate = clientCodeImdg.getSingleObjectByID(ID); - Assertions.assertNull(resultUpdate); + assertEquals(WorkflowStatus.Blocked.getKey(), resultUpdate.getStatus()); } // /** diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java index d6e39b9b8..0633dc9de 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java @@ -1,16 +1,11 @@ package ru.spcex.clearing.account.service; import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerRecord; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; @@ -24,25 +19,22 @@ import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.validation.AccountValidationConfig; import ru.spcex.clearing.account.config.validation.DepoAccountValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; -import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.account.DepoAccountNewRequest; +import ru.spcex.clearing.test.MatcherFactory; import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.imdg.api.ImdgProvider; import javax.annotation.PostConstruct; import java.util.Map; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; -import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; -import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; -import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.test.TestUtils.*; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { @@ -69,12 +61,8 @@ class DepoAccountServiceTest { @Autowired @Qualifier("hazelcastServiceTest") - private HazelcastService hazelcastServiceTest; + private ImdgProvider hazelcastServiceTest; - @Captor - private ArgumentCaptor producerRecord; - @SpyBean - private MockProducer producer; @Autowired @Qualifier("mockProducer") protected Producer mockProducer; @@ -159,8 +147,7 @@ class DepoAccountServiceTest { 0, jsonString); - verify(producer, timeout(30_000L).times(2)) - .send(producerRecord.capture()); + waitingSendAndCheckRecord(0L, mockProducer); Account predictableAccount = new Account(); predictableAccount.setAccount(ACCOUNT_VALUE); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java index 6fbe84f26..6fa633e59 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java @@ -1,18 +1,13 @@ package ru.spcex.clearing.account.service; import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerRecord; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; @@ -25,10 +20,10 @@ import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.validation.AccountValidationConfig; import ru.spcex.clearing.account.config.validation.InformationAccountValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; -import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest; +import ru.spcex.clearing.test.MatcherFactory; import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; @@ -36,16 +31,12 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import javax.annotation.PostConstruct; import java.util.Map; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; -import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; -import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; -import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.test.TestUtils.*; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { @@ -71,12 +62,8 @@ class InformationAccountServiceTest { @Autowired @Qualifier("hazelcastServiceTest") - private HazelcastService hazelcastServiceTest; + private ImdgProvider hazelcastServiceTest; - @Captor - private ArgumentCaptor producerRecord; - @SpyBean - private MockProducer producer; @Autowired @Qualifier("mockProducer") protected Producer mockProducer; @@ -98,6 +85,7 @@ class InformationAccountServiceTest { accountImdg = hazelcastServiceTest.getImdg( IMDGDistributedNames.Map_Account, Account.class ); + clearImdg(accountImdg); companyImdg = hazelcastServiceTest.getImdg( IMDGDistributedNames.Map_Company, Company.class @@ -145,6 +133,7 @@ class InformationAccountServiceTest { void accountInformationNew() { InformationAccountNewRequest InformationAccountNewRequest = new InformationAccountNewRequest(); InformationAccountNewRequest.setCompanyId(companyId); + InformationAccountNewRequest.setAccount(account); String jsonString = getJsonStringForNew(InformationAccountNewRequest, 0L); @@ -154,9 +143,7 @@ class InformationAccountServiceTest { 0, jsonString); - //waiting for kafka producer send message (finale event) - verify(producer, timeout(30_000L).times(2)) - .send(producerRecord.capture()); + waitingSendAndCheckRecord(0L, mockProducer); Account predictableAccount = new Account(); predictableAccount.setAccountType(AccountType.Info.getKey()); @@ -172,7 +159,7 @@ class InformationAccountServiceTest { InformationAccount resultInfoAccountNew = informationAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", resultAccountNew.getId())); predictableAccount.setId(resultAccountNew.getId()); - predictableAccount.setAccount(informationAccountService.generateInfoAccount(resultInfoAccountNew.getId())); + predictableAccount.setAccount(account); predictableInfoAccount.setAccountId(resultAccountNew.getId()); predictableInfoAccount.setId(resultInfoAccountNew.getId()); @@ -183,7 +170,6 @@ class InformationAccountServiceTest { accountImdg.delete(resultAccountNew); } - @Autowired ImdgProvider imdgProvider; @Test void accountIncrementSequence() { Imdg accountInfoImdg = hazelcastServiceTest.getImdg( IMDGDistributedNames.Map_InformationAccount, InformationAccount.class ); @@ -203,7 +189,7 @@ class InformationAccountServiceTest { } UserRoleVerification userRoleVerification = Mockito.mock(UserRoleVerification.class); InformationAccountService infoAccSvc=new InformationAccountService(null,null,null, - null, userRoleVerification, imdgProvider, null, null, null, null); + null, userRoleVerification, hazelcastServiceTest, null, null, null, null); Long n = infoAccSvc.accountNextId(); Assertions.assertEquals(13L, n); n = infoAccSvc.accountNextId(); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/SDFProcessServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/SDFProcessServiceTest.java index bd2b2f3f7..91a6b4842 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/SDFProcessServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/SDFProcessServiceTest.java @@ -1,6 +1,5 @@ package ru.spcex.clearing.account.service; -import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; @@ -27,15 +26,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.imdg.api.ImdgProvider; import javax.annotation.PostConstruct; -import java.util.Map; - -import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; -import static ru.spcex.clearing.test.TestUtils.*; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { @@ -50,7 +45,7 @@ class SDFProcessServiceTest { @Autowired @Qualifier("hazelcastServiceTest") - private HazelcastService hazelcastServiceTest; + private ImdgProvider hazelcastServiceTest; @Captor private ArgumentCaptor producerRecord; diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/TradingClearingRegistryServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/TradingClearingRegistryServiceTest.java index e9a2760f5..77b3ad360 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/TradingClearingRegistryServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/TradingClearingRegistryServiceTest.java @@ -1,17 +1,13 @@ package ru.spcex.clearing.account.service; import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerRecord; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.kafka.core.KafkaTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; @@ -19,31 +15,30 @@ import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.DepoAccount; import ru.clearing.classes.statics.data.account.InformationAccount; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.validation.TradingClearingRegistryValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; -import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; 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.registry.TradingClearingRegistryNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest; +import ru.spcex.clearing.test.MatcherFactory; import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.ServiceStatus; -import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose; -import ru.spcex.platform.enumeration.TradingClearingRegistryType; -import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.imdg.api.ImdgProvider; import javax.annotation.PostConstruct; -import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator; import static ru.spcex.clearing.test.TestUtils.*; +import static ru.spcex.clearing.test.config.KafkaTestConfig.setMockFuture; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { @@ -64,18 +59,19 @@ class TradingClearingRegistryServiceTest { TradingClearingRegistryService tradingClearingRegistryService; @Autowired @Qualifier("hazelcastServiceTest") - private HazelcastService hazelcastServiceTest; + private ImdgProvider hazelcastServiceTest; - @Captor - private ArgumentCaptor producerRecord; - @SpyBean - private MockProducer producer; @Autowired @Qualifier("mockProducer") protected Producer mockProducer; + @Autowired + @Qualifier("kafkaTestTemplate") + protected KafkaTemplate kafkaTemplate; + private Imdg tradingClearingRegistryImdg; private Imdg companyImdg; + private Imdg companySymbolsImdg; private Imdg serviceStatusDictionaryImdg; private Imdg clearingAccountImdg; @@ -103,6 +99,9 @@ class TradingClearingRegistryServiceTest { companyImdg = hazelcastServiceTest.getImdg( IMDGDistributedNames.Map_Company, Company.class ); + companySymbolsImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class + ); serviceStatusDictionaryImdg = hazelcastServiceTest.getImdg( IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class ); @@ -129,8 +128,14 @@ class TradingClearingRegistryServiceTest { company.setClearingCode("77"); companyImdg.insert(company); + CompanySymbols companySymbols = new CompanySymbols(); + companySymbols.setCompanyId(companyId); + companySymbols.setCompanySymbol(CompanySymbol.CLRC.getKey()); + companySymbolsImdg.insert(companySymbols); + Account account = new Account(); account.setStatus(ServiceStatus.Active.getKey()); + account.setAccountType(AccountType.Clrn.getKey()); accountId = accountImdg.insert(account); account2Id = accountImdg.insert(account); @@ -154,15 +159,17 @@ class TradingClearingRegistryServiceTest { @Test void tradingClearingRegistryNew_moneyAccount_clearingAccount() { + setMockFuture(kafkaTemplate); TradingClearingRegistryNewRequest tradingClearingRegistryNewRequest = new TradingClearingRegistryNewRequest(); tradingClearingRegistryNewRequest.setCompanyId(companyId); tradingClearingRegistryNewRequest.setMoneyAccountId(accountId); + tradingClearingRegistryNewRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Owner_A.getKey()); TradingClearingRegistry predictableTradingClearingRegistry = new TradingClearingRegistry(); predictableTradingClearingRegistry.setCompanyId(companyId); - predictableTradingClearingRegistry.setCode("0077MAT"); + predictableTradingClearingRegistry.setCode("0077MAT00001"); predictableTradingClearingRegistry.setMoneyAccountId(accountId); - predictableTradingClearingRegistry.setTradingClearingRegistryType("CAT"); + predictableTradingClearingRegistry.setTradingClearingRegistryType(TradingClearingRegistryType.Owner_A.getKey()); predictableTradingClearingRegistry.setTradingClearingRegistryPurpose(TradingClearingRegistryPurpose.M.getKey()); predictableTradingClearingRegistry.setStatus(ServiceStatus.Active.getKey()); @@ -178,7 +185,6 @@ class TradingClearingRegistryServiceTest { TradingClearingRegistry resultNew = tradingClearingRegistryImdg.getAllValues().iterator().next(); predictableTradingClearingRegistry.setId(resultNew.getId()); - predictableTradingClearingRegistry.setCode(predictableTradingClearingRegistry.getCode() + resultNew.getId()); predictableTradingClearingRegistry.setUpdated(resultNew.getUpdated()); predictableTradingClearingRegistry.setCreated(resultNew.getCreated()); @@ -190,13 +196,16 @@ class TradingClearingRegistryServiceTest { @Test void tradingClearingRegistryNew_moneyAccount_informationAccount() { + setMockFuture(kafkaTemplate); + clearImdg(tradingClearingRegistryImdg); TradingClearingRegistryNewRequest tradingClearingRegistryNewRequest = new TradingClearingRegistryNewRequest(); tradingClearingRegistryNewRequest.setCompanyId(companyId); tradingClearingRegistryNewRequest.setMoneyAccountId(account2Id); + tradingClearingRegistryNewRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Owner_A.getKey()); TradingClearingRegistry predictableTradingClearingRegistry = new TradingClearingRegistry(); predictableTradingClearingRegistry.setCompanyId(companyId); - predictableTradingClearingRegistry.setCode("0077MAT"); + predictableTradingClearingRegistry.setCode("0077MAT00001"); predictableTradingClearingRegistry.setMoneyAccountId(account2Id); predictableTradingClearingRegistry.setTradingClearingRegistryType(TradingClearingRegistryType.Owner_A.getKey()); predictableTradingClearingRegistry.setTradingClearingRegistryPurpose(TradingClearingRegistryPurpose.M.getKey()); @@ -210,11 +219,10 @@ class TradingClearingRegistryServiceTest { 0, jsonString); - waitingSendAndCheckRecord(0L, producer, producerRecord); + waitingSendAndCheckRecord(0L, mockProducer); TradingClearingRegistry resultNew = tradingClearingRegistryImdg.getAllValues().iterator().next(); predictableTradingClearingRegistry.setId(resultNew.getId()); - predictableTradingClearingRegistry.setCode(predictableTradingClearingRegistry.getCode() + resultNew.getId()); predictableTradingClearingRegistry.setUpdated(resultNew.getUpdated()); predictableTradingClearingRegistry.setCreated(resultNew.getCreated()); @@ -227,6 +235,8 @@ class TradingClearingRegistryServiceTest { @Test void tradingClearingRegistryNew_depoAccount() { + setMockFuture(kafkaTemplate); + clearImdg(tradingClearingRegistryImdg); TradingClearingRegistryNewRequest tradingClearingRegistryNewRequest = new TradingClearingRegistryNewRequest(); tradingClearingRegistryNewRequest.setCompanyId(companyId); tradingClearingRegistryNewRequest.setMoneyAccountId(accountId); @@ -234,7 +244,7 @@ class TradingClearingRegistryServiceTest { TradingClearingRegistry predictableTradingClearingRegistry = new TradingClearingRegistry(); predictableTradingClearingRegistry.setCompanyId(companyId); - predictableTradingClearingRegistry.setCode("0077CDAT"); + predictableTradingClearingRegistry.setCode("0077CDATT00001"); predictableTradingClearingRegistry.setMoneyAccountId(accountId); predictableTradingClearingRegistry.setDepoAccountId(account2Id); predictableTradingClearingRegistry.setTradingClearingRegistryType("DAT"); @@ -249,14 +259,12 @@ class TradingClearingRegistryServiceTest { 0, jsonString); - waitingSendAndCheckRecord(0L, producer, producerRecord); + waitingSendAndCheckRecord(0L, mockProducer); TradingClearingRegistry resultNew = tradingClearingRegistryImdg.getAllValues().iterator().next(); predictableTradingClearingRegistry.setId(resultNew.getId()); - predictableTradingClearingRegistry.setCode(predictableTradingClearingRegistry.getCode() + resultNew.getId()); predictableTradingClearingRegistry.setUpdated(resultNew.getUpdated()); predictableTradingClearingRegistry.setCreated(resultNew.getCreated()); - predictableTradingClearingRegistry.setCompanyId(123L); TRADING_CLEARING_REGISTRY_MATCHER.assertMatch(resultNew, predictableTradingClearingRegistry); tradingClearingRegistryImdg.delete(resultNew); @@ -284,7 +292,7 @@ class TradingClearingRegistryServiceTest { jsonString); //ASSERT - waitingSendAndCheckRecord(0L, producer, producerRecord); + waitingSendAndCheckRecord(0L, mockProducer); TradingClearingRegistry resultUpdating = tradingClearingRegistryImdg.getSingleObjectByID(registryId); existTradingClearingRegistry.setUpdated(resultUpdating.getUpdated()); @@ -312,7 +320,7 @@ class TradingClearingRegistryServiceTest { jsonString); //ASSERT - waitingSendAndCheckRecord(0L, producer, producerRecord); + waitingSendAndCheckRecord(0L, mockProducer); TradingClearingRegistry resultUpdating = tradingClearingRegistryImdg.getSingleObjectByID(registryId); existTradingClearingRegistry.setUpdated(resultUpdating.getUpdated()); @@ -333,8 +341,8 @@ class TradingClearingRegistryServiceTest { "000000105", TradingClearingRegistryPurpose.C, "ER", 100012L )); - Assertions.assertEquals("0105MAT100012", tradingClearingRegistryService.makeCode( - "000000105", TradingClearingRegistryPurpose.M, "ER", 100012L + Assertions.assertEquals("0105MAT00012", tradingClearingRegistryService.makeCode( + "000000105", TradingClearingRegistryPurpose.M, "A", 100012L )); } 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 deleted file mode 100644 index c018ead9a..000000000 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/ImapEvent.java +++ /dev/null @@ -1,63 +0,0 @@ -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.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); - } -} diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/MatcherFactory.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/MatcherFactory.java deleted file mode 100644 index b2d1a4fdc..000000000 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/utils/MatcherFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.spcex.clearing.account.utils; - -import java.util.Arrays; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Factory for creating test matchers. - *

- * Comparing actual and expected objects via AssertJ - */ -public class MatcherFactory { - - public static Matcher usingIgnoringFieldsComparator(String... fieldsToIgnore) { - return new Matcher<>(fieldsToIgnore); - } - - public static class Matcher { - private final String[] fieldsToIgnore; - - private Matcher(String... fieldsToIgnore) { - this.fieldsToIgnore = fieldsToIgnore; - } - - public void assertMatch(T actual, T expected) { - assertThat(actual).usingRecursiveComparison().ignoringFields(fieldsToIgnore).isEqualTo(expected); - } - - @SafeVarargs - public final void assertMatch(Iterable actual, T... expected) { - assertMatch(actual, Arrays.asList(expected)); - } - - public void assertMatch(Iterable actual, Iterable expected) { - assertThat(actual).usingRecursiveFieldByFieldElementComparatorIgnoringFields(fieldsToIgnore).isEqualTo(expected); - } - } -} diff --git a/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/config/ImdgTestConfig.java b/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/config/ImdgTestConfig.java index 56932f90f..8717e9e1c 100644 --- a/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/config/ImdgTestConfig.java +++ b/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/config/ImdgTestConfig.java @@ -89,7 +89,8 @@ public class ImdgTestConfig { params.setPassword("dev-pass"); params.setClusterMembers("127.0.0.1"); params.setInstanceName("hzTestClient" + new Random().nextInt()); - params.setNearCacheConfig(new NearCacheConfig()); +// params.setNearCacheConfig(new NearCacheConfig()); Если добавить будет с опазданием(8-12с) обновлятся данные для метода Imdg.getSingleObjectByID +// (getSingleObjectByFieldValues, getAllValues, getSingleObjectBySQL работают корректно) при ТРАНЗАКЦИЯХ. Используется в проде(по факту нет) если в конфиг добавить эту настройку.. return params; } } diff --git a/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/config/KafkaTestConfig.java b/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/config/KafkaTestConfig.java index 0e8ff9860..a9dd282ef 100644 --- a/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/config/KafkaTestConfig.java +++ b/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/config/KafkaTestConfig.java @@ -60,6 +60,15 @@ public class KafkaTestConfig { TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); doReturn(future).when(mockProducer).send(captor.capture()); } + + /** + * Позволяет избежать NPE при вызове Future.get(), из-за очисткой перед каждым тестом(MockReset.withSettings(MockReset.AFTER) необходимо обновлять перед вызовом + * @param mockProducer + */ + public static void setMockFuture(Producer mockProducer){ + ArgumentCaptor captor = producerCaptors.get(mockProducer); + setFuture(captor, mockProducer); + } public static void setFuture(ArgumentCaptor recordArgumentCaptor, ReplyingKafkaTemplate kafkaTemplate){ //sendToQueueWaitForAnswer @@ -89,6 +98,15 @@ public class KafkaTestConfig { } } + /** + * Позволяет избежать NPE при вызове Future.get(), из-за очисткой перед каждым тестом(MockReset.withSettings(MockReset.AFTER) необходимо обновлять перед вызовом + * @param kafkaTemplate + */ + public static void setMockFuture(KafkaTemplate kafkaTemplate){ + ArgumentCaptor captor = templateCaptors.get(kafkaTemplate); + setFuture(captor, (ReplyingKafkaTemplate) kafkaTemplate); + } + // @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Bean("mockProducer") public Producer kafkaProducer() { diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionalHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionalHazelcast.java index d3849b462..0c89da722 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionalHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionalHazelcast.java @@ -11,6 +11,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateHazelcast; import ru.spcex.platform.utils.log.ExceptionUtils; import java.util.*; @@ -25,6 +29,11 @@ public class ImdgTransactionalHazelcast implements Im private HazelcastInstance hzInstance; + @Override + public Collection getAllValues() { + return map.values(); + } + @Override public Long insert(T paramT) { if (paramT.getId() == null) { @@ -183,4 +192,43 @@ public class ImdgTransactionalHazelcast implements Im public Long nextIDSequenceFor() { return idGenerator.newId(); } + + // Predicate API + @Override + public Collection getCollectionObjectsByPredicate(ImdgPredicate predicateImdg) { + Predicate hazelcastPredicate = ((ImdgPredicateHazelcast) predicateImdg).getRawPredicate(); + Set ids = map.keySet(hazelcastPredicate); + Iterator idIterator = ids.iterator(); + Collection searchResult = new ArrayList<>(); + while (idIterator.hasNext()) { + T element = map.get(idIterator.next()); + if (element != null) { + searchResult.add(element); + } + } + return searchResult; + } + + @Override + public T getSingleObjectByPredicate(ImdgPredicate predicate) { + Collection els = getCollectionObjectsByPredicate(predicate); + if (els.size() > 1) { + throw new RuntimeException("More than one element found by predicate [" + predicate + "] - " + els.size()); + } + return els.size() == 1 ? els.iterator().next() : null; + } + + @Override + public T getFirstObjectByPredicate(ImdgPredicate predicate) { + Collection els = getCollectionObjectsByPredicate(predicate); + Iterator iterator = els.iterator(); + if (iterator.hasNext()) { + return iterator.next(); + } else return null; + } + + @Override + public ImdgPredicateBuilder predicateBuilder() { + return ImdgPredicateBuilderHazelcast.instance(); + } }