package co.smartreceipts.android.sync;
import android.support.v4.app.FragmentActivity;
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 co.smartreceipts.android.sync.network.NetworkManager;
import co.smartreceipts.android.sync.network.SupportedNetworkType;
import co.smartreceipts.android.sync.provider.SyncProvider;
import co.smartreceipts.android.sync.provider.SyncProviderFactory;
import co.smartreceipts.android.sync.provider.SyncProviderStore;
import static junit.framework.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@RunWith(RobolectricTestRunner.class)
public class BackupProvidersManagerTest {
// Class under test
BackupProvidersManager mBackupProvidersManager;
@Mock
BackupProvider mNoneBackupProvider;
@Mock
BackupProvider mDriveBackupProvider;
@Mock
SyncProviderFactory mSyncProviderFactory;
@Mock
SyncProviderStore mSyncProviderStore;
@Mock
NetworkManager mNetworkManager;
@Mock
FragmentActivity mFragmentActivity;
@Mock
BackupProviderChangeListener mBackupProviderChangeListener1, mBackupProviderChangeListener2;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mSyncProviderStore.getProvider()).thenReturn(SyncProvider.None);
when(mSyncProviderFactory.get(SyncProvider.None)).thenReturn(mNoneBackupProvider);
when(mSyncProviderFactory.get(SyncProvider.GoogleDrive)).thenReturn(mDriveBackupProvider);
mBackupProvidersManager = new BackupProvidersManager(mSyncProviderFactory, mSyncProviderStore, mNetworkManager);
mBackupProvidersManager.registerChangeListener(mBackupProviderChangeListener1);
mBackupProvidersManager.registerChangeListener(mBackupProviderChangeListener2);
mBackupProvidersManager.unregisterChangeListener(mBackupProviderChangeListener2);
}
@Test
public void initialize() {
mBackupProvidersManager.initialize(mFragmentActivity);
verify(mNoneBackupProvider).initialize(mFragmentActivity);
}
@Test
public synchronized void deinitialize() {
mBackupProvidersManager.deinitialize();
verify(mNoneBackupProvider).deinitialize();
}
@Test
public void onActivityResult() {
mBackupProvidersManager.onActivityResult(0, 0, null);
verify(mNoneBackupProvider).onActivityResult(0, 0, null);
}
@Test
public void getRemoteBackups() {
mBackupProvidersManager.getRemoteBackups();
verify(mNoneBackupProvider).getRemoteBackups();
}
@Test
public void getDeviceSyncId() {
mBackupProvidersManager.getDeviceSyncId();
verify(mNoneBackupProvider).getDeviceSyncId();
}
@Test
public void getSyncProvider() {
assertEquals(SyncProvider.None, mBackupProvidersManager.getSyncProvider());
verify(mSyncProviderStore, times(2)).getProvider();
}
@Test
public void setAndInitializeNetworkProviderType() {
mBackupProvidersManager.setAndInitializeNetworkProviderType(SupportedNetworkType.WifiOnly);
verify(mNetworkManager).setAndInitializeNetworkProviderType(SupportedNetworkType.WifiOnly);
}
@Test
public void setAndInitializeSyncProvider() {
when(mSyncProviderStore.setSyncProvider(any(SyncProvider.class))).thenReturn(true);
mBackupProvidersManager.setAndInitializeSyncProvider(SyncProvider.GoogleDrive, mFragmentActivity);
verify(mNoneBackupProvider).deinitialize();
verify(mDriveBackupProvider).initialize(mFragmentActivity);
// And confirm our internal refs now work
mBackupProvidersManager.onActivityResult(0, 0, null);
verify(mDriveBackupProvider).onActivityResult(0, 0, null);
mBackupProvidersManager.deinitialize();
verify(mDriveBackupProvider).deinitialize();
mBackupProvidersManager.initialize(mFragmentActivity);
verify(mDriveBackupProvider, times(2)).initialize(mFragmentActivity);
verify(mBackupProviderChangeListener1).onProviderChanged(SyncProvider.GoogleDrive);
mBackupProvidersManager.getRemoteBackups();
verify(mDriveBackupProvider).getRemoteBackups();
mBackupProvidersManager.getDeviceSyncId();
verify(mDriveBackupProvider).getDeviceSyncId();
verifyZeroInteractions(mBackupProviderChangeListener2);
}
@Test
public void setAndInitializeTheCurrentSyncProvider() {
when(mSyncProviderStore.setSyncProvider(any(SyncProvider.class))).thenReturn(false);
mBackupProvidersManager.setAndInitializeSyncProvider(SyncProvider.GoogleDrive, mFragmentActivity);
verify(mNoneBackupProvider, never()).deinitialize();
verify(mDriveBackupProvider, never()).initialize(mFragmentActivity);
verifyZeroInteractions(mBackupProviderChangeListener1);
verifyZeroInteractions(mBackupProviderChangeListener2);
}
}