From ec0a5edd67ca08ed84f6f3f190809913ee36db5a Mon Sep 17 00:00:00 2001 From: psemenkov Date: Tue, 13 Dec 2022 18:46:42 +0300 Subject: [PATCH] Adding AccountBalanceServiceTest. --- clearing-parent/balance-service/pom.xml | 37 ++++- .../AccountBalanceValidationRule.java | 4 +- .../balance/config/BalanceImdgTestConfig.java | 75 ++++++++++ .../balance/config/KafkaTestConfig.java | 26 ++++ .../balance/service/AbstractServiceTest.java | 19 +++ .../service/AccountBalanceServiceTest.java | 132 ++++++++++++++++++ .../balance/utils/MatcherFactory.java | 38 +++++ 7 files changed, 327 insertions(+), 4 deletions(-) create mode 100644 clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/config/BalanceImdgTestConfig.java create mode 100644 clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/config/KafkaTestConfig.java create mode 100644 clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AbstractServiceTest.java create mode 100644 clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AccountBalanceServiceTest.java create mode 100644 clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/utils/MatcherFactory.java diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index 1abc9c32c..4414833e5 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -1,6 +1,6 @@ - clearing-parent @@ -40,6 +40,22 @@ ru.spcex.platform platform-enum + + + org.springframework + spring-test + test + + + org.junit.jupiter + junit-jupiter + test + + + org.assertj + assertj-core + test + @@ -67,6 +83,23 @@ ${project.artifactId} + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + org.junit.platform + junit-platform-surefire-provider + 1.2.0-M1 + + + org.junit.jupiter + junit-jupiter-engine + 5.2.0-M1 + + + \ No newline at end of file diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidationRule.java index 7ac689a73..50cac7c02 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidationRule.java @@ -23,7 +23,7 @@ public enum AccountBalanceValidationRule implements IValidationRule companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); Company company = companyImdg.getSingleObjectByID(validatedObject.addresseeId()); if (company == null) { - return of( BalanceError.CompanyNotFound); + return of(BalanceError.CompanyNotFound); } context.storeObject(ValidationStored.Company, company); return empty(); @@ -50,6 +50,6 @@ public enum AccountBalanceValidationRule implements IValidationRule 2) { + pool.setKeepAliveSeconds(60); + pool.setAllowCoreThreadTimeOut(true); + } + pool.setCorePoolSize(maxPoolSz); + pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); + return pool; + } + + @Bean(name = "taskExecutorHazelcastTestClientInitializer") + public ThreadPoolTaskExecutor taskExecutorHazelcastTestClientInitializer() { + return createThreadPoolTestTaskExecutor(1, true); + } + + @Bean(name = "taskExecutorTestIdGeneratorAwaiter") + public ThreadPoolTaskExecutor taskExecutorTestIdGeneratorAwaiter() { + return createThreadPoolTestTaskExecutor(1, false); + } + + @Autowired + @Bean(name = "hazelcastServiceTest") + public ImdgProvider imdgTestProvider( + @Qualifier("taskExecutorHazelcastTestClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, + @Qualifier("taskExecutorTestIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, + HazelcastClientParams params) { + Config cfg = new Config(); + cfg.setInstanceName("localhost"); + + NetworkConfig networkConfig = new NetworkConfig(); + JoinConfig joinConfig = new JoinConfig(); + joinConfig.setMulticastConfig(new MulticastConfig().setEnabled(false)); + joinConfig.setTcpIpConfig(new TcpIpConfig().setEnabled(true).setMembers(List.of("127.0.0.1"))); + networkConfig.setJoin(joinConfig); + cfg.setNetworkConfig(networkConfig); + hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); + HazelcastHelper.otcSystem_setStorageState(true, hazelcastInstance); + return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); + } + + @Bean(name = "hazelcastClientParams") + public HazelcastClientParams getHazelcastClientParams() { + HazelcastClientParams params = new HazelcastClientParams(); + params.setLogin("dev"); + params.setPassword("dev-pass"); + params.setClusterMembers("127.0.0.1"); + params.setInstanceName("hzTestClient" + new Random().nextInt()); + params.setNearCacheConfig(new NearCacheConfig()); + return params; + } +} diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/config/KafkaTestConfig.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/config/KafkaTestConfig.java new file mode 100644 index 000000000..33e62153e --- /dev/null +++ b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/config/KafkaTestConfig.java @@ -0,0 +1,26 @@ +package ru.spcex.clearing.balance.config; + +import org.apache.kafka.clients.consumer.Consumer; +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.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class KafkaTestConfig { + + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + @Bean + public Consumer createTestConsumer() { + return new MockConsumer<>(OffsetResetStrategy.EARLIEST); + } + + @Bean + public Producer createTestProducer() { + return new MockProducer<>(); + } +} diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AbstractServiceTest.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AbstractServiceTest.java new file mode 100644 index 000000000..29723228e --- /dev/null +++ b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AbstractServiceTest.java @@ -0,0 +1,19 @@ +package ru.spcex.clearing.balance.service; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.spcex.clearing.balance.config.BalanceImdgTestConfig; +import ru.spcex.clearing.balance.config.KafkaSenderConfig; +import ru.spcex.clearing.balance.config.KafkaTestConfig; +import ru.spcex.clearing.balance.config.ValidationConfig; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + AccountBalanceService.class, + ValidationConfig.class, + BalanceImdgTestConfig.class, + KafkaSenderConfig.class, + KafkaTestConfig.class}) +public abstract class AbstractServiceTest { +} diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AccountBalanceServiceTest.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AccountBalanceServiceTest.java new file mode 100644 index 000000000..31a79fe58 --- /dev/null +++ b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AccountBalanceServiceTest.java @@ -0,0 +1,132 @@ +package ru.spcex.clearing.balance.service; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.balance.errors.BalanceError; +import ru.spcex.clearing.balance.utils.MatcherFactory.Matcher; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.BalanceAccountType; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; + +import javax.annotation.PostConstruct; +import java.math.BigDecimal; + +import static ru.spcex.clearing.balance.utils.MatcherFactory.usingIgnoringFieldsComparator; + + +class AccountBalanceServiceTest extends AbstractServiceTest { + + public static final Matcher ACCOUNT_BALANCE_MATCHER = usingIgnoringFieldsComparator("account.created", "account.updated", "account.clearingDate"); + private final Long id = 0L; + private final Long accountIdNew = 0L; + private final Long addresseeIdNew = 0L; + private final BigDecimal amountNew = new BigDecimal(1000); + private final String cashMovementCurrencyCodeNew = "cash"; + private final Long accountIdUpdate = accountIdNew; + private final Long addresseeIdUpdate = addresseeIdNew; + private final BigDecimal amountUpdate = new BigDecimal(100000); + private final String cashMovementCurrencyCodeUpdate = "cash"; + @Autowired + AccountBalanceService accountBalanceService; + @Autowired + @Qualifier("hazelcastServiceTest") + private ImdgProvider hazelcast; + + private Imdg companyImdg; + private Imdg accountImdg; + + @PostConstruct + void init() { + companyImdg = hazelcast.getImdg(IMDGDistributedNames.Map_Company, Company.class); + accountImdg = hazelcast.getImdg(IMDGDistributedNames.Map_Account, Account.class); + } + + @Test + void createAccountBalance() { + hazelcast.waitAvailable(); + Company company = new Company(); + company.setId(addresseeIdNew); + company.setTradingCode("code"); + company.setShortName("ShortName"); + company.setFullName("FullName"); + companyImdg.insert(company); + Account account = new Account(); + account.setId(accountIdNew); + account.setAccount("123456789"); + account.setAccountType(AccountType.Clrn.getKey()); + account.setAccountStatus(Status.Active.getKey()); + accountImdg.insert(account); + + AccountBalance accountBalanceNew = new AccountBalance(); + accountBalanceNew.setId(id); + accountBalanceNew.setCompanyId(addresseeIdNew); + accountBalanceNew.setAccountId(accountIdNew); + accountBalanceNew.setAccountType(account.getAccountType()); + accountBalanceNew.setAccount(account.getAccount()); + accountBalanceNew.setOpenBalanceAmount(amountNew); + accountBalanceNew.setFreeBalanceAmount(amountNew); + accountBalanceNew.setBalanceAmount(amountNew); + accountBalanceNew.setBalanceAccountType(BalanceAccountType.Active.getKey()); + accountBalanceNew.setCurrencyCode(cashMovementCurrencyCodeNew); + accountBalanceNew.setTradingCode(company.getTradingCode()); + accountBalanceNew.setShortName(company.getShortName()); + accountBalanceNew.setFullName(company.getFullName()); + AccountResult predictableNewResult = new AccountResult(accountBalanceNew); + AccountResult resultNew = accountBalanceService.createAccountBalance(addresseeIdNew, accountIdNew, amountNew, cashMovementCurrencyCodeNew); + resultNew.getAccount().setId(id); + + AccountBalance accountBalanceUpdate = new AccountBalance(); + accountBalanceUpdate.setId(id); + accountBalanceUpdate.setCompanyId(addresseeIdUpdate); + accountBalanceUpdate.setAccountId(accountIdUpdate); + accountBalanceUpdate.setAccountType(account.getAccountType()); + accountBalanceUpdate.setAccount(account.getAccount()); + accountBalanceUpdate.setOpenBalanceAmount(amountUpdate); + accountBalanceUpdate.setFreeBalanceAmount(amountUpdate); + accountBalanceUpdate.setBalanceAmount(amountUpdate); + accountBalanceUpdate.setBalanceAccountType(BalanceAccountType.Active.getKey()); + accountBalanceUpdate.setCurrencyCode(cashMovementCurrencyCodeUpdate); + accountBalanceUpdate.setTradingCode(company.getTradingCode()); + accountBalanceUpdate.setShortName(company.getShortName()); + accountBalanceUpdate.setFullName(company.getFullName()); + AccountResult resultUpdate = accountBalanceService.createAccountBalance(addresseeIdUpdate, accountIdUpdate, amountUpdate, cashMovementCurrencyCodeUpdate); + resultUpdate.getAccount().setId(id); + AccountResult predictableUpdateResult = new AccountResult(accountBalanceUpdate); + + ACCOUNT_BALANCE_MATCHER.assertMatch(resultNew, predictableNewResult); + ACCOUNT_BALANCE_MATCHER.assertMatch(resultUpdate, predictableUpdateResult); + } + + @Test + void validatedCreateAccountBalance() { + AccountResult predictableResult; + hazelcast.waitAvailable(); + predictableResult = new AccountResult(new EnumMessage(BalanceError.CompanyNotFound)); + + AccountResult result = accountBalanceService.createAccountBalance(addresseeIdNew, accountIdNew, amountNew, cashMovementCurrencyCodeNew); + ACCOUNT_BALANCE_MATCHER.assertMatch(result, predictableResult); + + Company company = new Company(); + company.setId(addresseeIdNew); + companyImdg.insert(company); + + Account account = new Account(); +// account.setId(accountIdNew); + account.setAccountType(AccountType.Clrn.getKey()); + account.setAccountStatus(Status.Active.getKey()); + accountImdg.insert(account); + predictableResult = new AccountResult(new EnumMessage(BalanceError.AccountNotPresent)); + + result = accountBalanceService.createAccountBalance(addresseeIdNew, accountIdNew, amountNew, cashMovementCurrencyCodeNew); + ACCOUNT_BALANCE_MATCHER.assertMatch(result, predictableResult); + + } +} \ No newline at end of file diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/utils/MatcherFactory.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/utils/MatcherFactory.java new file mode 100644 index 000000000..a18ccb4f0 --- /dev/null +++ b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/utils/MatcherFactory.java @@ -0,0 +1,38 @@ +package ru.spcex.clearing.balance.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); + } + } +}