Skip to content

Commit 2cb0969

Browse files
committed
done data tests
1 parent 0cd2bbd commit 2cb0969

File tree

1 file changed

+63
-1
lines changed

1 file changed

+63
-1
lines changed

data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplTest.kt

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import kotlin.test.Test
3737
import kotlin.test.assertContentEquals
3838
import kotlin.test.assertEquals
3939
import kotlin.test.assertNotNull
40+
import kotlin.test.assertNull
4041
import kotlin.test.assertTrue
4142
import kotlin.time.ExperimentalTime
4243

@@ -286,7 +287,7 @@ class UserRepositoryImplTest {
286287
val job = launch(start = CoroutineStart.UNDISPATCHED) {
287288
repo.getUsers().toList(events)
288289
}
289-
delay(1_000)
290+
delay(5_000)
290291
job.cancel()
291292

292293
assertEquals(1, events.size)
@@ -302,6 +303,67 @@ class UserRepositoryImplTest {
302303
}
303304
}
304305
}
306+
307+
@Test
308+
fun test_getUsers_withApiCallError_rethrows() = testDispatcher.runBlockingTest {
309+
coEvery { userApiService.getUsers() } throws IOException()
310+
every { errorMapper(ofType<IOException>()) } returns UserError.NetworkError
311+
312+
val events = mutableListOf<Either<UserError, List<User>>>()
313+
val job = launch(start = CoroutineStart.UNDISPATCHED) {
314+
repo.getUsers().toList(events)
315+
}
316+
delay(20_000)
317+
job.cancel()
318+
319+
assertEquals(1, events.size)
320+
val result = events.single()
321+
assertTrue(result.isLeft())
322+
assertNull(result.orNull())
323+
assertEquals(UserError.NetworkError, result.leftOrThrow)
324+
325+
coVerify(exactly = 3) { userApiService.getUsers() } // retry 3 times.
326+
verify(exactly = 1) { errorMapper(ofType<IOException>()) }
327+
}
328+
329+
@Test
330+
fun test_getUsers_withApiCallSuccess_emitsInitialAndUpdatedUsers() =
331+
testDispatcher.runBlockingTest {
332+
val user = USERS.last()
333+
val userResponse = USER_RESPONSES.last()
334+
coEvery { userApiService.getUsers() } returns USER_RESPONSES.dropLast(1)
335+
coEvery { userApiService.add(USER_BODY) } returns userResponse
336+
coEvery { userApiService.remove(user.id) } returns userResponse
337+
every { domainToBody(user) } returns USER_BODY
338+
USER_RESPONSES.zip(USERS).forEach { (r, u) -> every { responseToDomain(r) } returns u }
339+
340+
val events = mutableListOf<Either<UserError, List<User>>>()
341+
val job = launch(start = CoroutineStart.UNDISPATCHED) {
342+
repo.getUsers().toList(events)
343+
}
344+
repo.add(user)
345+
repo.remove(user)
346+
delay(120_000)
347+
job.cancel()
348+
349+
assertContentEquals(
350+
events.map { it.getOrThrow },
351+
listOf(
352+
USERS.dropLast(1),
353+
USERS,
354+
USERS.dropLast(1),
355+
)
356+
)
357+
358+
coVerify { userApiService.getUsers() }
359+
coVerify { userApiService.add(USER_BODY) }
360+
coVerify { userApiService.remove(user.id) }
361+
verify { domainToBody(user) }
362+
verifySequence {
363+
USER_RESPONSES.forEach { responseToDomain(it) }
364+
responseToDomain(USER_RESPONSES.last())
365+
}
366+
}
305367
}
306368

307369
private inline val <L, R> Either<L, R>.leftOrThrow: L

0 commit comments

Comments
 (0)