package com.fsck.k9.mail.internet;
import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.K9LibRobolectricTestRunner;
import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.MessagingException;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@RunWith(K9LibRobolectricTestRunner.class)
public class ListHeadersTest {
private static final String[] TEST_EMAIL_ADDRESSES = new String[] {
"prettyandsimple@example.com",
"very.common@example.com",
"disposable.style.email.with+symbol@example.com",
"other.email-with-dash@example.com",
//TODO: Fix Address.parse()
/*
"\"much.more unusual\"@example.com",
"\"very.unusual.@.unusual.com\"@example.com",
//"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com
"\"very.(),:;<>[]\\\".VERY.\\\"very@\\\\ \\\"very\\\".unusual\"@strange.example.com",
"admin@mailserver1",
"#!$%&'*+-/=?^_`{}|~@example.org",
"\"()<>[]:,;@\\\\\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org",
"\" \"@example.org",
"example@localhost",
"example@s.solutions",
"user@com",
"user@localserver",
"user@[IPv6:2001:db8::1]"
*/
};
@Test
public void getListPostAddresses_withMailTo_shouldReturnCorrectAddress() throws Exception {
for (String emailAddress : TEST_EMAIL_ADDRESSES) {
String headerValue = "<mailto:" + emailAddress + ">";
Message message = buildMimeMessageWithListPostValue(headerValue);
Address[] result = ListHeaders.getListPostAddresses(message);
assertExtractedAddressMatchesEmail(emailAddress, result);
}
}
@Test
public void getListPostAddresses_withMailtoWithNote_shouldReturnCorrectAddress() throws Exception {
for (String emailAddress : TEST_EMAIL_ADDRESSES) {
String headerValue = "<mailto:" + emailAddress + "> (Postings are Moderated)";
Message message = buildMimeMessageWithListPostValue(headerValue);
Address[] result = ListHeaders.getListPostAddresses(message);
assertExtractedAddressMatchesEmail(emailAddress, result);
}
}
@Test
public void getListPostAddresses_withMailtoWithSubject_shouldReturnCorrectAddress() throws Exception {
for (String emailAddress : TEST_EMAIL_ADDRESSES) {
String headerValue = "<mailto:" + emailAddress + "?subject=list%20posting>";
Message message = buildMimeMessageWithListPostValue(headerValue);
Address[] result = ListHeaders.getListPostAddresses(message);
assertExtractedAddressMatchesEmail(emailAddress, result);
}
}
@Test
public void getListPostAddresses_withMessageWithNo_shouldReturnEmptyList() throws Exception {
MimeMessage message = buildMimeMessageWithListPostValue("NO (posting not allowed on this list)");
Address[] result = ListHeaders.getListPostAddresses(message);
assertEquals(0, result.length);
}
@Test
public void getListPostAddresses_shouldProvideAllListPostHeaders() throws Exception {
MimeMessage message = buildMimeMessageWithListPostValue(
"<mailto:list1@example.org>", "<mailto:list2@example.org>");
Address[] result = ListHeaders.getListPostAddresses(message);
assertNotNull(result);
assertEquals(2, result.length);
assertNotNull(result[0]);
assertEquals("list1@example.org", result[0].getAddress());
assertNotNull(result[1]);
assertEquals("list2@example.org", result[1].getAddress());
}
@Test
public void getListPostAddresses_withoutMailtoUriInBrackets_shouldReturnEmptyList() throws Exception {
MimeMessage message = buildMimeMessageWithListPostValue("<x-mailto:something>");
Address[] result = ListHeaders.getListPostAddresses(message);
assertEquals(0, result.length);
}
private void assertExtractedAddressMatchesEmail(String emailAddress, Address[] result) {
assertNotNull(result);
assertEquals(1, result.length);
assertNotNull(result[0]);
assertEquals(emailAddress, result[0].getAddress());
}
private MimeMessage buildMimeMessageWithListPostValue(String... values) throws MessagingException {
MimeMessage message = new MimeMessage();
for (String value : values) {
message.addHeader("List-Post", value);
}
return message;
}
}