package com.patloew.rxlocation;
import android.app.PendingIntent;
import android.location.Location;
import android.os.Looper;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationAvailability;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import io.reactivex.Maybe;
import io.reactivex.Single;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@SuppressWarnings("MissingPermission")
@RunWith(PowerMockRunner.class)
@PrepareOnlyThisForTest({ LocationRequest.class, LocationAvailability.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class, RxLocationBaseOnSubscribe.class })
public class LocationOnSubscribeTest extends BaseOnSubscribeTest {
@Mock PendingIntent pendingIntent;
@Mock LocationRequest locationRequest;
@Mock Location location;
@Override
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
super.setup();
}
// LocationAvailabilitySingle
@Test
public void LocationAvailabilitySingle_Success() {
LocationAvailabilitySingleOnSubscribe single = PowerMockito.spy(new LocationAvailabilitySingleOnSubscribe(rxLocation));
LocationAvailability locationAvailability = Mockito.mock(LocationAvailability.class);
doReturn(true).when(locationAvailability).isLocationAvailable();
when(fusedLocationProviderApi.getLocationAvailability(apiClient)).thenReturn(locationAvailability);
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), true);
}
@Test
public void LocationAvailabilitySingle_Null_False() {
LocationAvailabilitySingleOnSubscribe single = PowerMockito.spy(new LocationAvailabilitySingleOnSubscribe(rxLocation));
when(fusedLocationProviderApi.getLocationAvailability(apiClient)).thenReturn(null);
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), false);
}
// LocationFlushSingle
@Test
public void LocationFlushSingle_Success() {
LocationFlushSingleOnSubscribe single = PowerMockito.spy(new LocationFlushSingleOnSubscribe(rxLocation, null, null));
setPendingResultValue(status);
when(status.isSuccess()).thenReturn(true);
when(fusedLocationProviderApi.flushLocations(apiClient)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), status);
}
@Test
public void LocationFlushSingle_StatusException() {
LocationFlushSingleOnSubscribe single = PowerMockito.spy(new LocationFlushSingleOnSubscribe(rxLocation, null, null));
setPendingResultValue(status);
when(status.isSuccess()).thenReturn(false);
when(fusedLocationProviderApi.flushLocations(apiClient)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertError(Single.create(single).test(), StatusException.class);
}
// LocationLastMaybe
@Test
public void LocationLastMaybe_Success() {
LocationLastMaybeOnSubscribe maybe = PowerMockito.spy(new LocationLastMaybeOnSubscribe(rxLocation));
Location location = Mockito.mock(Location.class);
when(fusedLocationProviderApi.getLastLocation(apiClient)).thenReturn(location);
setupBaseMaybeSuccess(maybe);
assertSingleValue(Maybe.create(maybe).test(), location);
}
@Test
public void LocationLastMaybe_Null_False() {
LocationLastMaybeOnSubscribe maybe = PowerMockito.spy(new LocationLastMaybeOnSubscribe(rxLocation));
when(fusedLocationProviderApi.getLocationAvailability(apiClient)).thenReturn(null);
setupBaseMaybeSuccess(maybe);
assertNoValue(Maybe.create(maybe).test());
}
// LocationRemoveUpdatesSingle
@Test
public void LocationRemoveUpdatesSingle_Success() {
LocationRemoveUpdatesSingleOnSubscribe single = PowerMockito.spy(new LocationRemoveUpdatesSingleOnSubscribe(rxLocation, pendingIntent, null, null));
setPendingResultValue(status);
when(status.isSuccess()).thenReturn(true);
when(fusedLocationProviderApi.removeLocationUpdates(apiClient, pendingIntent)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), status);
}
@Test
public void LocationRemoveUpdatesSingle_StatusException() {
LocationRemoveUpdatesSingleOnSubscribe single = PowerMockito.spy(new LocationRemoveUpdatesSingleOnSubscribe(rxLocation, pendingIntent, null, null));
setPendingResultValue(status);
when(status.isSuccess()).thenReturn(false);
when(fusedLocationProviderApi.removeLocationUpdates(apiClient, pendingIntent)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertError(Single.create(single).test(), StatusException.class);
}
// LocationRequestUpdatesSingle
@Test
public void LocationRequestUpdatesSingle_Success() {
LocationRequestUpdatesSingleOnSubscribe single = PowerMockito.spy(new LocationRequestUpdatesSingleOnSubscribe(rxLocation, locationRequest, pendingIntent, null, null));
setPendingResultValue(status);
when(status.isSuccess()).thenReturn(true);
when(fusedLocationProviderApi.requestLocationUpdates(apiClient, locationRequest, pendingIntent)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), status);
}
@Test
public void LocationRequestUpdatesSingle_StatusException() {
LocationRequestUpdatesSingleOnSubscribe single = PowerMockito.spy(new LocationRequestUpdatesSingleOnSubscribe(rxLocation, locationRequest, pendingIntent, null, null));
setPendingResultValue(status);
when(status.isSuccess()).thenReturn(false);
when(fusedLocationProviderApi.requestLocationUpdates(apiClient, locationRequest, pendingIntent)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertError(Single.create(single).test(), StatusException.class);
}
// LocationUpdatesFlowable
@Test
public void LocationUpdatesFlowable_Success() {
LocationUpdatesFlowableOnSubscribe single = PowerMockito.spy(new LocationUpdatesFlowableOnSubscribe(rxLocation, locationRequest, null, null, null));
setPendingResultValue(status);
doReturn(true).when(status).isSuccess();
doAnswer(invocation -> {
single.locationListener.onLocationChanged(location);
return pendingResult;
}).when(fusedLocationProviderApi).requestLocationUpdates(eq(apiClient), eq(locationRequest), any(LocationListener.class), isNull(Looper.class));
setupBaseFlowableSuccess(single);
Flowable.create(single, BackpressureStrategy.BUFFER).test()
.assertValue(location)
.assertNotTerminated();
}
@Test
public void LocationUpdatesFlowable_StatusException() {
LocationUpdatesFlowableOnSubscribe single = PowerMockito.spy(new LocationUpdatesFlowableOnSubscribe(rxLocation, locationRequest, null, null, null));
setPendingResultValue(status);
when(status.isSuccess()).thenReturn(false);
doReturn(pendingResult).when(fusedLocationProviderApi).requestLocationUpdates(eq(apiClient), eq(locationRequest), any(LocationListener.class), isNull(Looper.class));
setupBaseFlowableSuccess(single);
Flowable.create(single, BackpressureStrategy.BUFFER).test()
.assertNoValues()
.assertError(StatusException.class);
}
}