From 2ad1233863a1545fb1ee4126d18270c5f69bf5d4 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 7 Feb 2023 13:36:37 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-130 added test SdfCreatorBySTLDPayment --- .../service/SdfCreatorBySTLDPaymentTest.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/SdfCreatorBySTLDPaymentTest.java diff --git a/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/SdfCreatorBySTLDPaymentTest.java b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/SdfCreatorBySTLDPaymentTest.java new file mode 100644 index 000000000..b0f4e27ef --- /dev/null +++ b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/SdfCreatorBySTLDPaymentTest.java @@ -0,0 +1,131 @@ +package ru.spcex.clearing.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; +import ru.spcex.platform.enumeration.ClearingCategory; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +class SdfCreatorBySTLDPaymentTest { + private SdfCreatorBySTLDPayment sdfCreatorBySTLDPayment; + private Map categories; + + @BeforeEach + void setUp() { + ImdgProvider mock = Mockito.mock(ImdgProvider.class); + sdfCreatorBySTLDPayment = new SdfCreatorBySTLDPayment(mock, null, null); + //create a Mockito spy for the sdfCreatorBySTLDPayment object + //when getClearingCategory is called, return the value from the categories map by paymentInstruction.getSenderId() + sdfCreatorBySTLDPayment = Mockito.spy(sdfCreatorBySTLDPayment); + Mockito.doAnswer(invocation -> { + Object[] args = invocation.getArguments(); + return categories.get(((PaymentInstruction) args[0]).getSenderId()); + }).when(sdfCreatorBySTLDPayment).getClearingCategory(Mockito.any()); + } + + @Test + public void testSdfCreatorBySTLDPaymentGrouping() { + categories = new LinkedHashMap<>(); + BiFunction senderGen = (senderId, category) -> { + categories.put(senderId, category); + return senderId; + }; + Long i1 = senderGen.apply(1000L, ClearingCategory.I); + Long i2 = senderGen.apply(1001L, ClearingCategory.I); + Long i3 = senderGen.apply(1002L, ClearingCategory.I); + Long i4 = senderGen.apply(1003L, ClearingCategory.I); + + Long v1 = senderGen.apply(2000L, ClearingCategory.V); + Long v2 = senderGen.apply(2001L, ClearingCategory.V); + Long v3 = senderGen.apply(2002L, ClearingCategory.V); + + Long b1 = senderGen.apply(3000L, ClearingCategory.B); + Long b2 = senderGen.apply(3001L, ClearingCategory.B); + + Function bySender = sender -> { + PaymentInstruction pmt = new PaymentInstruction(); + pmt.setSenderId(sender); + return pmt; + }; + + List payments = new ArrayList<>(); + payments.add(bySender.apply(b1)); + payments.add(bySender.apply(i4)); + payments.add(bySender.apply(i4)); + payments.add(bySender.apply(v2)); + payments.add(bySender.apply(1L)); + payments.add(bySender.apply(b1)); + payments.add(bySender.apply(b2)); + payments.add(bySender.apply(v3)); + payments.add(bySender.apply(i3)); + payments.add(bySender.apply(1L)); + payments.add(bySender.apply(1L)); + payments.add(bySender.apply(i2)); + payments.add(bySender.apply(i1)); + payments.add(bySender.apply(v1)); + payments.add(bySender.apply(v2)); + payments.add(bySender.apply(b2)); + + List>>> group = sdfCreatorBySTLDPayment.group(payments); + + assertEquals(4, group.size()); + SenderChecker checker = checker(group); + //order i 1 v b + checker.check(i1, 0, 1); + checker.check(i2, 0, 1); + checker.check(i3, 0, 1); + checker.check(i4, 0, 2); + + checker.check(1L, 1, 3); + + checker.check(v1, 2, 1); + checker.check(v2, 2, 2); + + checker.check(b1, 3, 2); + checker.check(b2, 3, 2); + } + + + private SenderChecker + checker(List>>> group) { + return (senderId, order, count) -> { + //получаем группы относящиеся к order категории + Map.Entry>> entry = group.get(order); + Collection> allSenderForThisCategory = entry.getValue(); + //находим нашего sender + List senderFound = allSenderForThisCategory.stream().filter(paymentInstructions -> { + PaymentInstruction specificSender = paymentInstructions.iterator().next(); + return specificSender.getSenderId().equals(senderId); + }).findFirst().orElseThrow(() -> new RuntimeException("Sender " + senderId + " not found")); + //проверяем количество PaymentInstruction + assertEquals(count, senderFound.size()); + //проверяем что в остальных группах нет нашего sender + for (int i = 0; i < group.size(); i++) { + if (i == order) { + continue; + } + Map.Entry>> otherEntry = group.get(i); + Collection> otherAllSenderForThisCategory = otherEntry.getValue(); + boolean found = otherAllSenderForThisCategory.stream().anyMatch(paymentInstructions -> { + PaymentInstruction specificSender = paymentInstructions.iterator().next(); + return specificSender.getSenderId().equals(senderId); + }); + assertFalse(found); + } + }; + } + + @FunctionalInterface + private interface SenderChecker { + void check(Long senderId, Integer order, Integer count); + } + +} \ No newline at end of file