diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java index b4012fd71ce827623b2204ac56a62ab82ca530bf..e1446a7fe8bdeaf2c4eb7e39b66324650f135314 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java @@ -9,9 +9,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import de.ozgcloud.nachrichten.postfach.PostfachNachricht; +import de.ozgcloud.nachrichten.postfach.osiv2.OsiPostfachException; import de.ozgcloud.nachrichten.postfach.osiv2.config.Osi2PostfachProperties; import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.MessageExchangeApi; import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeReceiveMessage; +import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeReceiveMessagesResponse; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -25,7 +27,7 @@ public class PostfachApiFacadeService { private final Osi2RequestMapper osi2RequestMapper; private final Osi2ResponseMapper osi2ResponseMapper; - private static final int MAX_NUMBER_RECEIVED_MESSAGES = 100; + static final int MAX_NUMBER_RECEIVED_MESSAGES = 100; public void sendMessage(PostfachNachricht nachricht) { messageExchangeApi.sendMessage( @@ -35,12 +37,16 @@ public class PostfachApiFacadeService { } public Stream<PostfachNachricht> receiveMessages() { - var response = messageExchangeApi.receiveMessages(MAX_NUMBER_RECEIVED_MESSAGES, 0); - return Optional.ofNullable(response.getMessages()) + return Optional.ofNullable(receiveMessagesResponse().getMessages()) .stream() .flatMap(Collection::stream) .map(this::fetchMessageByGuid); } + + private MessageExchangeReceiveMessagesResponse receiveMessagesResponse() { + return Optional.ofNullable(messageExchangeApi.receiveMessages(MAX_NUMBER_RECEIVED_MESSAGES, 0)) + .orElseThrow(() -> new OsiPostfachException("Expect non empty response!", null)); + } PostfachNachricht fetchMessageByGuid(final MessageExchangeReceiveMessage message) { var messageReply = messageExchangeApi.getMessage(message.getGuid()); diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java index 82d1fd7a1bc3c4789ec9a9dc2ee0ef9a15b8263e..fd5c11bc956b400822c0dd6064fa7bb4dcc7794d 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java @@ -87,7 +87,7 @@ class OsiPostfachRemoteServiceRemoteITCase { @DisplayName("should delete message") @Test void shouldDeleteMessage() { - assertThatCode(() -> osiPostfachRemoteService.deleteMessage("5dd65c1e-bd41-4c3d-bf98-be769ca341dc")) + assertThatCode(() -> osiPostfachRemoteService.deleteMessage("2cec3eac-66d2-4de0-bc6b-652b8e985ceb")) .doesNotThrowAnyException(); } } diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/MessageExchangeReceiveMessagesResponseTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/MessageExchangeReceiveMessagesResponseTestFactory.java index 7fa0ae8e0f9b23e5d3f5d416f5eddbb47f291b63..a104cfc9d8ee0dc6d185b871a27103b7f9d55542 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/MessageExchangeReceiveMessagesResponseTestFactory.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/MessageExchangeReceiveMessagesResponseTestFactory.java @@ -7,6 +7,9 @@ import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeReceiveMe public class MessageExchangeReceiveMessagesResponseTestFactory { + public static final String MESSAGE_ID_1 = UUID.randomUUID().toString(); + public static final String MESSAGE_ID_2 = UUID.randomUUID().toString(); + public static MessageExchangeReceiveMessagesResponse create(String... uuids) { return new MessageExchangeReceiveMessagesResponse() .messages(Arrays.stream(uuids) diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java index c1abebba22f3e88935c0465e0bba99d6840a07e5..d2ceb286eaf9a6dfe46d5f79841fa0f63b08ea18 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java @@ -1,9 +1,12 @@ package de.ozgcloud.nachrichten.postfach.osiv2.transfer; +import static de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeReceiveMessagesResponseTestFactory.*; import static de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachAddressTestFactory.*; +import static de.ozgcloud.nachrichten.postfach.osiv2.transfer.PostfachApiFacadeService.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import java.util.List; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; @@ -12,8 +15,11 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import de.ozgcloud.nachrichten.postfach.PostfachNachricht; +import de.ozgcloud.nachrichten.postfach.osiv2.OsiPostfachException; +import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeReceiveMessagesResponseTestFactory; import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory; import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.MessageExchangeApi; import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeDeleteMessageResponse; @@ -26,6 +32,7 @@ import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.V1ReplyMessage; class PostfachApiFacadeServiceTest { @InjectMocks + @Spy PostfachApiFacadeService postfachApiFacadeService; @Mock @@ -68,27 +75,85 @@ class PostfachApiFacadeServiceTest { @DisplayName("receive messages") @Nested - class TestReceiveMessage{ + class TestReceiveMessage { + + @DisplayName("with two pending messages") + @Nested + class TestWithTwoPendingMessages { + private final MessageExchangeReceiveMessagesResponse response = MessageExchangeReceiveMessagesResponseTestFactory.create( + MESSAGE_ID_1, MESSAGE_ID_2 + ); + + @BeforeEach + void mock() { + when(messageExchangeApi.receiveMessages(anyInt(), anyInt())).thenReturn(response); + doReturn(PostfachNachrichtTestFactory.createBuilder().messageId(MESSAGE_ID_1).build()) + .when(postfachApiFacadeService).fetchMessageByGuid(response.getMessages().get(0)); + doReturn(PostfachNachrichtTestFactory.createBuilder().messageId(MESSAGE_ID_2).build()) + .when(postfachApiFacadeService).fetchMessageByGuid(response.getMessages().get(1)); + } + + @DisplayName("should return") + @Test + void shouldReturn() { + var messages = receiveMessageList(); + + assertThat(messages) + .extracting(PostfachNachricht::getMessageId) + .containsExactly(MESSAGE_ID_1, MESSAGE_ID_2); + } + + @DisplayName("should call receiveMessages api method") + @Test + void shouldCallReceiveMessagesApiMethod() { + receiveMessageList(); + + verify(messageExchangeApi).receiveMessages(MAX_NUMBER_RECEIVED_MESSAGES, 0); + } - @Mock - MessageExchangeReceiveMessagesResponse messageExchangeReceiveMessagesResponse; + } + + @DisplayName("with no pending messages") + @Nested + class TestWithNoPendingMessages { + private final MessageExchangeReceiveMessagesResponse emptyResponse = MessageExchangeReceiveMessagesResponseTestFactory.create(); + + @BeforeEach + void mock() { + when(messageExchangeApi.receiveMessages(anyInt(), anyInt())).thenReturn(emptyResponse); + } + + @DisplayName("should return") + @Test + void shouldReturn() { + var messages = receiveMessageList(); + + assertThat(messages).isEmpty(); + } - @BeforeEach - void mock(){ - when(messageExchangeApi.receiveMessages(anyInt(),anyInt())).thenReturn(messageExchangeReceiveMessagesResponse); } - @Test - void responseShouldNotBeEmpty(){ - postfachApiFacadeService.receiveMessages(); + @DisplayName("with null response") + @Nested + class TestWithNullResponse { - verify(messageExchangeApi).receiveMessages(anyInt(), anyInt()); + @DisplayName("should throw") + @Test + void shouldThrow() { + assertThatThrownBy(TestReceiveMessage.this::receiveMessageList) + .isInstanceOf(OsiPostfachException.class); + } } + + private List<PostfachNachricht> receiveMessageList() { + return postfachApiFacadeService.receiveMessages().toList(); + } + } @DisplayName("fetch Message by guid") @Nested - class TestFetchMessageByGuid{ + class TestFetchMessageByGuid { @Mock V1ReplyMessage replyMessage; @@ -96,7 +161,7 @@ class PostfachApiFacadeServiceTest { MessageExchangeReceiveMessage receiveMessage; @Test - void shouldCallGetMessage(){ + void shouldCallGetMessage() { when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); postfachApiFacadeService.fetchMessageByGuid(receiveMessage); @@ -105,7 +170,7 @@ class PostfachApiFacadeServiceTest { } @Test - void shouldCallResponseMapper(){ + void shouldCallResponseMapper() { when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); when(osi2ResponseMapper.toPostfachNachricht(any())).thenReturn(PostfachNachrichtTestFactory.create()); @@ -115,7 +180,7 @@ class PostfachApiFacadeServiceTest { } @Test - void shouldReturnPostfachNachricht(){ + void shouldReturnPostfachNachricht() { when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); when(osi2ResponseMapper.toPostfachNachricht(any())).thenReturn(PostfachNachrichtTestFactory.create()); @@ -127,12 +192,12 @@ class PostfachApiFacadeServiceTest { @DisplayName("Delete Message") @Nested - class TestDeleteMessage{ + class TestDeleteMessage { @Mock MessageExchangeDeleteMessageResponse replyMessage; @Test - void shouldCallDeleteMessage(){ + void shouldCallDeleteMessage() { when(messageExchangeApi.deleteMessage(any())).thenReturn(replyMessage); postfachApiFacadeService.deleteMessage(UUID.randomUUID().toString()); diff --git a/src/test/resources/application-dev.yml b/src/test/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..42c79c97a9e25c34d6547d9dee3b96bbddf5a308 --- /dev/null +++ b/src/test/resources/application-dev.yml @@ -0,0 +1,24 @@ +spring: + security: + oauth2: + client: + registration: + osi2: + client-id: 'OZG-Kopfstelle' + client-secret: 'changeme' + scope: default, access_urn:dataport:osi:sh:stage:ozgkopfstelle + authorization-grant-type: 'client_credentials' + client-authentication-method: client_secret_post + provider: + osi2: + token-uri: 'http://localhost:8080/osi-postfach-v2-token' +ozgcloud: + osiv2: + enabled: false + api: + resource: 'urn:dataport:osi:postfach:rz2:stage:sh' + url: 'http://localhost:8080' + tenant: 'SH' + name-identifier: 'ozgkopfstelle' + proxy: + enabled: false \ No newline at end of file