From 2d81e9c0fb8e7ba1f0f2bc8f7bbe3dd04f5a4466 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Mon, 21 Oct 2024 14:48:02 +0200 Subject: [PATCH] OZG-6798 add MailSendRequest validation --- .../nachrichten/email/EMailService.java | 7 +- .../nachrichten/email/MailRecipient.java | 4 +- .../nachrichten/email/MailSendRequest.java | 6 +- .../nachrichten/email/MailService.java | 8 +- .../email/MailSendRequestTestFactory.java | 5 +- .../email/MailSendRequestValidationTest.java | 82 +++++++++++++++++++ 6 files changed, 103 insertions(+), 9 deletions(-) create mode 100644 nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestValidationTest.java diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/EMailService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/EMailService.java index 8f5c54e..1048f94 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/EMailService.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/EMailService.java @@ -25,18 +25,20 @@ package de.ozgcloud.nachrichten.email; import java.util.Objects; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; + import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.nachrichten.email.MailSendRequest.MailAttachment; -import jakarta.mail.MessagingException; -import jakarta.mail.internet.MimeMessage; import lombok.extern.log4j.Log4j2; @Service @@ -55,6 +57,7 @@ class EMailService { @Autowired private ApplicationEventPublisher publisher; + @Async public void sendEmail(MailSendRequest request) { MimeMessage message = sender.createMimeMessage(); prepareAndSendMail(message, request); diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailRecipient.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailRecipient.java index e5f76ec..82a60a0 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailRecipient.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailRecipient.java @@ -23,8 +23,10 @@ */ package de.ozgcloud.nachrichten.email; +import jakarta.validation.constraints.NotBlank; + import lombok.Builder; @Builder -public record MailRecipient(String firstName, String lastName, String email) { +public record MailRecipient(String firstName, String lastName, @NotBlank String email) { } diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailSendRequest.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailSendRequest.java index 8026f7c..8b5520d 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailSendRequest.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailSendRequest.java @@ -26,6 +26,9 @@ package de.ozgcloud.nachrichten.email; import java.util.Collection; import jakarta.activation.DataSource; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; + import lombok.Builder; import lombok.Getter; import lombok.Singular; @@ -36,7 +39,8 @@ public class MailSendRequest { private String fromAddress; @Singular - private Collection<MailRecipient> toAddresses; + @NotEmpty + private Collection<@Valid MailRecipient> toAddresses; private String replyTo; diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailService.java index 1dd1bbd..9780a47 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailService.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/email/MailService.java @@ -23,18 +23,20 @@ */ package de.ozgcloud.nachrichten.email; +import jakarta.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; @Service +@Validated public class MailService { @Autowired private EMailService emailService; - @Async - public void sendMail(MailSendRequest request) { + public void sendMail(@Valid MailSendRequest request) { emailService.sendEmail(request); } } diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestTestFactory.java index 3e7fea3..4e8db6e 100644 --- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestTestFactory.java +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestTestFactory.java @@ -25,9 +25,10 @@ package de.ozgcloud.nachrichten.email; import java.util.UUID; -import de.ozgcloud.nachrichten.email.MailSendRequest.MailAttachment; import jakarta.mail.util.ByteArrayDataSource; +import de.ozgcloud.nachrichten.email.MailSendRequest.MailAttachment; + class MailSendRequestTestFactory { public static final String FROM = "from@mailinator.com"; @@ -36,7 +37,7 @@ class MailSendRequestTestFactory { public static final String SUBJECT = "The Subject"; public static final String BODY = "Lorem ipsum"; - private static final String REFERENCE = UUID.randomUUID().toString(); + public static final String REFERENCE = UUID.randomUUID().toString(); public static final String ATTACHMENT_NAME = "aFile"; public static final String ATTACHMENT = "BINARY_BLAH"; diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestValidationTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestValidationTest.java new file mode 100644 index 0000000..22d4392 --- /dev/null +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestValidationTest.java @@ -0,0 +1,82 @@ +package de.ozgcloud.nachrichten.email; + +import static de.ozgcloud.nachrichten.email.MailSendRequestTestFactory.*; +import static org.assertj.core.api.Assertions.*; + +import jakarta.mail.util.ByteArrayDataSource; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +import de.ozgcloud.nachrichten.email.MailSendRequest.MailAttachment; + +class MailSendRequestValidationTest { + + private Validator validator; + + @BeforeEach + public void setUp() { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + validator = factory.getValidator(); + } + + @Nested + class TestToAddressesValidation { + @Test + void shouldBeValid() { + var request = MailSendRequestTestFactory.create(); + + var violations = validator.validate(request); + + assertThat(violations).isEmpty(); + } + + @Test + void shouldBeInvalidOnNull() { + var ds = new ByteArrayDataSource(ATTACHMENT.getBytes(), "plain/text"); + ds.setName(ATTACHMENT_NAME); + var request = MailSendRequest.builder() + .fromAddress(FROM) + .subject(SUBJECT) + .body(BODY) + .requestReference(REFERENCE) + .attachment(MailAttachment.builder() + .dataSource(ds) + .build()) + .replyTo(REPLY_TO) + .build(); + + var violations = validator.validate(request); + + assertThat(violations).isNotEmpty(); + } + + @Test + void shouldBeInvalidOnEmpty() { + var request = MailSendRequestTestFactory.createBuilder().clearToAddresses().build(); + + var violations = validator.validate(request); + + assertThat(violations).isNotEmpty(); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldBeInvalidOnBlankRecipientEmail(String email) { + var recipient = MailRecipientTestFactory.createBuilder() + .email(email) + .build(); + var request = MailSendRequestTestFactory.createBuilder().clearToAddresses().toAddress(recipient).build(); + + var violations = validator.validate(request); + + assertThat(violations).isNotEmpty(); + } + } +} -- GitLab