Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add failing test for discard flow
  • Loading branch information
seadowg committed Dec 18, 2025
commit f30097c4eacd4b04087e15e1932fa55e13ac403a
5 changes: 5 additions & 0 deletions androidtest/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,9 @@ dependencies {
var composeBom = platform(libs.androidxComposeBom)
implementation(composeBom)
implementation(libs.androidXComposeUiTestJunit4)

//noinspection FragmentGradleConfiguration
debugApi(libs.androidxFragmentTesting) {
exclude(group = "androidx.test", module = "monitor") // fixes issue https://github.com/android/android-test/issues/731
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.odk.collect.androidtest

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentResultListener
import androidx.fragment.app.testing.FragmentScenario

object FragmentScenarioExtensions {

fun <T : Fragment> FragmentScenario<T>.setFragmentResultListener(
requestKey: String,
listener: FragmentResultListener
) {
onFragment {
it.parentFragmentManager.setFragmentResultListener(requestKey, it, listener)
}
}
}
137 changes: 100 additions & 37 deletions geo/src/test/java/org/odk/collect/geo/geopoly/GeoPolyFragmentTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import org.mockito.Mockito
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.odk.collect.androidshared.ui.FragmentFactoryBuilder
import org.odk.collect.androidtest.FragmentScenarioExtensions.setFragmentResultListener
import org.odk.collect.async.Scheduler
import org.odk.collect.fragmentstest.FragmentScenarioLauncherRule
import org.odk.collect.geo.DaggerGeoDependencyComponent
Expand Down Expand Up @@ -211,32 +212,112 @@ class GeoPolyFragmentTest {
}

@Test
fun whenPolygonExtraPresent_andPolyIsEmpty_pressingBack_setsCancelledResult() {
fun pressingBack_setsCancelledResult() {
val onBackPressedDispatcher = OnBackPressedDispatcher()
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(onBackPressedDispatcher = { onBackPressedDispatcher }) }
.forClass(GeoPolyFragment::class) { GeoPolyFragment({ onBackPressedDispatcher }) }
.build()
)

mapFragment.ready()

val resultListener = FragmentResultRecorder()
scenario.onFragment {
it.parentFragmentManager.setFragmentResultListener(
GeoPolyFragment.REQUEST_GEOPOLY,
it,
resultListener
)
}
scenario.setFragmentResultListener(GeoPolyFragment.REQUEST_GEOPOLY, resultListener)

onBackPressedDispatcher.onBackPressed()
val result = resultListener.result
val result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(result.second.isEmpty, equalTo(true))
}

@Test
fun whenInputPolyIsNotEmpty_pressingBack_setsCancelledResult() {
val onBackPressedDispatcher = OnBackPressedDispatcher()
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(
{ onBackPressedDispatcher },
inputPolygon = listOf(MapPoint(1.0, 1.0))
)
}
.build()
)

mapFragment.ready()

val resultListener = FragmentResultRecorder()
scenario.setFragmentResultListener(GeoPolyFragment.REQUEST_GEOPOLY, resultListener)

onBackPressedDispatcher.onBackPressed()
val result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(result.second.isEmpty, equalTo(true))
}

@Test
fun whenPolygonHasBeenModified_pressingBack_andClickingCancel_setsNoResult() {
val onBackPressedDispatcher = OnBackPressedDispatcher()
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment({ onBackPressedDispatcher })
}
.build()
)

mapFragment.ready()

val resultListener = FragmentResultRecorder()
scenario.setFragmentResultListener(GeoPolyFragment.REQUEST_GEOPOLY, resultListener)

startInput(R.id.placement_mode)
mapFragment.click(MapPoint(1.0, 1.0))
resultListener.clear()

onBackPressedDispatcher.onBackPressed()
Interactions.clickOn(withText(string.cancel), root = isDialog())

val result = resultListener.lastResult
assertThat(result, equalTo(null))
}

@Test
fun whenPolygonHasBeenCreated_pressingBack_andClickingDiscard_setsEmptyResult() {
val onBackPressedDispatcher = OnBackPressedDispatcher()
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(
{ onBackPressedDispatcher }
)
}
.build()
)

mapFragment.ready()

val resultListener = FragmentResultRecorder()
scenario.setFragmentResultListener(GeoPolyFragment.REQUEST_GEOPOLY, resultListener)

startInput(R.id.placement_mode)
mapFragment.click(MapPoint(1.0, 1.0))
mapFragment.click(MapPoint(2.0, 2.0))
resultListener.clear()

onBackPressedDispatcher.onBackPressed()
Interactions.clickOn(withText(string.discard), root = isDialog())

val result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(result.second.getString(GeoPolyFragment.RESULT_GEOPOLY), equalTo(""))
}

@Test
fun startingInput_usingAutomaticMode_usesRetainMockAccuracyTrueToStartLocationTracker() {
fragmentLauncherRule.launchInContainer(
Expand Down Expand Up @@ -503,28 +584,22 @@ class GeoPolyFragmentTest {
)

val resultListener = FragmentResultRecorder()
scenario.onFragment {
it.parentFragmentManager.setFragmentResultListener(
GeoPolyFragment.REQUEST_GEOPOLY,
it,
resultListener
)
}
scenario.setFragmentResultListener(GeoPolyFragment.REQUEST_GEOPOLY, resultListener)

mapFragment.ready()

startInput(R.id.placement_mode)

mapFragment.click(MapPoint(0.0, 0.0))
var result = resultListener.result
var result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(
result.second.getString(GeoPolyFragment.RESULT_GEOPOLY_CHANGE),
equalTo("")
)

mapFragment.click(MapPoint(1.0, 1.0))
result = resultListener.result
result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(
result.second.getString(GeoPolyFragment.RESULT_GEOPOLY_CHANGE),
Expand All @@ -547,36 +622,30 @@ class GeoPolyFragmentTest {
)

val resultListener = FragmentResultRecorder()
scenario.onFragment {
it.parentFragmentManager.setFragmentResultListener(
GeoPolyFragment.REQUEST_GEOPOLY,
it,
resultListener
)
}
scenario.setFragmentResultListener(GeoPolyFragment.REQUEST_GEOPOLY, resultListener)

mapFragment.ready()

startInput(R.id.placement_mode)

mapFragment.click(MapPoint(0.0, 0.0))
var result = resultListener.result
var result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(
result.second.getString(GeoPolyFragment.RESULT_GEOPOLY_CHANGE),
equalTo("")
)

mapFragment.click(MapPoint(1.0, 0.0))
result = resultListener.result
result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(
result.second.getString(GeoPolyFragment.RESULT_GEOPOLY_CHANGE),
equalTo("")
)

mapFragment.click(MapPoint(1.0, 1.0))
result = resultListener.result
result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(
result.second.getString(GeoPolyFragment.RESULT_GEOPOLY_CHANGE),
Expand Down Expand Up @@ -604,18 +673,12 @@ class GeoPolyFragmentTest {
)

val resultListener = FragmentResultRecorder()
scenario.onFragment {
it.parentFragmentManager.setFragmentResultListener(
GeoPolyFragment.REQUEST_GEOPOLY,
it,
resultListener
)
}
scenario.setFragmentResultListener(GeoPolyFragment.REQUEST_GEOPOLY, resultListener)

mapFragment.ready()

Interactions.clickOn(withContentDescription(string.remove_last_point))
val result = resultListener.result
val result = resultListener.lastResult
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(
result.second.getString(GeoPolyFragment.RESULT_GEOPOLY_CHANGE),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,17 @@ import androidx.fragment.app.FragmentResultListener

class FragmentResultRecorder : FragmentResultListener {

var result: Pair<String, Bundle>? = null
private val results = mutableListOf<Pair<String, Bundle>>()
val lastResult: Pair<String, Bundle>?
get() {
return results.lastOrNull()
}

fun clear() {
results.clear()
}

override fun onFragmentResult(requestKey: String, result: Bundle) {
this.result = Pair(requestKey, result)
results.add(Pair(requestKey, result))
}
}