FINERACT-1694: Bulk event support

This commit is contained in:
Arnold Galovics
2022-09-12 14:45:34 +02:00
committed by Arnold Gálovics
parent a0749ffe19
commit 7558b09def
18 changed files with 556 additions and 13 deletions
@@ -20,26 +20,33 @@ package org.apache.fineract.infrastructure.event.external.service;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import org.apache.fineract.avro.BulkMessageItemV1;
import org.apache.fineract.avro.loan.v1.LoanAccountDataV1;
import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.infrastructure.event.business.domain.BulkBusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.external.repository.ExternalEventRepository;
import org.apache.fineract.infrastructure.event.external.repository.domain.ExternalEvent;
import org.apache.fineract.infrastructure.event.external.service.idempotency.ExternalEventIdempotencyKeyGenerator;
import org.apache.fineract.infrastructure.event.external.service.serialization.BusinessEventSerializerFactory;
import org.apache.fineract.infrastructure.event.external.service.message.BulkMessageItemFactory;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializerFactory;
import org.apache.fineract.infrastructure.event.external.service.support.ByteBufferConverter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -58,13 +65,18 @@ class ExternalEventServiceTest {
@Mock
private BusinessEventSerializerFactory serializerFactory;
@Mock
private ByteBufferConverter byteBufferConverter;
@Mock
private BulkMessageItemFactory bulkMessageItemFactory;
@Mock
private EntityManager entityManager;
private ExternalEventService underTest;
@BeforeEach
public void setUp() {
underTest = new ExternalEventService(repository, idempotencyKeyGenerator, serializerFactory);
underTest = new ExternalEventService(repository, idempotencyKeyGenerator, serializerFactory, byteBufferConverter,
bulkMessageItemFactory);
underTest.setEntityManager(entityManager);
FineractPlatformTenant tenant = new FineractPlatformTenant(1L, "default", "Default Tenant", "Europe/Budapest", null);
ThreadLocalContextUtil.setTenant(tenant);
@@ -94,7 +106,7 @@ class ExternalEventServiceTest {
}
@Test
public void testPostEventShouldWork() throws IOException {
public void testPostEventShouldWorkWithRegularEvent() throws IOException {
// given
ArgumentCaptor<ExternalEvent> externalEventArgumentCaptor = ArgumentCaptor.forClass(ExternalEvent.class);
@@ -120,4 +132,31 @@ class ExternalEventServiceTest {
assertThat(externalEvent.getType()).isEqualTo(eventType);
assertThat(externalEvent.getSchema()).isEqualTo(eventSchema);
}
@Test
public void testPostEventShouldWorkWithBulkEvent() throws IOException {
// given
ArgumentCaptor<ExternalEvent> externalEventArgumentCaptor = ArgumentCaptor.forClass(ExternalEvent.class);
String eventType = "BulkBusinessEvent";
String schema = "org.apache.fineract.avro.BulkMessagePayloadV1";
String idempotencyKey = "key";
BusinessEvent event = mock(BusinessEvent.class);
BulkMessageItemV1 messageItem = new BulkMessageItemV1(1, "", "", "", ByteBuffer.wrap(new byte[0]));
BulkBusinessEvent bulkEvent = new BulkBusinessEvent(List.of(event));
byte[] data = new byte[0];
given(bulkMessageItemFactory.createBulkMessageItem(1, event)).willReturn(messageItem);
given(idempotencyKeyGenerator.generate(bulkEvent)).willReturn(idempotencyKey);
given(byteBufferConverter.convert(any(ByteBuffer.class))).willReturn(data);
// when
underTest.postEvent(bulkEvent);
// then
verify(repository).save(externalEventArgumentCaptor.capture());
ExternalEvent externalEvent = externalEventArgumentCaptor.getValue();
assertThat(externalEvent.getIdempotencyKey()).isEqualTo(idempotencyKey);
assertThat(externalEvent.getData()).isEqualTo(data);
assertThat(externalEvent.getType()).isEqualTo(eventType);
assertThat(externalEvent.getSchema()).isEqualTo(schema);
}
}