Skip to content

Commit 372f212

Browse files
Prepare code to record first lesson
1 parent a575472 commit 372f212

File tree

6 files changed

+118
-25
lines changed

6 files changed

+118
-25
lines changed

.idea/codeStyles/Project.xml

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase1
22

3+
import androidx.lifecycle.viewModelScope
34
import com.lukaslechner.coroutineusecasesonandroid.base.BaseViewModel
45
import com.lukaslechner.coroutineusecasesonandroid.mock.MockApi
6+
import kotlinx.coroutines.launch
7+
import timber.log.Timber
58

69
class 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
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.lukaslechner.coroutineusecasesonandroid.utils
2+
3+
class EndpointShouldNotBeCalledException : Throwable()

app/src/test/java/com/lukaslechner/coroutineusecasesonandroid/utils/ReplaceMainDispatcherRule.kt

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)