diff --git a/pom.xml b/pom.xml
index 72bd2c7d..13ac17bc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,6 +94,7 @@
dev.vality
damsel
+ 1.699-7280b62
dev.vality
diff --git a/src/main/java/dev/vality/proxy/mocketbank/handler/oct/OctServerHandler.java b/src/main/java/dev/vality/proxy/mocketbank/handler/oct/OctServerHandler.java
index a52bb34f..6b65ed19 100644
--- a/src/main/java/dev/vality/proxy/mocketbank/handler/oct/OctServerHandler.java
+++ b/src/main/java/dev/vality/proxy/mocketbank/handler/oct/OctServerHandler.java
@@ -31,6 +31,8 @@
@RequiredArgsConstructor
public class OctServerHandler implements AdapterSrv.Iface {
+ private static final int AMOUNT_CHANGE_DIVISOR = 2;
+
private final CdsService cdsService;
private final ErrorMapping errorMapping;
private final List cardPayoutList;
@@ -48,6 +50,12 @@ public ProcessResult processWithdrawal(
Optional cardPayout = PayoutUtils.extractCardPayoutByPan(cardPayoutList, cardData.getPan());
if (cardPayout.isPresent()) {
log.info("Found card payout with action {}", cardPayout.get().getAction());
+ if (CardPayoutAction.isAmountChanged(cardPayout.get())) {
+ return createSuccessResult(withdrawal).setNewBody(
+ new Cash(withdrawal.getBody())
+ .setAmount(withdrawal.getBody().getAmount() / AMOUNT_CHANGE_DIVISOR)
+ );
+ }
if (CardPayoutAction.isCardFailed(cardPayout.get())) {
CardPayoutAction action = CardPayoutAction.findByValue(cardPayout.get().getAction());
log.info("Failed card payout with action {}", action);
@@ -56,10 +64,7 @@ public ProcessResult processWithdrawal(
}
}
- TransactionInfo transactionInfo =
- DomainPackageCreators.createTransactionInfo(withdrawal.getId(), Collections.emptyMap());
- Intent intent = WithdrawalsProviderAdapterPackageCreators.createFinishIntentSuccess(transactionInfo);
- return WithdrawalsProviderAdapterPackageCreators.createProcessResult(intent);
+ return createSuccessResult(withdrawal);
}
@Override
@@ -102,4 +107,11 @@ private static String getCurrentDateTimeByPattern(Long timestamp) {
return Instant.ofEpochMilli(timestamp).toString();
}
+ private static ProcessResult createSuccessResult(Withdrawal withdrawal) {
+ TransactionInfo transactionInfo =
+ DomainPackageCreators.createTransactionInfo(withdrawal.getId(), Collections.emptyMap());
+ Intent intent = WithdrawalsProviderAdapterPackageCreators.createFinishIntentSuccess(transactionInfo);
+ return WithdrawalsProviderAdapterPackageCreators.createProcessResult(intent);
+ }
+
}
diff --git a/src/main/java/dev/vality/proxy/mocketbank/utils/payout/CardPayoutAction.java b/src/main/java/dev/vality/proxy/mocketbank/utils/payout/CardPayoutAction.java
index dca42237..3b311ddd 100644
--- a/src/main/java/dev/vality/proxy/mocketbank/utils/payout/CardPayoutAction.java
+++ b/src/main/java/dev/vality/proxy/mocketbank/utils/payout/CardPayoutAction.java
@@ -13,7 +13,8 @@ public enum CardPayoutAction {
INSUFFICIENT_FUNDS("Insufficient Funds"),
INVALID_CARD("Invalid Card"),
EXPIRED_CARD("Expired Card"),
- UNKNOWN_FAILURE("Unknown Failure");
+ UNKNOWN_FAILURE("Unknown Failure"),
+ CHANGE_AMOUNT("Change Amount");
private static final CardPayoutAction[] FAILED_CARDS = {
INSUFFICIENT_FUNDS,
@@ -39,4 +40,8 @@ public static boolean isCardFailed(CardPayoutAction action) {
return Arrays.asList(FAILED_CARDS).contains(action);
}
+ public static boolean isAmountChanged(CardPayout card) {
+ return CHANGE_AMOUNT == findByValue(card.getAction());
+ }
+
}
diff --git a/src/main/resources/fixture/payout.csv b/src/main/resources/fixture/payout.csv
index 4e6c9362..aa68b39c 100644
--- a/src/main/resources/fixture/payout.csv
+++ b/src/main/resources/fixture/payout.csv
@@ -7,3 +7,4 @@ cardPan, action, paymentSystem
5105105105105100, Expired Card, MasterCard
4111110000000112, Unknown Failure, Visa
5124990000000002, Unknown Failure, MasterCard
+4000000000000077, Change Amount, Visa
diff --git a/src/test/java/dev/vality/proxy/mocketbank/handler/oct/OctServerHandlerTest.java b/src/test/java/dev/vality/proxy/mocketbank/handler/oct/OctServerHandlerTest.java
index 67ee6a58..7e485918 100644
--- a/src/test/java/dev/vality/proxy/mocketbank/handler/oct/OctServerHandlerTest.java
+++ b/src/test/java/dev/vality/proxy/mocketbank/handler/oct/OctServerHandlerTest.java
@@ -12,9 +12,10 @@
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import static dev.vality.adapter.common.damsel.WithdrawalsProviderVerification.isSuccess;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
-import static org.springframework.test.util.AssertionErrors.assertTrue;
@Slf4j
@SpringBootTest
@@ -41,7 +42,31 @@ void testProcessWithdrawal() throws Exception {
createProxyOptions()
);
log.info("Response processWithdrawal {}", result);
- assertTrue("Result processWithdrawal isn`t success", isSuccess(result));
+ assertTrue(isSuccess(result), "Result processWithdrawal isn`t success");
+ }
+
+ @Test
+ void testProcessWithdrawalWithChangedAmount() throws Exception {
+ CardData cardData = new CardData()
+ .setPan("4000000000000077")
+ .setCardholderName(randomString());
+ BankCard bankCard = new BankCard()
+ .setToken(randomString())
+ .setCardholderName(randomString())
+ .setBin(randomString());
+ when(cdsStorageClient.getCardData(anyString())).thenReturn(cardData);
+
+ var withdrawal = createWithdrawal(bankCard);
+ ProcessResult result = handler.processWithdrawal(
+ withdrawal,
+ Value.str(""),
+ createProxyOptions()
+ );
+
+ assertTrue(isSuccess(result), "Result processWithdrawal isn`t success");
+ assertTrue(result.isSetNewBody(), "Result processWithdrawal doesn`t contain new body");
+ assertEquals(withdrawal.getBody().getAmount() / 2, result.getNewBody().getAmount());
+ assertEquals(withdrawal.getBody().getCurrency(), result.getNewBody().getCurrency());
}
}