11package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase14
22
3- import com.lukaslechner.coroutineusecasesonandroid.mock.AndroidVersion
4- import com.lukaslechner.coroutineusecasesonandroid.mock.MockApi
5- import com.lukaslechner.coroutineusecasesonandroid.mock.VersionFeatures
63import com.lukaslechner.coroutineusecasesonandroid.mock.mockAndroidVersions
7- import com.lukaslechner.coroutineusecasesonandroid.utils.EndpointShouldNotBeCalledException
84import com.lukaslechner.coroutineusecasesonandroid.utils.MainCoroutineScopeRule
95import junit.framework.Assert.assertEquals
106import junit.framework.Assert.fail
11- import kotlinx.coroutines.*
12- import kotlinx.coroutines.test.TestCoroutineScope
7+ import kotlinx.coroutines.ExperimentalCoroutinesApi
8+ import kotlinx.coroutines.launch
139import kotlinx.coroutines.test.runBlockingTest
14- import org.junit.Before
1510import org.junit.Rule
1611import org.junit.Test
1712
@@ -21,17 +16,10 @@ class AndroidVersionRepositoryTest {
2116 @get: Rule
2217 val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule ()
2318
24- private var insertedIntoDb = false
25-
26- @Before
27- fun setUp () {
28- insertedIntoDb = false
29- }
30-
3119 @Test
3220 fun `getLocalAndroidVersions() should return android versions from database` () =
3321 mainCoroutineScopeRule.runBlockingTest {
34- val fakeDatabase = createFakeDatabase ()
22+ val fakeDatabase = FakeDatabase ()
3523
3624 val repository = AndroidVersionRepository (fakeDatabase, mainCoroutineScopeRule)
3725 assertEquals(mockAndroidVersions, repository.getLocalAndroidVersions())
@@ -40,8 +28,8 @@ class AndroidVersionRepositoryTest {
4028 @Test
4129 fun `loadRecentAndroidVersions() should return android versions from network` () =
4230 mainCoroutineScopeRule.runBlockingTest {
43- val fakeDatabase = createFakeDatabase ()
44- val fakeApi = createFakeApi ()
31+ val fakeDatabase = FakeDatabase ()
32+ val fakeApi = FakeApi ()
4533 val repository = AndroidVersionRepository (
4634 fakeDatabase,
4735 mainCoroutineScopeRule,
@@ -53,54 +41,27 @@ class AndroidVersionRepositoryTest {
5341 @Test
5442 fun `loadRecentAndroidVersions() should continue to load and store android versions when calling scope gets cancelled` () =
5543 mainCoroutineScopeRule.runBlockingTest {
56- val fakeDatabase = createFakeDatabase ()
57- val fakeApi = createFakeApi ()
44+ val fakeDatabase = FakeDatabase ()
45+ val fakeApi = FakeApi ()
5846 val repository = AndroidVersionRepository (
5947 fakeDatabase,
6048 mainCoroutineScopeRule,
6149 api = fakeApi
6250 )
6351
64- val testScope = TestCoroutineScope (Job ())
65-
66- testScope
67- .launch {
68- println (" running coroutine!" )
69- val loadedVersions = repository.loadAndStoreRemoteAndroidVersions()
70- fail(" Scope should be cancelled before versions are loaded!" )
71- }
72-
73- testScope.cancel()
74-
75- advanceUntilIdle()
76-
77- assertEquals(true , insertedIntoDb)
78- }
79-
80- private fun createFakeApi (): MockApi {
81- return object : MockApi {
82- override suspend fun getRecentAndroidVersions (): List <AndroidVersion > {
83- delay(100 )
84- return mockAndroidVersions
52+ // this coroutine will be executed immediately (eagerly)
53+ // how ever, it will stop its execution at the delay(1) in the fakeApi
54+ val job = launch {
55+ println (" running coroutine!" )
56+ val loadedVersions = repository.loadAndStoreRemoteAndroidVersions()
57+ fail(" Scope should be cancelled before versions are loaded!" )
8558 }
8659
87- override suspend fun getAndroidVersionFeatures (apiLevel : Int ): VersionFeatures {
88- throw EndpointShouldNotBeCalledException ()
89- }
90- }
91- }
60+ job.cancel()
9261
93- private fun createFakeDatabase (): AndroidVersionDao {
94- return object : AndroidVersionDao {
95- override suspend fun getAndroidVersions (): List <AndroidVersionEntity > {
96- return mockAndroidVersions.mapToEntityList()
97- }
98-
99- override suspend fun insert (androidVersionEntity : AndroidVersionEntity ) {
100- insertedIntoDb = true
101- }
62+ // continue coroutine execution after delay(1) in the fakeApi
63+ advanceUntilIdle()
10264
103- override suspend fun clear () {}
65+ assertEquals( true , fakeDatabase.insertedIntoDb)
10466 }
105- }
10667}
0 commit comments