package com.patloew.rxlocation; import android.support.v4.content.ContextCompat; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.Api; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.Status; import com.google.android.gms.location.ActivityRecognition; import com.google.android.gms.location.LocationServices; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.powermock.core.classloader.annotations.PrepareOnlyThisForTest; import org.powermock.modules.junit4.PowerMockRunner; import io.reactivex.BackpressureStrategy; import io.reactivex.Flowable; import io.reactivex.FlowableEmitter; import io.reactivex.subscribers.TestSubscriber; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @RunWith(PowerMockRunner.class) @PrepareOnlyThisForTest({ ContextCompat.class, LocationServices.class, ActivityRecognition.class, Status.class, ConnectionResult.class }) public class RxLocationFlowableOnSubscribeTest extends BaseOnSubscribeTest { @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); super.setup(); } @Test public void BaseObservable_ApiClient_Connected() { final Object object = new Object(); RxLocationFlowableOnSubscribe<Object> observable = spy(new RxLocationFlowableOnSubscribe<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<? super Object> subscriber) { subscriber.onNext(object); subscriber.onComplete(); } }); doAnswer(invocation -> { RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnected(null); return apiClient; }).when(observable).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); TestSubscriber<Object> sub = Flowable.create(observable, BackpressureStrategy.MISSING).test(); sub.assertValue(object); sub.assertComplete(); } @Test public void BaseObservable_ApiClient_Connected_Dispose() { final Object object = new Object(); RxLocationFlowableOnSubscribe<Object> observable = spy(new RxLocationFlowableOnSubscribe<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<? super Object> subscriber) { subscriber.onNext(object); } }); doAnswer(invocation -> { RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnected(null); return apiClient; }).when(observable).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); doReturn(true).when(apiClient).isConnected(); Flowable.create(observable, BackpressureStrategy.MISSING).subscribe().dispose(); verify(observable).onUnsubscribed(apiClient); verify(apiClient).disconnect(); } @Test public void BaseObservable_ApiClient_ConnectionSuspended() { final Object object = new Object(); RxLocationFlowableOnSubscribe<Object> observable = spy(new RxLocationFlowableOnSubscribe<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<? super Object> subscriber) { subscriber.onNext(object); subscriber.onComplete(); } }); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnectionSuspended(0); return apiClient; } }).when(observable).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); TestSubscriber<Object> sub = Flowable.create(observable, BackpressureStrategy.MISSING).test(); sub.assertNoValues(); sub.assertError(GoogleApiConnectionSuspendedException.class); } @Test public void BaseObservable_ApiClient_ConnectionFailed() { final Object object = new Object(); RxLocationFlowableOnSubscribe<Object> observable = spy(new RxLocationFlowableOnSubscribe<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, FlowableEmitter<? super Object> subscriber) { subscriber.onNext(object); subscriber.onComplete(); } }); doReturn(false).when(connectionResult).hasResolution(); doAnswer(invocation -> { RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnectionFailed(connectionResult); return apiClient; }).when(observable).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); TestSubscriber<Object> sub = Flowable.create(observable, BackpressureStrategy.MISSING).test(); sub.assertNoValues(); sub.assertError(GoogleApiConnectionException.class); } }