package com.patloew.rxlocation;
import android.app.Activity;
import android.content.Intent;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationAvailability;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
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.Single;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@SuppressWarnings("MissingPermission")
@RunWith(PowerMockRunner.class)
@PrepareOnlyThisForTest({ LocationSettingsRequest.class, LocationSettingsResult.class, LocationAvailability.class, LocationServices.class, com.google.android.gms.location.ActivityRecognition.class, Status.class, ConnectionResult.class, RxLocationBaseOnSubscribe.class })
public class SettingsOnSubscribeTest extends BaseOnSubscribeTest {
@Mock LocationSettingsRequest locationSettingsRequest;
@Mock LocationSettingsResult locationSettingsResult;
@Override
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
super.setup();
}
// SettingsCheckSingle
@Test
public void SettingsCheckSingle_Success() {
SettingsCheckSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));
setPendingResultValue(locationSettingsResult);
doReturn(status).when(locationSettingsResult).getStatus();
doReturn(true).when(status).isSuccess();
when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), locationSettingsResult);
}
@Test
public void SettingsCheckSingle_StatusException() {
SettingsCheckSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));
setPendingResultValue(locationSettingsResult);
doReturn(status).when(locationSettingsResult).getStatus();
doReturn(false).when(status).isSuccess();
when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertError(Single.create(single).test(), StatusException.class);
}
// SettingsCheckHandleSingle
@Test
public void SettingsCheckHandleSingle_Success() {
SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));
setPendingResultValue(locationSettingsResult);
doReturn(status).when(locationSettingsResult).getStatus();
doReturn(LocationSettingsStatusCodes.SUCCESS).when(status).getStatusCode();
when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), true);
}
@Test
public void SettingsCheckHandleSingle_ChangeUnavailable() {
SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));
setPendingResultValue(locationSettingsResult);
doReturn(status).when(locationSettingsResult).getStatus();
doReturn(LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE).when(status).getStatusCode();
when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), false);
}
@Test
public void SettingsCheckHandleSingle_ResolutionRequired_Success() {
SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));
setPendingResultValue(locationSettingsResult);
doReturn(status).when(locationSettingsResult).getStatus();
doReturn(LocationSettingsStatusCodes.RESOLUTION_REQUIRED).when(status).getStatusCode();
when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);
doAnswer(invocation -> {
String key = (String) SettingsCheckHandleSingleOnSubscribe.observableMap.keySet().toArray()[0];
SettingsCheckHandleSingleOnSubscribe.onResolutionResult(key, Activity.RESULT_OK);
return null;
}).when(ctx).startActivity(any(Intent.class));
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), true);
assertTrue(SettingsCheckHandleSingleOnSubscribe.observableMap.isEmpty());
}
@Test
public void SettingsCheckHandleSingle_ResolutionRequired_Canceled() {
SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));
setPendingResultValue(locationSettingsResult);
doReturn(status).when(locationSettingsResult).getStatus();
doReturn(LocationSettingsStatusCodes.RESOLUTION_REQUIRED).when(status).getStatusCode();
when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);
doAnswer(invocation -> {
String key = (String) SettingsCheckHandleSingleOnSubscribe.observableMap.keySet().toArray()[0];
SettingsCheckHandleSingleOnSubscribe.onResolutionResult(key, Activity.RESULT_CANCELED);
return null;
}).when(ctx).startActivity(any(Intent.class));
setupBaseSingleSuccess(single);
assertSingleValue(Single.create(single).test(), false);
assertTrue(SettingsCheckHandleSingleOnSubscribe.observableMap.isEmpty());
}
@Test
public void SettingsCheckHandleSingle_StatusException() {
SettingsCheckHandleSingleOnSubscribe single = PowerMockito.spy(new SettingsCheckHandleSingleOnSubscribe(rxLocation, locationSettingsRequest, null, null));
setPendingResultValue(locationSettingsResult);
doReturn(status).when(locationSettingsResult).getStatus();
doReturn(CommonStatusCodes.TIMEOUT).when(status).getStatusCode();
when(settingsApi.checkLocationSettings(apiClient, locationSettingsRequest)).thenReturn(pendingResult);
setupBaseSingleSuccess(single);
assertError(Single.create(single).test(), StatusException.class);
}
}