package com.softwaremill.common.test.web.email;
import com.dumbster.smtp.SmtpMessage;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
/**
* @author maciek
*/
public class EmailMessageTest {
@Test(dataProvider = "getMessages")
public void shouldFindLinksInEmail(String message, String[] expectedLinks) {
// Given
EmailMessage email = new EmailMessage(getMockEmail(message));
// When
List<String> links = email.getLinksInMessage();
// Then
assertThat(links).isNotNull();
assertThat(links.size()).isEqualTo(expectedLinks.length);
assertThat(links).containsExactly(expectedLinks);
}
@Test(dataProvider = "getMessagesWithSpecialLink")
public void shouldFindSpecialLinkInEmail(String message, String urlPart, String expectedLink) {
// Given
EmailMessage email = new EmailMessage(getMockEmail(message));
// When
String link = email.getLinkLike(urlPart);
// Then
assertThat(link).isEqualTo(expectedLink);
}
@Test(dataProvider = "getMessagesWithSpecialLinks")
public void shouldFindSpecialLinksInEmail(String message, String urlPart, String[] expectedLinks) {
// Given
EmailMessage email = new EmailMessage(getMockEmail(message));
// When
List<String> links = email.getLinksLike(urlPart);
// Then
assertThat(links).isNotNull();
assertThat(links.size()).isEqualTo(expectedLinks.length);
assertThat(links).containsExactly(expectedLinks);
}
@Test
public void shouldParseEncodedEmailInPolish() {
// Given
EmailMessage email = new EmailMessage(getMockEmail(plEncodedEmail, "quoted-printable"));
System.out.println("RAW: \n"+email.getRawMessage());
System.out.println("MSG: \n"+email.getMessage());
// When
List<String> links = email.getLinksLike("register/confirm");
// Then
assertThat(links).isNotNull();
assertThat(links.size()).isEqualTo(1);
assertThat(links.get(0)).isEqualTo("http://www.localhost.pl/register/confirm?code=newcomp2MFJRRPEHPUDCTQSCIMXT");
assertThat(email.getMessage()).contains("Witaj ncadmin ć");
assertThat(email.getMessage()).contains("New Company Ó");
assertThat(email.getMessage()).contains("Zespół Systemu");
}
@Test
public void shouldParseNotEncodedEmailInEnglish() {
// Given
EmailMessage email = new EmailMessage(getMockEmail(notQuotedPrintableEmail));
// When
List<String> links = email.getLinksLike("register/confirm");
// Then
assertThat(links).isNotNull();
assertThat(links.size()).isEqualTo(1);
assertThat(links.get(0)).isEqualTo("http://www.localhost.eu/register/confirm?code=engcompanyTRNAOJBALKSTRJBJUNOA");
assertThat(email.getMessage()).contains("Welcome ncadmin");
assertThat(email.getMessage()).contains("New Company");
}
@Test
public void shouldProperlyDecodeEmailWithSoftLineBreak() {
// Given
String body = "You applied for an account in Circular system, for organization New Company= =C3=93.";
EmailMessage email = new EmailMessage(getMockEmail(body, "quoted-printable"));
// When
String message = email.getMessage();
// Then
assertThat(message).contains("New Company Ó");
assertThat(message).doesNotContain("=");
}
private final String link1 = "http://www.example.org";
private final String link2 = "https://www.example.org";
private final String link3 = "http://www.example.org/data/project-x";
private final String link4 = "http://www.example.org?id=12";
private final String link5 = "http://www.example.org?id=12&type=3&cat=9";
private final String link6 = "http://www.example.org?id=12&type=new-version#top";
private final String urlPart3 = "data/project-x";
private final String urlPart6 = "type=new-version";
private final String urlPart456 = "id=12";
private final String message1 = "Welcome User,\n Visit our site at {link} for great deals!";
private final String message2 = "Welcome User,\n To activate your account follow link {link1}. For help see our site at {link2}!";
private final String plEncodedEmail = "Witaj ncadmin =C4=87,\n" +
"\n" +
"\n" +
"Utworzyli=C5=9Bmy konto dla firmy 'New Company =C3=93' i u=C5=BCytkownika '=\n" +
"ncadmin =C4=87'. Konto b=C4=99dzie dost=C4=99pne po potwierdzeniu rejestrac=\n" +
"ji.\n" +
"\n" +
"W celu potwierdzenia rejestracji kliknij poni=C5=BCszy link:\n" +
"\n" +
"http://www.localhost.pl/register/confirm?code=3Dnewcomp2MFJRRPEHPUDCTQSCIMX=\n" +
"T\n" +
"\n" +
"\n" +
"--\n" +
"Z powa=C5=BCaniem,\n" +
"Zesp=C3=B3=C5=82 Systemu";
private final String notQuotedPrintableEmail = "Welcome ncadmin,\n" +
"\n" +
"\n" +
"You applied for an account in our system, for organization New Company.\n" +
"\n" +
"Your new service will be available on http://engcompany.localhost.eu.\n" +
"\n" +
"To complete the registration process follow this link:\n" +
"\n" +
"http://www.localhost.eu/register/confirm?code=engcompanyTRNAOJBALKSTRJBJUNOA\n" +
"\n" +
"\n" +
"--\n" +
"Best regards,\n" +
"System Team";
@DataProvider
private Object[][] getMessagesWithSpecialLink(){
return new Object[][] {
// message, url part, expected link
{ getSimpleMessage(link1), "mill.pl", null },
{ getSimpleMessage(link3), urlPart3, link3 },
{ getSimpleMessage(link6), urlPart6, link6 },
{ getAdvancedMessage(link5, link6), urlPart6, link6 }
};
}
@DataProvider
private Object[][] getMessagesWithSpecialLinks(){
return new Object[][] {
// message, url part, expected links
{ getSimpleMessage(link1), "mill.pl", new String[] { } },
{ getSimpleMessage(link3), urlPart3, new String[] { link3 } },
{ getSimpleMessage(link6), urlPart456, new String[] { link6 } },
{ getAdvancedMessage(link5, link6), urlPart456, new String[] { link5, link6 } },
{ getAdvancedMessage(link1, link6), urlPart456, new String[] { link6 } }
};
}
@DataProvider
private Object[][] getMessages(){
return new Object[][] {
// message, expected links
{ getSimpleMessage(link1), new String[] { link1 } },
{ getSimpleMessage(link2), new String[] { link2 } },
{ getSimpleMessage(link3), new String[] { link3 } },
{ getSimpleMessage(link4), new String[] { link4 } },
{ getSimpleMessage(link5), new String[] { link5 } },
{ getSimpleMessage(link6), new String[] { link6 } },
{ getSimpleMessage(""), new String[] { } },
{ getAdvancedMessage(link1, link2), new String[] { link1, link2 } },
{ getAdvancedMessage(link5, link3), new String[] { link5, link3 } },
{ getAdvancedMessage(link6, link4), new String[] { link6, link4 } },
{ getAdvancedMessage("", ""), new String[] { } }
};
}
private String getSimpleMessage(String link) {
return message1.replace("{link}", link);
}
private String getAdvancedMessage(String link1, String link2) {
String msg = message2.replace("{link1}", link1);
msg = msg.replace("{link2}", link2);
return msg;
}
private SmtpMessage getMockEmail(String message){
return getMockEmail(message, "");
}
private SmtpMessage getMockEmail(String message, String encoding){
SmtpMessage email = mock(SmtpMessage.class);
when(email.getBody()).thenReturn(message);
when(email.getHeaderValue(EmailHeader.CONTENT_TRANSFER_ENCODING.getValue())).thenReturn(encoding);
return email;
}
}