diff --git a/nachrichten-manager-server/pom.xml b/nachrichten-manager-server/pom.xml index 58a468f924faa5feae06b52d224341f70044eccc..809691410f9f54e01d5b45a58de3cffb5790b2f8 100644 --- a/nachrichten-manager-server/pom.xml +++ b/nachrichten-manager-server/pom.xml @@ -229,6 +229,11 @@ <type>test-jar</type> <scope>test</scope> </dependency> + <dependency> + <groupId>io.grpc</groupId> + <artifactId>grpc-inprocess</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>de.ozgcloud.api-lib</groupId> <artifactId>api-lib-core</artifactId> @@ -256,6 +261,12 @@ <goals> <goal>test-jar</goal> </goals> + <configuration> + <excludes> + <exclude>**/NachrichtenManagerTestApplication*</exclude> + <exclude>**/junit-platform.properties</exclude> + </excludes> + </configuration> </execution> </executions> </plugin> 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 8f5c54e5ddc42b29e9c78810d1fa423db98adb4d..1048f946648a9afb358199726052b3a1861f7629 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 e5f76ec83abb204fb3e88ffd4c69f1ff243548b2..82a60a01e23b240de778cdba6a482af215c04a04 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 8026f7cc8e9c1c1f287ec4621e7354092a02f648..8b5520d6b7a3e5c832add8d11c83dc9ee8f60785 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 1dd1bbde8018bbd11c39c1dff3c44590a05e20cc..9780a47ef8289807c7c62a57d56e20f3e43bb4e9 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/NachrichtenManagerTestApplication.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/NachrichtenManagerTestApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..489b714cbb2abbcc18c4167fd1446781565734ce --- /dev/null +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/NachrichtenManagerTestApplication.java @@ -0,0 +1,28 @@ +package de.ozgcloud.nachrichten; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.ComponentScan; + +import de.ozgcloud.apilib.common.command.OzgCloudCommandService; +import de.ozgcloud.apilib.file.OzgCloudFileService; +import de.ozgcloud.nachrichten.postfach.BinaryFileService; +import de.ozgcloud.nachrichten.postfach.muk.MukPostfachConfiguration; + +@SpringBootApplication +@ComponentScan(basePackages = "de.ozgcloud.*") +public class NachrichtenManagerTestApplication { + + @MockBean + private OzgCloudCommandService ozgCloudCommandService; + @MockBean + @Qualifier(NachrichtenManagerConfiguration.OZG_CLOUD_FILE_SERVICE_NAME) + private OzgCloudFileService nachrichtenOzgCloudFileServices; + @MockBean + @Qualifier(MukPostfachConfiguration.OZG_CLOUD_FILE_SERVICE_NAME) + private OzgCloudFileService mukOzgCloudFileServices; + @MockBean + private BinaryFileService binaryFileService; + +} 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 3e7fea3f26be53b05dd8e5aeccf7258f4b0c1076..4e8db6e836ef508e9514a835cb1616bd2ff5b351 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 0000000000000000000000000000000000000000..bf9f9083433a381be0a735c90fc3dbace39892df --- /dev/null +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailSendRequestValidationTest.java @@ -0,0 +1,54 @@ +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 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 final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + + @Nested + class TestToAddressesValidation { + @Test + void shouldBeValid() { + var request = MailSendRequestTestFactory.create(); + + var violations = validator.validate(request); + + assertThat(violations).isEmpty(); + } + + @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(); + } + } +} diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailServiceITCase.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailServiceITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..3708772085cc7349c4aace9d0235c03f9ad2ef04 --- /dev/null +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/email/MailServiceITCase.java @@ -0,0 +1,47 @@ +package de.ozgcloud.nachrichten.email; + +import static org.junit.jupiter.api.Assertions.*; + +import jakarta.validation.ConstraintViolationException; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor; +import de.ozgcloud.common.test.ITCase; + +@ITCase +class MailServiceITCase { + + @Autowired + private MailService mailService; + + @MockBean + private OzgCloudCallContextAttachingInterceptor interceptor; + + @MockBean + private EmailGrpcService emailGrpcService; + + @Nested + class TestSendMail { + + @Test + void shouldThrowConstraintViolationException() { + Executable callSendMailWithoutRecipients = () -> mailService + .sendMail(MailSendRequestTestFactory.createBuilder().clearToAddresses().build()); + + assertThrows(ConstraintViolationException.class, callSendMailWithoutRecipients); + } + + @Test + void shouldNotThrowException() { + Executable callSendMailWithoutRecipients = () -> mailService + .sendMail(MailSendRequestTestFactory.create()); + + assertDoesNotThrow(callSendMailWithoutRecipients); + } + } +} diff --git a/nachrichten-manager-server/src/test/resources/application-itcase.yaml b/nachrichten-manager-server/src/test/resources/application-itcase.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a99534b0e2823eeb33a967c8854cbb8e4f6c223b --- /dev/null +++ b/nachrichten-manager-server/src/test/resources/application-itcase.yaml @@ -0,0 +1,10 @@ +grpc: + server: + port: -1 + +spring: + mail: + host: dummy + username: dummy + password: dummy + port: -1 \ No newline at end of file