Skip to content

Commit 1ab1dc1

Browse files
committed
Unit Testing | Patch 33
1 parent da45b15 commit 1ab1dc1

File tree

7 files changed

+477
-18
lines changed

7 files changed

+477
-18
lines changed

dependencies.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ ext {
110110
stringutils: "org.apache.commons:commons-lang3:$apacheLangVersion"
111111
]
112112
test = [
113-
kotlin : "org.jetbrains.kotlin:kotlin-test",
114113
junit : "junit:junit:$testJunitVersion",
115114
mockito : "com.nhaarman.mockitokotlin2:mockito-kotlin:$testMockitoVersion",
116115
mockk : "io.mockk:mockk:$testMockkVersion",

presentation/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ dependencies {
5656
implementation ui.composeGestures
5757
implementation ui.composeEasyCrop
5858

59-
// testImplementation test.kotlin
6059
testImplementation test.junit
6160
testImplementation test.mockk
6261
testImplementation test.coroutines

presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionViewModel.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.shifthackz.aisdv1.core.common.model.Quintuple
66
import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider
77
import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread
88
import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel
9+
import com.shifthackz.aisdv1.domain.entity.Configuration
910
import com.shifthackz.aisdv1.domain.entity.LocalAiModel
1011
import com.shifthackz.aisdv1.domain.entity.ServerSource
1112
import com.shifthackz.aisdv1.domain.preference.PreferenceManager
@@ -36,6 +37,7 @@ class EngineSelectionViewModel(
3637
val configuration = preferenceManager
3738
.observe()
3839
.flatMap { getConfigurationUseCase().toFlowable() }
40+
.onErrorReturn { Configuration() }
3941

4042
val a1111Models = getStableDiffusionModelsUseCase()
4143
.onErrorReturn { emptyList() }
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.shifthackz.aisdv1.presentation.mocks
2+
3+
import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine
4+
5+
val mockStabilityAiEngines = listOf(
6+
StabilityAiEngine(
7+
id = "5598",
8+
name = "engine_5598",
9+
),
10+
)

presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasViewModelTest.kt

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider
1111
import io.mockk.every
1212
import io.mockk.mockk
1313
import io.reactivex.rxjava3.core.Single
14+
import kotlinx.coroutines.flow.firstOrNull
1415
import kotlinx.coroutines.test.runTest
1516
import org.junit.Assert
1617
import org.junit.Before
@@ -41,16 +42,7 @@ class ExtrasViewModelTest : CoreViewModelTest<ExtrasViewModel>() {
4142

4243
@Test
4344
fun `given update data, fetch loras successful, expected UI state with loras list`() {
44-
every {
45-
stubFetchAndGetLorasUseCase()
46-
} returns Single.just(mockStableDiffusionLoras)
47-
48-
viewModel.updateData(
49-
prompt = "prompt <lora:alias_5598:1>",
50-
negativePrompt = "negative",
51-
type = ExtraType.Lora,
52-
)
53-
45+
mockInitialData()
5446
runTest {
5547
val expected = ExtrasState(
5648
loading = false,
@@ -78,12 +70,12 @@ class ExtrasViewModelTest : CoreViewModelTest<ExtrasViewModel>() {
7870
),
7971
)
8072
val actual = viewModel.state.value
81-
// assertEquals(expected.type, actual.type)
82-
// assertEquals(expected.error, actual.error)
83-
// assertEquals(expected.prompt, actual.prompt)
84-
// assertEquals(expected.negativePrompt, actual.negativePrompt)
85-
// assertEquals(expected.type, actual.type)
86-
assert(actual.loras.any { it.name == "name_5598" && it.isApplied })
73+
Assert.assertEquals(expected.type, actual.type)
74+
Assert.assertEquals(expected.error, actual.error)
75+
Assert.assertEquals(expected.prompt, actual.prompt)
76+
Assert.assertEquals(expected.negativePrompt, actual.negativePrompt)
77+
Assert.assertEquals(expected.type, actual.type)
78+
Assert.assertEquals(true, actual.loras.any { it.name == "name_5598" && it.isApplied })
8779
}
8880
}
8981

@@ -106,6 +98,61 @@ class ExtrasViewModelTest : CoreViewModelTest<ExtrasViewModel>() {
10698
}
10799
}
108100

101+
@Test
102+
fun `given received ApplyPrompts intent, expected ApplyPrompts effect delivered to effect collector`() {
103+
mockInitialData()
104+
viewModel.processIntent(ExtrasIntent.ApplyPrompts)
105+
runTest {
106+
val expected = ExtrasEffect.ApplyPrompts(
107+
prompt = "prompt <lora:alias_5598:1>",
108+
negativePrompt = "negative",
109+
)
110+
val actual = viewModel.effect.firstOrNull()
111+
Assert.assertEquals(expected, actual)
112+
}
113+
}
114+
115+
@Test
116+
fun `given received Close intent, expected Close effect delivered to effect collector`() {
117+
viewModel.processIntent(ExtrasIntent.Close)
118+
runTest {
119+
val expected = ExtrasEffect.Close
120+
val actual = viewModel.effect.firstOrNull()
121+
Assert.assertEquals(expected, actual)
122+
}
123+
}
124+
125+
@Test
126+
fun `given received ToggleItem intent, expected prompt updated in UI state`() {
127+
mockInitialData()
128+
Thread.sleep(1000L)
129+
val item = ExtraItemUi(
130+
type = ExtraType.Lora,
131+
key = "name_5598_lora_$MOCK_SYS_TIME",
132+
name = "name_5598",
133+
alias = "alias_5598",
134+
isApplied = true,
135+
value = "1",
136+
)
137+
viewModel.processIntent(ExtrasIntent.ToggleItem(item))
138+
runTest {
139+
val state = viewModel.state.value
140+
Assert.assertEquals("prompt", state.prompt)
141+
}
142+
}
143+
144+
private fun mockInitialData() {
145+
every {
146+
stubFetchAndGetLorasUseCase()
147+
} returns Single.just(mockStableDiffusionLoras)
148+
149+
viewModel.updateData(
150+
prompt = "prompt <lora:alias_5598:1>",
151+
negativePrompt = "negative",
152+
type = ExtraType.Lora,
153+
)
154+
}
155+
109156
companion object {
110157
private const val MOCK_SYS_TIME = 5598L
111158
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.shifthackz.aisdv1.presentation.widget.connectivity
2+
3+
import com.shifthackz.aisdv1.domain.entity.Settings
4+
import com.shifthackz.aisdv1.domain.preference.PreferenceManager
5+
import com.shifthackz.aisdv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCase
6+
import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest
7+
import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider
8+
import io.mockk.every
9+
import io.mockk.mockk
10+
import io.reactivex.rxjava3.core.BackpressureStrategy
11+
import io.reactivex.rxjava3.subjects.BehaviorSubject
12+
import kotlinx.coroutines.test.runTest
13+
import org.junit.Assert
14+
import org.junit.Before
15+
import org.junit.Test
16+
17+
class ConnectivityViewModelTest : CoreViewModelTest<ConnectivityViewModel>() {
18+
19+
private val stubSettings = BehaviorSubject.create<Settings>()
20+
private val stubConnected = BehaviorSubject.create<Boolean>()
21+
private val stubPreferenceManager = mockk<PreferenceManager>()
22+
private val stubObserveSeverConnectivityUseCase = mockk<ObserveSeverConnectivityUseCase>()
23+
24+
override fun initializeViewModel() = ConnectivityViewModel(
25+
preferenceManager = stubPreferenceManager,
26+
observeServerConnectivityUseCase = stubObserveSeverConnectivityUseCase,
27+
schedulersProvider = stubSchedulersProvider,
28+
)
29+
30+
@Before
31+
override fun initialize() {
32+
super.initialize()
33+
34+
every {
35+
stubPreferenceManager.observe()
36+
} returns stubSettings.toFlowable(BackpressureStrategy.LATEST)
37+
38+
every {
39+
stubPreferenceManager::monitorConnectivity.get()
40+
} returns true
41+
42+
every {
43+
stubObserveSeverConnectivityUseCase()
44+
} returns stubConnected.toFlowable(BackpressureStrategy.LATEST)
45+
}
46+
47+
@Test
48+
fun `initialized, monitorConnectivity true, expected UI state is Uninitialized, enabled is true`() {
49+
runTest {
50+
val expected = ConnectivityState.Uninitialized(true)
51+
val actual = viewModel.state.value
52+
Assert.assertEquals(expected, actual)
53+
}
54+
}
55+
56+
@Test
57+
fun `initialized, monitorConnectivity false, expected UI state is Uninitialized, enabled is false`() {
58+
every {
59+
stubPreferenceManager::monitorConnectivity.get()
60+
} returns false
61+
62+
runTest {
63+
val expected = ConnectivityState.Uninitialized(false)
64+
val actual = viewModel.state.value
65+
Assert.assertEquals(expected, actual)
66+
}
67+
}
68+
69+
@Test
70+
fun `given monitorConnectivity true, connected, expected UI state is Connected, enabled is true`() {
71+
stubSettings.onNext(Settings(monitorConnectivity = true))
72+
stubConnected.onNext(true)
73+
runTest {
74+
val expected = ConnectivityState.Connected(true)
75+
val actual = viewModel.state.value
76+
Assert.assertEquals(expected, actual)
77+
}
78+
}
79+
80+
@Test
81+
fun `given monitorConnectivity false, connected, expected UI state is Connected, enabled is false`() {
82+
stubSettings.onNext(Settings(monitorConnectivity = false))
83+
stubConnected.onNext(true)
84+
runTest {
85+
val expected = ConnectivityState.Connected(false)
86+
val actual = viewModel.state.value
87+
Assert.assertEquals(expected, actual)
88+
}
89+
}
90+
91+
@Test
92+
fun `given monitorConnectivity true, disconnected, expected UI state is Disconnected, enabled is true`() {
93+
stubSettings.onNext(Settings(monitorConnectivity = true))
94+
stubConnected.onNext(false)
95+
runTest {
96+
val expected = ConnectivityState.Disconnected(true)
97+
val actual = viewModel.state.value
98+
Assert.assertEquals(expected, actual)
99+
}
100+
}
101+
102+
@Test
103+
fun `given monitorConnectivity false, disconnected, expected UI state is Disconnected, enabled is false`() {
104+
stubSettings.onNext(Settings(monitorConnectivity = false))
105+
stubConnected.onNext(false)
106+
runTest {
107+
val expected = ConnectivityState.Disconnected(false)
108+
val actual = viewModel.state.value
109+
Assert.assertEquals(expected, actual)
110+
}
111+
}
112+
}

0 commit comments

Comments
 (0)