Добавил CurrencyService валидацию и тесты к нему.
This commit is contained in:
psemenkov 2023-04-05 18:45:29 +03:00
parent 894f12591d
commit 15a477e8ce
13 changed files with 398 additions and 237 deletions

View file

@ -6,8 +6,11 @@ public enum SecuritiesError implements IErrorEnumId {
RequiredFieldIsEmpty(1002L),
WrongFieldValue(1004L),
InstrumentAlreadyExists(1010L),
InstrumentNotActive(1012L),
InstrumentNotFound(1011L),
InstrumentNotActive(1012L),
CurrencyAlreadyExists(1015L),
CurrencyNotFound(1016L),
;
private final Long id;

View file

@ -0,0 +1,92 @@
package ru.spcex.clearing.securities.service.cud;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Currency;
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.securitites.CurrencyNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.CurrencyUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.securities.component.ListingBuilder;
import ru.spcex.clearing.securities.validation.ValidationProvider;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
@Service
public class CurrencyService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Currency> currencyImdg;
private final ImdgProvider imdgProvider;
private final ImdgId idGenerator;
private final ValidationProvider validation;
private final ValidationHelper validationHelper;
private final ListingBuilder listingBuilder = new ListingBuilder();
@Autowired
public CurrencyService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
ValidationProvider validation,
ValidationHelper validationHelper) {
super(kafkaQueue, kafkaProducer);
this.validation = validation;
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.validationHelper = validationHelper;
}
@Override
public void afterPropertiesSet() {
callback(CurrencyNewRequest.class)
.setFunction(this::newCurrency)
.forDestination(Consts.DESTINATION_СURRENCY_NEW, callbacks::put);
callback(CurrencyUpdateRequest.class)
.setFunction(this::updateCurrency)
.forDestination(Consts.DESTINATION_СURRENCY_UPDATE, callbacks::put);
imdgProvider.waitAvailable();
init();
}
private RequestInfoUpdate newCurrency(BaseRequest<CurrencyNewRequest> userRequest) {
ImdgTransaction transaction = imdgProvider.newTransaction();
CurrencyNewRequest req = userRequest.getRequestPayload();
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.currencyNewValidator());
if (requestInfoUpdate != null) return requestInfoUpdate;
log.debug("newCurrency received");
Currency currency = new Currency();
currency.setId(idGenerator.nextId());
currency.setCountryCode(req.getCountryCode());
currency.setCurrencyCode(req.getCurrencyCode());
currencyImdg.insert(currency);
log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), currency.getId());
return null; // default success
}
private RequestInfoUpdate updateCurrency(BaseRequest<CurrencyUpdateRequest> userRequest) {
CurrencyUpdateRequest req = userRequest.getRequestPayload();
log.debug("updateCurrency received id = {}", req.getId());
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.currencyUpdateValidator());
if (requestInfoUpdate != null) return requestInfoUpdate;
Currency currency = currencyImdg.getSingleObjectByID(req.getId());
currency.setCountryCode(req.getCountryCode());
currency.setCurrencyCode(req.getCurrencyCode());
currencyImdg.update(currency);
return null;
}
}

View file

@ -76,7 +76,7 @@ public class FixedIncomeSecurityService extends QueueConsumer implements Initial
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.fixedIncomeNewValidator());
if (requestInfoUpdate != null) return requestInfoUpdate;
log.debug("EquitySecurityNewRequest received");
log.debug("newFixedIncome received");
FixedIncomeSecurity fixedIncome = new FixedIncomeSecurity();
fixedIncome.setId(idGenerator.nextId());
fixedIncome.setSecuritySymbol(req.getSecuritySymbol());
@ -119,7 +119,7 @@ public class FixedIncomeSecurityService extends QueueConsumer implements Initial
private RequestInfoUpdate updateFixedIncome(BaseRequest<FixedIncomeSecurityUpdateRequest> userRequest) {
FixedIncomeSecurityUpdateRequest req = userRequest.getRequestPayload();
log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId());
log.debug("updateFixedIncome received id = {}", req.getId());
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.fixedIncomeUpdateValidator());
if (requestInfoUpdate != null) return requestInfoUpdate;
@ -148,7 +148,7 @@ public class FixedIncomeSecurityService extends QueueConsumer implements Initial
fixedIncomeSecurityImdg.update(fixedIncome);
Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", fixedIncome.getId()));
if (listing == null) {
log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), fixedIncome.getId());
log.error("updateFixedIncome id {} couldn't find listing with securityId {}", req.getId(), fixedIncome.getId());
return null;
}
listing = listingBuilder.byFixedIncomeEquity(fixedIncome, listing);

View file

@ -1,171 +0,0 @@
package ru.spcex.clearing.securities.service.cud;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.misc.Listing;
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.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.EquitySecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.EquitySecurityUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.securities.component.ListingBuilder;
import ru.spcex.clearing.securities.validation.ValidationProvider;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import java.time.Instant;
import java.util.Map;
@Service
public class СurrencyService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<EquitySecurity> equitySecurityImdg;
private final Imdg<Listing> listingImdg;
private final ImdgProvider imdgProvider;
private final ImdgId idGenerator;
private final ValidationProvider validation;
private final ValidationHelper validationHelper;
private final ListingBuilder listingBuilder = new ListingBuilder();
@Autowired
public СurrencyService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
ValidationProvider validation,
ValidationHelper validationHelper) {
super(kafkaQueue, kafkaProducer);
this.validation = validation;
this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.validationHelper = validationHelper;
}
@Override
public void afterPropertiesSet() {
callback(EquitySecurityNewRequest.class)
.setFunction(this::newEquity)
.forDestination(Consts.DESTINATION_СURRENCY_NEW, callbacks::put);
callback(EquitySecurityUpdateRequest.class)
.setFunction(this::updateEquity)
.forDestination(Consts.DESTINATION_СURRENCY_UPDATE, callbacks::put);
callback(CommonDeleteRequest.class)
.setFunction(this::deleteEquity)
.forDestination(Consts.DESTINATION_СURRENCY_DELETE, callbacks::put);
imdgProvider.waitAvailable();
init();
}
private RequestInfoUpdate newEquity(BaseRequest<EquitySecurityNewRequest> userRequest) {
ImdgTransaction transaction = imdgProvider.newTransaction();
EquitySecurityNewRequest req = userRequest.getRequestPayload();
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.equityNewValidator());
if (requestInfoUpdate != null) return requestInfoUpdate;
log.debug("EquitySecurityNewRequest received");
EquitySecurity equity = new EquitySecurity();
equity.setId(idGenerator.nextId());
equity.setSecuritySymbol(req.getSecuritySymbol());
equity.setShortName(req.getShortName());
equity.setFullName(req.getFullName());
equity.setIsin(req.getIsin());
equity.setShareType(req.getShareType());
equity.setLotSize(req.getLotSize());
equity.setIssuerId(req.getIssuerId());
equity.setShortNameEng(req.getShortNameEng());
equity.setFullNameEng(req.getFullNameEng());
equity.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Active.getKey());
equity.setInstrumentType(req.getInstrumentType());
equity.setSecurityId(equity.getId());
equity.setCreated(Instant.now());
try {
transaction.beginTransaction();
Imdg<EquitySecurity> equityImdg = transaction.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
Imdg<Listing> listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
//одним скопом выполняем реквест
equityImdg.insert(equity);
Listing listing = listingBuilder.byNewEquity(equity, req);
listingMap.insert(listing);
//и сохраняем обновленный
// reqInfoMap.insert(reqInfo);
transaction.commitTransaction();
} catch (Throwable e) {
transaction.rollbackTransaction();
// RequestInfo.update(reqInfo, Status.Error, ExceptionUtils.getStackTrace(e));
// requestInfoImdg.insert(reqInfo);
}
log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), equity.getId());
return null; // default success
}
private RequestInfoUpdate updateEquity(BaseRequest<EquitySecurityUpdateRequest> userRequest) {
EquitySecurityUpdateRequest req = userRequest.getRequestPayload();
log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId());
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.equityUpdateValidator());
if (requestInfoUpdate != null) return requestInfoUpdate;
EquitySecurity equity = equitySecurityImdg.getSingleObjectByID(req.getId());
Instant updateTime = Instant.now();
equity.setUpdated(updateTime);
equity.setSecuritySymbol(req.getSecuritySymbol());
equity.setShortName(req.getShortName());
equity.setFullName(req.getFullName());
equity.setIsin(req.getIsin());
equity.setShareType(req.getShareType());
equity.setLotSize(req.getLotSize());
equity.setIssuerId(req.getIssuerId());
equity.setShortNameEng(req.getShortNameEng());
equity.setFullNameEng(req.getFullNameEng());
equity.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Active.getKey());
equity.setInstrumentType(req.getInstrumentType());
equitySecurityImdg.update(equity);
Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", equity.getId()));
if (listing == null) {
log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), equity.getId());
return null;
}
listing = listingBuilder.byUpdateEquity(equity, listing);
listingImdg.update(listing);
return null;
}
private RequestInfoUpdate deleteEquity(BaseRequest<CommonDeleteRequest> userRequest) {
CommonDeleteRequest req = userRequest.getRequestPayload();
log.debug("CommonDeleteRequest received id = {}", req.getId());
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.equityDeleteValidator());
if (requestInfoUpdate != null) return requestInfoUpdate;
Instant updateTime = Instant.now();
EquitySecurity equity = equitySecurityImdg.getSingleObjectByID(req.getId());
equity.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
equity.setUpdated(updateTime);
equitySecurityImdg.update(equity);
Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", equity.getId()));
if (listing == null) {
log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), equity.getId());
return null;
}
listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
listing.setUpdated(updateTime);
listingImdg.update(listing);
return null;
}
}

View file

@ -28,6 +28,7 @@ public class ValidationProvider {
private final Imdg<SpcexObjectBase> shareTypeDictionaryImdg;
private final Imdg<SpcexObjectBase> bondTypeDictionaryImdg;
private final Imdg<SpcexObjectBase> companyImdg;
private final Imdg<SpcexObjectBase> currencyImdg;
public ValidationProvider(ImdgProvider imdgProvider) {
@ -41,6 +42,7 @@ public class ValidationProvider {
this.shareTypeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ShareTypeDictionary, SpcexObjectBase.class);
this.bondTypeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_BondTypeDictionary, SpcexObjectBase.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, SpcexObjectBase.class);
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, SpcexObjectBase.class);
}
public Function<MoneyMarketSecurityNewRequest, IValidator> mmsNewValidator() {
@ -217,4 +219,26 @@ public class ValidationProvider {
);
};
}
public Function<CurrencyNewRequest, IValidator> currencyNewValidator() {
return currencyRequest -> {
ImdgValidationContext<CurrencyNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(currencyRequest);
context.addImdg(IMDGDistributedNames.Map_Currency, currencyImdg);
return new ValidatorImpl<>(context,
CurrencyNewValidationRule.CurrencyNotExists
);
};
}
public Function<CurrencyUpdateRequest, IValidator> currencyUpdateValidator() {
return currencyRequest -> {
ImdgValidationContext<CurrencyUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(currencyRequest);
context.addImdg(IMDGDistributedNames.Map_Currency, currencyImdg);
return new ValidatorImpl<>(context,
CurrencyUpdateValidationRule.CurrencyExists
);
};
}
}

View file

@ -0,0 +1,38 @@
package ru.spcex.clearing.securities.validation.rule;
import org.springframework.util.StringUtils;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.CurrencyNewRequest;
import ru.spcex.clearing.securities.errors.SecuritiesError;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Map;
import java.util.Optional;
public enum CurrencyNewValidationRule implements IValidationRule<ImdgValidationContext<CurrencyNewRequest>> {
CurrencyNotExists() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<CurrencyNewRequest> context) {
CurrencyNewRequest action = context.getValidatedObject();
if (!StringUtils.hasText(action.getCurrencyCode())) {
return of(SecuritiesError.RequiredFieldIsEmpty, "currencyCode");
}
Imdg<SpcexObjectBase> imdgDictionary = context.obtainMap(IMDGDistributedNames.Map_Currency, SpcexObjectBase.class);
SpcexObjectBase currency = imdgDictionary.getSingleObjectByFieldValues(Map.of(
"currencyCode", action.getCurrencyCode()));
if (currency != null) {
return of(SecuritiesError.CurrencyAlreadyExists, "currencyCode");
}
return empty();
}
};
@Override
public String ruleName() {
return "MmsNewValidationRule." + name();
}
}

View file

@ -0,0 +1,38 @@
package ru.spcex.clearing.securities.validation.rule;
import org.springframework.util.StringUtils;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.CurrencyUpdateRequest;
import ru.spcex.clearing.securities.errors.SecuritiesError;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Map;
import java.util.Optional;
public enum CurrencyUpdateValidationRule implements IValidationRule<ImdgValidationContext<CurrencyUpdateRequest>> {
CurrencyExists() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<CurrencyUpdateRequest> context) {
CurrencyUpdateRequest action = context.getValidatedObject();
if (!StringUtils.hasText(action.getCurrencyCode())) {
return of(SecuritiesError.RequiredFieldIsEmpty, "currencyCode");
}
Imdg<SpcexObjectBase> imdgDictionary = context.obtainMap(IMDGDistributedNames.Map_Currency, SpcexObjectBase.class);
SpcexObjectBase currency = imdgDictionary.getSingleObjectByFieldValues(Map.of(
"currencyCode", action.getCurrencyCode()));
if (currency == null) {
return of(SecuritiesError.CurrencyNotFound, "currencyCode");
}
return empty();
}
};
@Override
public String ruleName() {
return "MmsNewValidationRule." + name();
}
}

View file

@ -13,6 +13,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
import ru.clearing.platform.dictionary.*;
@ -22,6 +23,7 @@ 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.service.cud.CurrencyService;
import ru.spcex.clearing.securities.service.cud.EquitySecurityService;
import ru.spcex.clearing.securities.service.cud.FixedIncomeSecurityService;
import ru.spcex.clearing.securities.service.cud.MoneyMarketSecurityService;
@ -42,6 +44,7 @@ import static ru.spcex.clearing.securities.utils.MatcherFactory.usingIgnoringFie
EquitySecurityService.class,
FixedIncomeSecurityService.class,
MoneyMarketSecurityService.class,
CurrencyService.class,
ImdgTestConfig.class,
KafkaTestConfig.class,
ValidationProvider.class,
@ -61,6 +64,7 @@ public abstract class AbstractServiceTest {
protected Imdg<ShareTypeDictionary> shareTypeDictionaryImdg;
protected Imdg<BondTypeDictionary> bondTypeDictionaryImdg;
protected Imdg<Company> companyImdg;
protected Imdg<Currency> currencyImdg;
public static String RATE = "RATE";
protected String EQTY = "EQTY";
@ -92,6 +96,7 @@ public abstract class AbstractServiceTest {
this.shareTypeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ShareTypeDictionary, ShareTypeDictionary.class);
this.bondTypeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_BondTypeDictionary, BondTypeDictionary.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
InstrumentTypeDictionary instrumentTypeDictionary = new InstrumentTypeDictionary();
instrumentTypeDictionary.setId(1L);

View file

@ -0,0 +1,95 @@
package ru.spcex.clearing.securities.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.CurrencyNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.CurrencyUpdateRequest;
import ru.spcex.clearing.securities.service.cud.CurrencyService;
import ru.spcex.clearing.securities.utils.MatcherFactory;
import javax.annotation.PostConstruct;
import static ru.spcex.clearing.securities.utils.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.securities.utils.TestUtils.*;
public class CurrencyServiceTest extends AbstractServiceTest {
private static final MatcherFactory.Matcher<Currency> CURRENCY_MATCHER = usingIgnoringFieldsComparator("created", "updated");
private final long ID = currentId.getAndIncrement();
private final int PARTITION = 0;
private final String countryCode = "countryCode";
private final String currencyCode = "currencyCode";
@Autowired
private CurrencyService currencyService;
@PostConstruct
protected void init() {
super.init();
}
/**
* {@link CurrencyService#newCurrency(BaseRequest)}<br>
* Тест проверяет генерацию сущности {@link Currency} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link CurrencyNewRequest}:<br>
*/
@Test
public void testNewCurrency() {
clearAllInImdg(currencyImdg);
final String TOPIC = Consts.DESTINATION_СURRENCY_NEW;
final Currency currencyPrediction = new Currency();
currencyPrediction.setCountryCode(countryCode);
currencyPrediction.setCurrencyCode(currencyCode);
final CurrencyNewRequest request = new CurrencyNewRequest();
request.setCountryCode(countryCode);
request.setCurrencyCode(currencyCode);
//ACT
String jsonString = getJsonStringForNew(request, ID);
addRecordToKafka((MockConsumer) currencyService.getConsumer(), TOPIC, PARTITION, 0, jsonString);
//ASSERT
waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord);
Currency result = currencyImdg.getSingleObjectBySQL(String.format("countryCode = %s", currencyPrediction.getCountryCode()));
currencyPrediction.setId(result.getId());
CURRENCY_MATCHER.assertMatch(result, currencyPrediction);
}
/**
* {@link CurrencyService#updateCurrency(BaseRequest)}
* Тест проверяет обновление сущности {@link Currency} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link CurrencyUpdateRequest}:<br>
*/
@Test
public void testUpdateCurrency() {
clearAllInImdg(currencyImdg);
final String TOPIC = Consts.DESTINATION_СURRENCY_UPDATE;
final Currency currencyPrediction = new Currency();
currencyPrediction.setId(ID);
currencyPrediction.setCountryCode("ExistsCountryCode");
currencyPrediction.setCurrencyCode(currencyCode);
currencyImdg.insert(currencyPrediction);
currencyPrediction.setCountryCode(countryCode);
final CurrencyUpdateRequest request = new CurrencyUpdateRequest();
request.setId(ID);
request.setCountryCode(countryCode);
request.setCurrencyCode(currencyCode);
//ACT
String jsonString = getJsonStringForUPDATE(request, ID);
addRecordToKafka((MockConsumer) currencyService.getConsumer(), TOPIC, PARTITION, 0, jsonString);
//ASSERT
waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord);
Currency result = currencyImdg.getSingleObjectBySQL(String.format("countryCode = %s", currencyPrediction.getCountryCode()));
currencyPrediction.setId(result.getId());
CURRENCY_MATCHER.assertMatch(result, currencyPrediction);
}
}

View file

@ -5,16 +5,12 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
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.securitites.EquitySecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.EquitySecurityUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest;
import ru.spcex.clearing.securities.service.cud.EquitySecurityService;
import ru.spcex.clearing.securities.service.cud.MoneyMarketSecurityService;
import ru.spcex.clearing.securities.utils.MatcherFactory;
import javax.annotation.PostConstruct;
@ -24,31 +20,25 @@ import java.util.Map;
import static ru.spcex.clearing.securities.utils.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.securities.utils.TestUtils.*;
public class EquitySecurityServiceTest extends AbstractServiceTest{
public class EquitySecurityServiceTest extends AbstractServiceTest {
private static final MatcherFactory.Matcher<EquitySecurity> EQUITY_SECURITY_MATCHER = usingIgnoringFieldsComparator("created", "updated");
private final long ID = currentId.getAndIncrement();
private final int PARTITION = 0;
@Autowired
private EquitySecurityService equitySecurityService;
@PostConstruct
protected void init() {
super.init();
}
/**
* {@link MoneyMarketSecurityService#newMoneyMarket(BaseRequest)}<br>
* Тест проверяет генерацию сущности {@link MoneyMarketSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link MoneyMarketSecurityNewRequest}:<br>
* {@link MoneyMarketSecurityNewRequest#lotSize} - 1.0<br>
* {@link MoneyMarketSecurityNewRequest#startDate} - текущее колличество секунд с 1970-01-01T00:00:00Z.<br>
* {@link MoneyMarketSecurityNewRequest#endDate} - текущее колличество секунд с 1970-01-01T00:00:00Z.<br>
* {@link MoneyMarketSecurityNewRequest#nominalValue} - 1.0<br>
* {@link MoneyMarketSecurityNewRequest#nominalCurrency} - 1L<br>
* {@link MoneyMarketSecurityNewRequest#instrumentType} - "sdgaga"<br>
* {@link MoneyMarketSecurityNewRequest#fullName} - "estat"<br>
* {@link EquitySecurityService#newEquity(BaseRequest)}<br>
* Тест проверяет генерацию сущности {@link EquitySecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link EquitySecurityNewRequest}:<br>
*/
@Test
public void testNewEquity(){
public void testNewEquity() {
clearAllInImdg(equitySecurityImdg);
final String TOPIC = Consts.DESTINATION_EQUITY_SECURITY_NEW;
@ -76,14 +66,9 @@ public class EquitySecurityServiceTest extends AbstractServiceTest{
}
/**
* {@link MoneyMarketSecurityService#updateMoneyMarket(BaseRequest)}
* Тест проверяет обновление сущности {@link MoneyMarketSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link MoneyMarketSecurityUpdateRequest}:<br>
* {@link MoneyMarketSecurityUpdateRequest#fullName} - sfgsdfg<br>
* {@link MoneyMarketSecurityUpdateRequest#instrumentType} - qwerqwe<br>
* {@link MoneyMarketSecurityUpdateRequest#nominalCurrency} - RUB<br>
* {@link MoneyMarketSecurityUpdateRequest#nominalValue} - 2.0<br>
* {@link MoneyMarketSecurityUpdateRequest#endDate} - текущее колличество секунд с 1970-01-01T00:00:00Z + (24 * 3600)<br>
* {@link EquitySecurityService#updateEquity(BaseRequest)}
* Тест проверяет обновление сущности {@link EquitySecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link EquitySecurityUpdateRequest}:<br>
*/
@Test
public void testUpdateEquity() {
@ -121,13 +106,13 @@ public class EquitySecurityServiceTest extends AbstractServiceTest{
}
/**
* {@link MoneyMarketSecurityService#deleteMoneyMarket(BaseRequest)}<br>
* Тест проверяет удаление сущности {@link MoneyMarketSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* {@link EquitySecurityService#deleteEquity(BaseRequest)}<br>
* Тест проверяет удаление сущности {@link EquitySecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link CommonDeleteRequest}:<br>
* {@link CommonDeleteRequest#id} - Идентификатор записи<br>
*/
@Test
public void testDeleteEquity(){
public void testDeleteEquity() {
clearAllInImdg(equitySecurityImdg);
final String TOPIC = Consts.DESTINATION_EQUITY_SECURITY_DELETE;
@ -137,7 +122,8 @@ public class EquitySecurityServiceTest extends AbstractServiceTest{
Listing listingPrediction = new Listing();
listingPrediction = listingBuilder.byUpdateEquity(equityPrediction, listingPrediction);
listingImdg.insert(listingPrediction);listingPrediction.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
listingImdg.insert(listingPrediction);
listingPrediction.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
CommonDeleteRequest commonDeleteRequest = new CommonDeleteRequest();
commonDeleteRequest.setId(ID);
@ -161,7 +147,7 @@ public class EquitySecurityServiceTest extends AbstractServiceTest{
LISTING_MATCHER.assertMatch(listingResult, listingPrediction);
}
private EquitySecurity getEquitySecurity(){
private EquitySecurity getEquitySecurity() {
EquitySecurity equitySecurity = new EquitySecurity();
equitySecurity.setId(ID);
equitySecurity.setSecuritySymbol("SecuritySymbol");
@ -178,7 +164,7 @@ public class EquitySecurityServiceTest extends AbstractServiceTest{
return equitySecurity;
}
private EquitySecurityNewRequest getEquitySecurityNewRequest(EquitySecurity equitySecurity){
private EquitySecurityNewRequest getEquitySecurityNewRequest(EquitySecurity equitySecurity) {
EquitySecurityNewRequest equitySecurityNewRequest = new EquitySecurityNewRequest();
equitySecurityNewRequest.setSecuritySymbol(equitySecurity.getSecuritySymbol());
equitySecurityNewRequest.setShortName(equitySecurity.getShortName());
@ -194,7 +180,7 @@ public class EquitySecurityServiceTest extends AbstractServiceTest{
return equitySecurityNewRequest;
}
private EquitySecurityUpdateRequest getEquitySecurityUpdateRequest(EquitySecurity equitySecurity){
private EquitySecurityUpdateRequest getEquitySecurityUpdateRequest(EquitySecurity equitySecurity) {
EquitySecurityUpdateRequest equitySecurityUpdateRequest = new EquitySecurityUpdateRequest();
equitySecurityUpdateRequest.setId(equitySecurity.getId());
equitySecurityUpdateRequest.setSecuritySymbol(equitySecurity.getSecuritySymbol());

View file

@ -5,16 +5,12 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
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.securitites.FixedIncomeSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.FixedIncomeSecurityUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest;
import ru.spcex.clearing.securities.service.cud.FixedIncomeSecurityService;
import ru.spcex.clearing.securities.service.cud.MoneyMarketSecurityService;
import ru.spcex.clearing.securities.utils.MatcherFactory;
import javax.annotation.PostConstruct;
@ -25,31 +21,25 @@ import java.util.Map;
import static ru.spcex.clearing.securities.utils.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.securities.utils.TestUtils.*;
public class FixedIncomeSecurityServiceTest extends AbstractServiceTest{
public class FixedIncomeSecurityServiceTest extends AbstractServiceTest {
private static final MatcherFactory.Matcher<FixedIncomeSecurity> FIXED_INCOME_SECURITY_MATCHER = usingIgnoringFieldsComparator("created", "updated");
private final long ID = currentId.getAndIncrement();
private final int PARTITION = 0;
@Autowired
private FixedIncomeSecurityService fixedIncomeSecurityService;
@PostConstruct
protected void init() {
super.init();
}
/**
* {@link MoneyMarketSecurityService#newMoneyMarket(BaseRequest)}<br>
* Тест проверяет генерацию сущности {@link MoneyMarketSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link MoneyMarketSecurityNewRequest}:<br>
* {@link MoneyMarketSecurityNewRequest#lotSize} - 1.0<br>
* {@link MoneyMarketSecurityNewRequest#startDate} - текущее колличество секунд с 1970-01-01T00:00:00Z.<br>
* {@link MoneyMarketSecurityNewRequest#endDate} - текущее колличество секунд с 1970-01-01T00:00:00Z.<br>
* {@link MoneyMarketSecurityNewRequest#nominalValue} - 1.0<br>
* {@link MoneyMarketSecurityNewRequest#nominalCurrency} - 1L<br>
* {@link MoneyMarketSecurityNewRequest#instrumentType} - "sdgaga"<br>
* {@link MoneyMarketSecurityNewRequest#fullName} - "estat"<br>
* {@link FixedIncomeSecurityService#newFixedIncome(BaseRequest)}<br>
* Тест проверяет генерацию сущности {@link FixedIncomeSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link FixedIncomeSecurityNewRequest}:<br>
*/
@Test
public void newFixedIncome(){
public void newFixedIncome() {
clearAllInImdg(fixedIncomeSecurityImdg);
final String TOPIC = Consts.DESTINATION_FIXED_INCOME_SECURITY_NEW;
@ -77,14 +67,9 @@ public class FixedIncomeSecurityServiceTest extends AbstractServiceTest{
}
/**
* {@link MoneyMarketSecurityService#updateMoneyMarket(BaseRequest)}
* Тест проверяет обновление сущности {@link MoneyMarketSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link MoneyMarketSecurityUpdateRequest}:<br>
* {@link MoneyMarketSecurityUpdateRequest#fullName} - sfgsdfg<br>
* {@link MoneyMarketSecurityUpdateRequest#instrumentType} - qwerqwe<br>
* {@link MoneyMarketSecurityUpdateRequest#nominalCurrency} - RUB<br>
* {@link MoneyMarketSecurityUpdateRequest#nominalValue} - 2.0<br>
* {@link MoneyMarketSecurityUpdateRequest#endDate} - текущее колличество секунд с 1970-01-01T00:00:00Z + (24 * 3600)<br>
* {@link FixedIncomeSecurityService#updateFixedIncome(BaseRequest)}
* Тест проверяет обновление сущности {@link FixedIncomeSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link FixedIncomeSecurityUpdateRequest}:<br>
*/
@Test
public void updateFixedIncome() {
@ -123,13 +108,13 @@ public class FixedIncomeSecurityServiceTest extends AbstractServiceTest{
}
/**
* {@link MoneyMarketSecurityService#deleteMoneyMarket(BaseRequest)}<br>
* Тест проверяет удаление сущности {@link MoneyMarketSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* {@link FixedIncomeSecurityService#deleteFixedIncome(BaseRequest)}<br>
* Тест проверяет удаление сущности {@link FixedIncomeSecurity} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link CommonDeleteRequest}:<br>
* {@link CommonDeleteRequest#id} - Идентификатор записи<br>
*/
@Test
public void deleteFixedIncome(){
public void deleteFixedIncome() {
clearAllInImdg(moneyMarketSecurityMap);
final String TOPIC = Consts.DESTINATION_FIXED_INCOME_SECURITY_DELETE;
@ -139,7 +124,8 @@ public class FixedIncomeSecurityServiceTest extends AbstractServiceTest{
Listing listingPrediction = new Listing();
listingPrediction = listingBuilder.byFixedIncomeEquity(fixedIncomePrediction, listingPrediction);
listingImdg.insert(listingPrediction);listingPrediction.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
listingImdg.insert(listingPrediction);
listingPrediction.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
CommonDeleteRequest commonDeleteRequest = new CommonDeleteRequest();
commonDeleteRequest.setId(ID);
@ -163,7 +149,7 @@ public class FixedIncomeSecurityServiceTest extends AbstractServiceTest{
LISTING_MATCHER.assertMatch(listingResult, listingPrediction);
}
private FixedIncomeSecurity getFixedIncomeSecurity(){
private FixedIncomeSecurity getFixedIncomeSecurity() {
FixedIncomeSecurity fixedIncome = new FixedIncomeSecurity();
fixedIncome.setId(ID);
fixedIncome.setSecuritySymbol("SecuritySymbol");
@ -187,7 +173,7 @@ public class FixedIncomeSecurityServiceTest extends AbstractServiceTest{
return fixedIncome;
}
private FixedIncomeSecurityNewRequest getFixedIncomeSecurityNewRequest(FixedIncomeSecurity fixedIncomeSecurity){
private FixedIncomeSecurityNewRequest getFixedIncomeSecurityNewRequest(FixedIncomeSecurity fixedIncomeSecurity) {
FixedIncomeSecurityNewRequest fixedIncomeSecurityNewRequest = new FixedIncomeSecurityNewRequest();
fixedIncomeSecurityNewRequest.setSecuritySymbol(fixedIncomeSecurity.getSecuritySymbol());
fixedIncomeSecurityNewRequest.setShortName(fixedIncomeSecurity.getShortName());
@ -208,7 +194,7 @@ public class FixedIncomeSecurityServiceTest extends AbstractServiceTest{
return fixedIncomeSecurityNewRequest;
}
private FixedIncomeSecurityUpdateRequest getFixedIncomeSecurityUpdateRequest(FixedIncomeSecurity fixedIncomeSecurity){
private FixedIncomeSecurityUpdateRequest getFixedIncomeSecurityUpdateRequest(FixedIncomeSecurity fixedIncomeSecurity) {
FixedIncomeSecurityUpdateRequest equitySecurityUpdateRequest = new FixedIncomeSecurityUpdateRequest();
equitySecurityUpdateRequest.setId(fixedIncomeSecurity.getId());
equitySecurityUpdateRequest.setSecuritySymbol(fixedIncomeSecurity.getSecuritySymbol());

View file

@ -0,0 +1,26 @@
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
import com.fasterxml.jackson.annotation.JsonProperty;
public class CurrencyNewRequest{
@JsonProperty
public String countryCode;
@JsonProperty
public String currencyCode;
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
public String getCurrencyCode() {
return currencyCode;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
}

View file

@ -0,0 +1,39 @@
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
import com.fasterxml.jackson.annotation.JsonProperty;
import ru.spcex.platform.classes.base.interfaces.WithId;
public class CurrencyUpdateRequest implements WithId {
@JsonProperty
public Long id;
@JsonProperty
public String countryCode;
@JsonProperty
public String currencyCode;
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
public String getCurrencyCode() {
return currencyCode;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
}