Skip to content

Commit bf09ec1

Browse files
committed
[Add] NavigatorTest
1 parent b1eab9b commit bf09ec1

1 file changed

Lines changed: 121 additions & 0 deletions

File tree

  • app/src/test/java/com/rumosoft/marvelcompose/presentation/navigation
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package com.rumosoft.marvelcompose.presentation.navigation
2+
3+
import androidx.compose.runtime.mutableStateOf
4+
import androidx.navigation3.runtime.NavBackStack
5+
import androidx.navigation3.runtime.NavKey
6+
import com.rumosoft.components.presentation.deeplinks.CharacterDetails
7+
import com.rumosoft.components.presentation.deeplinks.CharactersScreen
8+
import com.rumosoft.components.presentation.deeplinks.ComicDetails
9+
import com.rumosoft.components.presentation.deeplinks.ComicsScreen
10+
import org.junit.jupiter.api.Assertions.assertEquals
11+
import org.junit.jupiter.api.BeforeEach
12+
import org.junit.jupiter.api.Test
13+
14+
class NavigatorTest {
15+
16+
private lateinit var navigator: Navigator
17+
private lateinit var state: NavigationState
18+
19+
@BeforeEach
20+
fun setUp() {
21+
val charactersStack = NavBackStack<NavKey>(CharactersScreen)
22+
val comicsStack = NavBackStack<NavKey>(ComicsScreen)
23+
state = NavigationState(
24+
startRoute = CharactersScreen,
25+
topLevelRoute = mutableStateOf(CharactersScreen),
26+
backStacks = mapOf(
27+
CharactersScreen to charactersStack,
28+
ComicsScreen to comicsStack,
29+
),
30+
)
31+
navigator = Navigator(state)
32+
}
33+
34+
@Test
35+
fun `navigate to top-level route switches tab`() {
36+
navigator.navigate(ComicsScreen)
37+
38+
assertEquals(ComicsScreen, state.topLevelRoute)
39+
}
40+
41+
@Test
42+
fun `navigate to detail route pushes onto current stack`() {
43+
val detail = CharacterDetails(42L)
44+
45+
navigator.navigate(detail)
46+
47+
val stack = state.backStacks[CharactersScreen]!!
48+
assertEquals(listOf(CharactersScreen, detail), stack.toList())
49+
}
50+
51+
@Test
52+
fun `navigateOnTab switches tab and pushes route`() {
53+
val comicDetail = ComicDetails(123)
54+
55+
navigator.navigateOnTab(ComicsScreen, comicDetail)
56+
57+
assertEquals(ComicsScreen, state.topLevelRoute)
58+
val stack = state.backStacks[ComicsScreen]!!
59+
assertEquals(listOf(ComicsScreen, comicDetail), stack.toList())
60+
}
61+
62+
@Test
63+
fun `goBack pops current entry from stack`() {
64+
navigator.navigate(CharacterDetails(1L))
65+
66+
navigator.goBack()
67+
68+
val stack = state.backStacks[CharactersScreen]!!
69+
assertEquals(listOf<NavKey>(CharactersScreen), stack.toList())
70+
}
71+
72+
@Test
73+
fun `goBack at base of non-start tab returns to start tab`() {
74+
navigator.navigate(ComicsScreen)
75+
assertEquals(ComicsScreen, state.topLevelRoute)
76+
77+
navigator.goBack()
78+
79+
assertEquals(CharactersScreen, state.topLevelRoute)
80+
}
81+
82+
@Test
83+
fun `switchTabAndNavigate pops current entry and navigates to target tab`() {
84+
// Simulate being on a character details screen
85+
navigator.navigate(CharacterDetails(1L))
86+
assertEquals(
87+
listOf<NavKey>(CharactersScreen, CharacterDetails(1L)),
88+
state.backStacks[CharactersScreen]!!.toList(),
89+
)
90+
91+
// Switch to comics tab with a comic detail
92+
val comicDetail = ComicDetails(99)
93+
navigator.switchTabAndNavigate(ComicsScreen, comicDetail)
94+
95+
// Current entry popped from characters stack
96+
assertEquals(
97+
listOf<NavKey>(CharactersScreen),
98+
state.backStacks[CharactersScreen]!!.toList(),
99+
)
100+
// Switched to comics tab
101+
assertEquals(ComicsScreen, state.topLevelRoute)
102+
// Comic detail pushed onto comics stack
103+
assertEquals(
104+
listOf<NavKey>(ComicsScreen, comicDetail),
105+
state.backStacks[ComicsScreen]!!.toList(),
106+
)
107+
}
108+
109+
@Test
110+
fun `stacksInUse returns only start route when on start tab`() {
111+
assertEquals(listOf<NavKey>(CharactersScreen), state.stacksInUse)
112+
}
113+
114+
@Test
115+
fun `stacksInUse returns start and current when on different tab`() {
116+
navigator.navigate(ComicsScreen)
117+
118+
assertEquals(listOf<NavKey>(CharactersScreen, ComicsScreen), state.stacksInUse)
119+
}
120+
}
121+

0 commit comments

Comments
 (0)