I'd like to pass mandatory nav args into my (Robolectric) tests so that I can run the code for my lower level composable. My code is based on how navigation was used in an earlier version of the TiVi app: https://github.com/chrisbanes/tivi Unfortunately, they did not bother to write any tests...
How can I achieve this?
fun NavGraphBuilder.addTopLevelComposable(
navController: NavHostController,
... etc
) {
addLowLevelComposable(
navController = navController,
... etc
)
}
private fun NavGraphBuilder.addLowLevelComposable(
navController: NavHostController,
... etc
) {
composable(
LeafScreen.LowLevelDetails.route,
arguments = listOf(
navArgument("id") {
type = NavType.StringType
nullable = false
},
),
) { backStackEntry ->
val arguments = checkNotNull(backStackEntry.arguments)
val id = checkNotNull(arguments.getString("id"))
// Code using id
}
My test:
@Test
fun `addTopLevelComposable- low level destination - asserts something`() {
composeTestRule.setContent {
NavHost(
navController = rememberNavController(),
// This argument is not properly processed! Why!?
startDestination = LeafScreen.LowLevelDetails.createRoute("this is an id"),
) {
addTopLevelComposable(
navController = navHostController,
// etc
)
}
}
// assert something
}
data object LowLevelDetails: LeafScreen("home/lowlevel/{id}") {
fun createRoute(id: String): String =
"home/lowlevel/$id"
}