mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 12:23:58 +01:00
Add some more tests for SearchActivity (#4780)
This commit is contained in:
parent
d77ae8e582
commit
9e38c33650
2 changed files with 249 additions and 33 deletions
|
|
@ -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...
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue