package com.zegoggles.smssync.service; import android.content.ContentResolver; import android.content.Context; import android.database.MatrixCursor; import android.database.sqlite.SQLiteException; import android.net.Uri; import com.zegoggles.smssync.mail.DataType; 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 static com.zegoggles.smssync.mail.DataType.*; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; import static org.mockito.MockitoAnnotations.initMocks; @RunWith(RobolectricTestRunner.class) public class BackupItemsFetcherTest { BackupItemsFetcher fetcher; @Mock BackupQueryBuilder queryBuilder; @Mock ContentResolver resolver; Context context; @Before public void before() { initMocks(this); context = Robolectric.application; fetcher = new BackupItemsFetcher( context, resolver, queryBuilder); } @Test public void shouldGetItemsForDataType() throws Exception { SMS.setBackupEnabled(context, true); assertThat(fetcher.getItemsForDataType(SMS, null, -1).getCount()).isEqualTo(0); verifyZeroInteractions(resolver); } @Test public void shouldCatchSQLiteExceptions() throws Exception { SMS.setBackupEnabled(context, true); when(resolver.query(any(Uri.class), any(String[].class), anyString(), any(String[].class), anyString())) .thenThrow(new SQLiteException()); mockEmptyQuery(); assertThat(fetcher.getItemsForDataType(SMS, null, -1).getCount()).isEqualTo(0); } @Test public void shouldCatchNullPointerExceptions() throws Exception { SMS.setBackupEnabled(context, true); when(resolver.query(any(Uri.class), any(String[].class), anyString(), any(String[].class), anyString())) .thenThrow(new NullPointerException()); mockEmptyQuery(); assertThat(fetcher.getItemsForDataType(SMS, null, -1).getCount()).isEqualTo(0); } @Test public void shouldReturnDefaultIfDataTypeCannotBeRead() throws Exception { for (DataType type : DataType.values()) { assertThat(fetcher.getMostRecentTimestamp(type)).isEqualTo(-1); } } @Test public void shouldGetgetMostRecentTimestampForItemTypeSMS() throws Exception { mockMostRecentTimestampForType(SMS, 23L); assertThat(fetcher.getMostRecentTimestamp(SMS)).isEqualTo(23L); } @Test public void shouldgetMostRecentTimestampForItemTypeMMS() throws Exception { mockMostRecentTimestampForType(MMS, 23L); assertThat(fetcher.getMostRecentTimestamp(MMS)).isEqualTo(23L); } @Test public void shouldGetMostRecentTimestampForItemTypeCallLog() throws Exception { mockMostRecentTimestampForType(CALLLOG, 23L); assertThat(fetcher.getMostRecentTimestamp(CALLLOG)).isEqualTo(23L); } private void mockMostRecentTimestampForType(DataType type, long max) { MatrixCursor cursor = new MatrixCursor(new String[]{"date"}); cursor.addRow(new Object[] { max }); BackupQueryBuilder.Query query = mock(BackupQueryBuilder.Query.class); when(queryBuilder.buildMostRecentQueryForDataType(type)).thenReturn(query); when(resolver.query(any(Uri.class), any(String[].class), any(String.class), any(String[].class), any(String.class))).thenReturn(cursor); } private void mockEmptyQuery() { BackupQueryBuilder.Query query = mock(BackupQueryBuilder.Query.class); when(queryBuilder.buildQueryForDataType(SMS, null, -1)).thenReturn(query); } }