package com.fsck.k9.notification;
import android.support.v4.app.NotificationCompat.BigTextStyle;
import android.support.v4.app.NotificationCompat.Builder;
import com.fsck.k9.Account;
import com.fsck.k9.K9;
import com.fsck.k9.K9.NotificationQuickDelete;
import com.fsck.k9.K9RobolectricTestRunner;
import com.fsck.k9.MockHelper;
import com.fsck.k9.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(K9RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class BaseNotificationsTest {
private static final int ACCOUNT_COLOR = 0xAABBCC;
private static final String ACCOUNT_NAME = "AccountName";
private static final int ACCOUNT_NUMBER = 2;
private static final String NOTIFICATION_SUMMARY = "Summary";
private static final String SENDER = "MessageSender";
private static final String SUBJECT = "Subject";
private static final String NOTIFICATION_PREVIEW = "Preview";
private TestNotifications notifications;
@Before
public void setUp() throws Exception {
notifications = createTestNotifications();
}
@Test
public void testCreateAndInitializeNotificationBuilder() throws Exception {
Account account = createFakeAccount();
Builder builder = notifications.createAndInitializeNotificationBuilder(account);
verify(builder).setSmallIcon(R.drawable.notification_icon_new_mail);
verify(builder).setColor(ACCOUNT_COLOR);
verify(builder).setAutoCancel(true);
}
@Test
public void testIsDeleteActionEnabled_NotificationQuickDelete_ALWAYS() throws Exception {
K9.setNotificationQuickDeleteBehaviour(NotificationQuickDelete.ALWAYS);
boolean result = notifications.isDeleteActionEnabled();
assertTrue(result);
}
@Test
public void testIsDeleteActionEnabled_NotificationQuickDelete_FOR_SINGLE_MSG() throws Exception {
K9.setNotificationQuickDeleteBehaviour(NotificationQuickDelete.FOR_SINGLE_MSG);
boolean result = notifications.isDeleteActionEnabled();
assertTrue(result);
}
@Test
public void testIsDeleteActionEnabled_NotificationQuickDelete_NEVER() throws Exception {
K9.setNotificationQuickDeleteBehaviour(NotificationQuickDelete.NEVER);
boolean result = notifications.isDeleteActionEnabled();
assertFalse(result);
}
@Test
public void testCreateBigTextStyleNotification() throws Exception {
Account account = createFakeAccount();
int notificationId = 23;
NotificationHolder holder = createNotificationHolder(notificationId);
Builder builder = notifications.createBigTextStyleNotification(account, holder, notificationId);
verify(builder).setTicker(NOTIFICATION_SUMMARY);
verify(builder).setGroup("newMailNotifications-" + ACCOUNT_NUMBER);
verify(builder).setContentTitle(SENDER);
verify(builder).setContentText(SUBJECT);
verify(builder).setSubText(ACCOUNT_NAME);
BigTextStyle bigTextStyle = notifications.bigTextStyle;
verify(bigTextStyle).bigText(NOTIFICATION_PREVIEW);
verify(builder).setStyle(bigTextStyle);
}
private NotificationHolder createNotificationHolder(int notificationId) {
NotificationContent content = new NotificationContent(null, SENDER, SUBJECT, NOTIFICATION_PREVIEW,
NOTIFICATION_SUMMARY, false);
return new NotificationHolder(notificationId, content);
}
private TestNotifications createTestNotifications() {
NotificationController controller = createFakeController();
NotificationActionCreator actionCreator = mock(NotificationActionCreator.class);
return new TestNotifications(controller, actionCreator);
}
private NotificationController createFakeController() {
Builder builder = MockHelper.mockBuilder(Builder.class);
NotificationController controller = mock(NotificationController.class);
when(controller.createNotificationBuilder()).thenReturn(builder);
when(controller.getAccountName(any(Account.class))).thenReturn(ACCOUNT_NAME);
return controller;
}
private Account createFakeAccount() {
Account account = mock(Account.class);
when(account.getAccountNumber()).thenReturn(ACCOUNT_NUMBER);
when(account.getChipColor()).thenReturn(ACCOUNT_COLOR);
return account;
}
static class TestNotifications extends BaseNotifications {
BigTextStyle bigTextStyle;
protected TestNotifications(NotificationController controller, NotificationActionCreator actionCreator) {
super(controller, actionCreator);
bigTextStyle = mock(BigTextStyle.class);
}
@Override
protected BigTextStyle createBigTextStyle(Builder builder) {
return bigTextStyle;
}
}
}