Skip to content

Commit a7194a2

Browse files
Add test for flow use case 4
1 parent 8a876db commit a7194a2

File tree

3 files changed

+86
-1
lines changed

3 files changed

+86
-1
lines changed

app/src/main/java/com/lukaslechner/coroutineusecasesonandroid/usecases/flow/usecase4/FlowUseCase4ViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class FlowUseCase4ViewModel(
99
stockPriceDataSource: StockPriceDataSource
1010
) : BaseViewModel<UiState>() {
1111

12-
val currentStockPriceAsFlow: Flow<UiState> = stockPriceDataSource
12+
val currentStockPriceAsFlow: StateFlow<UiState> = stockPriceDataSource
1313
.latestStockList
1414
.map { stockList ->
1515
UiState.Success(stockList) as UiState
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.lukaslechner.coroutineusecasesonandroid.usecases.flow.usecase4
2+
3+
import com.lukaslechner.coroutineusecasesonandroid.usecases.flow.mock.Stock
4+
import kotlinx.coroutines.flow.Flow
5+
import kotlinx.coroutines.flow.MutableSharedFlow
6+
import kotlinx.coroutines.flow.asSharedFlow
7+
8+
class FakeStockPriceDataSource : StockPriceDataSource {
9+
10+
private val sharedFlow = MutableSharedFlow<List<Stock>>()
11+
12+
suspend fun emit(stockList: List<Stock>) {
13+
sharedFlow.emit(stockList)
14+
}
15+
16+
override val latestStockList: Flow<List<Stock>> = sharedFlow.asSharedFlow()
17+
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.lukaslechner.coroutineusecasesonandroid.usecases.flow.usecase4
2+
3+
import com.lukaslechner.coroutineusecasesonandroid.usecases.flow.usecase1.appleStock
4+
import com.lukaslechner.coroutineusecasesonandroid.usecases.flow.usecase1.googleStock
5+
import com.lukaslechner.coroutineusecasesonandroid.utils.ReplaceMainDispatcherRule
6+
import junit.framework.Assert.assertEquals
7+
import kotlinx.coroutines.ExperimentalCoroutinesApi
8+
import kotlinx.coroutines.flow.collect
9+
import kotlinx.coroutines.launch
10+
import kotlinx.coroutines.test.UnconfinedTestDispatcher
11+
import kotlinx.coroutines.test.runTest
12+
import org.junit.Rule
13+
import org.junit.Test
14+
15+
class FlowUseCase4ViewModelTest {
16+
17+
@OptIn(ExperimentalCoroutinesApi::class)
18+
@get: Rule
19+
val replaceMainDispatcherRule = ReplaceMainDispatcherRule()
20+
21+
@Test
22+
fun `should collect loading and success ui states on successful emissions`() = runTest {
23+
24+
val fakeStockPriceDataSource = FakeStockPriceDataSource()
25+
val viewModel = FlowUseCase4ViewModel(fakeStockPriceDataSource)
26+
27+
val collectJob =
28+
launch(UnconfinedTestDispatcher()) {
29+
viewModel.currentStockPriceAsFlow.collect()
30+
}
31+
32+
assertEquals(
33+
UiState.Loading,
34+
viewModel.currentStockPriceAsFlow.value
35+
)
36+
37+
fakeStockPriceDataSource.emit(
38+
listOf(
39+
googleStock,
40+
appleStock
41+
)
42+
)
43+
44+
assertEquals(
45+
UiState.Success(
46+
listOf(
47+
googleStock,
48+
appleStock
49+
)
50+
),
51+
viewModel.currentStockPriceAsFlow.value
52+
)
53+
54+
fakeStockPriceDataSource.emit(listOf(googleStock))
55+
56+
assertEquals(
57+
UiState.Success(
58+
listOf(
59+
googleStock
60+
)
61+
),
62+
viewModel.currentStockPriceAsFlow.value
63+
)
64+
65+
collectJob.cancel()
66+
}
67+
}

0 commit comments

Comments
 (0)