diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java index 0b20678b622bcfc0df1bc2a009554693870c277e..cbd164b320d2d0275be14c42b8044542a9dfa3d6 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java @@ -21,9 +21,9 @@ public interface Osi2ResponseMapper { String POSTFACH_ADDRESS_VERSION = "2.0"; int POSTFACH_ADDRESS_TYPE = 2; - @Mapping(target = "id", source = "guid") + @Mapping(target = "id", ignore = true) @Mapping(target = "postfachAddress", expression = "java(buildPostfachAddressByPostfachId(message.getMessageBox().toString()))") - @Mapping(target = "messageId", ignore = true) + @Mapping(target = "messageId", source = "guid") @Mapping(target = "createdAt", expression = "java(java.time.ZonedDateTime.now())") @Mapping(target = "createdBy", source = "displayName") @Mapping(target = "sentAt", expression = "java(message.getResponseTime().toZonedDateTime())") 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 be0f329f70b0c21b27b6fadf053334f948b37c15..cecfbcab7392725972e938405a473a4ae74c16f0 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java @@ -2,12 +2,13 @@ package de.ozgcloud.nachrichten.postfach.osiv2; import static org.assertj.core.api.Assertions.*; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Stream; +import org.junit.jupiter.api.AfterEach; +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.api.condition.EnabledIfEnvironmentVariable; import org.springframework.beans.factory.annotation.Autowired; @@ -29,14 +30,7 @@ public class OsiPostfachRemoteServiceRemoteITCase { @Autowired private OsiPostfachRemoteService osiPostfachRemoteService; - private final PostfachNachricht nachricht = PostfachNachrichtTestFactory.createBuilder() - .replyOption(PostfachNachricht.ReplyOption.POSSIBLE) - .postfachAddress(PostfachAddressTestFactory.createBuilder() - .identifier(DummyStringBasedIdentifier.builder() - .mailboxId("49b5a7e2-5e60-4baf-8ccf-1f5b94b570f3") - .build()) - .build()) - .build(); + private List<String> initialMessageIds; @DynamicPropertySource static void dynamicProperties(DynamicPropertyRegistry registry) { @@ -62,40 +56,56 @@ public class OsiPostfachRemoteServiceRemoteITCase { throw new IllegalArgumentException("Proxy host and port not found in '%s'".formatted(text)); } - @DisplayName("send message") - @Nested - class TestSendMessage { - - @DisplayName("should not fail") - @Test - void shouldNotFail() { - assertThatCode(() -> osiPostfachRemoteService.sendMessage(nachricht)) - .doesNotThrowAnyException(); - } + List<String> fetchPostfachMessagesIds() { + return osiPostfachRemoteService.getAllMessages() + .map(PostfachNachricht::getMessageId) + .toList(); } - @DisplayName("receive all messages") - @Nested - class TestReceiveAllMessages { + @BeforeEach + void setup() { + initialMessageIds = fetchPostfachMessagesIds(); + assertThat(initialMessageIds).doesNotContainNull(); + } - @Test - void shouldReceiveAllMessage() { - Stream<PostfachNachricht> allMessages = osiPostfachRemoteService.getAllMessages(); + @AfterEach + void validateMessagesBackAtOriginalState() { + var currentGuids = fetchPostfachMessagesIds(); - var messages = allMessages.toList(); + assertThat(currentGuids).containsExactlyElementsOf(initialMessageIds); + } - assertThat(messages).isNotEmpty(); - } + private PostfachNachricht createNachricht() { + return PostfachNachrichtTestFactory.createBuilder() + .replyOption(PostfachNachricht.ReplyOption.POSSIBLE) + .postfachAddress(PostfachAddressTestFactory.createBuilder() + .identifier(DummyStringBasedIdentifier.builder() + .mailboxId("49b5a7e2-5e60-4baf-8ccf-1f5b94b570f3") + .build()) + .build()) + .build(); } - @DisplayName("delete message") - @Nested - class TestDeleteMessageById { + @DisplayName("should send and receive message without attachment") + @Test + void shouldSendAndReceiveMessage() { + var nachricht = createNachricht(); - @Test - void shouldDeleteMessage() { - assertThatCode(() -> osiPostfachRemoteService.deleteMessage("5dd65c1e-bd41-4c3d-bf98-be769ca341dc")) - .doesNotThrowAnyException(); - } + osiPostfachRemoteService.sendMessage(nachricht); + + var messages = osiPostfachRemoteService.getAllMessages().toList(); + assertThat(messages).isNotEmpty(); + + var newMessages = messages.stream() + .filter(m -> !initialMessageIds.contains(m.getMessageId())) + .toList(); + assertThat(newMessages).hasSize(1); + var newMessage = newMessages.getFirst(); + assertThat(newMessage.getSubject()).isEqualTo(nachricht.getSubject()); + assertThat(newMessage.getMailBody()).isEqualTo(nachricht.getMailBody()); + assertThat(newMessage.getPostfachAddress()) + .isEqualTo(nachricht.getPostfachAddress()); + + osiPostfachRemoteService.deleteMessage(newMessage.getMessageId()); } } diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/PostfachNachrichtTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/PostfachNachrichtTestFactory.java index e24b966431f23e9de36aac29539323a0c456a25b..aaf929ea7d99c7b3262df9458295e8bc7c647e90 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/PostfachNachrichtTestFactory.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/PostfachNachrichtTestFactory.java @@ -1,12 +1,15 @@ package de.ozgcloud.nachrichten.postfach.osiv2.factory; import java.time.ZonedDateTime; +import java.util.UUID; + +import com.thedeanda.lorem.LoremIpsum; import de.ozgcloud.nachrichten.postfach.PostfachNachricht; public class PostfachNachrichtTestFactory { - public static final String MAIL_BODY = "mail body"; - public static final String MAIL_SUBJECT = "mail subject"; + public static final String MAIL_BODY = "Hallo,\n" + LoremIpsum.getInstance().getParagraphs(1, 4); + public static final String MAIL_SUBJECT = "AW: " + LoremIpsum.getInstance().getTitle(2, 6); public static final String VORGANG_ID = "test-vorgang-id"; public static final String USER_ID = "test-user-id"; diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java index 84fec5a318a83aafc58fe20142b84367db2aa30f..3797d54977d7ecb6a0dc197ded47e69a5dddef89 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java @@ -17,13 +17,13 @@ public class V1ReplyMessageTestFactory { public static final String REPLY_BODY = """ Das ist das Multiline&<b>a</b><br><br/> Body"""; + public static final String MESSAGE_ID = UUID.randomUUID().toString(); private static final String DISPLAY_NAME = "Das ist der Absender"; private static final String ORIGIN_SENDER = "das ist der original Sender"; private static final String REPLAY_ACTION = "Replypossible"; private static final String EIDAS_LEVEL = "Low"; private static final Boolean IS_OBLIGATORY = Boolean.FALSE; private static final Boolean IS_HTML = Boolean.FALSE; - private static final String GUID = "123-guid-456"; private static final String MESSAGE_BOX = "Mailbox-Id-Antwortender"; private static final OffsetDateTime RESPONSE_TIME = OffsetDateTime.now(); @@ -38,7 +38,7 @@ public class V1ReplyMessageTestFactory { .eidasLevel(V1EidasLevel.fromValue(EIDAS_LEVEL)) .isObligatory(IS_OBLIGATORY) .isHtml(IS_HTML) - .guid(UUID.nameUUIDFromBytes(GUID.getBytes())) + .guid(UUID.fromString(MESSAGE_ID)) .messageBox(UUID.nameUUIDFromBytes(MESSAGE_BOX.getBytes())) .responseTime(RESPONSE_TIME); } diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java index 1c417e577b9134818309cc5a0ecdc9b976d8423a..e692451fc530c988380623f5bc90e826071994d8 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java @@ -3,13 +3,21 @@ package de.ozgcloud.nachrichten.postfach.osiv2.transfer; import static de.ozgcloud.nachrichten.postfach.osiv2.factory.V1ReplyMessageTestFactory.*; import static org.assertj.core.api.Assertions.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.UUID; +import java.util.stream.Stream; 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.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.mapstruct.factory.Mappers; import org.mockito.InjectMocks; @@ -26,86 +34,93 @@ class Osi2ResponseMapperTest { @DisplayName("map V1ReplyMessage to PostfachNachricht") @Nested class V1ReplyMessageToPostfachNachricht { - @Test - void shouldHaveId() { - var postfachNachricht = mapper.toPostfachNachricht(message); - - assertThat(postfachNachricht.getId()).isEqualTo(UUID.nameUUIDFromBytes("123-guid-456".getBytes()).toString()); - } @Test void shouldHaveVorgangId() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); - assertThat(postfachNachricht.getVorgangId()).isEqualTo("OZG-Cloud-VorgangId"); + assertThat(result.getVorgangId()).isEqualTo("OZG-Cloud-VorgangId"); } @Test void shouldHavePostfachAddress() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); - assertThat(postfachNachricht.getPostfachAddress().getIdentifier().toString()) + assertThat(result.getPostfachAddress().getIdentifier().toString()) .hasToString(UUID.nameUUIDFromBytes("Mailbox-Id-Antwortender".getBytes()).toString()); } @Test void shouldHaveCreatedAt() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); - assertThat(postfachNachricht.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(5, ChronoUnit.SECONDS)); + assertThat(result.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(5, ChronoUnit.SECONDS)); } @Test void shouldHaveCreatedBy() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); - assertThat(postfachNachricht.getCreatedBy()).isEqualTo("Das ist der Absender"); + assertThat(result.getCreatedBy()).isEqualTo("Das ist der Absender"); } @Test void shouldHaveSentAt() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); - assertThat(postfachNachricht.getSentAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(5, ChronoUnit.SECONDS)); + assertThat(result.getSentAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(5, ChronoUnit.SECONDS)); } @Test void shouldHaveDirection() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); - assertThat(postfachNachricht.getDirection()).isEqualTo(PostfachNachricht.Direction.IN); + assertThat(result.getDirection()).isEqualTo(PostfachNachricht.Direction.IN); } @Test void shouldHaveSubject() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); - assertThat(postfachNachricht.getSubject()).isEqualTo("Das ist das Subject"); + assertThat(result.getSubject()).isEqualTo("Das ist das Subject"); } @Test void shouldHaveBody() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); - assertThat(postfachNachricht.getMailBody()).isEqualTo(REPLY_BODY); + assertThat(result.getMailBody()).isEqualTo(REPLY_BODY); } @Test void shouldMapHTMLBody() { - var postfachNachricht = mapper.toPostfachNachricht(message + var htmlMessage = V1ReplyMessageTestFactory.create() .body(HTML_REPLY_BODY) - .isHtml(true)); + .isHtml(true); - assertThat(postfachNachricht.getMailBody()).isEqualTo(REPLY_BODY); + var result = mapper.toPostfachNachricht(htmlMessage); + + assertThat(result.getMailBody()).isEqualTo(REPLY_BODY); } @Test void shouldHaveReplyOption() { - var postfachNachricht = mapper.toPostfachNachricht(message); + var result = doMapping(); + + assertThat(result.getReplyOption()).isEqualTo(PostfachNachricht.ReplyOption.POSSIBLE); + } + + @DisplayName("should map messageId") + @Test + void shouldMapMessageId() { + var result = doMapping(); + + assertThat(result.getMessageId()).isEqualTo(MESSAGE_ID); + } - assertThat(postfachNachricht.getReplyOption()).isEqualTo(PostfachNachricht.ReplyOption.POSSIBLE); + private PostfachNachricht doMapping() { + return mapper.toPostfachNachricht(message); } - // TODO:prüfen das Attachments in der PostfachNachricht enthalten sind } }