Skip to content

Commit 8dd1abc

Browse files
committed
add refresh test
1 parent 547442a commit 8dd1abc

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

core/test/src/main/java/dev/dai/android/architecture/core/test/repository/FakeUserRepository.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dev.dai.android.architecture.core.test.repository
22

33
import dev.dai.android.architecture.core.data.repository.UserRepository
44
import dev.dai.android.architecture.core.model.User
5+
import dev.dai.android.architecture.core.model.fake
56
import kotlinx.coroutines.flow.Flow
67
import kotlinx.coroutines.flow.MutableSharedFlow
78

@@ -11,7 +12,9 @@ class FakeUserRepository : UserRepository {
1112

1213
override fun users(): Flow<List<User>> = _users
1314

14-
override suspend fun refresh() = Unit
15+
override suspend fun refresh() {
16+
_users.emit(listOf(User.fake()))
17+
}
1518

1619
suspend fun emitUser(user: List<User>) {
1720
_users.emit(user)

feature/user/src/test/java/dev/dai/android/architecture/feature/user/UserListViewModelTest.kt

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import dev.dai.android.architecture.core.model.User
55
import dev.dai.android.architecture.core.model.fake
66
import dev.dai.android.architecture.core.test.MainDispatcherRule
77
import dev.dai.android.architecture.core.test.repository.FakeUserRepository
8+
import dev.dai.android.architecture.ui.UserMessageResult
89
import dev.dai.android.architecture.ui.UserMessageStateHolder
910
import io.mockk.coEvery
11+
import io.mockk.coVerify
1012
import io.mockk.junit4.MockKRule
1113
import io.mockk.mockk
1214
import kotlinx.coroutines.flow.collect
1315
import kotlinx.coroutines.flow.flow
16+
import kotlinx.coroutines.flow.flowOf
1417
import kotlinx.coroutines.launch
1518
import kotlinx.coroutines.test.UnconfinedTestDispatcher
1619
import kotlinx.coroutines.test.runTest
@@ -90,4 +93,66 @@ class UserListViewModelTest {
9093
viewModel.uiState.value
9194
)
9295
}
96+
97+
@Test
98+
fun `Refresh users`() = runTest {
99+
val userRepository = FakeUserRepository()
100+
val viewModel = UserListViewModel(userMessageStateHolder, userRepository)
101+
backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
102+
viewModel.uiState.collect()
103+
}
104+
105+
userRepository.emitUser(
106+
listOf(
107+
User.fake(),
108+
User.fake(
109+
id = 2,
110+
name = "User2",
111+
email = "user2@dev.dai.com",
112+
phone = "1234567890",
113+
website = "https://dev.dai.com",
114+
)
115+
)
116+
)
117+
118+
viewModel.refresh()
119+
120+
assertEquals(
121+
UserListContentUiState(
122+
userListUiState = UserListUiState.UserList(
123+
isRefresh = false,
124+
users = listOf(User.fake())
125+
)
126+
),
127+
viewModel.uiState.value
128+
)
129+
}
130+
131+
@Test
132+
fun `Refresh users failed`() = runTest {
133+
val exception = TimeoutException()
134+
val userRepository = mockk<UserRepository> {
135+
coEvery { users() } returns flowOf(listOf(User.fake()))
136+
coEvery { refresh() } throws exception
137+
}
138+
coEvery { userMessageStateHolder.showMessage(exception.message.orEmpty()) } returns UserMessageResult.Dismissed
139+
val viewModel = UserListViewModel(userMessageStateHolder, userRepository)
140+
backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
141+
viewModel.uiState.collect()
142+
}
143+
144+
viewModel.refresh()
145+
146+
assertEquals(
147+
UserListContentUiState(
148+
userListUiState = UserListUiState.UserList(
149+
isRefresh = false,
150+
users = listOf(User.fake())
151+
)
152+
),
153+
viewModel.uiState.value
154+
)
155+
156+
coVerify(exactly = 1) { userMessageStateHolder.showMessage(exception.message.orEmpty()) }
157+
}
93158
}

0 commit comments

Comments
 (0)