package com.zegoggles.smssync.service; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.net.Uri; import android.provider.Telephony; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.store.imap.ImapMessage; import com.zegoggles.smssync.Consts; import com.zegoggles.smssync.auth.TokenRefresher; import com.zegoggles.smssync.mail.BackupImapStore; import com.zegoggles.smssync.mail.DataType; import com.zegoggles.smssync.mail.MessageConverter; import com.zegoggles.smssync.service.state.RestoreState; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import java.util.ArrayList; import java.util.Date; import java.util.List; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @RunWith(RobolectricTestRunner.class) public class RestoreTaskTest { RestoreTask task; RestoreConfig config; Context context; @Mock BackupImapStore store; @Mock BackupImapStore.BackupFolder folder; @Mock SmsRestoreService service; @Mock RestoreState state; @Mock MessageConverter converter; @Mock ContentResolver resolver; @Mock TokenRefresher tokenRefresher; @Before public void before() throws MessagingException { initMocks(this); config = new RestoreConfig(store, 0, true, false, false, -1, 0); when(service.getApplicationContext()).thenReturn(Robolectric.application); when(service.getState()).thenReturn(state); when(store.getFolder(any(DataType.class))).thenReturn(folder); task = new RestoreTask(service, converter, resolver, tokenRefresher); context = Robolectric.application; } @Test public void shouldAcquireAndReleaseLocksDuringRestore() throws Exception { task.doInBackground(config); verify(service).acquireLocks(); verify(service).releaseLocks(); } @Test public void shouldVerifyStoreSettings() throws Exception { task.doInBackground(config); verify(store).checkSettings(); } @Test public void shouldCloseFolders() throws Exception { task.doInBackground(config); verify(store).closeFolders(); } @Test public void shouldRestoreItems() throws Exception { Date now = new Date(); List<ImapMessage> messages = new ArrayList<ImapMessage>(); ContentValues values = new ContentValues(); values.put(Telephony.TextBasedSmsColumns.TYPE, Telephony.TextBasedSmsColumns.MESSAGE_TYPE_INBOX); values.put(Telephony.TextBasedSmsColumns.DATE, now.getTime()); ImapMessage mockMessage = mock(ImapMessage.class); when(mockMessage.getFolder()).thenReturn(folder); when(converter.getDataType(mockMessage)).thenReturn(DataType.SMS); when(converter.messageToContentValues(mockMessage)).thenReturn(values); messages.add(mockMessage); when(folder.getMessages(anyInt(), anyBoolean(), any(Date.class))).thenReturn(messages); when(resolver.insert(Consts.SMS_PROVIDER, values)).thenReturn(Uri.parse("content://sms/123")); task.doInBackground(config); verify(resolver).insert(Consts.SMS_PROVIDER, values); verify(resolver).delete(Uri.parse("content://sms/conversations/-1"), null, null); assertThat(DataType.SMS.getMaxSyncedDate(context)).isEqualTo(now.getTime()); assertThat(task.getSmsIds()).containsExactly("123"); verify(store).closeFolders(); } }