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.powermock.core.classloader.annotations.PrepareOnlyThisForTest; import org.powermock.modules.junit4.PowerMockRunner; import io.reactivex.Single; import io.reactivex.SingleEmitter; import io.reactivex.observers.TestObserver; 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, Status.class, LocationServices.class, ActivityRecognition.class, ConnectionResult.class, SingleEmitter.class }) public class RxLocationSingleOnSubscribeTest extends BaseOnSubscribeTest { @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); super.setup(); } @Test public void ApiClient_Connected() { final Object object = new Object(); RxLocationSingleOnSubscribe<Object> single = spy(new RxLocationSingleOnSubscribe<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<? super Object> emitter) { emitter.onSuccess(object); } }); doAnswer(invocation -> { RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnected(null); return apiClient; }).when(single).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); TestObserver<Object> sub = Single.create(single).test(); sub.assertValue(object); sub.assertComplete(); } @Test public void ApiClient_Connected_Dispose() { RxLocationSingleOnSubscribe<Object> single = spy(new RxLocationSingleOnSubscribe<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<? super Object> emitter) { } }); doAnswer(invocation -> { RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnected(null); return apiClient; }).when(single).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); doReturn(true).when(apiClient).isConnected(); Single.create(single).subscribe().dispose(); verify(single).onUnsubscribed(apiClient); verify(apiClient).disconnect(); } @Test public void ApiClient_ConnectionSuspended() { final Object object = new Object(); RxLocationSingleOnSubscribe<Object> single = spy(new RxLocationSingleOnSubscribe<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<? super Object> emitter) { emitter.onSuccess(object); } }); doAnswer(invocation -> { RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnectionSuspended(0); return apiClient; }).when(single).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); TestObserver<Object> sub = Single.create(single).test(); sub.assertNoValues(); sub.assertError(GoogleApiConnectionSuspendedException.class); } @Test public void ApiClient_ConnectionFailed() { final Object object = new Object(); RxLocationSingleOnSubscribe<Object> single = spy(new RxLocationSingleOnSubscribe<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<? super Object> emitter) { emitter.onSuccess(object); } }); 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(single).createApiClient(Matchers.any(RxLocationBaseOnSubscribe.ApiClientConnectionCallbacks.class)); TestObserver<Object> sub = Single.create(single).test(); sub.assertNoValues(); sub.assertError(GoogleApiConnectionException.class); } }