mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-09 07:16:04 -04:00
Removed unnecessary debouncing code from search functionality.
* Refactored SearchViewModelTest.
This commit is contained in:
parent
d0de528dc8
commit
3eda149636
@ -64,6 +64,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.Action
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ActivityResultReceived
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ClickedSearchInText
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ExitedSearch
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.Filter
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemClick
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemLongClick
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnOpenInNewTabClick
|
||||
@ -222,7 +223,7 @@ class SearchFragment : BaseFragment() {
|
||||
searchView?.setOnQueryTextListener(
|
||||
SimpleTextListener {
|
||||
if (it.isNotEmpty()) {
|
||||
searchViewModel.searchResults(it)
|
||||
searchViewModel.actions.trySend(Filter(it)).isSuccess
|
||||
}
|
||||
}
|
||||
)
|
||||
|
@ -88,20 +88,10 @@ class SearchViewModel @Inject constructor(
|
||||
val actions = Channel<Action>(Channel.UNLIMITED)
|
||||
private val filter = ConflatedBroadcastChannel("")
|
||||
private val searchOrigin = ConflatedBroadcastChannel(FromWebView)
|
||||
private val debouncedSearchQuery = MutableStateFlow("")
|
||||
|
||||
init {
|
||||
viewModelScope.launch { reducer() }
|
||||
viewModelScope.launch { actionMapper() }
|
||||
viewModelScope.launch { debouncedSearchQuery() }
|
||||
}
|
||||
|
||||
private suspend fun debouncedSearchQuery() {
|
||||
// Observe and collect the debounced search query
|
||||
debouncedSearchQuery
|
||||
.collect { query ->
|
||||
actions.trySend(Filter(query)).isSuccess
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
@ -211,10 +201,6 @@ class SearchViewModel @Inject constructor(
|
||||
}, LATEST)
|
||||
.subscribeOn(Schedulers.io())
|
||||
}
|
||||
|
||||
fun searchResults(query: String) {
|
||||
debouncedSearchQuery.value = query
|
||||
}
|
||||
}
|
||||
|
||||
data class SearchResultsWithTerm(val searchTerm: String, val suggestionSearch: SuggestionSearch?)
|
||||
|
@ -29,12 +29,10 @@ import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.consumeAsFlow
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.test.TestCoroutineDispatcher
|
||||
import kotlinx.coroutines.test.TestCoroutineScheduler
|
||||
import kotlinx.coroutines.test.TestCoroutineScope
|
||||
import kotlinx.coroutines.test.TestScope
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
@ -59,6 +57,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ClickedSearchInText
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ConfirmedDelete
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.CreatedWithArguments
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ExitedSearch
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.Filter
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemClick
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemLongClick
|
||||
import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnOpenInNewTabClick
|
||||
@ -110,54 +109,6 @@ internal class SearchViewModelTest {
|
||||
viewModel = SearchViewModel(recentSearchDao, zimReaderContainer, searchResultGenerator)
|
||||
}
|
||||
|
||||
@Nested
|
||||
inner class DebouncedTest {
|
||||
@Test
|
||||
fun `Search action is debounced`() = runTest {
|
||||
val searchTerm1 = "query1"
|
||||
val searchTerm2 = "query2"
|
||||
val searchTerm3 = "query3"
|
||||
val searchOrigin = FromWebView
|
||||
val suggestionSearch: SuggestionSearch = mockk()
|
||||
|
||||
viewModel.state
|
||||
.test(this)
|
||||
.also {
|
||||
searchResult(searchTerm1, suggestionSearch, testScheduler)
|
||||
delay(100)
|
||||
searchResult(searchTerm2, suggestionSearch, testScheduler)
|
||||
delay(100)
|
||||
searchResult(searchTerm3, suggestionSearch, testScheduler)
|
||||
it.assertValue(
|
||||
SearchState(
|
||||
searchTerm3,
|
||||
SearchResultsWithTerm(searchTerm3, suggestionSearch),
|
||||
emptyList(),
|
||||
searchOrigin
|
||||
)
|
||||
)
|
||||
}
|
||||
.finish()
|
||||
}
|
||||
|
||||
private fun searchResult(
|
||||
searchTerm: String,
|
||||
suggestionSearch: SuggestionSearch,
|
||||
testScheduler: TestCoroutineScheduler
|
||||
) {
|
||||
coEvery {
|
||||
searchResultGenerator.generateSearchResults(searchTerm, zimFileReader)
|
||||
} returns suggestionSearch
|
||||
viewModel.searchResults(searchTerm)
|
||||
recentsFromDb.trySend(emptyList()).isSuccess
|
||||
viewModel.actions.trySend(ScreenWasStartedFrom(FromWebView)).isSuccess
|
||||
testScheduler.apply {
|
||||
advanceTimeBy(400)
|
||||
runCurrent()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
inner class StateTests {
|
||||
@Test
|
||||
@ -301,7 +252,7 @@ internal class SearchViewModelTest {
|
||||
coEvery {
|
||||
searchResultGenerator.generateSearchResults(searchTerm, zimFileReader)
|
||||
} returns suggestionSearch
|
||||
viewModel.searchResults(searchTerm)
|
||||
viewModel.actions.trySend(Filter(searchTerm)).isSuccess
|
||||
recentsFromDb.trySend(databaseResults).isSuccess
|
||||
viewModel.actions.trySend(ScreenWasStartedFrom(searchOrigin)).isSuccess
|
||||
testScheduler.apply {
|
||||
|
Loading…
x
Reference in New Issue
Block a user