Unit Tests for LocationPickerActivity (#4830)

* LocationPickerActivityUnitTests.kt class created

* Unit tests for LocationPickerActivity

* Unit tests for LocationPickerActivity

* Added verify

* verify added

* Minor changes

* Covered more lines

* Covered more lines

* addCredits test added
This commit is contained in:
Ayan Sarkar 2022-02-20 11:37:32 +05:30 committed by GitHub
parent ea6258ccf5
commit 4a69bc55cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 289 additions and 101 deletions

View file

@ -224,44 +224,57 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa
@Override
public void onMapReady(final MapboxMap mapboxMap) {
this.mapboxMap = mapboxMap;
mapboxMap.setStyle(Style.MAPBOX_STREETS, style -> {
mapboxMap.setStyle(Style.MAPBOX_STREETS, this::onStyleLoaded);
}
if (modifyLocationButton.getVisibility() == View.VISIBLE) {
initDroppedMarker(style);
adjustCameraBasedOnOptions();
enableLocationComponent(style);
if (style.getLayer(DROPPED_MARKER_LAYER_ID) != null) {
final GeoJsonSource source = style.getSourceAs("dropped-marker-source-id");
if (source != null) {
source.setGeoJson(Point.fromLngLat(cameraPosition.target.getLongitude(),
cameraPosition.target.getLatitude()));
}
droppedMarkerLayer = style.getLayer(DROPPED_MARKER_LAYER_ID);
if (droppedMarkerLayer != null) {
droppedMarkerLayer.setProperties(visibility(VISIBLE));
markerImage.setVisibility(View.GONE);
shadow.setVisibility(View.GONE);
}
/**
* Initializes dropped marker and layer
* Handles camera position based on options
* Enables location components
*
* @param style style
*/
private void onStyleLoaded(final Style style) {
if (modifyLocationButton.getVisibility() == View.VISIBLE) {
initDroppedMarker(style);
adjustCameraBasedOnOptions();
enableLocationComponent(style);
if (style.getLayer(DROPPED_MARKER_LAYER_ID) != null) {
final GeoJsonSource source = style.getSourceAs("dropped-marker-source-id");
if (source != null) {
source.setGeoJson(Point.fromLngLat(cameraPosition.target.getLongitude(),
cameraPosition.target.getLatitude()));
}
droppedMarkerLayer = style.getLayer(DROPPED_MARKER_LAYER_ID);
if (droppedMarkerLayer != null) {
droppedMarkerLayer.setProperties(visibility(VISIBLE));
markerImage.setVisibility(View.GONE);
shadow.setVisibility(View.GONE);
}
} else {
adjustCameraBasedOnOptions();
enableLocationComponent(style);
bindListeners();
}
modifyLocationButton.setOnClickListener(v -> {
placeSelectedButton.setVisibility(View.VISIBLE);
modifyLocationButton.setVisibility(View.GONE);
showInMapButton.setVisibility(View.GONE);
droppedMarkerLayer.setProperties(visibility(NONE));
markerImage.setVisibility(View.VISIBLE);
shadow.setVisibility(View.VISIBLE);
largeToolbarText.setText(getResources().getString(R.string.choose_a_location));
smallToolbarText.setText(getResources().getString(R.string.pan_and_zoom_to_adjust));
bindListeners();
});
} else {
adjustCameraBasedOnOptions();
enableLocationComponent(style);
bindListeners();
}
showInMapButton.setOnClickListener(v -> showInMap());
});
modifyLocationButton.setOnClickListener(v -> onClickModifyLocation());
showInMapButton.setOnClickListener(v -> showInMap());
}
/**
* Handles onclick event of modifyLocationButton
*/
private void onClickModifyLocation() {
placeSelectedButton.setVisibility(View.VISIBLE);
modifyLocationButton.setVisibility(View.GONE);
showInMapButton.setVisibility(View.GONE);
droppedMarkerLayer.setProperties(visibility(NONE));
markerImage.setVisibility(View.VISIBLE);
shadow.setVisibility(View.VISIBLE);
largeToolbarText.setText(getResources().getString(R.string.choose_a_location));
smallToolbarText.setText(getResources().getString(R.string.pan_and_zoom_to_adjust));
bindListeners();
}
/**
@ -290,6 +303,7 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa
iconIgnorePlacement(true)
));
}
/**
* move the location to the current media coordinates
*/

View file

@ -1,67 +0,0 @@
package fr.free.nrw.commons.locationpicker
import android.os.Looper
import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.MapboxMap
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import org.powermock.reflect.Whitebox
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode
import java.lang.reflect.Method
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [21], application = TestCommonsApplication::class)
@LooperMode(LooperMode.Mode.PAUSED)
class LocationPickerActivityTest {
private lateinit var activityLocationPicker : LocationPickerActivity
@Mock
private lateinit var applicationKvStore: JsonKvStore
@Mock
private lateinit var mapboxMap : MapboxMap
@Before
fun setup(){
MockitoAnnotations.initMocks(this)
activityLocationPicker = Robolectric.buildActivity(LocationPickerActivity::class.java).get()
}
@Test
@Throws(Exception::class)
fun testRememberZoomLevel(){
shadowOf(Looper.getMainLooper()).idle()
Whitebox.setInternalState(activityLocationPicker,"mapboxMap",mapboxMap)
Whitebox.setInternalState(activityLocationPicker,"activity", "NoLocationUploadActivity")
Whitebox.setInternalState(activityLocationPicker,"applicationKvStore",applicationKvStore)
val position = CameraPosition.Builder().target(LatLng(
51.50550,
-0.07520, 0.0
)
).zoom(15.0).build()
`when`(mapboxMap.cameraPosition).thenReturn(position)
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"placeSelected"
)
method.isAccessible = true
method.invoke(activityLocationPicker)
Mockito.verify(applicationKvStore,Mockito.times(1))
.putString(LAST_ZOOM,position.zoom.toString())
}
}

View file

@ -0,0 +1,241 @@
package fr.free.nrw.commons.locationpicker
import android.content.Context
import android.os.Looper
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.widget.AppCompatTextView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.MapboxMap
import com.mapbox.mapboxsdk.maps.Style
import com.mapbox.mapboxsdk.maps.UiSettings
import com.mapbox.mapboxsdk.style.layers.Layer
import com.nhaarman.mockitokotlin2.times
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_LOCATION
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM
import org.junit.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.MockitoAnnotations
import org.powermock.reflect.Whitebox
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.Shadows
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode
import java.lang.reflect.Method
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [21], application = TestCommonsApplication::class)
@LooperMode(LooperMode.Mode.PAUSED)
class LocationPickerActivityUnitTests {
private lateinit var activity: LocationPickerActivity
private lateinit var context: Context
@Mock
private lateinit var applicationKvStore: JsonKvStore
@Mock
private lateinit var mapboxMap: MapboxMap
@Mock
private lateinit var cameraPosition: CameraPosition
@Mock
private lateinit var modifyLocationButton: Button
@Mock
private lateinit var placeSelectedButton: FloatingActionButton
@Mock
private lateinit var showInMapButton: TextView
@Mock
private lateinit var droppedMarkerLayer: Layer
@Mock
private lateinit var markerImage: ImageView
@Mock
private lateinit var shadow: ImageView
@Mock
private lateinit var largeToolbarText: TextView
@Mock
private lateinit var smallToolbarText: TextView
@Mock
private lateinit var tvAttribution: AppCompatTextView
@Mock
private lateinit var style: Style
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
context = RuntimeEnvironment.application.applicationContext
activity = Robolectric.buildActivity(LocationPickerActivity::class.java).get()
Whitebox.setInternalState(activity, "mapboxMap", mapboxMap)
Whitebox.setInternalState(activity, "applicationKvStore", applicationKvStore)
Whitebox.setInternalState(activity, "cameraPosition", cameraPosition)
Whitebox.setInternalState(activity, "modifyLocationButton", modifyLocationButton)
Whitebox.setInternalState(activity, "placeSelectedButton", placeSelectedButton)
Whitebox.setInternalState(activity, "showInMapButton", showInMapButton)
Whitebox.setInternalState(activity, "droppedMarkerLayer", droppedMarkerLayer)
Whitebox.setInternalState(activity, "markerImage", markerImage)
Whitebox.setInternalState(activity, "shadow", shadow)
Whitebox.setInternalState(activity, "largeToolbarText", largeToolbarText)
Whitebox.setInternalState(activity, "smallToolbarText", smallToolbarText)
Whitebox.setInternalState(activity, "tvAttribution", tvAttribution)
}
@Test
@Throws(Exception::class)
fun checkActivityNotNull() {
Assert.assertNotNull(activity)
}
@Test
@Throws(Exception::class)
fun testBindListeners() {
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"bindListeners"
)
method.isAccessible = true
method.invoke(activity)
verify(mapboxMap, times(1)).addOnCameraMoveStartedListener(activity)
verify(mapboxMap, times(1)).addOnCameraIdleListener(activity)
}
@Test
@Throws(Exception::class)
fun testOnMapReady() {
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"onMapReady",
MapboxMap::class.java
)
method.isAccessible = true
method.invoke(activity, mapboxMap)
}
@Test
@Throws(Exception::class)
fun testAddCredits() {
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"addCredits"
)
method.isAccessible = true
method.invoke(activity)
verify(tvAttribution).text = any()
verify(tvAttribution).movementMethod = any()
}
@Test
@Throws(Exception::class)
fun testAdjustCameraBasedOnOptions() {
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"adjustCameraBasedOnOptions"
)
method.isAccessible = true
method.invoke(activity)
verify(mapboxMap, times(1))
.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
}
@Test
@Throws(Exception::class)
fun testOnChanged() {
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"onChanged",
CameraPosition::class.java
)
method.isAccessible = true
method.invoke(activity, mock(CameraPosition::class.java))
verify(mapboxMap, times(0)).cameraPosition
}
@Test
@Throws(Exception::class)
fun testOnStyleLoaded() {
whenever(modifyLocationButton.visibility).thenReturn(View.INVISIBLE)
whenever(mapboxMap.uiSettings).thenReturn(mock(UiSettings::class.java))
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"onStyleLoaded",
Style::class.java
)
method.isAccessible = true
method.invoke(activity, style)
verify(modifyLocationButton, times(1)).visibility
verify(mapboxMap, times(1))
.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
verify(mapboxMap, times(1)).uiSettings
verify(mapboxMap, times(1)).addOnCameraMoveStartedListener(activity)
verify(mapboxMap, times(1)).addOnCameraIdleListener(activity)
}
@Test
@Throws(Exception::class)
fun testOnClickModifyLocation() {
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"onClickModifyLocation"
)
method.isAccessible = true
method.invoke(activity)
verify(placeSelectedButton, times(1)).visibility = View.VISIBLE
verify(modifyLocationButton, times(1)).visibility = View.GONE
verify(showInMapButton, times(1)).visibility = View.GONE
verify(markerImage, times(1)).visibility = View.VISIBLE
verify(shadow, times(1)).visibility = View.VISIBLE
verify(droppedMarkerLayer, times(1)).setProperties(any())
verify(largeToolbarText, times(1)).text = "Choose a location"
verify(smallToolbarText, times(1)).text = "Pan and zoom to adjust"
verify(mapboxMap, times(1)).addOnCameraMoveStartedListener(activity)
verify(mapboxMap, times(1)).addOnCameraIdleListener(activity)
}
@Test
@Throws(Exception::class)
fun testPlaceSelected() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
Whitebox.setInternalState(activity,"activity", "NoLocationUploadActivity")
val position = CameraPosition.Builder().target(
LatLng(
51.50550,
-0.07520,
0.0
)
).zoom(15.0).build()
`when`(mapboxMap.cameraPosition).thenReturn(position)
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"placeSelected"
)
method.isAccessible = true
method.invoke(activity)
verify(applicationKvStore, times(1))
.putString(LAST_LOCATION, position.target.latitude.toString()
+ ","
+ position.target.longitude
)
verify(applicationKvStore, times(1))
.putString(LAST_ZOOM, position.zoom.toString())
verify(mapboxMap, times(4)).cameraPosition
}
}