package com.novoda.downloadmanager.lib;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import com.novoda.downloadmanager.lib.DownloadContract.Batches;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.isNull;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.whenNew;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ContentUris.class, BatchStartingRepository.class})
public class BatchStartingRepositoryTest {
private static final Uri PUBLICLY_ACCESSIBLE_DOWNLOADS_URI = mock(Uri.class);
private static final Uri DOWNLOADS_BY_BATCH_URI = mock(Uri.class);
private static final Uri ALL_DOWNLOADS_URI = mock(Uri.class);
private static final Uri BATCHES_URI = mock(Uri.class);
private static final Uri BATCH_BY_ID_URI = mock(Uri.class);
private static final Uri CONTENT_URI = mock(Uri.class);
private static final Uri DOWNLOADS_WITHOUT_PROGRESS_URI = mock(Uri.class);
private static final Uri BATCHES_WITHOUT_PROGRESS_URI = mock(Uri.class);
private static final long ANY_BATCH_ID = 1l;
public static final int SQL_TRUE = 1;
private BatchStartingRepository batchStatusService;
private Cursor mockCursor;
private ContentResolver mockContentResolver;
@Before
public void setUp() throws Exception {
mockStatic(ContentUris.class);
when(ContentUris.withAppendedId(BATCHES_URI, ANY_BATCH_ID)).thenReturn(BATCH_BY_ID_URI);
mockContentResolver = mock(ContentResolver.class);
batchStatusService = new BatchStartingRepository(
mockContentResolver,
givenDownloadsUriProvider()
);
mockCursor = mock(Cursor.class);
when(mockCursor.moveToFirst()).thenReturn(true);
when(mockContentResolver.query(
same(BATCH_BY_ID_URI),
any(String[].class),
isNull(String.class),
isNull(String[].class),
isNull(String.class)
)).thenReturn(mockCursor);
}
@Test
public void whenQueryingForStartedBatchThenResultIsFalse() throws Exception {
when(mockCursor.getInt(0)).thenReturn(1);
boolean hasStarted = batchStatusService.isBatchStartingForTheFirstTime(ANY_BATCH_ID);
assertThat(hasStarted).isFalse();
}
@Test
public void whenQueryingForNotStartedBatchThenResultIsTrue() throws Exception {
when(mockCursor.getInt(0)).thenReturn(0);
boolean hasStarted = batchStatusService.isBatchStartingForTheFirstTime(ANY_BATCH_ID);
assertThat(hasStarted).isTrue();
}
@Test
public void whenMarkingBatchAsStartedThenCorrectBatchIsMarked() throws Exception {
ContentValues mockContentValues = mock(ContentValues.class);
whenNew(ContentValues.class).withAnyArguments()
.thenReturn(mockContentValues);
batchStatusService.markBatchAsStarted(ANY_BATCH_ID);
InOrder order = inOrder(mockContentValues, mockContentResolver);
order.verify(mockContentValues).put(Batches.COLUMN_HAS_STARTED, SQL_TRUE);
order.verify(mockContentResolver).update(
BATCH_BY_ID_URI,
mockContentValues,
null,
null
);
}
private static DownloadsUriProvider givenDownloadsUriProvider() {
return new DownloadsUriProvider(
PUBLICLY_ACCESSIBLE_DOWNLOADS_URI,
DOWNLOADS_BY_BATCH_URI,
ALL_DOWNLOADS_URI,
BATCHES_URI,
CONTENT_URI,
DOWNLOADS_WITHOUT_PROGRESS_URI,
BATCHES_WITHOUT_PROGRESS_URI
);
}
}