test(mutual): portrait-size Robolectric + NavDisplay entry scenario

Run the scroll tests at 411x891dp portrait (device-like layout) and add
a NavDisplay entryProvider scenario that composes MutualScreen the way
the app does, so the prefill scroll is exercised end-to-end.
This commit is contained in:
atsunatsu committed 2026-09-22 14:49:04 +08:00
1 parent d600836e19
commit f2fc1b7b28
2 files changed
+31 -3

No files matched your search

+1
View File
@@ -18,5 +18,6 @@ dependencies {
testImplementation(libs.robolectric) testImplementation(libs.robolectric)
testImplementation(libs.androidx.test.core) testImplementation(libs.androidx.test.core)
testImplementation(libs.compose.ui.test.junit4) testImplementation(libs.compose.ui.test.junit4)
testImplementation(libs.compose.navigation3)
debugImplementation(libs.compose.debug.manifest) debugImplementation(libs.compose.debug.manifest)
} }
@@ -12,6 +12,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.ui.NavDisplay
import com.rtbishop.look4sat.core.presentation.Screen
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@@ -38,7 +42,7 @@ import org.robolectric.annotation.GraphicsMode
*/ */
@RunWith(RobolectricTestRunner::class) @RunWith(RobolectricTestRunner::class)
@GraphicsMode(GraphicsMode.Mode.NATIVE) @GraphicsMode(GraphicsMode.Mode.NATIVE)
@Config(sdk = [34]) @Config(sdk = [34], qualifiers = "w411dp-h891dp-port")
class MutualMatchPrefillScrollTest { class MutualMatchPrefillScrollTest {
@get:Rule @get:Rule
@@ -114,8 +118,7 @@ class MutualMatchPrefillScrollTest {
fun prefillAutoStartsQueryAndFillsState() { fun prefillAutoStartsQueryAndFillsState() {
val vm = MutualViewModel(FakeSatelliteRepo(), FakeSettingsRepo()) val vm = MutualViewModel(FakeSatelliteRepo(), FakeSettingsRepo())
vm.prefillMatchFromGrid("OL62") vm.prefillMatchFromGrid("OL62")
val s = vm.uiState.value val s = vm.uiState.value // Query auto-started: with the empty-satellite fake the query reaches
// Query auto-started: with the empty-satellite fake the query reaches
// the "no satellite data" guard (rather than never being triggered), // the "no satellite data" guard (rather than never being triggered),
// proving prefillMatchFromGrid kicks off queryMutualPasses. // proving prefillMatchFromGrid kicks off queryMutualPasses.
assertTrue( assertTrue(
@@ -127,4 +130,28 @@ class MutualMatchPrefillScrollTest {
org.junit.Assert.assertEquals("OL62", s.stationBGrid) org.junit.Assert.assertEquals("OL62", s.stationBGrid)
org.junit.Assert.assertEquals(24, s.hoursAhead) org.junit.Assert.assertEquals(24, s.hoursAhead)
} }
@Test
fun navDisplayEntryAfterPrefill_scrollsToTimeRange() {
// Closest to the real device path: the Mutual screen composed inside a
// NavDisplay entry (back stack [Mutual]) right after prefillMatchFromGrid.
val vm = MutualViewModel(FakeSatelliteRepo(), FakeSettingsRepo())
vm.prefillMatchFromGrid("OL62")
composeRule.setContent {
val backStack = rememberNavBackStack(Screen.Mutual)
MaterialTheme {
Surface(modifier = Modifier.fillMaxSize()) {
NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryProvider = entryProvider {
entry<Screen.Mutual> { MutualScreen(viewModel = vm) }
}
)
}
}
}
composeRule.waitForIdle()
composeRule.onNodeWithText("Time range").assertIsDisplayed()
}
} }