http://jira.mfd.msk:8088/browse/CLS-130 added test SdfCreatorBySTLDPayment
This commit is contained in:
parent
d22a4048aa
commit
2ad1233863
1 changed files with 131 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue