Skip to content

Commit b52ea89

Browse files
committed
Refactor NavOptions
- Add tests
1 parent f7f01db commit b52ea89

File tree

2 files changed

+164
-12
lines changed

2 files changed

+164
-12
lines changed

android/quest/src/main/java/org/smartregister/fhircore/quest/util/extensions/ConfigExtensions.kt

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -160,21 +160,10 @@ fun ActionConfig.handleClickEvent(
160160
return
161161
}
162162

163-
val navOptionsBuilder = NavOptions.Builder().setLaunchSingleTop(true)
164-
165-
if (
166-
actionConfig.popNavigationBackStack == true &&
167-
navController.currentBackStackEntry?.destination?.id != MainNavigationScreen.Home.route
168-
) {
169-
navController.currentBackStackEntry?.destination?.id?.let {
170-
navOptionsBuilder.setPopUpTo(it, inclusive = true)
171-
}
172-
}
173-
174163
navController.navigate(
175164
resId = MainNavigationScreen.Home.route,
176165
args = args,
177-
navOptions = navOptionsBuilder.build(),
166+
navOptions = createRegisterNavigationOptions(actionConfig, navController),
178167
)
179168
}
180169
ApplicationWorkflow.LAUNCH_REPORT -> {
@@ -328,3 +317,21 @@ suspend fun List<ViewProperties>.decodeImageResourcesToBitmap(
328317
}
329318
}
330319
}
320+
321+
internal fun createRegisterNavigationOptions(
322+
actionConfig: ActionConfig,
323+
navController: NavController,
324+
): NavOptions {
325+
val navOptionsBuilder = NavOptions.Builder().setLaunchSingleTop(true)
326+
327+
if (
328+
actionConfig.popNavigationBackStack == true &&
329+
navController.currentBackStackEntry?.destination?.id != MainNavigationScreen.Home.route
330+
) {
331+
navController.currentBackStackEntry?.destination?.id?.let {
332+
navOptionsBuilder.setPopUpTo(it, inclusive = true)
333+
}
334+
}
335+
336+
return navOptionsBuilder.build()
337+
}

android/quest/src/test/java/org/smartregister/fhircore/quest/util/extensions/ConfigExtensionsKtTest.kt

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,151 @@ class ConfigExtensionsKtTest : RobolectricTest() {
610610
Assert.assertTrue(slotNavOptions.captured.shouldLaunchSingleTop())
611611
}
612612

613+
@Test
614+
fun testCreateRegisterNavigationOptionsWithPopBackStackFalse() {
615+
val actionConfig =
616+
ActionConfig(
617+
trigger = ActionTrigger.ON_CLICK,
618+
workflow = ApplicationWorkflow.LAUNCH_REGISTER.name,
619+
id = "registerId",
620+
popNavigationBackStack = false,
621+
)
622+
every { navController.currentBackStackEntry } returns
623+
mockk { every { destination } returns mockk { every { id } returns 1234 } }
624+
625+
val navOptions = createRegisterNavigationOptions(actionConfig, navController)
626+
627+
Assert.assertTrue(navOptions.shouldLaunchSingleTop())
628+
Assert.assertFalse(navOptions.isPopUpToInclusive())
629+
}
630+
631+
@Test
632+
fun testCreateRegisterNavigationOptionsWithPopBackStackTrue() {
633+
val actionConfig =
634+
ActionConfig(
635+
trigger = ActionTrigger.ON_CLICK,
636+
workflow = ApplicationWorkflow.LAUNCH_REGISTER.name,
637+
id = "registerId",
638+
popNavigationBackStack = true,
639+
)
640+
every { navController.currentBackStackEntry } returns
641+
mockk { every { destination } returns mockk { every { id } returns 1234 } }
642+
643+
val navOptions = createRegisterNavigationOptions(actionConfig, navController)
644+
645+
Assert.assertTrue(navOptions.shouldLaunchSingleTop())
646+
Assert.assertTrue(navOptions.isPopUpToInclusive())
647+
Assert.assertEquals(1234, navOptions.popUpToId)
648+
}
649+
650+
@Test
651+
fun testCreateRegisterNavigationOptionsWithPopBackStackNull() {
652+
val actionConfig =
653+
ActionConfig(
654+
trigger = ActionTrigger.ON_CLICK,
655+
workflow = ApplicationWorkflow.LAUNCH_REGISTER.name,
656+
id = "registerId",
657+
popNavigationBackStack = null,
658+
)
659+
every { navController.currentBackStackEntry } returns
660+
mockk { every { destination } returns mockk { every { id } returns 1234 } }
661+
662+
val navOptions = createRegisterNavigationOptions(actionConfig, navController)
663+
664+
Assert.assertTrue(navOptions.shouldLaunchSingleTop())
665+
Assert.assertFalse(navOptions.isPopUpToInclusive())
666+
}
667+
668+
@Test
669+
fun testCreateRegisterNavigationOptionsWithNullCurrentBackStackEntry() {
670+
val actionConfig =
671+
ActionConfig(
672+
trigger = ActionTrigger.ON_CLICK,
673+
workflow = ApplicationWorkflow.LAUNCH_REGISTER.name,
674+
id = "registerId",
675+
popNavigationBackStack = true,
676+
)
677+
every { navController.currentBackStackEntry } returns null
678+
679+
val navOptions = createRegisterNavigationOptions(actionConfig, navController)
680+
681+
Assert.assertTrue(navOptions.shouldLaunchSingleTop())
682+
Assert.assertFalse(navOptions.isPopUpToInclusive())
683+
}
684+
685+
@Test
686+
fun testCreateRegisterNavigationOptionsWithNullDestinationId() {
687+
val actionConfig =
688+
ActionConfig(
689+
trigger = ActionTrigger.ON_CLICK,
690+
workflow = ApplicationWorkflow.LAUNCH_REGISTER.name,
691+
id = "registerId",
692+
popNavigationBackStack = true,
693+
)
694+
every { navController.currentBackStackEntry } returns
695+
mockk { every { destination } returns mockk { every { id } returns 0 } }
696+
697+
val navOptions = createRegisterNavigationOptions(actionConfig, navController)
698+
699+
Assert.assertTrue(navOptions.shouldLaunchSingleTop())
700+
Assert.assertTrue(navOptions.isPopUpToInclusive())
701+
Assert.assertEquals(0, navOptions.popUpToId)
702+
}
703+
704+
@Test
705+
fun testLaunchRegisterAllowsNavigationWhenCurrentRegisterIdIsNull() {
706+
val clickAction =
707+
ActionConfig(
708+
id = "registerId",
709+
trigger = ActionTrigger.ON_CLICK,
710+
workflow = ApplicationWorkflow.LAUNCH_REGISTER.name,
711+
popNavigationBackStack = false,
712+
)
713+
every { navController.currentBackStackEntry } returns mockk { every { arguments } returns null }
714+
every { navController.previousBackStackEntry } returns
715+
mockk { every { arguments } returns bundleOf(NavigationArg.REGISTER_ID to "registerId") }
716+
every { navController.currentDestination } returns null
717+
718+
listOf(clickAction).handleClickEvent(navController = navController, resourceData = resourceData)
719+
720+
val slotInt = slot<Int>()
721+
val slotBundle = slot<Bundle>()
722+
val slotNavOptions = slot<NavOptions>()
723+
verify {
724+
navController.navigate(capture(slotInt), capture(slotBundle), capture(slotNavOptions))
725+
}
726+
Assert.assertEquals(MainNavigationScreen.Home.route, slotInt.captured)
727+
Assert.assertTrue(slotNavOptions.captured.shouldLaunchSingleTop())
728+
}
729+
730+
@Test
731+
fun testLaunchRegisterAllowsNavigationWhenPreviousRegisterIdIsNull() {
732+
val clickAction =
733+
ActionConfig(
734+
id = "registerId",
735+
trigger = ActionTrigger.ON_CLICK,
736+
workflow = ApplicationWorkflow.LAUNCH_REGISTER.name,
737+
popNavigationBackStack = false,
738+
)
739+
every { navController.currentBackStackEntry } returns
740+
mockk {
741+
every { arguments } returns bundleOf(NavigationArg.REGISTER_ID to "currentRegisterId")
742+
}
743+
every { navController.previousBackStackEntry } returns null
744+
every { navController.currentDestination } returns null
745+
746+
listOf(clickAction).handleClickEvent(navController = navController, resourceData = resourceData)
747+
748+
val slotInt = slot<Int>()
749+
val slotBundle = slot<Bundle>()
750+
val slotNavOptions = slot<NavOptions>()
751+
verify {
752+
navController.navigate(capture(slotInt), capture(slotBundle), capture(slotNavOptions))
753+
}
754+
Assert.assertEquals(MainNavigationScreen.Home.route, slotInt.captured)
755+
Assert.assertTrue(slotNavOptions.captured.shouldLaunchSingleTop())
756+
}
757+
613758
@Test
614759
fun testDeviceToDeviceSyncActionOnClick() {
615760
val clickAction =

0 commit comments

Comments
 (0)