@@ -8,9 +8,7 @@ import io.kotest.matchers.shouldBe
8
8
import io.mockk.MockKAnnotations
9
9
import io.mockk.coEvery
10
10
import io.mockk.coVerify
11
- import io.mockk.every
12
11
import io.mockk.impl.annotations.MockK
13
- import io.mockk.mockk
14
12
import kotlinx.coroutines.ExperimentalCoroutinesApi
15
13
import kotlinx.coroutines.flow.MutableStateFlow
16
14
import kotlinx.coroutines.flow.emptyFlow
@@ -23,22 +21,50 @@ import me.sujanpoudel.playdeals.common.domain.models.Failure
23
21
import me.sujanpoudel.playdeals.common.domain.models.Result
24
22
import me.sujanpoudel.playdeals.common.domain.persistent.AppPreferences
25
23
import me.sujanpoudel.playdeals.common.domain.repositories.DealsRepository
24
+ import me.sujanpoudel.playdeals.common.domain.repositories.ForexRepository
25
+ import me.sujanpoudel.playdeals.common.domain.repositories.defaultUsdConversion
26
26
import me.sujanpoudel.playdeals.common.ui.screens.home.HomeScreenState
27
27
import me.sujanpoudel.playdeals.common.ui.screens.home.HomeScreenViewModel
28
28
import me.sujanpoudel.playdeals.common.utils.setMainDispatcher
29
29
import me.sujanpoudel.playdeals.common.utils.settings.asObservableSettings
30
30
import org.junit.jupiter.api.BeforeEach
31
31
import org.junit.jupiter.api.Test
32
32
33
+ fun dealEntity (id : String = "1") = DealEntity (
34
+ id = id,
35
+ name = " name" ,
36
+ icon = " icon" ,
37
+ images = listOf (),
38
+ normalPrice = 1.1f ,
39
+ currentPrice = 1.2f ,
40
+ currency = " $" ,
41
+ url = " " ,
42
+ category = " game" ,
43
+ downloads = " 150k" ,
44
+ rating = 3.7f ,
45
+ offerExpiresIn = kotlinx.datetime.Clock .System .now(),
46
+ type = " " ,
47
+ source = " " ,
48
+ createdAt = kotlinx.datetime.Clock .System .now(),
49
+ updatedAt = kotlinx.datetime.Clock .System .now(),
50
+ )
51
+
33
52
@OptIn(ExperimentalCoroutinesApi ::class )
34
53
class HomeScreenViewModelTest {
35
54
36
55
@MockK
37
56
lateinit var dealsRepository: DealsRepository
38
57
58
+ @MockK
59
+ lateinit var forexRepository: ForexRepository
60
+
39
61
@BeforeEach
40
62
fun setup () {
41
63
MockKAnnotations .init (this )
64
+ coEvery { forexRepository.refreshRatesIfNecessary() } returns Result .success(Unit )
65
+ coEvery { forexRepository.forexRatesFlow() } returns flowOf(emptyList())
66
+ coEvery { forexRepository.forexUpdateAtFlow() } returns MutableStateFlow (null )
67
+ coEvery { forexRepository.preferredConversionRateFlow() } returns MutableStateFlow (defaultUsdConversion())
42
68
}
43
69
44
70
private fun appPreference (): AppPreferences {
@@ -62,7 +88,7 @@ class HomeScreenViewModelTest {
62
88
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
63
89
coEvery { dealsRepository.refreshDeals() } returns Result .success(Unit )
64
90
65
- HomeScreenViewModel (appPreference(), dealsRepository)
91
+ HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
66
92
67
93
coVerify {
68
94
dealsRepository.dealsFlow()
@@ -76,21 +102,17 @@ class HomeScreenViewModelTest {
76
102
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
77
103
coEvery { dealsRepository.refreshDeals() } returns Result .success(Unit )
78
104
79
- HomeScreenViewModel (appPreference(), dealsRepository)
105
+ HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
80
106
81
107
coVerify { dealsRepository.refreshDeals() }
82
108
}
83
109
84
110
@Test
85
111
fun `should correctly update state before calling the remoteAPI_getDeals` (): Unit = runTest {
86
- val dispatcher = StandardTestDispatcher ()
87
-
88
- setMainDispatcher(dispatcher)
89
-
90
112
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
91
113
coEvery { dealsRepository.refreshDeals() } returns Result .success(Unit )
92
114
93
- val viewModel = HomeScreenViewModel (appPreference(), dealsRepository)
115
+ val viewModel = HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
94
116
95
117
viewModel.state.value.let {
96
118
it.allDeals shouldHaveSize 0
@@ -108,7 +130,7 @@ class HomeScreenViewModelTest {
108
130
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
109
131
coEvery { dealsRepository.refreshDeals() } returns Result .failure(Failure .UnknownError )
110
132
111
- val viewModel = HomeScreenViewModel (appPreference(), dealsRepository)
133
+ val viewModel = HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
112
134
113
135
dispatcher.scheduler.runCurrent()
114
136
@@ -125,16 +147,12 @@ class HomeScreenViewModelTest {
125
147
runTest {
126
148
val dispatcher = StandardTestDispatcher ()
127
149
128
- val deal = mockk<DealEntity >()
129
-
130
- every { deal.category } returns " "
131
-
132
150
setMainDispatcher(dispatcher)
133
151
134
152
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
135
153
coEvery { dealsRepository.refreshDeals() } returns Result .success(Unit )
136
154
137
- val viewModel = HomeScreenViewModel (appPreference(), dealsRepository)
155
+ val viewModel = HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
138
156
139
157
dispatcher.scheduler.runCurrent()
140
158
@@ -151,15 +169,14 @@ class HomeScreenViewModelTest {
151
169
runTest {
152
170
val dispatcher = StandardTestDispatcher ()
153
171
154
- val entity = mockk<DealEntity >()
155
- every { entity.category } returns " "
172
+ val entity = dealEntity(" 32" )
156
173
157
174
setMainDispatcher(dispatcher)
158
175
159
176
coEvery { dealsRepository.dealsFlow() } returns flowOf(listOf (entity))
160
177
coEvery { dealsRepository.refreshDeals() } returns Result .success(Unit )
161
178
162
- val viewModel = HomeScreenViewModel (appPreference(), dealsRepository)
179
+ val viewModel = HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
163
180
164
181
dispatcher.scheduler.runCurrent()
165
182
@@ -184,7 +201,7 @@ class HomeScreenViewModelTest {
184
201
185
202
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
186
203
187
- val viewModel = HomeScreenViewModel (appPreference(), dealsRepository)
204
+ val viewModel = HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
188
205
189
206
viewModel.state.value.also { state ->
190
207
state.allDeals shouldHaveSize 0
@@ -230,9 +247,7 @@ class HomeScreenViewModelTest {
230
247
runTest {
231
248
val dispatcher = StandardTestDispatcher ()
232
249
233
- val entity = mockk<DealEntity >()
234
-
235
- every { entity.category } returns " "
250
+ val entity = dealEntity(" 1" )
236
251
237
252
setMainDispatcher(dispatcher)
238
253
@@ -242,7 +257,7 @@ class HomeScreenViewModelTest {
242
257
243
258
coEvery { dealsRepository.dealsFlow() } returns flowOf(listOf (entity))
244
259
245
- val viewModel = HomeScreenViewModel (appPreference(), dealsRepository)
260
+ val viewModel = HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
246
261
247
262
viewModel.state.value.also { state ->
248
263
state.allDeals shouldHaveSize 0
@@ -289,20 +304,16 @@ class HomeScreenViewModelTest {
289
304
val dispatcher = StandardTestDispatcher ()
290
305
setMainDispatcher(dispatcher)
291
306
292
- val deal1 = mockk< DealEntity >( )
293
- val deal2 = mockk< DealEntity >( )
307
+ val deal1 = dealEntity( " 123 " )
308
+ val deal2 = dealEntity( " 321 " )
294
309
295
310
val flow = MutableStateFlow <List <DealEntity >>(emptyList())
296
311
297
- every { deal1.category } returns " "
298
- every { deal2.category } returns " "
299
-
300
312
coEvery { dealsRepository.refreshDeals() } returns Result .success(Unit )
301
313
coEvery { dealsRepository.dealsFlow() } returns flow
302
314
303
- val viewModel = HomeScreenViewModel (appPreference(), dealsRepository)
315
+ val viewModel = HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
304
316
305
- dispatcher.scheduler.advanceTimeBy(10000 )
306
317
dispatcher.scheduler.advanceUntilIdle()
307
318
308
319
viewModel.state.value.also { state ->
@@ -312,6 +323,7 @@ class HomeScreenViewModelTest {
312
323
flow.emit(listOf (deal1, deal2))
313
324
314
325
dispatcher.scheduler.advanceUntilIdle()
326
+ dispatcher.scheduler.runCurrent()
315
327
316
328
viewModel.state.value.also { state ->
317
329
state.allDeals.shouldContainExactly(deal1, deal2)
@@ -324,18 +336,15 @@ class HomeScreenViewModelTest {
324
336
val dispatcher = StandardTestDispatcher ()
325
337
setMainDispatcher(dispatcher)
326
338
327
- val deal1 = mockk< DealEntity > ()
328
- val deal2 = mockk< DealEntity >( )
339
+ val deal1 = dealEntity ()
340
+ val deal2 = dealEntity( " 2 " )
329
341
330
342
val flow = MutableStateFlow <List <DealEntity >>(emptyList())
331
343
332
- every { deal1.category } returns " "
333
- every { deal2.category } returns " "
334
-
335
344
coEvery { dealsRepository.refreshDeals() } returns Result .failure(Failure .UnknownError )
336
345
coEvery { dealsRepository.dealsFlow() } returns flow
337
346
338
- val viewModel = HomeScreenViewModel (appPreference(), dealsRepository)
347
+ val viewModel = HomeScreenViewModel (appPreference(), dealsRepository, forexRepository )
339
348
340
349
dispatcher.scheduler.advanceTimeBy(10000 )
341
350
dispatcher.scheduler.advanceUntilIdle()
0 commit comments