@@ -313,6 +313,107 @@ class SearchVMTest : BaseMviViewModelTest<ViewIntent, ViewState, SingleEvent, Se
313313 }
314314 }
315315
316+ @Test
317+ fun test_withRetryIntentWhenNoError_ignored () {
318+ test(
319+ vmProducer = { vm },
320+ intents = flowOf(ViewIntent .Retry ),
321+ expectedStates = listOf (
322+ ViewState .initial(null ),
323+ ).mapRight(),
324+ expectedEvents = emptyList(),
325+ )
326+ }
327+
328+ @Test
329+ fun test_withRetryIntentWhenError_returnsUserItemsWithProperLoadingState () {
330+ val query = " #hoc081098"
331+ val networkError = UserError .NetworkError
332+ coEvery { searchUsersUseCase(query) } returnsMany listOf (
333+ networkError.left(),
334+ USERS .right(),
335+ )
336+
337+ test(
338+ vmProducer = { vm },
339+ intents = flowOf(ViewIntent .Retry ),
340+ expectedStates = listOf (
341+ ViewState (
342+ users = emptyList(),
343+ isLoading = false ,
344+ error = networkError,
345+ submittedQuery = query,
346+ originalQuery = query,
347+ ),
348+ ViewState (
349+ users = emptyList(),
350+ isLoading = true , // update isLoading
351+ error = null , // update error
352+ submittedQuery = query,
353+ originalQuery = query,
354+ ),
355+ ViewState (
356+ users = USER_ITEMS , // update users
357+ isLoading = false , // update isLoading
358+ error = null ,
359+ submittedQuery = query,
360+ originalQuery = query,
361+ ),
362+ ).mapRight(),
363+ expectedEvents = emptyList(),
364+ intentsBeforeCollecting = flow {
365+ emit(ViewIntent .Search (query))
366+ timeout()
367+ },
368+ ) {
369+ coVerify(exactly = 2 ) { searchUsersUseCase(query) }
370+ }
371+ }
372+
373+ @Test
374+ fun test_withRetryIntentWhenError_returnsUserErrorWithProperLoadingState () {
375+ val query = " #hoc081098"
376+ val networkError = UserError .NetworkError
377+ coEvery { searchUsersUseCase(query) } returns networkError.left()
378+
379+ test(
380+ vmProducer = { vm },
381+ intents = flowOf(ViewIntent .Retry ),
382+ expectedStates = listOf (
383+ ViewState (
384+ users = emptyList(),
385+ isLoading = false ,
386+ error = networkError,
387+ submittedQuery = query,
388+ originalQuery = query,
389+ ),
390+ ViewState (
391+ users = emptyList(),
392+ isLoading = true , // update isLoading
393+ error = null , // update error
394+ submittedQuery = query,
395+ originalQuery = query,
396+ ),
397+ ViewState (
398+ users = emptyList(),
399+ isLoading = false , // update isLoading
400+ error = networkError, // update error
401+ submittedQuery = query,
402+ originalQuery = query,
403+ ),
404+ ).mapRight(),
405+ expectedEvents = listOf (
406+ SingleEvent .SearchFailure (networkError),
407+ ).mapRight(),
408+ intentsBeforeCollecting = flow {
409+ emit(ViewIntent .Search (query))
410+ timeout()
411+ },
412+ ) {
413+ coVerify(exactly = 2 ) { searchUsersUseCase(query) }
414+ }
415+ }
416+
316417 private companion object {
317418 private val EXTRAS_TIMEOUT = Duration .milliseconds(100 )
318419 private val TOTAL_TIMEOUT = SEARCH_DEBOUNCE_DURATION + EXTRAS_TIMEOUT
0 commit comments