Injecting NavBackStackEntry to composable in tests of NavHost

48 views Asked by At

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"

}

0

There are 0 answers