Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /