diff --git a/src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java b/src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java new file mode 100644 index 00000000..c8181861 --- /dev/null +++ b/src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java @@ -0,0 +1,65 @@ +package org.folio.dcb.integration.kafka; + +import static org.folio.dcb.integration.kafka.CirculationEventListener.CHECK_IN_LISTENER_ID; +import static org.folio.dcb.integration.kafka.CirculationEventListener.CHECK_OUT_LOAN_LISTENER_ID; +import static org.folio.dcb.integration.kafka.CirculationEventListener.REQUEST_LISTENER_ID; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; +import org.springframework.kafka.listener.MessageListenerContainer; + +@ExtendWith(MockitoExtension.class) +class KafkaServiceTest { + + @InjectMocks + private KafkaService kafkaService; + + @Mock + private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; + + @Test + void restartEventListenersShouldRestartAllDefinedListeners() { + // TestMate-45dd7ecc27dbf76d9b9b89c85033baae + var loanContainer = mock(MessageListenerContainer.class); + var checkInContainer = mock(MessageListenerContainer.class); + var requestContainer = mock(MessageListenerContainer.class); + when(kafkaListenerEndpointRegistry.getListenerContainer(CHECK_OUT_LOAN_LISTENER_ID)).thenReturn(loanContainer); + when(kafkaListenerEndpointRegistry.getListenerContainer(CHECK_IN_LISTENER_ID)).thenReturn(checkInContainer); + when(kafkaListenerEndpointRegistry.getListenerContainer(REQUEST_LISTENER_ID)).thenReturn(requestContainer); + var inOrder = inOrder(loanContainer, checkInContainer, requestContainer); + + kafkaService.restartEventListeners(); + + inOrder.verify(loanContainer).stop(); + inOrder.verify(loanContainer).start(); + inOrder.verify(checkInContainer).stop(); + inOrder.verify(checkInContainer).start(); + inOrder.verify(requestContainer).stop(); + inOrder.verify(requestContainer).start(); + } + + @Test + void restartEventListenersShouldHandleMissingContainersGracefully() { + // TestMate-8b6eec42e68f12f44653dac2c23cba01 + var loanContainer = mock(MessageListenerContainer.class); + var requestContainer = mock(MessageListenerContainer.class); + when(kafkaListenerEndpointRegistry.getListenerContainer(CHECK_OUT_LOAN_LISTENER_ID)).thenReturn(loanContainer); + when(kafkaListenerEndpointRegistry.getListenerContainer(CHECK_IN_LISTENER_ID)).thenReturn(null); + when(kafkaListenerEndpointRegistry.getListenerContainer(REQUEST_LISTENER_ID)).thenReturn(requestContainer); + var inOrder = inOrder(loanContainer, requestContainer); + + kafkaService.restartEventListeners(); + + inOrder.verify(loanContainer).stop(); + inOrder.verify(loanContainer).start(); + inOrder.verify(requestContainer).stop(); + inOrder.verify(requestContainer).start(); + } +} diff --git a/src/test/java/org/folio/dcb/integration/kafka/TransactionHelperTest.java b/src/test/java/org/folio/dcb/integration/kafka/TransactionHelperTest.java new file mode 100644 index 00000000..09ecd4af --- /dev/null +++ b/src/test/java/org/folio/dcb/integration/kafka/TransactionHelperTest.java @@ -0,0 +1,75 @@ +package org.folio.dcb.integration.kafka; + +import static java.util.Collections.emptyMap; +import static org.assertj.core.api.Assertions.assertThat; + +import java.nio.charset.StandardCharsets; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.messaging.MessageHeaders; + +@ExtendWith(MockitoExtension.class) +class TransactionHelperTest { + + @Test + void getHeaderValue_positive_shouldReturnHeaderValueWhenExists() { + // TestMate-2d5040ffc335eec4a8a7920946d099b8 + var headerName = "x-okapi-tenant"; + var headerValue = "diku"; + var defaultValue = "default-tenant"; + var headers = new MessageHeaders(Map.of(headerName, headerValue.getBytes(StandardCharsets.UTF_8))); + + var result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + + assertThat(result).hasSize(1).containsExactly(headerValue); + } + + @Test + void getHeaderValue_positive_shouldReturnDefaultValueWhenHeaderMissing() { + // TestMate-0d2c51271449a74c5b6391cb2241f2a8 + var headerName = "missing-header"; + var defaultValue = "fallback"; + var headers = new MessageHeaders(emptyMap()); + + var result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + + assertThat(result).hasSize(1).containsExactly(defaultValue); + } + + @Test + void getHeaderValue_positive_shouldReturnEmptyListWhenBothValueAndDefaultAreNull() { + // TestMate-4423ae29a46220bb8c5e8ca0ce09bb97 + var headerName = "non-existent-header"; + var headers = new MessageHeaders(emptyMap()); + var result = TransactionHelper.getHeaderValue(headers, headerName, null); + assertThat(result).isEmpty(); + } + + @Test + void getHeaderValue_positive_shouldHandleEmptyByteArrayHeader() { + // TestMate-bfbbbd329f6a2dc1d12c169998db4db5 + var headerName = "test-header"; + var defaultValue = "default"; + var emptyHeaderValue = new byte[0]; + var headers = new MessageHeaders(Map.of(headerName, emptyHeaderValue)); + + var result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + + assertThat(result).hasSize(1).containsExactly(""); + } + + @Test + void getHeaderValue_positive_shouldHandleSpecialCharactersInUtf8() { + // TestMate-75141cc3fdff80ada4b6ce4d76e31673 + var headerName = "special-header"; + var headerValue = "tést-vålue"; + var defaultValue = "default"; + var headers = new MessageHeaders(Map.of(headerName, headerValue.getBytes(StandardCharsets.UTF_8))); + + var result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + + assertThat(result).hasSize(1).containsExactly(headerValue); + } +}