diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/validation/FixedIncomeCashFlowValidationConfig.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/validation/FixedIncomeCashFlowValidationConfig.java index 179b29106..04dcc1b6d 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/validation/FixedIncomeCashFlowValidationConfig.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/validation/FixedIncomeCashFlowValidationConfig.java @@ -30,7 +30,7 @@ public class FixedIncomeCashFlowValidationConfig { ImdgValidationContext context = new ImdgValidationContext<>(); context.setValidatedObject(fixedIncomeCashFlowNewRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); - addImdg.accept(IMDGDistributedNames.Map_ClearingMemberCategory); + addImdg.accept(IMDGDistributedNames.Map_FixedIncomeCashFlow); return new ValidatorImpl<>(context, IsLongValueRule.instance("securitySymbol", FixedIncomeCashFlowNewRequest::getSecuritySymbol, diff --git a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/config/ImdgTestConfig.java b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/config/ImdgTestConfig.java index 95f01963c..839542afd 100644 --- a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/config/ImdgTestConfig.java +++ b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/config/ImdgTestConfig.java @@ -15,10 +15,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 ImdgTestConfig { + public static final AtomicLong currentID = new AtomicLong(0L); private HazelcastInstance hazelcastInstance; private static ThreadPoolTaskExecutor createThreadPoolTestTaskExecutor(int maxPoolSz, boolean waitForCompletion) { diff --git a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/FixedIncomeCashFlowServiceTest.java b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/FixedIncomeCashFlowServiceTest.java new file mode 100644 index 000000000..27fc8ce30 --- /dev/null +++ b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/FixedIncomeCashFlowServiceTest.java @@ -0,0 +1,113 @@ +package ru.spcex.clearing.securities.service; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.MockProducer; +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.instrument.issue.FixedIncomeCashFlow; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.FixedIncomeCashFlowNewRequest; +import ru.spcex.clearing.securities.config.ErrorResolverConfig; +import ru.spcex.clearing.securities.config.ImdgTestConfig; +import ru.spcex.clearing.securities.config.KafkaTestConfig; +import ru.spcex.clearing.securities.config.ValidationConfig; +import ru.spcex.clearing.securities.config.validation.FixedIncomeCashFlowValidationConfig; +import ru.spcex.clearing.securities.service.cud.FixedIncomeCashFlowService; +import ru.spcex.clearing.securities.utils.MatcherFactory.Matcher; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import javax.annotation.PostConstruct; +import java.math.BigDecimal; +import java.time.LocalDate; + +import static ru.spcex.clearing.securities.config.ImdgTestConfig.currentID; +import static ru.spcex.clearing.securities.utils.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.securities.utils.TestUtils.*; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + ErrorResolverConfig.class, + ValidationConfig.class, + FixedIncomeCashFlowService.class, + FixedIncomeCashFlowValidationConfig.class, + KafkaTestConfig.class, + ImdgTestConfig.class}) +class FixedIncomeCashFlowServiceTest { + public static final Matcher FIXED_INCOME_CASH_FLOW_MATCHER = usingIgnoringFieldsComparator(); + + private static final String TOPIC_FIXED_INCOME_CASH_FLOW_NEW = Consts.DESTINATION_FIXED_INCOME_CASH_FLOW_NEW; + private static final String TOPIC_FIXED_INCOME_CASH_FLOW_UPDATE = Consts.DESTINATION_FIXED_INCOME_CASH_FLOW_UPDATE; + private static final Long ID = currentID.incrementAndGet(); + private static final int PARTITION = 0; + + @Autowired + FixedIncomeCashFlowService fixedIncomeCashFlowService; + + @Autowired + @Qualifier("hazelcastServiceTest") + private ImdgProvider hazelcastServiceTest; + private Imdg fixedIncomeCashFlowImdg; + + @Captor + private ArgumentCaptor producerRecord; + @SpyBean + private MockProducer mockProducer; + + private final String SECURITY_SYMBOL_STR = "777"; + private final Long SECURITY_SYMBOL_LONG = 777L; + + private final LocalDate TEST_DATE = LocalDate.now(); + + private final BigDecimal TEST_BIG_DECIMAL = BigDecimal.TEN; + + private final Long TEST_LONG = Long.MAX_VALUE; + + @PostConstruct + private void init() { + hazelcastServiceTest.waitAvailable(); + fixedIncomeCashFlowImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_FixedIncomeCashFlow, + FixedIncomeCashFlow.class + ); + } + + @Test + void fixedIncomeCashFlowNewTest() throws InterruptedException { + //ARRANGE + FixedIncomeCashFlowNewRequest newRequest = new FixedIncomeCashFlowNewRequest(); + newRequest.setSecuritySymbol(SECURITY_SYMBOL_STR); + newRequest.setNominalValue(TEST_BIG_DECIMAL); + newRequest.setAccruedCoupon(TEST_BIG_DECIMAL); + newRequest.setNumber(TEST_LONG); + newRequest.setValueDate(TEST_DATE); + + FixedIncomeCashFlow predictableFixedIncomeCashFlow = new FixedIncomeCashFlow(); + predictableFixedIncomeCashFlow.setSecurityId(SECURITY_SYMBOL_LONG); + predictableFixedIncomeCashFlow.setNominalValue(TEST_BIG_DECIMAL); + predictableFixedIncomeCashFlow.setAccruedCoupon(TEST_BIG_DECIMAL); + predictableFixedIncomeCashFlow.setNumber(TEST_LONG); + predictableFixedIncomeCashFlow.setValueDate(TEST_DATE); + + //ACT + String jsonString = getJsonStringForNew(newRequest, ID); + + addRecordToKafka((MockConsumer) fixedIncomeCashFlowService.getConsumer(), TOPIC_FIXED_INCOME_CASH_FLOW_NEW, PARTITION, 0, jsonString); + + //ASSERT + waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord); + FixedIncomeCashFlow resultNew = fixedIncomeCashFlowImdg.getSingleObjectBySQL(String.format("securityId = %s", SECURITY_SYMBOL_STR)); + predictableFixedIncomeCashFlow.setId(resultNew.getId()); + FIXED_INCOME_CASH_FLOW_MATCHER.assertMatch(resultNew, predictableFixedIncomeCashFlow); + } + +} \ No newline at end of file diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/FixedIncomeCashFlowNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/FixedIncomeCashFlowNewRequest.java index eaca2e32b..dc4ae3c0e 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/FixedIncomeCashFlowNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/FixedIncomeCashFlowNewRequest.java @@ -2,7 +2,10 @@ package ru.spcex.clearing.platform.messaging.domain.cud.securitites; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.deser.std.NumberDeserializers; +import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; +import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol; import java.math.BigDecimal; @@ -24,6 +27,8 @@ public class FixedIncomeCashFlowNewRequest implements WithSecuritySymbol { public Long number; @JsonProperty + @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) public LocalDate valueDate;