File tree Expand file tree Collapse file tree 6 files changed +118
-25
lines changed
main/java/com/lukaslechner/coroutineusecasesonandroid/usecases/coroutines/usecase1
test/java/com/lukaslechner/coroutineusecasesonandroid
usecases/coroutines/usecase1 Expand file tree Collapse file tree 6 files changed +118
-25
lines changed Original file line number Diff line number Diff line change 11package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase1
22
3+ import androidx.lifecycle.viewModelScope
34import com.lukaslechner.coroutineusecasesonandroid.base.BaseViewModel
45import com.lukaslechner.coroutineusecasesonandroid.mock.MockApi
6+ import kotlinx.coroutines.launch
7+ import timber.log.Timber
58
69class PerformSingleNetworkRequestViewModel (
710 private val mockApi : MockApi = mockApi()
811) : BaseViewModel<UiState>() {
912
1013 fun performSingleNetworkRequest () {
11-
14+ uiState.value = UiState .Loading
15+ viewModelScope.launch {
16+ try {
17+ val recentAndroidVersions = mockApi.getRecentAndroidVersions()
18+ uiState.value = UiState .Success (recentAndroidVersions)
19+ } catch (exception: Exception ) {
20+ Timber .e(exception)
21+ uiState.value = UiState .Error (" Network Request failed!" )
22+ }
23+ }
1224 }
1325}
Original file line number Diff line number Diff line change 1+ package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase1
2+
3+ import com.lukaslechner.coroutineusecasesonandroid.mock.AndroidVersion
4+ import com.lukaslechner.coroutineusecasesonandroid.mock.MockApi
5+ import com.lukaslechner.coroutineusecasesonandroid.mock.VersionFeatures
6+ import com.lukaslechner.coroutineusecasesonandroid.mock.mockAndroidVersions
7+ import com.lukaslechner.coroutineusecasesonandroid.utils.EndpointShouldNotBeCalledException
8+
9+ class FakeSuccessApi () : MockApi {
10+
11+ override suspend fun getRecentAndroidVersions (): List <AndroidVersion > {
12+ return mockAndroidVersions
13+ }
14+
15+ override suspend fun getAndroidVersionFeatures (apiLevel : Int ): VersionFeatures {
16+ throw EndpointShouldNotBeCalledException ()
17+ }
18+ }
Original file line number Diff line number Diff line change 1+ package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase1
2+
3+ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
4+ import com.lukaslechner.coroutineusecasesonandroid.mock.mockAndroidVersions
5+ import org.junit.After
6+ import org.junit.Assert
7+ import org.junit.Assert.*
8+ import org.junit.Before
9+ import org.junit.Rule
10+ import org.junit.Test
11+ import org.junit.rules.TestRule
12+
13+ class PerformSingleNetworkRequestViewModelTest {
14+
15+ @get: Rule
16+ val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule ()
17+
18+ private val receivedUiStates = mutableListOf<UiState >()
19+
20+ @Test
21+ fun `should return Success when network request is successful` () {
22+
23+ // Arrange
24+ val fakeApi = FakeSuccessApi ()
25+ val viewModel = PerformSingleNetworkRequestViewModel (fakeApi)
26+
27+ observeViewModel(viewModel)
28+
29+ // Act
30+ viewModel.performSingleNetworkRequest()
31+
32+ // Assert
33+ Assert .assertEquals(
34+ listOf (
35+ UiState .Loading ,
36+ UiState .Success (mockAndroidVersions)
37+ ), receivedUiStates
38+ )
39+ }
40+
41+ private fun observeViewModel (viewModel : PerformSingleNetworkRequestViewModel ) {
42+ viewModel.uiState().observeForever { uiState ->
43+ if (uiState != null ) {
44+ receivedUiStates.add(uiState)
45+ }
46+ }
47+ }
48+
49+ }
Original file line number Diff line number Diff line change 1+ package com.lukaslechner.coroutineusecasesonandroid.utils
2+
3+ class EndpointShouldNotBeCalledException : Throwable ()
Load Diff This file was deleted.
You can’t perform that action at this time.
0 commit comments