diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteService.java index 5f0c072c1cf44b76fab4c529442cf47977f0da5b..e58d7ea789c085e33fdd534b0978aba34c8e7337 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteService.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteService.java @@ -51,7 +51,7 @@ class AttachedItemRemoteService { @Autowired private PostfachNachrichtMapper postfachNachrichtMapper; - public Stream<PostfachNachricht> findPostfachNachrichts(String vorgangId) { + public Stream<PostfachNachricht> findReplyAllowedPostfachNachrichts(String vorgangId) { return getVorgangAttachedItemServiceStub().find(buildFindRequest(vorgangId)).getVorgangAttachedItemsList().stream() .filter(this::replyAllowed).map(postfachNachrichtMapper::fromAttachedItem); } diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImpl.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImpl.java index 91d2c0ef798bb579c1763934c1fe95ec7247b528..378725d403ee2b8514352e30e1f4c519ed107b17 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImpl.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImpl.java @@ -103,7 +103,7 @@ public class PersistPostfachNachrichtServiceImpl implements PersistPostfachNachr @Override public Stream<PostfachNachricht> findRueckfragen(String servicekontoType, String postfachId) { - return vorgangRemoteService.findVorgangIds(servicekontoType, postfachId).flatMap(attachedItemRemoteService::findPostfachNachrichts); + return vorgangRemoteService.findVorgangIds(servicekontoType, postfachId).flatMap(attachedItemRemoteService::findReplyAllowedPostfachNachrichts); } @Override diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d06766d810ea307451dfa8a0ec1a70301d3b4a83 --- /dev/null +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteServiceTest.java @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.nachrichten.postfach; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Collections; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.ozgcloud.nachrichten.common.grpc.NachrichtenCallContextAttachingInterceptor; +import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory; +import de.ozgcloud.vorgang.common.GrpcObject; +import de.ozgcloud.vorgang.common.GrpcProperty; +import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemRequest; +import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse; +import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; +import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub; + +class AttachedItemRemoteServiceTest { + + @Spy + @InjectMocks + private AttachedItemRemoteService attachedItemRemoteService; + + @Mock + private VorgangAttachedItemServiceBlockingStub vorgangAttachedItemServiceBlockingStub; + + @Mock + private PostfachNachrichtMapper postfachNachrichtMapper; + + @Nested + class TestFindReplyAllowedPostfachNachrichts { + + private static final GrpcVorgangAttachedItem GRPC_VORGANG_ATTACHED_ITEM = GrpcVorgangAttachedItemTestFactory.create(); + + @Mock + private GrpcFindVorgangAttachedItemRequest grpcFindVorgangAttachedItemRequest; + @Mock + private GrpcFindVorgangAttachedItemResponse grpcFindVorgangAttachedItemResponse; + @Mock + private PostfachNachricht postfachNachricht; + + @BeforeEach + void init() { + when(grpcFindVorgangAttachedItemResponse.getVorgangAttachedItemsList()).thenReturn(Collections.singletonList(GRPC_VORGANG_ATTACHED_ITEM)); + when(vorgangAttachedItemServiceBlockingStub.find(any())).thenReturn(grpcFindVorgangAttachedItemResponse); + doReturn(vorgangAttachedItemServiceBlockingStub).when(attachedItemRemoteService).getVorgangAttachedItemServiceStub(); + } + + @Test + void testCallGetVorgangAttachedItemServiceStub() { + attachedItemRemoteService.findReplyAllowedPostfachNachrichts(MessageTestFactory.VORGANG_ID); + + verify(attachedItemRemoteService).getVorgangAttachedItemServiceStub(); + } + + @Test + void shouldCallBuildFindRequest() { + attachedItemRemoteService.findReplyAllowedPostfachNachrichts(MessageTestFactory.VORGANG_ID); + + verify(attachedItemRemoteService).buildFindRequest(MessageTestFactory.VORGANG_ID); + } + + @Test + void shouldCallFind() { + doReturn(grpcFindVorgangAttachedItemRequest).when(attachedItemRemoteService).buildFindRequest(anyString()); + + attachedItemRemoteService.findReplyAllowedPostfachNachrichts(MessageTestFactory.VORGANG_ID); + + verify(vorgangAttachedItemServiceBlockingStub).find(grpcFindVorgangAttachedItemRequest); + } + + @Test + void shouldCallReplyAllowed() { + attachedItemRemoteService.findReplyAllowedPostfachNachrichts(MessageTestFactory.VORGANG_ID).toList(); + + verify(attachedItemRemoteService).replyAllowed(GRPC_VORGANG_ATTACHED_ITEM); + } + + @Test + void shouldCallPostfachNachrichtMapper() { + doReturn(true).when(attachedItemRemoteService).replyAllowed(any()); + + attachedItemRemoteService.findReplyAllowedPostfachNachrichts(MessageTestFactory.VORGANG_ID).toList(); + + verify(postfachNachrichtMapper).fromAttachedItem(GRPC_VORGANG_ATTACHED_ITEM); + } + + @Test + void shouldNotCallPostfachNachrichtMapper() { + doReturn(false).when(attachedItemRemoteService).replyAllowed(any()); + + attachedItemRemoteService.findReplyAllowedPostfachNachrichts(MessageTestFactory.VORGANG_ID).toList(); + + verify(postfachNachrichtMapper, never()).fromAttachedItem(GRPC_VORGANG_ATTACHED_ITEM); + } + + @Test + void shouldReturnResult() { + doReturn(true).when(attachedItemRemoteService).replyAllowed(any()); + doReturn(postfachNachricht).when(postfachNachrichtMapper).fromAttachedItem(any()); + + var result = attachedItemRemoteService.findReplyAllowedPostfachNachrichts(MessageTestFactory.VORGANG_ID); + + assertThat(result).containsExactly(postfachNachricht); + } + } + + @Nested + class TestReplyAllowed { + + @DisplayName("should return true") + @ParameterizedTest(name = "when replyOption is {0}") + @EnumSource(value = PostfachNachricht.ReplyOption.class, names = { "FORBIDDEN" }, mode = EnumSource.Mode.EXCLUDE) + void shouldReturnTrue(PostfachNachricht.ReplyOption replyOption) { + var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItem(GrpcObject.newBuilder() + .addProperty(GrpcProperty.newBuilder().setName("replyOption").addValue(replyOption.name()))).build(); + + var result = attachedItemRemoteService.replyAllowed(grpcVorgangAttachedItem); + + assertThat(result).isTrue(); + } + + @Test + void shouldReturnFalse() { + var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItem(GrpcObject.newBuilder() + .addProperty(GrpcProperty.newBuilder().setName("replyOption").addValue("FORBIDDEN"))).build(); + + var result = attachedItemRemoteService.replyAllowed(grpcVorgangAttachedItem); + + assertThat(result).isFalse(); + } + } + + @Nested + class TestBuildFindRequest { + + @Test + void shouldSetVorgangId() { + var result = attachedItemRemoteService.buildFindRequest(MessageTestFactory.VORGANG_ID); + + assertThat(result.getVorgangId()).isEqualTo(MessageTestFactory.VORGANG_ID); + } + + @Test + void shouldSetClient() { + var result = attachedItemRemoteService.buildFindRequest(MessageTestFactory.VORGANG_ID); + + assertThat(result.getClient()).isEqualTo(AttachedItemRemoteService.CLIENT); + } + + @Test + void shouldSetItemName() { + var result = attachedItemRemoteService.buildFindRequest(MessageTestFactory.VORGANG_ID); + + assertThat(result.getItemName()).isEqualTo(AttachedItemRemoteService.ITEM_NAME); + } + } + + @Nested + class TestGetVorgangAttachedItemServiceStub { + + @Mock + private VorgangAttachedItemServiceBlockingStub stubWithInterceptor; + + @Test + void shouldAddInterceptor() { + attachedItemRemoteService.getVorgangAttachedItemServiceStub(); + + verify(vorgangAttachedItemServiceBlockingStub).withInterceptors(any(NachrichtenCallContextAttachingInterceptor.class)); + } + + @Test + void shouldReturnStub() { + when(vorgangAttachedItemServiceBlockingStub.withInterceptors(any())).thenReturn(stubWithInterceptor); + + var result = attachedItemRemoteService.getVorgangAttachedItemServiceStub(); + + assertThat(result).isSameAs(stubWithInterceptor); + } + } +} \ No newline at end of file diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/GrpcVorgangAttachedItemTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/GrpcVorgangAttachedItemTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..49dbefe72df4c240fc4ca8efeb0a9a0803e5a08e --- /dev/null +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/GrpcVorgangAttachedItemTestFactory.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.nachrichten.postfach; + +import de.ozgcloud.vorgang.common.GrpcObject; +import de.ozgcloud.vorgang.common.GrpcProperty; +import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; + +public class GrpcVorgangAttachedItemTestFactory { + + public static final String ID = "id"; + public static final String CLIENT = "client"; + public static final String ITEM_NAME = "itemName"; + + public static final String PROPERTY_NAME = "propertyName"; + public static final String PROPERTY_NAME_VALUE = "propertyNameValue"; + public static final GrpcObject OBJECT = GrpcObject.newBuilder() + .addProperty(GrpcProperty.newBuilder().setName(PROPERTY_NAME).addValue(PROPERTY_NAME_VALUE).build()).build(); + + static GrpcVorgangAttachedItem create() { + return createBuilder().build(); + } + + static GrpcVorgangAttachedItem.Builder createBuilder() { + return GrpcVorgangAttachedItem.newBuilder() + .setId(ID) + .setClient(CLIENT) + .setItemName(ITEM_NAME) + .setItem(OBJECT); + } +}