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<MimeMessage> 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("<html>test title, http://127.0.0.1:8080, john</html>\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("<html>" + emailTitle + ", http://127.0.0.1:8080, john</html>\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;
|
}
|
}
|