package com.pollex.pam.service; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; import com.pollex.pam.IntegrationTest; import com.pollex.pam.config.Constants; import com.pollex.pam.domain.User; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.net.URI; import java.net.URL; import java.nio.charset.Charset; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.mail.Multipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.MockitoAnnotations; import org.mockito.Spy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.mail.MailSendException; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.thymeleaf.spring5.SpringTemplateEngine; import tech.jhipster.config.JHipsterProperties; /** * Integration tests for {@link MailService}. */ @IntegrationTest class MailServiceIT { private static final String[] languages = { "zh-tw", "en", // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array }; private static final Pattern PATTERN_LOCALE_3 = Pattern.compile("([a-z]{2})-([a-zA-Z]{4})-([a-z]{2})"); private static final Pattern PATTERN_LOCALE_2 = Pattern.compile("([a-z]{2})-([a-z]{2})"); @Autowired private JHipsterProperties jHipsterProperties; @Autowired private MessageSource messageSource; @Autowired private SpringTemplateEngine templateEngine; @Spy private JavaMailSenderImpl javaMailSender; @Captor private ArgumentCaptor messageCaptor; private MailService mailService; @BeforeEach public void setup() { MockitoAnnotations.initMocks(this); doNothing().when(javaMailSender).send(any(MimeMessage.class)); mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine); } @Test void testSendEmail() throws Exception { mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); verify(javaMailSender).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); assertThat(message.getSubject()).isEqualTo("testSubject"); assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); assertThat(message.getContent()).isInstanceOf(String.class); assertThat(message.getContent()).hasToString("testContent"); assertThat(message.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); } @Test void testSendHtmlEmail() throws Exception { mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, true); verify(javaMailSender).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); assertThat(message.getSubject()).isEqualTo("testSubject"); assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); assertThat(message.getContent()).isInstanceOf(String.class); assertThat(message.getContent()).hasToString("testContent"); assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); } @Test void testSendMultipartEmail() throws Exception { mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, false); verify(javaMailSender).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); MimeMultipart mp = (MimeMultipart) message.getContent(); MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); ByteArrayOutputStream aos = new ByteArrayOutputStream(); part.writeTo(aos); assertThat(message.getSubject()).isEqualTo("testSubject"); assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); assertThat(message.getContent()).isInstanceOf(Multipart.class); assertThat(aos).hasToString("\r\ntestContent"); assertThat(part.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); } @Test void testSendMultipartHtmlEmail() throws Exception { mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, true); verify(javaMailSender).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); MimeMultipart mp = (MimeMultipart) message.getContent(); MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); ByteArrayOutputStream aos = new ByteArrayOutputStream(); part.writeTo(aos); assertThat(message.getSubject()).isEqualTo("testSubject"); assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); assertThat(message.getContent()).isInstanceOf(Multipart.class); assertThat(aos).hasToString("\r\ntestContent"); assertThat(part.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); } @Test void testSendEmailFromTemplate() throws Exception { User user = new User(); user.setLogin("john"); user.setEmail("john.doe@example.com"); user.setLangKey("en"); mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); verify(javaMailSender).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); assertThat(message.getSubject()).isEqualTo("test title"); assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); assertThat(message.getContent().toString()).isEqualToNormalizingNewlines("test title, http://127.0.0.1:8080, john\n"); assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); } @Test void testSendActivationEmail() throws Exception { User user = new User(); user.setLangKey(Constants.DEFAULT_LANGUAGE); user.setLogin("john"); user.setEmail("john.doe@example.com"); mailService.sendActivationEmail(user); verify(javaMailSender).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); assertThat(message.getContent().toString()).isNotEmpty(); assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); } @Test void testCreationEmail() throws Exception { User user = new User(); user.setLangKey(Constants.DEFAULT_LANGUAGE); user.setLogin("john"); user.setEmail("john.doe@example.com"); mailService.sendCreationEmail(user); verify(javaMailSender).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); assertThat(message.getContent().toString()).isNotEmpty(); assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); } @Test void testSendPasswordResetMail() throws Exception { User user = new User(); user.setLangKey(Constants.DEFAULT_LANGUAGE); user.setLogin("john"); user.setEmail("john.doe@example.com"); mailService.sendPasswordResetMail(user); verify(javaMailSender).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); assertThat(message.getContent().toString()).isNotEmpty(); assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); } @Test void testSendEmailWithException() { doThrow(MailSendException.class).when(javaMailSender).send(any(MimeMessage.class)); try { mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); } catch (Exception e) { fail("Exception shouldn't have been thrown"); } } @Test void testSendLocalizedEmailForAllSupportedLanguages() throws Exception { User user = new User(); user.setLogin("john"); user.setEmail("john.doe@example.com"); for (String langKey : languages) { user.setLangKey(langKey); mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); verify(javaMailSender, atLeastOnce()).send(messageCaptor.capture()); MimeMessage message = messageCaptor.getValue(); String propertyFilePath = "i18n/messages_" + getJavaLocale(langKey) + ".properties"; URL resource = this.getClass().getClassLoader().getResource(propertyFilePath); File file = new File(new URI(resource.getFile()).getPath()); Properties properties = new Properties(); properties.load(new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"))); String emailTitle = (String) properties.get("email.test.title"); assertThat(message.getSubject()).isEqualTo(emailTitle); assertThat(message.getContent().toString()) .isEqualToNormalizingNewlines("" + emailTitle + ", http://127.0.0.1:8080, john\n"); } } /** * Convert a lang key to the Java locale. */ private String getJavaLocale(String langKey) { String javaLangKey = langKey; Matcher matcher2 = PATTERN_LOCALE_2.matcher(langKey); if (matcher2.matches()) { javaLangKey = matcher2.group(1) + "_" + matcher2.group(2).toUpperCase(); } Matcher matcher3 = PATTERN_LOCALE_3.matcher(langKey); if (matcher3.matches()) { javaLangKey = matcher3.group(1) + "_" + matcher3.group(2) + "_" + matcher3.group(3).toUpperCase(); } return javaLangKey; } }