-
Notifications
You must be signed in to change notification settings - Fork 9
/
InitializeDatabaseActivityRobolectricTest.kt
125 lines (99 loc) · 3.68 KB
/
InitializeDatabaseActivityRobolectricTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.jaimegc.covid19tracker.activity
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.Intents.intended
import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
import arrow.core.Either
import com.jaimegc.covid19tracker.ScreenStateFactoryTest
import com.jaimegc.covid19tracker.data.room.Covid19TrackerDatabase
import com.jaimegc.covid19tracker.domain.usecase.GetCovidTracker
import com.jaimegc.covid19tracker.ui.home.InitializeDatabaseActivity
import com.jaimegc.covid19tracker.ui.home.MainActivity
import com.jaimegc.covid19tracker.util.FileUtils
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkClass
import kotlinx.coroutines.flow.flow
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
import org.koin.core.module.Module
import org.koin.dsl.module
import org.koin.test.AutoCloseKoinTest
import org.koin.test.mock.MockProviderRule
import org.koin.test.mock.declareMock
import org.robolectric.Robolectric.buildActivity
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.LooperMode
@RunWith(RobolectricTestRunner::class)
@LooperMode(LooperMode.Mode.PAUSED)
class InitializeDatabaseActivityRobolectricTest : AutoCloseKoinTest() {
private val fileUtils = mockk<FileUtils>()
private lateinit var mockModule: Module
@get:Rule
val mockProvider = MockProviderRule.create { clazz ->
mockkClass(clazz)
}
@Before
fun setUp() {
mockModule = module(createdAtStart = true, override = true) {
single {
Covid19TrackerDatabase.buildTest(get())
}
single {
fileUtils
}
}
mockRequests()
Intents.init()
}
@After
fun tearDown() {
Intents.release()
unloadKoinModules(mockModule)
}
private fun mockRequests() {
// Empty requests for UpdateDatabaseWorker
every { fileUtils.generateCurrentDates() } returns listOf()
declareMock<GetCovidTracker> {
every { getCovidTrackerByDate(any()) } returns flow {
emit(Either.right(ScreenStateFactoryTest.stateCovidTrackerEmptyData))
}
}
}
@Test
fun ifDatabaseExists_shouldNotCallInitDatabase() {
every { fileUtils.databaseExists() } returns true
loadKoinModules(mockModule)
buildActivity(InitializeDatabaseActivity::class.java).setup()
coVerify(exactly = 0) { fileUtils.initDatabase() }
}
@Test
fun ifDatabaseDoesNotExist_shouldCallInitDatabase() {
every { fileUtils.databaseExists() } returns false
coEvery { fileUtils.initDatabase() } returns Unit
loadKoinModules(mockModule)
buildActivity(InitializeDatabaseActivity::class.java).setup()
coVerify { fileUtils.initDatabase() }
}
@Test
fun ifDatabaseExists_shouldOpenMainActivityDirectly() {
every { fileUtils.databaseExists() } returns true
loadKoinModules(mockModule)
buildActivity(InitializeDatabaseActivity::class.java).setup()
intended(hasComponent(MainActivity::class.java.name))
}
@Test
fun ifDatabaseDoesNotExist_shouldOpenMainActivityAfterInitDatabase() {
every { fileUtils.databaseExists() } returns false
coEvery { fileUtils.initDatabase() } returns Unit
loadKoinModules(mockModule)
buildActivity(InitializeDatabaseActivity::class.java).setup()
intended(hasComponent(MainActivity::class.java.name))
}
}