package com.fsck.k9.notification;
import android.app.Notification;
import android.app.PendingIntent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.support.v4.app.NotificationManagerCompat;
import com.fsck.k9.Account;
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.RuntimeEnvironment;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(K9RobolectricTestRunner.class)
public class SendFailedNotificationsTest {
private static final int ACCOUNT_NUMBER = 1;
private static final String ACCOUNT_NAME = "TestAccount";
private NotificationManagerCompat notificationManager;
private Builder builder;
private Account account;
private SendFailedNotifications sendFailedNotifications;
private PendingIntent contentIntent;
private int notificationId;
@Before
public void setUp() throws Exception {
notificationManager = createFakeNotificationManager();
builder = createFakeNotificationBuilder();
NotificationController controller = createFakeNotificationController(notificationManager, builder);
account = createFakeAccount();
contentIntent = createFakeContentIntent();
NotificationActionCreator actionBuilder = createActionBuilder(contentIntent);
notificationId = NotificationIds.getSendFailedNotificationId(account);
sendFailedNotifications = new SendFailedNotifications(controller, actionBuilder);
}
@Test
public void testShowSendFailedNotification() throws Exception {
Exception exception = new Exception();
sendFailedNotifications.showSendFailedNotification(account, exception);
verify(notificationManager).notify(eq(notificationId), any(Notification.class));
verify(builder).setSmallIcon(R.drawable.notification_icon_new_mail);
verify(builder).setTicker("Failed to send some messages");
verify(builder).setContentTitle("Failed to send some messages");
verify(builder).setContentText("Exception");
verify(builder).setContentIntent(contentIntent);
verify(builder).setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
}
@Test
public void testClearSendFailedNotification() throws Exception {
sendFailedNotifications.clearSendFailedNotification(account);
verify(notificationManager).cancel(notificationId);
}
private NotificationManagerCompat createFakeNotificationManager() {
return mock(NotificationManagerCompat.class);
}
private Builder createFakeNotificationBuilder() {
return MockHelper.mockBuilder(Builder.class);
}
private NotificationController createFakeNotificationController(NotificationManagerCompat notificationManager,
Builder builder) {
NotificationController controller = mock(NotificationController.class);
when(controller.getContext()).thenReturn(RuntimeEnvironment.application);
when(controller.getNotificationManager()).thenReturn(notificationManager);
when(controller.createNotificationBuilder()).thenReturn(builder);
return controller;
}
private Account createFakeAccount() {
Account account = mock(Account.class);
when(account.getAccountNumber()).thenReturn(ACCOUNT_NUMBER);
when(account.getDescription()).thenReturn(ACCOUNT_NAME);
return account;
}
private PendingIntent createFakeContentIntent() {
return mock(PendingIntent.class);
}
private NotificationActionCreator createActionBuilder(PendingIntent contentIntent) {
NotificationActionCreator actionBuilder = mock(NotificationActionCreator.class);
when(actionBuilder.createViewFolderListPendingIntent(any(Account.class), anyInt())).thenReturn(contentIntent);
return actionBuilder;
}
}