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(
9
9
stockPriceDataSource : StockPriceDataSource
10
10
) : BaseViewModel<UiState>() {
11
11
12
- val currentStockPriceAsFlow: Flow <UiState > = stockPriceDataSource
12
+ val currentStockPriceAsFlow: StateFlow <UiState > = stockPriceDataSource
13
13
.latestStockList
14
14
.map { stockList ->
15
15
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