http://jira.mfd.msk:8088/browse/CLS-130 added test SdfCreatorBySTLDPayment

This commit is contained in:
ialbert 2023-02-07 13:36:37 +03:00
parent d22a4048aa
commit 2ad1233863

View file

@ -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<Long, ClearingCategory> 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<Long, ClearingCategory, Long> 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<Long, PaymentInstruction> bySender = sender -> {
PaymentInstruction pmt = new PaymentInstruction();
pmt.setSenderId(sender);
return pmt;
};
List<PaymentInstruction> 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<Map.Entry<SdfCreatorBySTLDPayment.GroupWrapper, Collection<List<PaymentInstruction>>>> 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<Map.Entry<SdfCreatorBySTLDPayment.GroupWrapper, Collection<List<PaymentInstruction>>>> group) {
return (senderId, order, count) -> {
//получаем группы относящиеся к order категории
Map.Entry<SdfCreatorBySTLDPayment.GroupWrapper, Collection<List<PaymentInstruction>>> entry = group.get(order);
Collection<List<PaymentInstruction>> allSenderForThisCategory = entry.getValue();
//находим нашего sender
List<PaymentInstruction> 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<SdfCreatorBySTLDPayment.GroupWrapper, Collection<List<PaymentInstruction>>> otherEntry = group.get(i);
Collection<List<PaymentInstruction>> 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);
}
}