diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java index 28bc1da4fcb0c0f316144a454a2bc29b72399904..fc8b30283be549db5c634fdc032b169cd3017348 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java @@ -23,10 +23,13 @@ package de.ozgcloud.nachrichten.antragraum; +import java.time.ZonedDateTime; import java.util.stream.Stream; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import de.ozgcloud.nachrichten.postfach.PostfachNachricht; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.server.service.GrpcService; @@ -65,12 +68,26 @@ class AntragraumGrpcService extends AntragraumServiceGrpc.AntragraumServiceImplB @Override public void sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequest request, StreamObserver<GrpcSendRueckfrageAnswerResponse> streamObserver) { - var answer = request.getAnswer(); + var answer = mapper.fromRueckfrageAnswer(request.getAnswer()); - var commandId = antragraumService.sendRueckfrageAnswer(request.getSamlToken(), answer.getRueckfrageId(), - mapper.fromRueckfrageAnswer(answer)); + answer = enrichRueckfrageAnswer(answer, getRueckfrage(request.getSamlToken(), request.getAnswer().getRueckfrageId())); + var commandId = antragraumService.sendRueckfrageAnswer(request.getSamlToken(), request.getAnswer().getRueckfrageId(), answer); streamObserver.onNext(GrpcSendRueckfrageAnswerResponse.newBuilder().setCommandId(commandId).build()); streamObserver.onCompleted(); } + + PostfachNachricht getRueckfrage(String samlToken, String postfachNachrichtId) { + return antragraumService.findRueckfragen(samlToken) + .filter(postfachNachricht -> StringUtils.equals(postfachNachricht.getId(), postfachNachrichtId)) + .toList().getFirst(); + } + + PostfachNachricht enrichRueckfrageAnswer(PostfachNachricht answer, PostfachNachricht rueckfrage) { + return answer.toBuilder() + .vorgangId(rueckfrage.getVorgangId()) + .postfachAddress(rueckfrage.getPostfachAddress()) + .sentAt(ZonedDateTime.now()) + .build(); + } } diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java index 3946bb3f7691e4a76d198e667ec879a2fb645ce3..25500e8ea808c7e719814d097e7b25587873e8ff 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java @@ -63,19 +63,19 @@ interface AntragraumNachrichtMapper { @Mapping(target = "referencedNachricht", ignore = true) @Mapping(target = "mailBody", source = "answerText") @Mapping(target = "attachments", source = "attachmentFileIdList") - @Mapping(target = "createdAt", ignore = true) // FIXME + @Mapping(target = "createdAt", ignore = true) @Mapping(target = "createdBy", ignore = true) // FIXME @Mapping(target = "direction", constant = "IN") @Mapping(target = "id", ignore = true) @Mapping(target = "messageCode", ignore = true) @Mapping(target = "messageId", source = "rueckfrageId") - @Mapping(target = "postfachAddress", ignore = true) // FIXME rueckfrage laden, befüllen + @Mapping(target = "postfachAddress", ignore = true) @Mapping(target = "postfachId", ignore = true) @Mapping(target = "replyOption", constant = "FORBIDDEN") - @Mapping(target = "sentAt", ignore = true) // FIXME + @Mapping(target = "sentAt", ignore = true) @Mapping(target = "sentSuccessful", constant = "true") @Mapping(target = "subject", constant = "Antwort") // TODO klären - @Mapping(target = "vorgangId", ignore = true) // FIXME rueckfrage laden, befüllen + @Mapping(target = "vorgangId", ignore = true) PostfachNachricht fromRueckfrageAnswer(GrpcRueckfrageAnswer answer); @Mapping(target = "mergeFrom", ignore = true) diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java index 6a05e36e48e391f304ff207f337f8316c72d5537..e14177a773180e00b35acb87b676af648a5eb2e2 100644 --- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java @@ -20,13 +20,17 @@ package de.ozgcloud.nachrichten.antragraum; +import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import java.util.UUID; import java.util.stream.Stream; 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.mockito.InjectMocks; @@ -90,16 +94,20 @@ class AntragraumGrpcServiceTest { } } + @DisplayName("Send rueckfrage answer") @Nested - class TestSendAnswer { + class TestSendRueckfrageAnswer { @Mock private StreamObserver<GrpcSendRueckfrageAnswerResponse> streamObserver; + private PostfachNachricht postfachNachricht = PostfachNachrichtTestFactory.create(); @BeforeEach void setup() { + when(mapper.fromRueckfrageAnswer(any(GrpcRueckfrageAnswer.class))).thenReturn(postfachNachricht); when(antragraumService.sendRueckfrageAnswer(anyString(), anyString(), any(PostfachNachricht.class))) .thenReturn(UUID.randomUUID().toString()); - when(mapper.fromRueckfrageAnswer(any(GrpcRueckfrageAnswer.class))).thenReturn(PostfachNachrichtTestFactory.create()); + doReturn(postfachNachricht).when(antragsraumGrpcService).enrichRueckfrageAnswer(any(), any()); + doReturn(postfachNachricht).when(antragsraumGrpcService).getRueckfrage(any(), any()); } @Test @@ -109,6 +117,21 @@ class AntragraumGrpcServiceTest { verify(mapper).fromRueckfrageAnswer(any(GrpcRueckfrageAnswer.class)); } + @Test + void shouldGetRueckfrage() { + sendRueckfrageAnswer(); + + verify(antragsraumGrpcService).getRueckfrage(GrpcSendRueckfrageAnswerRequestTestFactory.SAML_TOKEN, + GrpcRueckfrageAnswerTestFactory.RUECKFRAGE_ID); + } + + @Test + void shouldEnrichPostfachNachricht() { + sendRueckfrageAnswer(); + + verify(antragsraumGrpcService).enrichRueckfrageAnswer(postfachNachricht, postfachNachricht); + } + @Test void shouldCallAntragraumService() { antragsraumGrpcService.sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequestTestFactory.create(), streamObserver); @@ -129,6 +152,77 @@ class AntragraumGrpcServiceTest { verify(streamObserver).onCompleted(); } + + private void sendRueckfrageAnswer() { + antragsraumGrpcService.sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequestTestFactory.create(), streamObserver); + } + } + + @DisplayName("Get rueckfrage") + @Nested + class TestGetRueckfrage { + + private final PostfachNachricht matchingPostfachNachricht = PostfachNachrichtTestFactory.createBuilder() + .id(GrpcRueckfrageAnswerTestFactory.RUECKFRAGE_ID) + .build(); + private final PostfachNachricht postfachNachricht = PostfachNachrichtTestFactory.create(); + + @BeforeEach + void mock() { + when(antragraumService.findRueckfragen(any())).thenReturn(Stream.of(postfachNachricht, matchingPostfachNachricht)); + } + + @Test + void shouldCallService() { + getRueckfrage(); + + verify(antragraumService).findRueckfragen(GrpcSendRueckfrageAnswerRequestTestFactory.SAML_TOKEN); + } + + @Test + void shouldReturnMatchingPostfachNachricht() { + var rueckfrage = getRueckfrage(); + + assertThat(rueckfrage).isEqualTo(matchingPostfachNachricht); + } + + private PostfachNachricht getRueckfrage() { + return antragsraumGrpcService.getRueckfrage(GrpcSendRueckfrageAnswerRequestTestFactory.SAML_TOKEN, + GrpcRueckfrageAnswerTestFactory.RUECKFRAGE_ID); + } } + @DisplayName("Enrich postfachNachricht") + @Nested + class TestEnrichPostfachNachricht { + + private PostfachNachricht postfachNachrichtToEnrich = PostfachNachrichtTestFactory.createBuilder() + .postfachAddress(null) + .vorgangId(null) + .sentAt(null) + .build(); + + private final PostfachNachricht postfachNachrichtRueckfrage = PostfachNachrichtTestFactory.create(); + + @Test + void shouldSetVorgangId() { + var enrichedPostfachNachricht = antragsraumGrpcService.enrichRueckfrageAnswer(postfachNachrichtToEnrich, postfachNachrichtRueckfrage); + + assertThat(enrichedPostfachNachricht.getVorgangId()).isEqualTo(postfachNachrichtRueckfrage.getVorgangId()); + } + + @Test + void shouldSetPostfachAddresses() { + var enrichedPostfachNachricht = antragsraumGrpcService.enrichRueckfrageAnswer(postfachNachrichtToEnrich, postfachNachrichtRueckfrage); + + assertThat(enrichedPostfachNachricht.getPostfachAddress()).isEqualTo(postfachNachrichtRueckfrage.getPostfachAddress()); + } + + @Test + void shouldSetSentAt() { + var enrichedPostfachNachricht = antragsraumGrpcService.enrichRueckfrageAnswer(postfachNachrichtToEnrich, postfachNachrichtRueckfrage); + + assertThat(enrichedPostfachNachricht.getSentAt()).isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); + } + } } \ No newline at end of file diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java index e42c73f0067c22281a20a3d8a2732a884fd4e43f..0fe3c3d3fc8b70e2dfacf2edb39a53970712b9e7 100644 --- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java @@ -22,7 +22,9 @@ package de.ozgcloud.nachrichten.antragraum; import static org.assertj.core.api.Assertions.*; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -32,6 +34,7 @@ import de.ozgcloud.nachrichten.postfach.PostfachNachricht; import de.ozgcloud.nachrichten.postfach.PostfachNachricht.Direction; import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory; import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory; +import de.ozgcloud.nachrichten.postfach.osi.ReplyOption; class AntragraumNachrichtMapperTest { @@ -126,6 +129,20 @@ class AntragraumNachrichtMapperTest { assertThat(result.getDirection()).isEqualTo(Direction.IN); } + @Test + void shouldMapReplyOption() { + var result = map(); + + assertThat(result.getReplyOption()).hasToString(ReplyOption.FORBIDDEN.name()); + } + + @Test + void shouldSetCreateAt() { + var result = map(); + + assertThat(result.getCreatedAt()).isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); + } + private PostfachNachricht map() { return mapper.fromRueckfrageAnswer(GrpcRueckfrageAnswerTestFactory.create()); }