From 61d91a6edd397ea7fdb10f8151a05ab98403a9b2 Mon Sep 17 00:00:00 2001 From: aitestmate Date: Wed, 8 Apr 2026 16:42:32 +0000 Subject: [PATCH 1/2] [chore] [mod-dcb] unit tests --- .../integration/kafka/KafkaServiceTest.java | 68 ++++++++++++ .../kafka/TransactionHelperTest.java | 104 ++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java create mode 100644 src/test/java/org/folio/dcb/integration/kafka/TransactionHelperTest.java 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..6b093022 --- /dev/null +++ b/src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java @@ -0,0 +1,68 @@ +package org.folio.dcb.integration.kafka; + +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.junit.jupiter.api.Test; +import org.mockito.InOrder; +import org.springframework.kafka.listener.MessageListenerContainer; +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; + +@ExtendWith(MockitoExtension.class) +class KafkaServiceTest { + + @InjectMocks + private KafkaService kafkaService; + + @Mock + private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; + + @Test + void restartEventListenersShouldRestartAllDefinedListeners() { + // TestMate-45dd7ecc27dbf76d9b9b89c85033baae + // Given + MessageListenerContainer loanContainer = mock(MessageListenerContainer.class); + MessageListenerContainer checkInContainer = mock(MessageListenerContainer.class); + MessageListenerContainer 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); + InOrder inOrder = inOrder(loanContainer, checkInContainer, requestContainer); + // When + kafkaService.restartEventListeners(); + // Then + 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 + // Given + MessageListenerContainer loanContainer = mock(MessageListenerContainer.class); + MessageListenerContainer 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); + InOrder inOrder = inOrder(loanContainer, requestContainer); + // When + kafkaService.restartEventListeners(); + // Then + 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..405fe182 --- /dev/null +++ b/src/test/java/org/folio/dcb/integration/kafka/TransactionHelperTest.java @@ -0,0 +1,104 @@ +package org.folio.dcb.integration.kafka; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.folio.dcb.integration.kafka.TransactionHelper; +import org.junit.jupiter.api.Test; +import org.springframework.messaging.MessageHeaders; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import static org.assertj.core.api.Assertions.assertThat; +import java.util.Collections; + +@ExtendWith(MockitoExtension.class) +class TransactionHelperTest { + + @Test + void getHeaderValue_positive_shouldReturnHeaderValueWhenExists() { + // TestMate-2d5040ffc335eec4a8a7920946d099b8 + // Given + String headerName = "x-okapi-tenant"; + String headerValue = "diku"; + String defaultValue = "default-tenant"; + byte[] headerValueBytes = headerValue.getBytes(StandardCharsets.UTF_8); + Map headersMap = new HashMap<>(); + headersMap.put(headerName, headerValueBytes); + MessageHeaders headers = new MessageHeaders(headersMap); + // When + List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + // Then + assertThat(result) + .hasSize(1) + .containsExactly(headerValue); + } + + @Test + void getHeaderValue_positive_shouldReturnDefaultValueWhenHeaderMissing() { + // TestMate-0d2c51271449a74c5b6391cb2241f2a8 + // Given + String headerName = "missing-header"; + String defaultValue = "fallback"; + Map headersMap = new HashMap<>(); + MessageHeaders headers = new MessageHeaders(headersMap); + // When + List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + // Then + assertThat(result) + .hasSize(1) + .containsExactly(defaultValue); + } + + @Test + void getHeaderValue_positive_shouldReturnEmptyListWhenBothValueAndDefaultAreNull() { + // TestMate-4423ae29a46220bb8c5e8ca0ce09bb97 + // Given + String headerName = "non-existent-header"; + String defaultValue = null; + Map headersMap = new HashMap<>(); + MessageHeaders headers = new MessageHeaders(headersMap); + // When + List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + // Then + assertThat(result).isEmpty(); + } + + @Test + void getHeaderValue_positive_shouldHandleEmptyByteArrayHeader() { + // TestMate-bfbbbd329f6a2dc1d12c169998db4db5 + // Given + String headerName = "test-header"; + String defaultValue = "default"; + byte[] emptyHeaderValue = new byte[0]; + Map headersMap = new HashMap<>(); + headersMap.put(headerName, emptyHeaderValue); + MessageHeaders headers = new MessageHeaders(headersMap); + // When + List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + // Then + assertThat(result) + .hasSize(1) + .containsExactly(""); + } + + @Test + void getHeaderValue_positive_shouldHandleSpecialCharactersInUtf8() { + // TestMate-75141cc3fdff80ada4b6ce4d76e31673 + // Given + String headerName = "special-header"; + String headerValue = "tést-vålue"; + String defaultValue = "default"; + byte[] headerValueBytes = headerValue.getBytes(StandardCharsets.UTF_8); + Map headersMap = new HashMap<>(); + headersMap.put(headerName, headerValueBytes); + MessageHeaders headers = new MessageHeaders(headersMap); + // When + List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); + // Then + assertThat(result) + .hasSize(1) + .containsExactly(headerValue); + } + +} From 89bc3916642e099e184b8b6bd79bda08f84d42d1 Mon Sep 17 00:00:00 2001 From: Pavel Filippov Date: Tue, 16 Jun 2026 17:11:40 +0300 Subject: [PATCH 2/2] fix(tests): Fix tests to follow general codestyle --- .../integration/kafka/KafkaServiceTest.java | 45 ++++--- .../kafka/TransactionHelperTest.java | 119 +++++++----------- 2 files changed, 66 insertions(+), 98 deletions(-) diff --git a/src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java b/src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java index 6b093022..c8181861 100644 --- a/src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java +++ b/src/test/java/org/folio/dcb/integration/kafka/KafkaServiceTest.java @@ -1,13 +1,5 @@ package org.folio.dcb.integration.kafka; -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.junit.jupiter.api.Test; -import org.mockito.InOrder; -import org.springframework.kafka.listener.MessageListenerContainer; 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; @@ -15,6 +7,14 @@ 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 { @@ -24,20 +24,19 @@ class KafkaServiceTest { @Mock private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; - @Test + @Test void restartEventListenersShouldRestartAllDefinedListeners() { // TestMate-45dd7ecc27dbf76d9b9b89c85033baae - // Given - MessageListenerContainer loanContainer = mock(MessageListenerContainer.class); - MessageListenerContainer checkInContainer = mock(MessageListenerContainer.class); - MessageListenerContainer requestContainer = mock(MessageListenerContainer.class); + 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); - InOrder inOrder = inOrder(loanContainer, checkInContainer, requestContainer); - // When + var inOrder = inOrder(loanContainer, checkInContainer, requestContainer); + kafkaService.restartEventListeners(); - // Then + inOrder.verify(loanContainer).stop(); inOrder.verify(loanContainer).start(); inOrder.verify(checkInContainer).stop(); @@ -46,23 +45,21 @@ void restartEventListenersShouldRestartAllDefinedListeners() { inOrder.verify(requestContainer).start(); } - @Test + @Test void restartEventListenersShouldHandleMissingContainersGracefully() { // TestMate-8b6eec42e68f12f44653dac2c23cba01 - // Given - MessageListenerContainer loanContainer = mock(MessageListenerContainer.class); - MessageListenerContainer requestContainer = mock(MessageListenerContainer.class); + 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); - InOrder inOrder = inOrder(loanContainer, requestContainer); - // When + var inOrder = inOrder(loanContainer, requestContainer); + kafkaService.restartEventListeners(); - // Then + 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 index 405fe182..09ecd4af 100644 --- a/src/test/java/org/folio/dcb/integration/kafka/TransactionHelperTest.java +++ b/src/test/java/org/folio/dcb/integration/kafka/TransactionHelperTest.java @@ -1,104 +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.folio.dcb.integration.kafka.TransactionHelper; -import org.junit.jupiter.api.Test; import org.springframework.messaging.MessageHeaders; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import static org.assertj.core.api.Assertions.assertThat; -import java.util.Collections; @ExtendWith(MockitoExtension.class) class TransactionHelperTest { - @Test + @Test void getHeaderValue_positive_shouldReturnHeaderValueWhenExists() { // TestMate-2d5040ffc335eec4a8a7920946d099b8 - // Given - String headerName = "x-okapi-tenant"; - String headerValue = "diku"; - String defaultValue = "default-tenant"; - byte[] headerValueBytes = headerValue.getBytes(StandardCharsets.UTF_8); - Map headersMap = new HashMap<>(); - headersMap.put(headerName, headerValueBytes); - MessageHeaders headers = new MessageHeaders(headersMap); - // When - List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); - // Then - assertThat(result) - .hasSize(1) - .containsExactly(headerValue); + 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 + @Test void getHeaderValue_positive_shouldReturnDefaultValueWhenHeaderMissing() { // TestMate-0d2c51271449a74c5b6391cb2241f2a8 - // Given - String headerName = "missing-header"; - String defaultValue = "fallback"; - Map headersMap = new HashMap<>(); - MessageHeaders headers = new MessageHeaders(headersMap); - // When - List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); - // Then - assertThat(result) - .hasSize(1) - .containsExactly(defaultValue); + 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 + @Test void getHeaderValue_positive_shouldReturnEmptyListWhenBothValueAndDefaultAreNull() { // TestMate-4423ae29a46220bb8c5e8ca0ce09bb97 - // Given - String headerName = "non-existent-header"; - String defaultValue = null; - Map headersMap = new HashMap<>(); - MessageHeaders headers = new MessageHeaders(headersMap); - // When - List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); - // Then + var headerName = "non-existent-header"; + var headers = new MessageHeaders(emptyMap()); + var result = TransactionHelper.getHeaderValue(headers, headerName, null); assertThat(result).isEmpty(); } - @Test + @Test void getHeaderValue_positive_shouldHandleEmptyByteArrayHeader() { // TestMate-bfbbbd329f6a2dc1d12c169998db4db5 - // Given - String headerName = "test-header"; - String defaultValue = "default"; - byte[] emptyHeaderValue = new byte[0]; - Map headersMap = new HashMap<>(); - headersMap.put(headerName, emptyHeaderValue); - MessageHeaders headers = new MessageHeaders(headersMap); - // When - List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); - // Then - assertThat(result) - .hasSize(1) - .containsExactly(""); + 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 + @Test void getHeaderValue_positive_shouldHandleSpecialCharactersInUtf8() { // TestMate-75141cc3fdff80ada4b6ce4d76e31673 - // Given - String headerName = "special-header"; - String headerValue = "tést-vålue"; - String defaultValue = "default"; - byte[] headerValueBytes = headerValue.getBytes(StandardCharsets.UTF_8); - Map headersMap = new HashMap<>(); - headersMap.put(headerName, headerValueBytes); - MessageHeaders headers = new MessageHeaders(headersMap); - // When - List result = TransactionHelper.getHeaderValue(headers, headerName, defaultValue); - // Then - assertThat(result) - .hasSize(1) - .containsExactly(headerValue); - } + 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); + } }