Skip to content

Commit 1c1b23b

Browse files
committed
Unit Testing | Patch 22
1 parent 3ac4077 commit 1c1b23b

File tree

6 files changed

+273
-5
lines changed

6 files changed

+273
-5
lines changed

presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouterImpl.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package com.shifthackz.aisdv1.presentation.navigation.router.drawer
22

33
import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect
4-
import io.reactivex.rxjava3.core.Observable
54
import io.reactivex.rxjava3.subjects.PublishSubject
65

76
internal class DrawerRouterImpl : DrawerRouter {
87

98
private val effectSubject: PublishSubject<NavigationEffect.Drawer> = PublishSubject.create()
109

11-
override fun observe(): Observable<NavigationEffect.Drawer> {
12-
return effectSubject
13-
}
10+
override fun observe() = effectSubject.distinctUntilChanged()
1411

1512
override fun openDrawer() {
1613
effectSubject.onNext(NavigationEffect.Drawer.Open)

presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ internal class MainRouterImpl(
5252
}
5353

5454
override fun navigateToDebugMenu() {
55-
if (debugMenuAccessor.invoke()) {
55+
if (debugMenuAccessor()) {
5656
effectSubject.onNext(NavigationEffect.Navigate.Route(Constants.ROUTE_DEBUG))
5757
}
5858
}

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ data class ServerSetupState(
8383
)
8484
}
8585

86+
//ToDo refactor key to enum ordinal
8687
enum class ServerSetupLaunchSource(val key: Int) {
8788
SPLASH(0),
8889
SETTINGS(1);

presentation/src/test/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModelTest.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,39 @@ class AiStableDiffusionViewModelTest : CoreViewModelTest<AiStableDiffusionViewMo
146146
}
147147
}
148148
}
149+
150+
@Test
151+
fun `given open event from drawer router, expected domain model delivered to effect collector`() {
152+
stubDrawerNavigationEffect.onNext(NavigationEffect.Drawer.Open)
153+
runTest {
154+
val expected = NavigationEffect.Drawer.Open
155+
val actual = viewModel.effect.firstOrNull()
156+
Assert.assertEquals(expected, actual)
157+
}
158+
}
159+
160+
@Test
161+
fun `given close event from drawer router, expected domain model delivered to effect collector`() {
162+
stubDrawerNavigationEffect.onNext(NavigationEffect.Drawer.Close)
163+
runTest {
164+
val expected = NavigationEffect.Drawer.Close
165+
val actual = viewModel.effect.firstOrNull()
166+
Assert.assertEquals(expected, actual)
167+
}
168+
}
169+
170+
@Test
171+
fun `given open then close events from drawer router, expected two domain models delivered to effect collector in same order`() {
172+
runTest {
173+
viewModel.effect.test {
174+
stubDrawerNavigationEffect.onNext(NavigationEffect.Drawer.Open)
175+
Assert.assertEquals(NavigationEffect.Drawer.Open, awaitItem())
176+
177+
stubDrawerNavigationEffect.onNext(NavigationEffect.Drawer.Close)
178+
Assert.assertEquals(NavigationEffect.Drawer.Close, awaitItem())
179+
180+
cancelAndIgnoreRemainingEvents()
181+
}
182+
}
183+
}
149184
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.shifthackz.aisdv1.presentation.navigation.router.drawer
2+
3+
import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect
4+
import org.junit.Test
5+
6+
class DrawerRouterImplTest {
7+
8+
private val router = DrawerRouterImpl()
9+
10+
@Test
11+
fun `given user opens drawer, expected router emits Open event`() {
12+
router
13+
.observe()
14+
.test()
15+
.also { router.openDrawer() }
16+
.assertNoErrors()
17+
.assertValueAt(0, NavigationEffect.Drawer.Open)
18+
}
19+
20+
@Test
21+
fun `given user closes drawer, expected router emits Close event`() {
22+
router
23+
.observe()
24+
.test()
25+
.also { router.closeDrawer() }
26+
.assertNoErrors()
27+
.assertValueAt(0, NavigationEffect.Drawer.Close)
28+
}
29+
30+
@Test
31+
fun `given user opens than closes drawer, expected router emits Open than Close events`() {
32+
router
33+
.observe()
34+
.test()
35+
.also { router.openDrawer() }
36+
.assertNoErrors()
37+
.assertValueAt(0, NavigationEffect.Drawer.Open)
38+
.also { router.closeDrawer() }
39+
.assertNoErrors()
40+
.assertValueAt(1, NavigationEffect.Drawer.Close)
41+
}
42+
43+
@Test
44+
fun `given user opens drawer twice, expected router emits one Open event`() {
45+
router
46+
.observe()
47+
.test()
48+
.also { router.openDrawer() }
49+
.assertNoErrors()
50+
.assertValueAt(0, NavigationEffect.Drawer.Open)
51+
.also { router.openDrawer() }
52+
.assertNoErrors()
53+
.assertValueCount(1)
54+
}
55+
56+
@Test
57+
fun `given user closes drawer twice, expected router emits one Close event`() {
58+
router
59+
.observe()
60+
.test()
61+
.also { router.closeDrawer() }
62+
.assertNoErrors()
63+
.assertValueAt(0, NavigationEffect.Drawer.Close)
64+
.also { router.closeDrawer() }
65+
.assertNoErrors()
66+
.assertValueCount(1)
67+
}
68+
}
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package com.shifthackz.aisdv1.presentation.navigation.router.main
2+
3+
import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider
4+
import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect
5+
import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuAccessor
6+
import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupLaunchSource
7+
import com.shifthackz.aisdv1.presentation.utils.Constants
8+
import io.mockk.every
9+
import io.mockk.mockk
10+
import org.junit.Test
11+
12+
class MainRouterImplTest {
13+
14+
private val stubBuildInfoProvider = mockk<BuildInfoProvider>()
15+
private val stubDebugMenuAccessor = DebugMenuAccessor(stubBuildInfoProvider)
16+
17+
private val router = MainRouterImpl(stubDebugMenuAccessor)
18+
19+
@Test
20+
fun `given user navigates back, expected router emits Back event`() {
21+
router
22+
.observe()
23+
.test()
24+
.also { router.navigateBack() }
25+
.assertNoErrors()
26+
.assertValueAt(0, NavigationEffect.Back)
27+
}
28+
29+
@Test
30+
fun `given user navigates to splash config loader, expected router emits RouteBuilder event with ROUTE_CONFIG_LOADER route`() {
31+
router
32+
.observe()
33+
.test()
34+
.also { router.navigateToPostSplashConfigLoader() }
35+
.assertNoErrors()
36+
.assertValueAt(0) { actual ->
37+
actual is NavigationEffect.Navigate.RouteBuilder
38+
&& actual.route == Constants.ROUTE_CONFIG_LOADER
39+
}
40+
}
41+
42+
@Test
43+
fun `given user navigates to home screen, expected router emits RoutePopUp event with ROUTE_HOME route`() {
44+
router
45+
.observe()
46+
.test()
47+
.also { router.navigateToHomeScreen() }
48+
.assertNoErrors()
49+
.assertValueAt(0, NavigationEffect.Navigate.RoutePopUp(Constants.ROUTE_HOME))
50+
}
51+
52+
@Test
53+
fun `given user navigates to server setup from splash, expected router emits RouteBuilder event with ROUTE_SERVER_SETUP route and SPLASH source`() {
54+
router
55+
.observe()
56+
.test()
57+
.also { router.navigateToServerSetup(ServerSetupLaunchSource.SPLASH) }
58+
.assertNoErrors()
59+
.assertValueAt(0) { actual ->
60+
val expectedRoute =
61+
"${Constants.ROUTE_SERVER_SETUP}/${ServerSetupLaunchSource.SPLASH.key}"
62+
actual is NavigationEffect.Navigate.RouteBuilder
63+
&& actual.route == expectedRoute
64+
}
65+
}
66+
67+
@Test
68+
fun `given user navigates to server setup from settings, expected router emits RouteBuilder event with ROUTE_SERVER_SETUP route and SETTINGS source`() {
69+
router
70+
.observe()
71+
.test()
72+
.also { router.navigateToServerSetup(ServerSetupLaunchSource.SETTINGS) }
73+
.assertNoErrors()
74+
.assertValueAt(0) { actual ->
75+
val expectedRoute =
76+
"${Constants.ROUTE_SERVER_SETUP}/${ServerSetupLaunchSource.SETTINGS.key}"
77+
actual is NavigationEffect.Navigate.RouteBuilder
78+
&& actual.route == expectedRoute
79+
}
80+
}
81+
82+
@Test
83+
fun `given user navigates to gallery details for item 5598, expected router emits Route event with ROUTE_GALLERY_DETAIL route and id 5598`() {
84+
router
85+
.observe()
86+
.test()
87+
.also { router.navigateToGalleryDetails(5598L) }
88+
.assertNoErrors()
89+
.assertValueAt(
90+
0,
91+
NavigationEffect.Navigate.Route("${Constants.ROUTE_GALLERY_DETAIL}/5598"),
92+
)
93+
}
94+
95+
@Test
96+
fun `given user navigates to in paint, expected router emits Route event with ROUTE_IN_PAINT route`() {
97+
router
98+
.observe()
99+
.test()
100+
.also { router.navigateToInPaint() }
101+
.assertNoErrors()
102+
.assertValueAt(
103+
0,
104+
NavigationEffect.Navigate.Route(Constants.ROUTE_IN_PAINT),
105+
)
106+
}
107+
108+
@Test
109+
fun `given user tapped hidden menu 6 times, build is debuggable, expected router emits no events`() {
110+
every {
111+
stubBuildInfoProvider.isDebug
112+
} returns true
113+
114+
val stubObserver = router.observe().test()
115+
116+
repeat(6) { router.navigateToDebugMenu() }
117+
118+
stubObserver
119+
.assertNoErrors()
120+
.assertNoValues()
121+
}
122+
123+
@Test
124+
fun `given user tapped hidden menu 7 times, build is debuggable, expected router emits Route event with ROUTE_DEBUG route`() {
125+
every {
126+
stubBuildInfoProvider.isDebug
127+
} returns true
128+
129+
val stubObserver = router.observe().test()
130+
131+
repeat(7) { router.navigateToDebugMenu() }
132+
133+
stubObserver
134+
.assertNoErrors()
135+
.assertValueAt(0, NavigationEffect.Navigate.Route(Constants.ROUTE_DEBUG))
136+
}
137+
138+
@Test
139+
fun `given user tapped hidden menu 6 times, build is NOT debuggable, expected router emits no events`() {
140+
every {
141+
stubBuildInfoProvider.isDebug
142+
} returns false
143+
144+
val stubObserver = router.observe().test()
145+
146+
repeat(6) { router.navigateToDebugMenu() }
147+
148+
stubObserver
149+
.assertNoErrors()
150+
.assertNoValues()
151+
}
152+
153+
@Test
154+
fun `given user tapped hidden menu 7 times, build is NOT debuggable, expected router emits no events`() {
155+
every {
156+
stubBuildInfoProvider.isDebug
157+
} returns false
158+
159+
val stubObserver = router.observe().test()
160+
161+
repeat(7) { router.navigateToDebugMenu() }
162+
163+
stubObserver
164+
.assertNoErrors()
165+
.assertNoValues()
166+
}
167+
}

0 commit comments

Comments
 (0)