package com.patloew.rxlocation; import android.app.PendingIntent; import android.support.annotation.CallSuper; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.PendingResult; import com.google.android.gms.common.api.Result; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.android.gms.location.ActivityRecognition; import com.google.android.gms.location.ActivityRecognitionApi; import com.google.android.gms.location.FusedLocationProviderApi; import com.google.android.gms.location.GeofencingApi; import com.google.android.gms.location.LocationServices; import com.google.android.gms.location.SettingsApi; import org.mockito.Matchers; import org.mockito.Mock; import org.powermock.api.mockito.PowerMockito; import org.powermock.reflect.Whitebox; import io.reactivex.FlowableEmitter; import io.reactivex.MaybeEmitter; import io.reactivex.SingleEmitter; import io.reactivex.observers.TestObserver; import io.reactivex.subscribers.TestSubscriber; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; public abstract class BaseOnSubscribeTest extends BaseTest { @Mock GoogleApiClient apiClient; @Mock Status status; @Mock ConnectionResult connectionResult; @Mock PendingResult pendingResult; @Mock PendingIntent pendingIntent; @Mock FusedLocationProviderApi fusedLocationProviderApi; @Mock ActivityRecognitionApi activityRecognitionApi; @Mock GeofencingApi geofencingApi; @Mock SettingsApi settingsApi; @CallSuper public void setup() throws Exception { PowerMockito.mockStatic(LocationServices.class); PowerMockito.mockStatic(ActivityRecognition.class); Whitebox.setInternalState(LocationServices.class, fusedLocationProviderApi); Whitebox.setInternalState(LocationServices.class, geofencingApi); Whitebox.setInternalState(LocationServices.class, settingsApi); Whitebox.setInternalState(ActivityRecognition.class, activityRecognitionApi); doReturn(status).when(status).getStatus(); super.setup(); } // Mock GoogleApiClient connection success behaviour protected <T> void setupBaseFlowableSuccess(final RxLocationFlowableOnSubscribe<T> rxLocationFlowableOnSubscribe) { setupBaseFlowableSuccess(rxLocationFlowableOnSubscribe, apiClient); } // Mock GoogleApiClient connection success behaviour protected <T> void setupBaseFlowableSuccess(final RxLocationFlowableOnSubscribe<T> rxLocationFlowableOnSubscribe, final GoogleApiClient apiClient) { doAnswer(invocation -> { final FlowableEmitter<T> subscriber = ((RxLocationFlowableOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter; doAnswer(invocation1 -> { rxLocationFlowableOnSubscribe.onGoogleApiClientReady(apiClient, subscriber); return null; }).when(apiClient).connect(); return apiClient; }).when(rxLocationFlowableOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); } // Mock GoogleApiClient connection success behaviour protected <T> void setupBaseSingleSuccess(final RxLocationSingleOnSubscribe<T> rxLocationSingleOnSubscribe) { setupBaseSingleSuccess(rxLocationSingleOnSubscribe, apiClient); } // Mock GoogleApiClient connection success behaviour protected <T> void setupBaseSingleSuccess(final RxLocationSingleOnSubscribe<T> rxLocationSingleOnSubscribe, final GoogleApiClient apiClient) { doAnswer(invocation -> { final SingleEmitter<T> subscriber = ((RxLocationSingleOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter; doAnswer(invocation1 -> { rxLocationSingleOnSubscribe.onGoogleApiClientReady(apiClient, subscriber); return null; }).when(apiClient).connect(); return apiClient; }).when(rxLocationSingleOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); } // Mock GoogleApiClient connection success behaviour protected <T> void setupBaseMaybeSuccess(final RxLocationMaybeOnSubscribe<T> baseSingle) { setupBaseMaybeSuccess(baseSingle, apiClient); } // Mock GoogleApiClient connection success behaviour protected <T> void setupBaseMaybeSuccess(final RxLocationMaybeOnSubscribe<T> baseSingle, final GoogleApiClient apiClient) { doAnswer(invocation -> { final MaybeEmitter<T> subscriber = ((RxLocationMaybeOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter; doAnswer(invocation1 -> { baseSingle.onGoogleApiClientReady(apiClient, subscriber); return null; }).when(apiClient).connect(); return apiClient; }).when(baseSingle).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); } // Mock GoogleApiClient connection error behaviour protected <T> void setupBaseSingleError(final RxLocationSingleOnSubscribe<T> rxLocationSingleOnSubscribe) { doAnswer(invocation -> { final SingleEmitter<T> subscriber = ((RxLocationSingleOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter; doAnswer(invocation1 -> { subscriber.onError(new GoogleApiConnectionException("Error connecting to GoogleApiClient.", connectionResult)); return null; }).when(apiClient).connect(); return apiClient; }).when(rxLocationSingleOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); } // Mock GoogleApiClient connection error behaviour protected <T> void setupBaseFlowableError(final RxLocationFlowableOnSubscribe<T> rxLocationFlowableOnSubscribe) { doAnswer(invocation -> { final FlowableEmitter<T> subscriber = ((RxLocationFlowableOnSubscribe.ApiClientConnectionCallbacks)invocation.getArguments()[0]).emitter; doAnswer(invocation1 -> { subscriber.onError(new GoogleApiConnectionException("Error connecting to GoogleApiClient.", connectionResult)); return null; }).when(apiClient).connect(); return apiClient; }).when(rxLocationFlowableOnSubscribe).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); } @SuppressWarnings("unchecked") protected void setPendingResultValue(final Result result) { doAnswer(invocation -> { ((ResultCallback)invocation.getArguments()[0]).onResult(result); return null; }).when(pendingResult).setResultCallback(Matchers.<ResultCallback>any()); } protected static void assertError(TestObserver sub, Class<? extends Throwable> errorClass) { sub.assertError(errorClass); sub.assertNoValues(); } protected static void assertError(TestSubscriber sub, Class<? extends Throwable> errorClass) { sub.assertError(errorClass); sub.assertNoValues(); } @SuppressWarnings("unchecked") protected static void assertSingleValue(TestObserver sub, Object value) { sub.assertComplete(); sub.assertValue(value); } @SuppressWarnings("unchecked") protected static void assertSingleValue(TestSubscriber sub, Object value) { sub.assertComplete(); sub.assertValue(value); } protected static void assertNoValue(TestObserver sub) { sub.assertComplete(); sub.assertNoValues(); } }