Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Geowidget Fragment tests #2537

Merged
merged 12 commits into from
Aug 7, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,17 @@ open class GeoWidgetFragment : Fragment(), Observer<FeatureCollection> {
savedInstanceState: Bundle?,
): View? {
Mapbox.getInstance(requireContext(), BuildConfig.MAPBOX_SDK_TOKEN)
geoWidgetConfiguration =
configurationRegistry.retrieveConfiguration(
ConfigType.GeoWidget,
geoWidgetActivityArgs.configId,
)
geoWidgetConfiguration = geoWidgetConfiguration()

return setupViews()
}

private fun geoWidgetConfiguration(): GeoWidgetConfiguration =
configurationRegistry.retrieveConfiguration(
ConfigType.GeoWidget,
geoWidgetActivityArgs.configId,
)

/** Create the fragment views. Add the toolbar and KujakuMapView to a LinearLayout */
private fun setupViews(): LinearLayout {
val layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 168)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,14 @@

package org.smartregister.fhircore.geowidget.screens

import android.content.Context
import android.os.Build
import android.os.Bundle
import android.os.Looper
import android.widget.LinearLayout
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.MutableLiveData
import androidx.navigation.NavArgsLazy
import com.mapbox.geojson.Feature
import com.mapbox.geojson.FeatureCollection
import com.mapbox.geojson.Point
Expand All @@ -47,14 +50,16 @@ import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import org.robolectric.util.ReflectionHelpers
import org.smartregister.fhircore.engine.configuration.geowidget.GeoWidgetConfiguration
import org.smartregister.fhircore.geowidget.BuildConfig
import org.smartregister.fhircore.geowidget.model.GeoWidgetEvent
import org.smartregister.fhircore.geowidget.shadows.ShadowConnectivityReceiver
import org.smartregister.fhircore.geowidget.shadows.ShadowKujakuMapView
import org.smartregister.fhircore.geowidget.shadows.ShadowMapbox

@RunWith(RobolectricTestRunner::class)
@Config(
sdk = [Build.VERSION_CODES.O_MR1],
shadows = [ShadowConnectivityReceiver::class, ShadowKujakuMapView::class],
shadows = [ShadowConnectivityReceiver::class, ShadowKujakuMapView::class, ShadowMapbox::class],
application = HiltTestApplication::class,
)
@HiltAndroidTest
Expand All @@ -70,6 +75,7 @@ class GeoWidgetFragmentTest {
@Before
fun setup() {
hiltRule.inject()

Robolectric.buildActivity(GeoWidgetTestActivity::class.java).create().resume().get()

geowidgetFragment = GeoWidgetFragment()
Expand Down Expand Up @@ -255,4 +261,88 @@ class GeoWidgetFragmentTest {

verify { kujakuMapView.addPoint(eq(true), any()) }
}

@Test
fun `onCreateView should call setupViews()`() {
val mockedGeoWidgetFragment = spyk(geowidgetFragment, recordPrivateCalls = true)
val geowidgetActivityArgs = spyk<GeoWidgetFragmentArgs>()
every { mockedGeoWidgetFragment.requireContext() } returns mockk()

val geowidgetActivityArgs2 = spyk(NavArgsLazy(GeoWidgetFragmentArgs::class) { mockk() })

every { geowidgetActivityArgs.configId } returns "geowidget-config-id"
every { geowidgetActivityArgs2.value } returns geowidgetActivityArgs

ReflectionHelpers.setField(
mockedGeoWidgetFragment,
"geoWidgetActivityArgs\$delegate",
geowidgetActivityArgs2,
)

every { mockedGeoWidgetFragment["setupViews"]() } returns mockk<LinearLayout>()
every { mockedGeoWidgetFragment["geoWidgetConfiguration"]() } returns
mockk<GeoWidgetConfiguration>()

mockedGeoWidgetFragment.onCreateView(mockk(), mockk(), mockk())

verify { mockedGeoWidgetFragment["setupViews"]() }
}

@Test
fun `onCreateView should initialise Mapbox()`() {
ShadowMapbox.allowMethodRecording()

val mockedGeoWidgetFragment = spyk(geowidgetFragment)
val geowidgetActivityArgs = spyk<GeoWidgetFragmentArgs>()
val mockContext = mockk<Context>()
every { mockedGeoWidgetFragment.requireContext() } returns mockContext

val geowidgetActivityArgs2 = spyk(NavArgsLazy(GeoWidgetFragmentArgs::class) { mockk() })

every { geowidgetActivityArgs.configId } returns "geowidget-config-id"
every { geowidgetActivityArgs2.value } returns geowidgetActivityArgs

ReflectionHelpers.setField(
mockedGeoWidgetFragment,
"geoWidgetActivityArgs\$delegate",
geowidgetActivityArgs2,
)

every { mockedGeoWidgetFragment["setupViews"]() } returns mockk<LinearLayout>()
every { mockedGeoWidgetFragment["geoWidgetConfiguration"]() } returns
mockk<GeoWidgetConfiguration>()

mockedGeoWidgetFragment.onCreateView(mockk(), mockk(), mockk())

val methodCallParams = ShadowMapbox.getLastMethodCall()
Assert.assertNotNull(methodCallParams["getInstance"])
Assert.assertEquals(mockContext, methodCallParams["getInstance"]!![0])
Assert.assertEquals(BuildConfig.MAPBOX_SDK_TOKEN, methodCallParams["getInstance"]!![1])
}

@Test
fun `onCreateView should fetch geowidget configuration`() {
val mockedGeoWidgetFragment = spyk(geowidgetFragment, recordPrivateCalls = true)
val geowidgetActivityArgs = spyk<GeoWidgetFragmentArgs>()
every { mockedGeoWidgetFragment.requireContext() } returns mockk()

val geowidgetActivityArgs2 = spyk(NavArgsLazy(GeoWidgetFragmentArgs::class) { mockk() })

every { geowidgetActivityArgs.configId } returns "geowidget-config-id"
every { geowidgetActivityArgs2.value } returns geowidgetActivityArgs

ReflectionHelpers.setField(
mockedGeoWidgetFragment,
"geoWidgetActivityArgs\$delegate",
geowidgetActivityArgs2,
)

every { mockedGeoWidgetFragment["setupViews"]() } returns mockk<LinearLayout>()
every { mockedGeoWidgetFragment["geoWidgetConfiguration"]() } returns
mockk<GeoWidgetConfiguration>()

mockedGeoWidgetFragment.onCreateView(mockk(), mockk(), mockk())

verify { mockedGeoWidgetFragment["geoWidgetConfiguration"]() }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package org.smartregister.fhircore.geowidget.shadows;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.net.ConnectivityReceiver;

import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Created by Ephraim Kigamba - ekigamba@ona.io on 28/12/2017.
*/

@Implements(Mapbox.class)
public class ShadowMapbox {

private static String lastMethodCall = null;
private static List<Object> lastMethodParams = null;

@Implementation
public static synchronized Mapbox getInstance(@NonNull Context context, @Nullable String accessToken) {

if ("YES".equals(lastMethodCall)) {
lastMethodCall = "getInstance";
lastMethodParams = new ArrayList<>();
lastMethodParams.add(context);
lastMethodParams.add(accessToken);
}

return null;
}

public static void allowMethodRecording() {
lastMethodCall = "YES";
}

/**
* Once this method is called, it resets
* @return
*/
public static Map<String, List<Object>> getLastMethodCall() {
String methodCall = lastMethodCall;
List<Object> params = lastMethodParams;

lastMethodCall = null;
lastMethodParams = null;

HashMap<String, List<Object>> map = new HashMap<>();
map.put(methodCall, params);

return map;
}
}