Empty search text is added in recent searches problem fix. (#1223)

* Add if state to prevent blank query.

* Create test emptySearchText_NotAddToRecentSearches
- For empty query not add in recent query list.

* Apply early return.

* assertEquals to assertNull.

Co-authored-by: Simon Marquis <contact@simon-marquis.fr>

* Import org.junit.Assert.assertNull

* Change org.junit.Assert.assertNull to kotlin.test.assertNull.

Change-Id: I60083b0b9a1dcaed84d957b49c91e5163d5659d6

* Add 'or' to prevent search when query is blank.

Change-Id: If498de05889d6d5946b1bbb1d1c10cb311bb9b52

* Create stateIsEmptyQuery_withThreeWhiteSpacesSearchQuery test.

Change-Id: I6d6e8f9fe988ca83fae484e4f2338ad6fe58b676

* Add UI logic to prevent blank text search in SearchScreen.
- Early return to do not call onSearchExplicitlyTriggered()

Change-Id: I28db284eac9059fb6f48dd718721a1fc5fdb8f7a

* Apply trim at query to remove whitespace.

Change-Id: Id349af4bb1af3d0f1c3973e6fb9e6f3e7b924d9b

* Create test stateIsEmptyQuery_withThreeWhiteSpacesAndOneLetterSearchQuery

Change-Id: Iee59f6085e4045b2e3c532f78804926290b6c6c5

* Update feature/search/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt

Change name to emptySearchText_isNotAddedTorecentSearches()

Co-authored-by: Don Turner <dturner@users.noreply.github.com>

* Change name to searchTextWithThreeSpaces_isEmptyQuery()

Co-authored-by: Don Turner <dturner@users.noreply.github.com>

* Change name to searchTextWithThreeWhiteSpacesAndOneCharacter_isEmptyQuery()

Change-Id: I4c82b12e2c9bd4ff480e94061caf257a603e38da

* Revert "Change name to searchTextWithThreeWhiteSpacesAndOneCharacter_isEmptyQuery()"

This reverts commit e4c176598a.

* Change name to searchTextWithThreeSpacesAndOneLetter_isEmptyQuery

Co-authored-by: Don Turner <dturner@users.noreply.github.com>

* Add end curly bracket.

Change-Id: I7bd113e7b65d646f5321e34a7df2868f6e239cad

---------

Co-authored-by: Simon Marquis <contact@simon-marquis.fr>
Co-authored-by: Don Turner <dturner@users.noreply.github.com>
pull/1721/head
Jaehwa Noh 2 weeks ago committed by GitHub
parent 274c38c154
commit dfc3355054
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -522,6 +522,7 @@ private fun SearchTextField(
.focusRequester(focusRequester) .focusRequester(focusRequester)
.onKeyEvent { .onKeyEvent {
if (it.key == Key.Enter) { if (it.key == Key.Enter) {
if (searchQuery.isBlank()) return@onKeyEvent false
onSearchExplicitlyTriggered() onSearchExplicitlyTriggered()
true true
} else { } else {
@ -536,6 +537,7 @@ private fun SearchTextField(
), ),
keyboardActions = KeyboardActions( keyboardActions = KeyboardActions(
onSearch = { onSearch = {
if (searchQuery.isBlank()) return@KeyboardActions
onSearchExplicitlyTriggered() onSearchExplicitlyTriggered()
}, },
), ),

@ -59,7 +59,7 @@ class SearchViewModel @Inject constructor(
flowOf(SearchResultUiState.SearchNotReady) flowOf(SearchResultUiState.SearchNotReady)
} else { } else {
searchQuery.flatMapLatest { query -> searchQuery.flatMapLatest { query ->
if (query.length < SEARCH_QUERY_MIN_LENGTH) { if (query.trim().length < SEARCH_QUERY_MIN_LENGTH) {
flowOf(SearchResultUiState.EmptyQuery) flowOf(SearchResultUiState.EmptyQuery)
} else { } else {
getSearchContentsUseCase(query) getSearchContentsUseCase(query)
@ -102,6 +102,7 @@ class SearchViewModel @Inject constructor(
* search query in the search text field, defining this method. * search query in the search text field, defining this method.
*/ */
fun onSearchTriggered(query: String) { fun onSearchTriggered(query: String) {
if (query.isBlank()) return
viewModelScope.launch { viewModelScope.launch {
recentSearchRepository.insertOrReplaceRecentSearch(searchQuery = query) recentSearchRepository.insertOrReplaceRecentSearch(searchQuery = query)
} }

@ -41,6 +41,7 @@ import org.junit.Rule
import org.junit.Test import org.junit.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertIs import kotlin.test.assertIs
import kotlin.test.assertNull
/** /**
* To learn more about how this test handles Flows created with stateIn, see * To learn more about how this test handles Flows created with stateIn, see
@ -122,6 +123,43 @@ class SearchViewModelTest {
assertEquals(SearchNotReady, viewModel.searchResultUiState.value) assertEquals(SearchNotReady, viewModel.searchResultUiState.value)
} }
@Test
fun emptySearchText_isNotAddedToRecentSearches() = runTest {
viewModel.onSearchTriggered("")
val recentSearchQueriesStream = getRecentQueryUseCase()
val recentSearchQueries = recentSearchQueriesStream.first()
val recentSearchQuery = recentSearchQueries.firstOrNull()
assertNull(recentSearchQuery)
}
@Test
fun searchTextWithThreeSpaces_isEmptyQuery() = runTest {
searchContentsRepository.addNewsResources(newsResourcesTestData)
searchContentsRepository.addTopics(topicsTestData)
val collectJob = launch(UnconfinedTestDispatcher()) { viewModel.searchResultUiState.collect() }
viewModel.onSearchQueryChanged(" ")
assertIs<EmptyQuery>(viewModel.searchResultUiState.value)
collectJob.cancel()
}
@Test
fun searchTextWithThreeSpacesAndOneLetter_isEmptyQuery() = runTest {
searchContentsRepository.addNewsResources(newsResourcesTestData)
searchContentsRepository.addTopics(topicsTestData)
val collectJob = launch(UnconfinedTestDispatcher()) { viewModel.searchResultUiState.collect() }
viewModel.onSearchQueryChanged(" a")
assertIs<EmptyQuery>(viewModel.searchResultUiState.value)
collectJob.cancel()
}
@Test @Test
fun whenToggleNewsResourceSavedIsCalled_bookmarkStateIsUpdated() = runTest { fun whenToggleNewsResourceSavedIsCalled_bookmarkStateIsUpdated() = runTest {
val newsResourceId = "123" val newsResourceId = "123"

Loading…
Cancel
Save