1
1
package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase14
2
2
3
- import com.lukaslechner.coroutineusecasesonandroid.mock.AndroidVersion
4
- import com.lukaslechner.coroutineusecasesonandroid.mock.MockApi
5
- import com.lukaslechner.coroutineusecasesonandroid.mock.VersionFeatures
6
3
import com.lukaslechner.coroutineusecasesonandroid.mock.mockAndroidVersions
7
- import com.lukaslechner.coroutineusecasesonandroid.utils.EndpointShouldNotBeCalledException
8
4
import com.lukaslechner.coroutineusecasesonandroid.utils.MainCoroutineScopeRule
9
5
import junit.framework.Assert.assertEquals
10
6
import junit.framework.Assert.fail
11
- import kotlinx.coroutines.*
12
- import kotlinx.coroutines.test.TestCoroutineScope
7
+ import kotlinx.coroutines.ExperimentalCoroutinesApi
8
+ import kotlinx.coroutines.launch
13
9
import kotlinx.coroutines.test.runBlockingTest
14
- import org.junit.Before
15
10
import org.junit.Rule
16
11
import org.junit.Test
17
12
@@ -21,17 +16,10 @@ class AndroidVersionRepositoryTest {
21
16
@get: Rule
22
17
val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule ()
23
18
24
- private var insertedIntoDb = false
25
-
26
- @Before
27
- fun setUp () {
28
- insertedIntoDb = false
29
- }
30
-
31
19
@Test
32
20
fun `getLocalAndroidVersions() should return android versions from database` () =
33
21
mainCoroutineScopeRule.runBlockingTest {
34
- val fakeDatabase = createFakeDatabase ()
22
+ val fakeDatabase = FakeDatabase ()
35
23
36
24
val repository = AndroidVersionRepository (fakeDatabase, mainCoroutineScopeRule)
37
25
assertEquals(mockAndroidVersions, repository.getLocalAndroidVersions())
@@ -40,8 +28,8 @@ class AndroidVersionRepositoryTest {
40
28
@Test
41
29
fun `loadRecentAndroidVersions() should return android versions from network` () =
42
30
mainCoroutineScopeRule.runBlockingTest {
43
- val fakeDatabase = createFakeDatabase ()
44
- val fakeApi = createFakeApi ()
31
+ val fakeDatabase = FakeDatabase ()
32
+ val fakeApi = FakeApi ()
45
33
val repository = AndroidVersionRepository (
46
34
fakeDatabase,
47
35
mainCoroutineScopeRule,
@@ -53,54 +41,27 @@ class AndroidVersionRepositoryTest {
53
41
@Test
54
42
fun `loadRecentAndroidVersions() should continue to load and store android versions when calling scope gets cancelled` () =
55
43
mainCoroutineScopeRule.runBlockingTest {
56
- val fakeDatabase = createFakeDatabase ()
57
- val fakeApi = createFakeApi ()
44
+ val fakeDatabase = FakeDatabase ()
45
+ val fakeApi = FakeApi ()
58
46
val repository = AndroidVersionRepository (
59
47
fakeDatabase,
60
48
mainCoroutineScopeRule,
61
49
api = fakeApi
62
50
)
63
51
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!" )
85
58
}
86
59
87
- override suspend fun getAndroidVersionFeatures (apiLevel : Int ): VersionFeatures {
88
- throw EndpointShouldNotBeCalledException ()
89
- }
90
- }
91
- }
60
+ job.cancel()
92
61
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()
102
64
103
- override suspend fun clear () {}
65
+ assertEquals( true , fakeDatabase.insertedIntoDb)
104
66
}
105
- }
106
67
}
0 commit comments