package com.fsck.k9.notification;
import android.content.Context;
import com.fsck.k9.Account;
import com.fsck.k9.K9RobolectricTestRunner;
import com.fsck.k9.activity.MessageReference;
import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.Flag;
import com.fsck.k9.mail.Message.RecipientType;
import com.fsck.k9.mailstore.LocalMessage;
import com.fsck.k9.message.extractors.PreviewResult.PreviewType;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(K9RobolectricTestRunner.class)
public class NotificationContentCreatorTest {
private static final String ACCOUNT_UUID = "1-2-3";
private static final String FOLDER_NAME = "INBOX";
private static final String UID = "42";
private static final String PREVIEW = "Message preview text";
private static final String SUBJECT = "Message subject";
private static final String SENDER_ADDRESS = "alice@example.com";
private static final String SENDER_NAME = "Alice";
private static final String RECIPIENT_ADDRESS = "bob@example.com";
private static final String RECIPIENT_NAME = "Bob";
private NotificationContentCreator contentCreator;
private MessageReference messageReference;
private Account account;
private LocalMessage message;
@Before
public void setUp() throws Exception {
contentCreator = createNotificationContentCreator();
messageReference = createMessageReference();
account = createFakeAccount();
message = createFakeLocalMessage(messageReference);
}
@Test
public void createFromMessage_withRegularMessage() throws Exception {
NotificationContent content = contentCreator.createFromMessage(account, message);
assertEquals(messageReference, content.messageReference);
assertEquals(SENDER_NAME, content.sender);
assertEquals(SUBJECT, content.subject);
assertEquals(SUBJECT + "\n" + PREVIEW, content.preview.toString());
assertEquals(SENDER_NAME + " " + SUBJECT, content.summary.toString());
assertEquals(false, content.starred);
}
@Test
public void createFromMessage_withoutSubject() throws Exception {
when(message.getSubject()).thenReturn(null);
NotificationContent content = contentCreator.createFromMessage(account, message);
String noSubject = "(No subject)";
assertEquals(noSubject, content.subject);
assertEquals(PREVIEW, content.preview.toString());
assertEquals(SENDER_NAME + " " + noSubject, content.summary.toString());
}
@Test
public void createFromMessage_withoutPreview() throws Exception {
when(message.getPreviewType()).thenReturn(PreviewType.NONE);
when(message.getPreview()).thenReturn(null);
NotificationContent content = contentCreator.createFromMessage(account, message);
assertEquals(SUBJECT, content.subject);
assertEquals(SUBJECT, content.preview.toString());
}
@Test
public void createFromMessage_withErrorPreview() throws Exception {
when(message.getPreviewType()).thenReturn(PreviewType.ERROR);
when(message.getPreview()).thenReturn(null);
NotificationContent content = contentCreator.createFromMessage(account, message);
assertEquals(SUBJECT, content.subject);
assertEquals(SUBJECT, content.preview.toString());
}
@Test
public void createFromMessage_withEncryptedMessage() throws Exception {
when(message.getPreviewType()).thenReturn(PreviewType.ENCRYPTED);
when(message.getPreview()).thenReturn(null);
NotificationContent content = contentCreator.createFromMessage(account, message);
String encrypted = "*Encrypted*";
assertEquals(SUBJECT, content.subject);
assertEquals(SUBJECT + "\n" + encrypted, content.preview.toString());
}
@Test
public void createFromMessage_withoutSender() throws Exception {
when(message.getFrom()).thenReturn(null);
NotificationContent content = contentCreator.createFromMessage(account, message);
assertEquals("No sender", content.sender);
assertEquals(SUBJECT, content.summary.toString());
}
@Test
public void createFromMessage_withMessageFromSelf() throws Exception {
when(account.isAnIdentity(any(Address[].class))).thenReturn(true);
NotificationContent content = contentCreator.createFromMessage(account, message);
String insteadOfSender = "To:Bob";
assertEquals(insteadOfSender, content.sender);
assertEquals(insteadOfSender + " " + SUBJECT, content.summary.toString());
}
@Test
public void createFromMessage_withStarredMessage() throws Exception {
when(message.isSet(Flag.FLAGGED)).thenReturn(true);
NotificationContent content = contentCreator.createFromMessage(account, message);
assertEquals(true, content.starred);
}
@Test
public void createFromMessage_withoutEmptyMessage() throws Exception {
when(message.getFrom()).thenReturn(null);
when(message.getSubject()).thenReturn(null);
when(message.getPreviewType()).thenReturn(PreviewType.NONE);
when(message.getPreview()).thenReturn(null);
NotificationContent content = contentCreator.createFromMessage(account, message);
assertEquals("No sender", content.sender);
assertEquals("(No subject)", content.subject);
assertEquals("(No subject)", content.preview.toString());
assertEquals("(No subject)", content.summary.toString());
}
private NotificationContentCreator createNotificationContentCreator() {
Context context = RuntimeEnvironment.application;
return new NotificationContentCreator(context);
}
private Account createFakeAccount() {
return mock(Account.class);
}
private MessageReference createMessageReference() {
return new MessageReference(ACCOUNT_UUID, FOLDER_NAME, UID, null);
}
private LocalMessage createFakeLocalMessage(MessageReference messageReference) throws Exception {
LocalMessage message = mock(LocalMessage.class);
when(message.makeMessageReference()).thenReturn(messageReference);
when(message.getPreviewType()).thenReturn(PreviewType.TEXT);
when(message.getPreview()).thenReturn(PREVIEW);
when(message.getSubject()).thenReturn(SUBJECT);
when(message.getFrom()).thenReturn(new Address[] { new Address(SENDER_ADDRESS, SENDER_NAME) });
when(message.getRecipients(RecipientType.TO))
.thenReturn(new Address[] { new Address(RECIPIENT_ADDRESS, RECIPIENT_NAME) });
return message;
}
}