Add some more tests for SearchActivity (#4780)

This commit is contained in:
Madhur Gupta 2022-02-01 14:56:13 +05:30 committed by GitHub
parent d77ae8e582
commit 9e38c33650
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 249 additions and 33 deletions

View file

@ -117,38 +117,39 @@ public class SearchActivity extends BaseActivity
.takeUntil(RxView.detaches(searchView))
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(query -> {
//update image list
if (!TextUtils.isEmpty(query)) {
saveRecentSearch(query.toString());
viewPager.setVisibility(View.VISIBLE);
tabLayout.setVisibility(View.VISIBLE);
searchHistoryContainer.setVisibility(View.GONE);
if (FragmentUtils.isFragmentUIActive(searchDepictionsFragment)) {
searchDepictionsFragment.onQueryUpdated(query.toString());
}
if (FragmentUtils.isFragmentUIActive(searchMediaFragment)) {
searchMediaFragment.onQueryUpdated(query.toString());
}
if (FragmentUtils.isFragmentUIActive(searchCategoryFragment)) {
searchCategoryFragment.onQueryUpdated(query.toString());
}
} else {
//Open RecentSearchesFragment
recentSearchesFragment.updateRecentSearches();
viewPager.setVisibility(View.GONE);
tabLayout.setVisibility(View.GONE);
setSearchHistoryFragment();
searchHistoryContainer.setVisibility(View.VISIBLE);
}
}, Timber::e
.subscribe(this::handleSearch, Timber::e
));
}
private void handleSearch(final CharSequence query) {
if (!TextUtils.isEmpty(query)) {
saveRecentSearch(query.toString());
viewPager.setVisibility(View.VISIBLE);
tabLayout.setVisibility(View.VISIBLE);
searchHistoryContainer.setVisibility(View.GONE);
if (FragmentUtils.isFragmentUIActive(searchDepictionsFragment)) {
searchDepictionsFragment.onQueryUpdated(query.toString());
}
if (FragmentUtils.isFragmentUIActive(searchMediaFragment)) {
searchMediaFragment.onQueryUpdated(query.toString());
}
if (FragmentUtils.isFragmentUIActive(searchCategoryFragment)) {
searchCategoryFragment.onQueryUpdated(query.toString());
}
} else {
//Open RecentSearchesFragment
recentSearchesFragment.updateRecentSearches();
viewPager.setVisibility(View.GONE);
tabLayout.setVisibility(View.GONE);
setSearchHistoryFragment();
searchHistoryContainer.setVisibility(View.VISIBLE);
}
}
private void saveRecentSearch(@NonNull final String query) {
final RecentSearch recentSearch = recentSearchesDao.find(query);
// Newly searched query...

View file

@ -1,19 +1,40 @@
package fr.free.nrw.commons.explore.search
import android.content.Context
import android.widget.SearchView
import androidx.fragment.app.FragmentController
import androidx.fragment.app.FragmentManager
import androidx.viewpager.widget.ViewPager
import com.nhaarman.mockitokotlin2.verify
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.ViewPagerAdapter
import fr.free.nrw.commons.explore.SearchActivity
import fr.free.nrw.commons.explore.categories.search.SearchCategoryFragment
import fr.free.nrw.commons.explore.depictions.search.SearchDepictionsFragment
import fr.free.nrw.commons.explore.media.SearchMediaFragment
import fr.free.nrw.commons.explore.recentsearches.RecentSearch
import fr.free.nrw.commons.explore.recentsearches.RecentSearchesDao
import fr.free.nrw.commons.explore.recentsearches.RecentSearchesFragment
import fr.free.nrw.commons.media.MediaDetailPagerFragment
import io.reactivex.disposables.CompositeDisposable
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import org.powermock.api.mockito.PowerMockito.mock
import org.powermock.reflect.Whitebox
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode
import java.lang.reflect.Method
@RunWith(RobolectricTestRunner::class)
@ -24,15 +45,49 @@ class SearchActivityUnitTests {
@Mock
private lateinit var activity: SearchActivity
@Mock
private lateinit var searchView: SearchView
@Mock
private lateinit var viewPager: ViewPager
@Mock
private lateinit var context: Context
@Mock
private lateinit var compositeDisposable: CompositeDisposable
@Mock
private lateinit var mediaDetails: MediaDetailPagerFragment
@Mock
private lateinit var viewPagerAdapter: ViewPagerAdapter
@Mock
private lateinit var recentSearchesDao: RecentSearchesDao
@Mock
private lateinit var searchMediaFragment: SearchMediaFragment
@Mock
private lateinit var recentSearchesFragment: RecentSearchesFragment
@Mock
private lateinit var supportFragmentManager: FragmentManager
@Mock
private lateinit var searchDepictionsFragment: SearchDepictionsFragment
@Mock
private lateinit var searchCategoryFragment: SearchCategoryFragment
@Mock
private lateinit var mFragments: FragmentController
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
activity = Robolectric.buildActivity(SearchActivity::class.java).create().get()
context = RuntimeEnvironment.application.applicationContext
}
@ -45,31 +100,191 @@ class SearchActivityUnitTests {
@Test
@Throws(Exception::class)
fun testSetTabs() {
Whitebox.setInternalState(activity, "viewPagerAdapter", viewPagerAdapter)
activity.setTabs()
verify(viewPagerAdapter).notifyDataSetChanged()
}
@Test
@Throws(Exception::class)
fun testUpdateText() {
activity.updateText("test")
val query = "test"
Whitebox.setInternalState(activity, "searchView", searchView)
Whitebox.setInternalState(activity, "viewPager", viewPager)
activity.updateText(query)
verify(searchView).setQuery(query, true)
verify(viewPager).requestFocus()
}
@Test
@Throws(Exception::class)
fun testOnBackPressed() {
Whitebox.setInternalState(activity, "mFragments", mFragments)
Whitebox.setInternalState(activity, "mediaDetails", mediaDetails)
`when`(mFragments.supportFragmentManager).thenReturn(supportFragmentManager)
`when`(supportFragmentManager.backStackEntryCount).thenReturn(0)
activity.onBackPressed()
verify(supportFragmentManager).backStackEntryCount
}
@Test
@Throws(Exception::class)
fun testViewPagerNotifyDataSetChanged() {
Whitebox.setInternalState(activity, "mediaDetails", mediaDetails)
activity.viewPagerNotifyDataSetChanged()
verify(mediaDetails).notifyDataSetChanged()
}
@Test
@Throws(Exception::class)
fun testGetContributionStateAt() {
activity.getContributionStateAt(0)
assertNull(activity.getContributionStateAt(0))
}
@Test
@Throws(Exception::class)
fun testOnDestroy() {
Whitebox.setInternalState(activity, "compositeDisposable", compositeDisposable)
val method: Method = SearchActivity::class.java.getDeclaredMethod("onDestroy")
method.isAccessible = true
method.invoke(activity)
verify(compositeDisposable).dispose()
}
@Test
@Throws(Exception::class)
fun testSaveRecentSearchCaseNull() {
val query = "test"
Whitebox.setInternalState(activity, "recentSearchesDao", recentSearchesDao)
val method: Method =
SearchActivity::class.java.getDeclaredMethod("saveRecentSearch", String::class.java)
method.isAccessible = true
method.invoke(activity, query)
verify(recentSearchesDao).find(query)
}
@Test
@Throws(Exception::class)
fun testSaveRecentSearchCaseNonNull() {
val query = "test"
Whitebox.setInternalState(activity, "recentSearchesDao", recentSearchesDao)
`when`(recentSearchesDao.find(query)).thenReturn(mock(RecentSearch::class.java))
val method: Method =
SearchActivity::class.java.getDeclaredMethod("saveRecentSearch", String::class.java)
method.isAccessible = true
method.invoke(activity, query)
verify(recentSearchesDao).find(query)
}
@Test
@Throws(Exception::class)
fun testGetMediaAtPosition() {
val pos = 0
val media = mock(Media::class.java)
Whitebox.setInternalState(activity, "searchMediaFragment", searchMediaFragment)
`when`(searchMediaFragment.getMediaAtPosition(pos)).thenReturn(media)
assertEquals(activity.getMediaAtPosition(pos), media)
}
@Test
@Throws(Exception::class)
fun testGetTotalMediaCount() {
val num = 1
Whitebox.setInternalState(activity, "searchMediaFragment", searchMediaFragment)
`when`(searchMediaFragment.totalMediaCount).thenReturn(num)
assertEquals(activity.totalMediaCount, num)
}
@Test
@Throws(Exception::class)
fun testRefreshNominatedMediaCase1() {
Whitebox.setInternalState(activity, "mFragments", mFragments)
Whitebox.setInternalState(activity, "mediaDetails", mediaDetails)
`when`(mFragments.supportFragmentManager).thenReturn(supportFragmentManager)
`when`(supportFragmentManager.backStackEntryCount).thenReturn(1)
`when`(mediaDetails.isVisible).thenReturn(true)
activity.refreshNominatedMedia(0)
verify(mediaDetails).backButtonClicked()
}
@Test
@Throws(Exception::class)
fun testRefreshNominatedMediaCase2() {
Whitebox.setInternalState(activity, "mFragments", mFragments)
Whitebox.setInternalState(activity, "mediaDetails", mediaDetails)
`when`(mFragments.supportFragmentManager).thenReturn(supportFragmentManager)
`when`(supportFragmentManager.backStackEntryCount).thenReturn(1)
`when`(mediaDetails.isVisible).thenReturn(true)
`when`(mediaDetails.backButtonClicked()).thenReturn(true)
activity.refreshNominatedMedia(0)
verify(mediaDetails).backButtonClicked()
}
@Test
@Throws(Exception::class)
fun testOnResume() {
Whitebox.setInternalState(activity, "mFragments", mFragments)
Whitebox.setInternalState(activity, "supportFragmentManager", supportFragmentManager)
Whitebox.setInternalState(activity, "mediaDetails", mediaDetails)
`when`(mFragments.supportFragmentManager).thenReturn(supportFragmentManager)
`when`(supportFragmentManager.backStackEntryCount).thenReturn(1)
`when`(mediaDetails.backButtonClicked()).thenReturn(true)
`when`(mediaDetails.isVisible).thenReturn(true)
val method: Method = SearchActivity::class.java.getDeclaredMethod("onResume")
method.isAccessible = true
method.invoke(activity)
verify(mediaDetails).backButtonClicked()
}
@Test
@Throws(Exception::class)
fun testHandleSearchCaseEmpty() {
Whitebox.setInternalState(activity, "recentSearchesFragment", recentSearchesFragment)
val query = ""
val method: Method = SearchActivity::class.java.getDeclaredMethod(
"handleSearch",
CharSequence::class.java
)
method.isAccessible = true
method.invoke(activity, query)
verify(recentSearchesFragment).updateRecentSearches()
}
@Test
@Throws(Exception::class)
fun testHandleSearchCaseNotEmpty() {
val query = "test"
Whitebox.setInternalState(activity, "recentSearchesDao", recentSearchesDao)
Whitebox.setInternalState(activity, "searchDepictionsFragment", searchDepictionsFragment)
Whitebox.setInternalState(activity, "searchMediaFragment", searchMediaFragment)
Whitebox.setInternalState(activity, "searchCategoryFragment", searchCategoryFragment)
`when`(searchDepictionsFragment.activity).thenReturn(activity)
`when`(searchMediaFragment.activity).thenReturn(activity)
`when`(searchCategoryFragment.activity).thenReturn(activity)
`when`(searchDepictionsFragment.isAdded).thenReturn(true)
`when`(searchMediaFragment.isAdded).thenReturn(true)
`when`(searchCategoryFragment.isAdded).thenReturn(true)
`when`(searchDepictionsFragment.isDetached).thenReturn(false)
`when`(searchMediaFragment.isDetached).thenReturn(false)
`when`(searchCategoryFragment.isDetached).thenReturn(false)
`when`(searchDepictionsFragment.isRemoving).thenReturn(false)
`when`(searchMediaFragment.isRemoving).thenReturn(false)
`when`(searchCategoryFragment.isRemoving).thenReturn(false)
val method: Method = SearchActivity::class.java.getDeclaredMethod(
"handleSearch",
CharSequence::class.java
)
method.isAccessible = true
method.invoke(activity, query)
verify(recentSearchesDao).find(query)
verify(searchDepictionsFragment).onQueryUpdated(query)
verify(searchMediaFragment).onQueryUpdated(query)
verify(searchCategoryFragment).onQueryUpdated(query)
}
}