Skip to content

Commit 8a876db

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

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.lukaslechner.coroutineusecasesonandroid.usecases.flow.usecase1
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,49 @@
1+
package com.lukaslechner.coroutineusecasesonandroid.usecases.flow.usecase1
2+
3+
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
4+
import com.lukaslechner.coroutineusecasesonandroid.utils.ReplaceMainDispatcherRule
5+
import junit.framework.Assert.assertEquals
6+
import kotlinx.coroutines.ExperimentalCoroutinesApi
7+
import kotlinx.coroutines.test.runTest
8+
import org.junit.Rule
9+
import org.junit.Test
10+
import org.junit.rules.TestRule
11+
12+
class FlowUseCase1ViewModelTest {
13+
14+
@get:Rule
15+
val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()
16+
17+
@OptIn(ExperimentalCoroutinesApi::class)
18+
@get: Rule
19+
val replaceMainDispatcherRule = ReplaceMainDispatcherRule()
20+
21+
private val receivedUiStates = mutableListOf<UiState>()
22+
23+
@Test
24+
fun `should return success UI States with values of fakeDataSource`() = runTest {
25+
26+
val fakeDataSource = FakeStockPriceDataSource()
27+
val viewModel = FlowUseCase1ViewModel(fakeDataSource)
28+
observeViewModel(viewModel)
29+
30+
assertEquals(UiState.Loading, receivedUiStates[0])
31+
assertEquals(1, receivedUiStates.size)
32+
33+
fakeDataSource.emit(listOf(googleStock, appleStock))
34+
assertEquals(UiState.Success(listOf(googleStock, appleStock)), receivedUiStates[1])
35+
assertEquals(2, receivedUiStates.size)
36+
37+
fakeDataSource.emit(listOf(googleStock))
38+
assertEquals(UiState.Success(listOf(googleStock)), receivedUiStates[2])
39+
assertEquals(3, receivedUiStates.size)
40+
}
41+
42+
private fun observeViewModel(viewModel: FlowUseCase1ViewModel) {
43+
viewModel.currentStockPriceAsLiveData.observeForever { uiState ->
44+
if (uiState != null) {
45+
receivedUiStates.add(uiState)
46+
}
47+
}
48+
}
49+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.lukaslechner.coroutineusecasesonandroid.usecases.flow.usecase1
2+
3+
import com.lukaslechner.coroutineusecasesonandroid.usecases.flow.mock.Stock
4+
5+
val appleStock = Stock(
6+
rank = 1,
7+
name = "Apple",
8+
symbol = "AAPL",
9+
marketCap = 1.0f,
10+
country = "United Stated",
11+
currentPrice = 1.0f
12+
)
13+
14+
val googleStock = Stock(
15+
rank = 4,
16+
name = "Alphabet",
17+
symbol = "GOOG",
18+
marketCap = 2.0f,
19+
country = "United Stated",
20+
currentPrice = 2.0f
21+
)

0 commit comments

Comments
 (0)