package com.appsimobile.appsii.module.weather; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.location.MockLocationManager; import android.os.Handler; import android.os.Looper; import com.appsimobile.appsii.module.SimplePreferences; import com.appsimobile.appsii.module.home.config.HomeItemConfiguration; import com.appsimobile.appsii.module.home.config.HomeItemConfigurationFactory; import com.appsimobile.appsii.module.home.config.HomeItemConfigurationHelper; import com.appsimobile.appsii.module.home.config.MockHomeItemConfigurationHelper; import com.appsimobile.appsii.preference.PreferencesFactory; import com.appsimobile.util.CollectionUtils; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import java.util.ArrayList; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; /** * Created by nmartens on 06/08/15. */ @RunWith(MockitoJUnitRunner.class) public class WeatherLoadingServiceTest { @Mock Context mContext; @Mock MockLocationManager mLocationManager; Location mLocationResult; long mWaitTime; void initLocationManagerMocks(boolean networkEnabled, String... allProviders) { Mockito.when(mLocationManager.getAllProviders()) .thenReturn(CollectionUtils.asList(allProviders)); Mockito.when(mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) .thenReturn(networkEnabled); } @Before public void initMocks() { Mockito.when(mContext.getSystemService(Context.LOCATION_SERVICE)) .thenReturn(mLocationManager); Mockito.when(mContext.getApplicationContext()).thenReturn(mContext); final Location loc = new Location(LocationManager.NETWORK_PROVIDER); loc.setLatitude(4.5); loc.setLongitude(31.0); mLocationResult = loc; Mockito.doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { Looper looper = (Looper) invocation.getArguments()[2]; final LocationListener l = (LocationListener) invocation.getArguments()[1]; if (looper != null) { Handler h = new Handler(looper); h.postDelayed(new Runnable() { @Override public void run() { l.onLocationChanged(loc); } }, mWaitTime); } else { l.onLocationChanged(loc); } return null; } }).when(mLocationManager).requestSingleUpdate(eq(LocationManager.NETWORK_PROVIDER), any(LocationListener.class), any(Looper.class)); SimplePreferences preferences = new SimplePreferences(); preferences.put("default_user_country", "mock_country") .put("default_user_display_name", "Mock Country") .put("default_user_timezone", "mock") .put("default_user_woeid", "12345"); PreferencesFactory.setPreferences(preferences); HomeItemConfigurationHelper.setFactory( new HomeItemConfigurationFactory() { @Override public HomeItemConfiguration createInstance( Context context) { return new MockHomeItemConfigurationHelper(mContext, new ArrayList<Runnable>()); } }); mWaitTime = 0; } @Test public void testLocation_available() throws InterruptedException { initLocationManagerMocks(true, LocationManager.NETWORK_PROVIDER); WeatherLoadingService weatherLoadingService = new WeatherLoadingService(mContext); Location result = weatherLoadingService.requestLocationInfoBlocking(null); Assert.assertEquals(mLocationResult, result); } @Test public void testLocation_providerDisabled() throws InterruptedException { initLocationManagerMocks(false, LocationManager.NETWORK_PROVIDER); WeatherLoadingService weatherLoadingService = new WeatherLoadingService(mContext); Location result = weatherLoadingService.requestLocationInfoBlocking(null); Assert.assertNull(result); } @Test public void testLocation_noNetworkProvider() throws InterruptedException { initLocationManagerMocks(true, LocationManager.PASSIVE_PROVIDER); WeatherLoadingService weatherLoadingService = new WeatherLoadingService(mContext); Location result = weatherLoadingService.requestLocationInfoBlocking(null); Assert.assertNull(result); } }