File tree Expand file tree Collapse file tree 3 files changed +86
-1
lines changed
main/java/com/lukaslechner/coroutineusecasesonandroid/usecases/flow/usecase4
test/java/com/lukaslechner/coroutineusecasesonandroid/usecases/flow/usecase4 Expand file tree Collapse file tree 3 files changed +86
-1
lines changed Original file line number Diff line number Diff 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 number Diff line number Diff line change 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 number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments