diff --git a/mail-service/pom.xml b/mail-service/pom.xml index 9a9d14a54e9af3fca679f7d7ce608ef94a14538e..5877a4ee4450e481ae24047124db4c2cb7282bf9 100644 --- a/mail-service/pom.xml +++ b/mail-service/pom.xml @@ -8,7 +8,7 @@ <version>2.4.5</version> <relativePath /> <!-- lookup parent from repository --> </parent> - + <groupId>de.itvsh.ozg.mail</groupId> <artifactId>mail-service</artifactId> <version>0.6.0-SNAPSHOT</version> @@ -43,7 +43,7 @@ <scope>test</scope> </dependency> </dependencies> - + <build> <plugins> <plugin> @@ -59,9 +59,20 @@ <skip>true</skip> </configuration> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> - + <repositories> <repository> <id>ozg-nexus</id> diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/MailSendRequest.java b/mail-service/src/main/java/de/itvsh/ozg/mail/MailSendRequest.java index 03ba87ca9d5e650405a9f0afc81dfec9554be265..a255b1e986f933647a06a38f004e386307469896 100644 --- a/mail-service/src/main/java/de/itvsh/ozg/mail/MailSendRequest.java +++ b/mail-service/src/main/java/de/itvsh/ozg/mail/MailSendRequest.java @@ -22,5 +22,5 @@ public class MailSendRequest { @Singular private Map<String, InputStreamSource> attachments; - private String requestReference; + private Object requestReference; } diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/MailSentEvent.java b/mail-service/src/main/java/de/itvsh/ozg/mail/MailSentEvent.java index eddaf1d76225676ab96c2393b49febc1f11e1eb9..c343eefab01e27e68c8383bdd06fbce482718614 100644 --- a/mail-service/src/main/java/de/itvsh/ozg/mail/MailSentEvent.java +++ b/mail-service/src/main/java/de/itvsh/ozg/mail/MailSentEvent.java @@ -6,7 +6,7 @@ public class MailSentEvent extends ApplicationEvent { private static final long serialVersionUID = 1L; - public MailSentEvent(MailSendRequest source) { + MailSentEvent(MailSendRequest source) { super(source); } diff --git a/mail-service/src/test/java/de/itvsh/ozg/mail/MailSentEventTestFactory.java b/mail-service/src/test/java/de/itvsh/ozg/mail/MailSentEventTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..68acc0d73a966bcd3caf222c4377035364fd944f --- /dev/null +++ b/mail-service/src/test/java/de/itvsh/ozg/mail/MailSentEventTestFactory.java @@ -0,0 +1,10 @@ +package de.itvsh.ozg.mail; + +public class MailSentEventTestFactory { + + public static MailSentEvent create(Object reference) { + + return new MailSentEvent(MailSendRequestTestFactory.createBuilder().requestReference(reference).build()); + } + +} diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml index 14df102b31a1f160cb8ed82f660388fdd883e2b6..35779f02f3678f7a5523fb500a3804f6ba1d158a 100644 --- a/pluto-server/pom.xml +++ b/pluto-server/pom.xml @@ -115,6 +115,14 @@ </dependency> <!-- Test --> + <dependency> + <groupId>de.itvsh.ozg.mail</groupId> + <artifactId>mail-service</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/PlutoServerApplication.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/PlutoServerApplication.java index 7cc0386bba508f2fa9925e5cfdb9a389889e6268..c84033620f6c9a3b346bc6175a6e97b1cbc3ec04 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/PlutoServerApplication.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/PlutoServerApplication.java @@ -6,7 +6,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "de.itvsh.ozg") @EnableAsync public class PlutoServerApplication { diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListener.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListener.java new file mode 100644 index 0000000000000000000000000000000000000000..dc3c77e5080519dab4e4e07a7c7b93690884bc7f --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListener.java @@ -0,0 +1,29 @@ +package de.itvsh.ozg.pluto.vorgang.redirect; + +import java.util.function.Predicate; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import de.itvsh.ozg.mail.MailSendRequest; +import de.itvsh.ozg.mail.MailSentEvent; +import de.itvsh.ozg.pluto.command.Command; +import de.itvsh.ozg.pluto.command.Order; + +@Component +public class RedirectListener { + + public static final Predicate<MailSendRequest> IS_REDIRECT_MAIL_REQ = req -> req.getRequestReference() instanceof Command + && ((Command) req.getRequestReference()).getOrder() == Order.REDIRECT_VORGANG; + + @Autowired + private RedirectService service; + + @EventListener(condition = "{T(de.itvsh.ozg.pluto.vorgang.redirect.RedirectListener).IS_REDIRECT_MAIL_REQ.test(event.getSource())}") + public void publishCommandExecutedEvent(MailSentEvent event) { + Command command = (Command) event.getSource().getRequestReference(); + + service.onRedirectMailSent(command); + } +} diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectService.java index ecb2a5703dd30628e0151d845f2b7cea04e63d7e..a8e1eabe37eb0e787e6f97b0113d8811ae5980db 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectService.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectService.java @@ -8,9 +8,12 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import de.itvsh.ozg.mail.MailSendRequest; +import de.itvsh.ozg.mail.MailService; +import de.itvsh.ozg.pluto.command.Command; import de.itvsh.ozg.pluto.common.errorhandling.TechnicalException; import de.itvsh.ozg.pluto.vorgang.Vorgang; import freemarker.template.Configuration; @@ -27,17 +30,28 @@ public class RedirectService { @Autowired private Configuration freemarkerCfg; + @Autowired + private MailService emailService; + + @Autowired + private ApplicationEventPublisher publisher; @Value("${pluto.redirect.mail-from}") private String mailFrom; - MailSendRequest createRedirectMail(Vorgang vorgang, RedirectRequest request) { - // FIXME set command id + public void redirectVorgang(Vorgang vorgang, Command command) { + var mailRequest = createRedirectMail(vorgang, command); + + emailService.sendMail(mailRequest); + } + + MailSendRequest createRedirectMail(Vorgang vorgang, Command command) { // TODO add attachments return MailSendRequest.builder() .fromAddress(mailFrom) - .toAddress(request.getEmail()) + .toAddress(command.getRedirectRequest().getEmail()) .body(fillMailTemplate(vorgang)) + .requestReference(command) .build(); } @@ -71,4 +85,7 @@ public class RedirectService { } } + public void onRedirectMailSent(Command command) { + publisher.publishEvent(new VorgangRedirectedEvent(command)); + } } diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/VorgangRedirectedEvent.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/VorgangRedirectedEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..93a0be55b6d9cc5228b278703513cd7dca9d56c2 --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/VorgangRedirectedEvent.java @@ -0,0 +1,13 @@ +package de.itvsh.ozg.pluto.vorgang.redirect; + +import de.itvsh.ozg.pluto.command.Command; +import de.itvsh.ozg.pluto.command.CommandExecutedEvent; + +public class VorgangRedirectedEvent extends CommandExecutedEvent { + + private static final long serialVersionUID = 1L; + + VorgangRedirectedEvent(Command source) { + super(source); + } +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..c89c480d7c5df70b610d1b178a492a56c2b34060 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java @@ -0,0 +1,16 @@ +package de.itvsh.ozg.pluto; + +import static org.mockito.Mockito.*; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.mail.javamail.JavaMailSender; + +@Configuration +public class TestConfiguration { + + @Bean + public JavaMailSender mockMailSender() { + return mock(JavaMailSender.class); + } +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListenerTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListenerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6dc0cf8358cdaab47d1808102c110db2884ce8ad --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListenerTest.java @@ -0,0 +1,32 @@ +package de.itvsh.ozg.pluto.vorgang.redirect; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import de.itvsh.ozg.mail.MailSentEventTestFactory; +import de.itvsh.ozg.pluto.command.Command; +import de.itvsh.ozg.pluto.command.CommandTestFactory; + +class RedirectListenerTest { + + @InjectMocks + private RedirectListener listener; + + @Mock + private RedirectService redirectService; + + @Nested + class onMailSentEvent { + + private Command command = CommandTestFactory.create(); + + @Test + void shouldCallRedirectService() { + listener.publishCommandExecutedEvent(MailSentEventTestFactory.create(command)); + + redirectService.onRedirectMailSent(command); + } + } +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectServiceTest.java index 95182d5a8f7df8d77baba93acc25479e8593ec94..eb929d2dab58d9282405e83f64ba61b51026f0d3 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectServiceTest.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectServiceTest.java @@ -9,20 +9,29 @@ import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Spy; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.test.util.ReflectionTestUtils; +import de.itvsh.ozg.pluto.command.Command; +import de.itvsh.ozg.pluto.command.CommandTestFactory; import de.itvsh.ozg.pluto.vorgang.EingangHeaderTestFactory; import de.itvsh.ozg.pluto.vorgang.Vorgang; import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory; class RedirectServiceTest { - @Spy + @Spy // NOSONAR @InjectMocks private RedirectService service; + @Mock + private ApplicationEventPublisher publisher; + @Nested class TestFillingTemplate { @@ -62,6 +71,7 @@ class RedirectServiceTest { private Vorgang vorgang = VorgangTestFactory.create(); private RedirectRequest request = RedirectRequestTestFactory.create(); + private Command command = CommandTestFactory.createBuilder().redirectRequest(request).build();; @BeforeEach void initTest() { @@ -72,25 +82,42 @@ class RedirectServiceTest { @Test void shouldSetFromAddress() { - var mailSendRequest = service.createRedirectMail(vorgang, request); + var mailSendRequest = service.createRedirectMail(vorgang, command); assertThat(mailSendRequest.getFromAddress()).isEqualTo(MAIL_FROM); } @Test void shouldSetToAddress() { - var mailSendRequest = service.createRedirectMail(vorgang, request); + var mailSendRequest = service.createRedirectMail(vorgang, command); assertThat(mailSendRequest.getToAddresses()).containsExactly(RedirectRequestTestFactory.E_MAIL); } @Test void shouldSetBody() { - var mailSendRequest = service.createRedirectMail(vorgang, request); + var mailSendRequest = service.createRedirectMail(vorgang, command); verify(service).fillMailTemplate(vorgang); assertThat(mailSendRequest.getBody()).isEqualTo(BODY); } } + @Nested + class TestOnRedirectMailSent { + + @Captor // NOSONAR + private ArgumentCaptor<VorgangRedirectedEvent> eventCaptor; + + private Command command = CommandTestFactory.create(); + + @Test + void shouldPublishEvent() { + service.onRedirectMailSent(command); + + verify(publisher).publishEvent(eventCaptor.capture()); + assertThat(eventCaptor.getValue()).isInstanceOf(VorgangRedirectedEvent.class) + .extracting(VorgangRedirectedEvent::getSource).isSameAs(command); + } + } }