package com.novoda.downloadmanager.lib; import android.content.ContentResolver; import android.net.Uri; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import static com.novoda.downloadmanager.lib.DownloadContract.Downloads.*; import static com.novoda.downloadmanager.lib.DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP; import static com.novoda.downloadmanager.lib.DownloadManager.COLUMN_STATUS; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.*; import static org.mockito.Mockito.verify; import static org.mockito.MockitoAnnotations.initMocks; public class QueryTest { @Mock private Uri uri; @Mock private ContentResolver resolver; @Captor ArgumentCaptor<String> stringArgumentCaptor; private Query query; @Before public void setUp() throws Exception { initMocks(this); query = new Query(); } @Test public void givenBatchIdsWhenTheQueryIsCreatedThenTheWhereStatementIsCorrect() { query.setFilterByBatchId(1, 2, 3).runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), stringArgumentCaptor.capture(), any(String[].class), anyString()); assertSelectionContains(COLUMN_BATCH_ID + " IN (1,2,3)"); } @Test public void givenNoBatchIdsWhenTheQueryIsCreatedThenTheWhereStatementContainsNoBatchIdPredicate() { query.runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), stringArgumentCaptor.capture(), any(String[].class), anyString()); assertSelectionDoesNotContain(COLUMN_BATCH_ID + " IN "); } @Test public void whenWeSetABatchStatusOrderByOnAQueryThenTheResolverIsQueriedWithTheCorrectSortOrder() { query.orderBy(COLUMN_LAST_MODIFIED_TIMESTAMP, Query.ORDER_ASCENDING).runQuery(resolver, null, uri); // Actually resolves to DownloadContract.Downloads.COLUMN_LAST_MODIFIED verify(resolver).query(any(Uri.class), any(String[].class), anyString(), any(String[].class), eq("last_modified_timestamp ASC")); } @Test public void whenWeSetNoOrderByOnAQueryThenTheResolverIsQueriedWithTheLastModifiedSortOrder() { query.runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), anyString(), any(String[].class), eq("last_modified_timestamp DESC")); } @Test public void whenOrderingByLivenessThenTheResolverIsQueriedWithTheExpectedSort() { query.orderByLiveness().runQuery(resolver, null, uri); verify(resolver).query( any(Uri.class), any(String[].class), anyString(), any(String[].class), eq( "CASE status " + "WHEN 192 THEN 1 " + "WHEN 190 THEN 2 " + "WHEN 193 THEN 3 " + "WHEN 498 THEN 4 " + "WHEN 200 THEN 5 " + "ELSE 6 END, _id ASC")); } @Test(expected = IllegalArgumentException.class) public void whenWeSetAnUnsupportedOrderByOnAQueryThenTheResolverIsQueriedWithTheCorrectSortOrder() { int anyOrder = Query.ORDER_ASCENDING; query.orderBy(COLUMN_STATUS, anyOrder).runQuery(resolver, null, uri); // Expecting an exception } @Test public void givenNotificationExtrasWhenTheQueryIsCreatedThenTheWhereStatementIsCorrect() { query.setFilterByNotificationExtras("something extra").runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), stringArgumentCaptor.capture(), any(String[].class), anyString()); assertSelectionContains(COLUMN_NOTIFICATION_EXTRAS + " = 'something extra'"); } @Test public void givenNoNotificationExtrasWhenTheQueryIsCreatedThenTheWhereStatementContainsNoBatchIdPredicate() { query.runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), stringArgumentCaptor.capture(), any(String[].class), anyString()); assertSelectionDoesNotContain(COLUMN_NOTIFICATION_EXTRAS + " IN "); } @Test public void givenExtraDataWhenTheQueryIsCreatedThenTheWhereStatementIsCorrect() { query.setFilterByExtraData("something extra").runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), stringArgumentCaptor.capture(), any(String[].class), anyString()); assertSelectionContains(COLUMN_EXTRA_DATA + " = 'something extra'"); } @Test public void givenNoExtraDataWhenTheQueryIsCreatedThenTheWhereStatementContainsNoBatchIdPredicate() { query.runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), stringArgumentCaptor.capture(), any(String[].class), anyString()); assertSelectionDoesNotContain(COLUMN_EXTRA_DATA + " IN "); } @Test public void givenMultipleNotificationExtrasWhenTheQueryIsCreatedThenTheWhereStatementIsCorrect() { query.setFilterByNotificationExtras("13", "14").runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), stringArgumentCaptor.capture(), any(String[].class), anyString()); assertSelectionContains("(" + COLUMN_NOTIFICATION_EXTRAS + " = '13' OR " + COLUMN_NOTIFICATION_EXTRAS + " = '14')"); } @Test public void givenEmptyNotificationExtrasWhenTheQueryIsCreatedThenTheWhereStatementDoesNotContainExtrasPredicate() { String[] empty = {}; query.setFilterByNotificationExtras(empty).runQuery(resolver, null, uri); verify(resolver).query(any(Uri.class), any(String[].class), stringArgumentCaptor.capture(), any(String[].class), anyString()); assertSelectionDoesNotContain(COLUMN_NOTIFICATION_EXTRAS); } private void assertSelectionContains(String sequence) { assertThat(stringArgumentCaptor.getValue()).contains(sequence); } private void assertSelectionDoesNotContain(String sequence) { assertThat(stringArgumentCaptor.getValue()).doesNotContain(sequence); } }