package co.smartreceipts.android.sync.drive.managers; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.io.File; import co.smartreceipts.android.analytics.Analytics; import co.smartreceipts.android.analytics.events.ErrorEvent; import co.smartreceipts.android.persistence.DatabaseHelper; import co.smartreceipts.android.sync.drive.device.GoogleDriveSyncMetadata; import co.smartreceipts.android.sync.drive.rx.DriveStreamsManager; import co.smartreceipts.android.sync.model.impl.Identifier; import co.smartreceipts.android.sync.network.NetworkManager; import io.reactivex.Single; import io.reactivex.schedulers.Schedulers; import static org.mockito.Matchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) public class DriveDatabaseManagerTest { // Class under test DriveDatabaseManager mDriveDatabaseManager; File mDatabaseFile; @Mock DriveStreamsManager mDriveStreamsManager; @Mock GoogleDriveSyncMetadata mGoogleDriveSyncMetadata; @Mock NetworkManager mNetworkManager; @Mock Analytics mAnalytics; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mDatabaseFile = new File(RuntimeEnvironment.application.getExternalFilesDir(null), DatabaseHelper.DATABASE_NAME); if (!mDatabaseFile.createNewFile()) { throw new RuntimeException("Failed to create database file... Failing this test"); } when(mNetworkManager.isNetworkAvailable()).thenReturn(true); mDriveDatabaseManager = new DriveDatabaseManager(RuntimeEnvironment.application, mDriveStreamsManager, mGoogleDriveSyncMetadata, mNetworkManager, mAnalytics, Schedulers.trampoline(), Schedulers.trampoline()); } @After @SuppressWarnings("ResultOfMethodCallIgnored") public void tearDown() throws Exception { mDatabaseFile.delete(); } @Test public void syncDatabaseWithoutNetwork() { when(mNetworkManager.isNetworkAvailable()).thenReturn(false); final Identifier identifier = new Identifier("newId"); when(mDriveStreamsManager.uploadFileToDrive(mDatabaseFile)).thenReturn(Single.just(identifier)); mDriveDatabaseManager.syncDatabase(); verify(mGoogleDriveSyncMetadata, never()).setDatabaseSyncIdentifier(identifier); } @Test public void syncDatabaseForTheFirstTime() { final Identifier identifier = new Identifier("newId"); when(mDriveStreamsManager.uploadFileToDrive(mDatabaseFile)).thenReturn(Single.just(identifier)); mDriveDatabaseManager.syncDatabase(); verify(mGoogleDriveSyncMetadata).setDatabaseSyncIdentifier(identifier); } @Test public void syncExistingDatabase() { final Identifier identifier = new Identifier("oldId"); when(mGoogleDriveSyncMetadata.getDatabaseSyncIdentifier()).thenReturn(identifier); when(mDriveStreamsManager.updateDriveFile(identifier, mDatabaseFile)).thenReturn(Single.just(identifier)); mDriveDatabaseManager.syncDatabase(); verify(mGoogleDriveSyncMetadata).setDatabaseSyncIdentifier(identifier); } @Test public void syncDatabaseError() { final Exception e = new Exception(); when(mDriveStreamsManager.uploadFileToDrive(mDatabaseFile)).thenReturn(Single.error(e)); mDriveDatabaseManager.syncDatabase(); verify(mGoogleDriveSyncMetadata, never()).setDatabaseSyncIdentifier(any(Identifier.class)); verify(mAnalytics).record(any(ErrorEvent.class)); } }