@@ -7,14 +7,17 @@ import com.hoc.flowmvi.domain.usecase.RefreshGetUsersUseCase
7
7
import com.hoc.flowmvi.domain.usecase.RemoveUserUseCase
8
8
import io.mockk.coEvery
9
9
import io.mockk.coVerify
10
+ import io.mockk.coVerifySequence
10
11
import io.mockk.every
11
12
import io.mockk.mockk
12
13
import io.mockk.verify
13
14
import kotlinx.coroutines.ExperimentalCoroutinesApi
14
15
import kotlinx.coroutines.FlowPreview
16
+ import kotlinx.coroutines.flow.MutableStateFlow
15
17
import kotlinx.coroutines.flow.emptyFlow
16
18
import kotlinx.coroutines.flow.flow
17
19
import kotlinx.coroutines.flow.flowOf
20
+ import kotlinx.coroutines.flow.update
18
21
import java.io.IOException
19
22
import kotlin.test.Test
20
23
import kotlin.time.Duration
@@ -327,4 +330,92 @@ class MainVMTest : BaseMviViewModelTest<
327
330
),
328
331
) { verify(exactly = 2 ) { getUserUseCase() } }
329
332
}
333
+
334
+ @Test
335
+ fun test_withRemoveUserIntentWhenSuccess_returnsUserItemsExceptRemovedUserItems () {
336
+ val user1 = USERS [0 ]
337
+ val user2 = USERS [1 ]
338
+ val item1 = USER_ITEMS [0 ]
339
+ val item2 = USER_ITEMS [1 ]
340
+ val usersFlow = MutableStateFlow (USERS )
341
+
342
+ test(
343
+ vmProducer = {
344
+ every { getUserUseCase() } returns usersFlow
345
+ coEvery { removeUser(any()) } coAnswers {
346
+ usersFlow.update { users ->
347
+ users.filter { it.id != firstArg<User >().id }
348
+ }
349
+ }
350
+ vm
351
+ },
352
+ intentsBeforeCollecting = flowOf(ViewIntent .Initial ),
353
+ intents = flowOf(
354
+ ViewIntent .RemoveUser (item1),
355
+ ViewIntent .RemoveUser (item2),
356
+ ),
357
+ expectedStates = listOf (
358
+ ViewState (
359
+ userItems = USER_ITEMS ,
360
+ isLoading = false ,
361
+ error = null ,
362
+ isRefreshing = false ,
363
+ ),
364
+ ViewState (
365
+ userItems = USER_ITEMS .toMutableList().apply { remove(item1) },
366
+ isLoading = false ,
367
+ error = null ,
368
+ isRefreshing = false ,
369
+ ),
370
+ ViewState (
371
+ userItems = USER_ITEMS .toMutableList().apply {
372
+ remove(item1)
373
+ remove(item2)
374
+ },
375
+ isLoading = false ,
376
+ error = null ,
377
+ isRefreshing = false ,
378
+ ),
379
+ ),
380
+ expectedEvents = listOf (
381
+ SingleEvent .RemoveUser .Success (item1),
382
+ SingleEvent .RemoveUser .Success (item2),
383
+ )
384
+ ) {
385
+ coVerifySequence {
386
+ removeUser(user1)
387
+ removeUser(user2)
388
+ }
389
+ }
390
+ }
391
+
392
+ @Test
393
+ fun test_withRemoveUserIntentWhenError_stateDoNotChange () {
394
+ val user = USERS [0 ]
395
+ val item = USER_ITEMS [0 ]
396
+ val ioException = IOException ()
397
+
398
+ test(
399
+ vmProducer = {
400
+ every { getUserUseCase() } returns flowOf(USERS )
401
+ coEvery { removeUser(any()) } throws ioException
402
+ vm
403
+ },
404
+ intentsBeforeCollecting = flowOf(ViewIntent .Initial ),
405
+ intents = flowOf(ViewIntent .RemoveUser (item)),
406
+ expectedStates = listOf (
407
+ ViewState (
408
+ userItems = USER_ITEMS ,
409
+ isLoading = false ,
410
+ error = null ,
411
+ isRefreshing = false ,
412
+ ),
413
+ ),
414
+ expectedEvents = listOf (
415
+ SingleEvent .RemoveUser .Failure (item, ioException),
416
+ )
417
+ ) {
418
+ coVerify(exactly = 1 ) { removeUser(user) }
419
+ }
420
+ }
330
421
}
0 commit comments