Skip to content

Commit e4bc506

Browse files
Improve test for UseCase14
1 parent c569b47 commit e4bc506

File tree

3 files changed

+56
-56
lines changed

3 files changed

+56
-56
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
package 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
63
import com.lukaslechner.coroutineusecasesonandroid.mock.mockAndroidVersions
7-
import com.lukaslechner.coroutineusecasesonandroid.utils.EndpointShouldNotBeCalledException
84
import com.lukaslechner.coroutineusecasesonandroid.utils.MainCoroutineScopeRule
95
import junit.framework.Assert.assertEquals
106
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
139
import kotlinx.coroutines.test.runBlockingTest
14-
import org.junit.Before
1510
import org.junit.Rule
1611
import 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
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase14
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+
import kotlinx.coroutines.delay
9+
10+
class FakeApi : MockApi {
11+
12+
override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {
13+
delay(1)
14+
return mockAndroidVersions
15+
}
16+
17+
override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {
18+
throw EndpointShouldNotBeCalledException()
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase14
2+
3+
import com.lukaslechner.coroutineusecasesonandroid.mock.mockAndroidVersions
4+
5+
class FakeDatabase : AndroidVersionDao {
6+
7+
var insertedIntoDb = false
8+
9+
override suspend fun getAndroidVersions(): List<AndroidVersionEntity> {
10+
return mockAndroidVersions.mapToEntityList()
11+
}
12+
13+
override suspend fun insert(androidVersionEntity: AndroidVersionEntity) {
14+
insertedIntoDb = true
15+
}
16+
17+
override suspend fun clear() {}
18+
19+
}

0 commit comments

Comments
 (0)