#3077 Hide disambiguation items from depiction search - when fetching depictions get the entity instead of the search result (#3741)

This commit is contained in:
Seán Mac Gillicuddy 2020-05-12 11:44:17 +01:00 committed by GitHub
parent 34f02499e4
commit 057d11a0e0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
31 changed files with 359 additions and 582 deletions

View file

@ -52,15 +52,6 @@ class SubDepictionListPresenterTest {
subDepictionListPresenter?.onAttachView(view)
}
@Test
fun fetchThumbnailForEntityId() {
val singleString: Single<String> = Single.just(String())
Mockito.`when`(depictsClient?.getP18ForItem(ArgumentMatchers.anyString())).thenReturn(singleString)
subDepictionListPresenter?.fetchThumbnailForEntityId("Q9394", 0)
testScheduler?.triggerActions()
view?.onImageUrlFetched("url", 0)
}
@Test
fun initSubDepictionListForParentClass() {
Mockito.`when`(okHttpJsonApiClient?.getParentQIDs(ArgumentMatchers.anyString())).thenReturn(testObservable)

View file

@ -1,68 +1,60 @@
package fr.free.nrw.commons.explore.depictions
import org.mockito.Mockito.verify
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.explore.recentsearches.RecentSearchesDao
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.upload.depictedItem
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
import io.reactivex.Observable
import io.reactivex.Single
import io.reactivex.schedulers.TestScheduler
import org.junit.Before
import org.junit.Test
import org.mockito.ArgumentMatchers
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
class SearchDepictionsPresenterTest {
@Mock
internal var view: SearchDepictionsFragmentContract.View? = null
internal lateinit var view: SearchDepictionsFragmentContract.View
var searchDepictionsFragmentPresenter: SearchDepictionsFragmentPresenter? = null
private lateinit var searchDepictionsFragmentPresenter: SearchDepictionsFragmentPresenter
var testScheduler: TestScheduler? = null
var jsonKvStore: JsonKvStore? = null
//var mediaWikiApi: MediaWikiApi? = null
private lateinit var testScheduler: TestScheduler
@Mock
var recentSearchesDao: RecentSearchesDao? = null
private lateinit var jsonKvStore: JsonKvStore
@Mock
var depictsClient: DepictsClient? = null
lateinit var recentSearchesDao: RecentSearchesDao
var testObservable: Observable<DepictedItem>? = null
var mediaList: ArrayList<DepictedItem> = ArrayList()
@Mock
lateinit var depictsClient: DepictsClient
@Before
@Throws(Exception::class)
fun setUp() {
MockitoAnnotations.initMocks(this)
testScheduler = TestScheduler()
val depictedItem: DepictedItem = DepictedItem("label", "description", "url", false, "Q9394")
mediaList.add(depictedItem)
testObservable = Observable.just(depictedItem)
searchDepictionsFragmentPresenter = SearchDepictionsFragmentPresenter(jsonKvStore, recentSearchesDao, depictsClient, testScheduler, testScheduler)
searchDepictionsFragmentPresenter?.onAttachView(view)
val depictedItem: DepictedItem = depictedItem(instanceOfs = listOf())
searchDepictionsFragmentPresenter = SearchDepictionsFragmentPresenter(
jsonKvStore,
recentSearchesDao,
depictsClient,
testScheduler,
testScheduler
)
searchDepictionsFragmentPresenter.onAttachView(view)
}
@Test
fun updateDepictionList() {
Mockito.`when`(depictsClient?.searchForDepictions(ArgumentMatchers.anyString(), ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt())).thenReturn(testObservable)
searchDepictionsFragmentPresenter?.updateDepictionList("rabbit", 25, false)
testScheduler?.triggerActions()
verify(view)?.onSuccess(mediaList)
val expectedList = listOf(depictedItem())
whenever(depictsClient.searchForDepictions("rabbit", 25, 0))
.thenReturn(Single.just(expectedList))
searchDepictionsFragmentPresenter.updateDepictionList("rabbit", 25, false)
testScheduler.triggerActions()
verify(view)?.onSuccess(expectedList)
}
@Test
fun fetchThumbnailForEntityId() {
val singleString: Single<String> = Single.just(String())
Mockito.`when`(depictsClient?.getP18ForItem(ArgumentMatchers.anyString())).thenReturn(singleString)
searchDepictionsFragmentPresenter?.fetchThumbnailForEntityId("Q9394", 0)
testScheduler?.triggerActions()
verify(view)?.onImageUrlFetched("", 0)
}
}
}

View file

@ -2,18 +2,15 @@ package fr.free.nrw.commons.upload
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.jraska.livedata.test
import com.nhaarman.mockitokotlin2.never
import com.nhaarman.mockitokotlin2.times
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.explore.depictions.DepictsClient
import fr.free.nrw.commons.explore.depictions.DepictsClient.NO_DEPICTED_IMAGE
import fr.free.nrw.commons.repository.UploadRepository
import fr.free.nrw.commons.upload.depicts.DepictsContract
import fr.free.nrw.commons.upload.depicts.DepictsPresenter
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
import fr.free.nrw.commons.wikidata.WikidataDisambiguationItems
import io.reactivex.Flowable
import io.reactivex.Single
import io.reactivex.schedulers.TestScheduler
import org.junit.Before
import org.junit.Rule
@ -48,7 +45,7 @@ class DepictsPresenterTest {
fun setUp() {
MockitoAnnotations.initMocks(this)
testScheduler = TestScheduler()
depictsPresenter = DepictsPresenter(repository, testScheduler, testScheduler, depictsClient)
depictsPresenter = DepictsPresenter(repository, testScheduler, testScheduler)
depictsPresenter.onAttachView(view)
}
@ -60,8 +57,15 @@ class DepictsPresenterTest {
}
@Test
fun `search results emission returns distinct results + selected items`() {
val searchResults = listOf(depictedItem(), depictedItem())
fun `search results emission returns distinct results + selected items without disambiguations`() {
val searchResults = listOf(
depictedItem(id="nonUnique"),
depictedItem(id="nonUnique"),
depictedItem(
id = "unique",
instanceOfs = listOf(WikidataDisambiguationItems.CATEGORY.id)
)
)
whenever(repository.searchAllEntities("")).thenReturn(Flowable.just(searchResults))
val selectedItem = depictedItem(id = "selected")
whenever(repository.selectedDepictions).thenReturn(listOf(selectedItem))
@ -71,22 +75,7 @@ class DepictsPresenterTest {
verify(view).showError(false)
depictsPresenter.depictedItems
.test()
.assertValue(listOf(selectedItem, depictedItem()))
}
@Test
fun `searchResults retrieve imageUrls from cache`() {
val depictedItem = depictedItem()
whenever(depictsClient.getP18ForItem(depictedItem.id)).thenReturn(Single.just("url"))
depictsPresenter.fetchThumbnailForEntityId(depictedItem)
testScheduler.triggerActions()
val searchResults = listOf(depictedItem(), depictedItem())
whenever(repository.searchAllEntities("")).thenReturn(Flowable.just(searchResults))
depictsPresenter.searchForDepictions("")
testScheduler.triggerActions()
depictsPresenter.depictedItems
.test()
.assertValue(listOf(depictedItem(imageUrl = "url")))
.assertValue(listOf(selectedItem, depictedItem(id="nonUnique")))
}
@Test
@ -149,42 +138,14 @@ class DepictsPresenterTest {
verify(view).noDepictionSelected()
}
@Test
fun `image urls fetched from network update the view`() {
val depictedItem = depictedItem()
whenever(depictsClient.getP18ForItem(depictedItem.id)).thenReturn(Single.just("url"))
depictsPresenter.fetchThumbnailForEntityId(depictedItem)
testScheduler.triggerActions()
verify(view).onUrlFetched(depictedItem, "url")
}
@Test
fun `image urls fetched from network filter NO_DEPICTED_IMAGE`() {
val depictedItem = depictedItem()
whenever(depictsClient.getP18ForItem(depictedItem.id))
.thenReturn(Single.just(NO_DEPICTED_IMAGE))
depictsPresenter.fetchThumbnailForEntityId(depictedItem)
testScheduler.triggerActions()
verify(view, never()).onUrlFetched(depictedItem, NO_DEPICTED_IMAGE)
}
@Test
fun `successive image urls fetched from cache`() {
val depictedItem = depictedItem()
whenever(depictsClient.getP18ForItem(depictedItem.id)).thenReturn(Single.just("url"))
depictsPresenter.fetchThumbnailForEntityId(depictedItem)
testScheduler.triggerActions()
verify(view).onUrlFetched(depictedItem, "url")
depictsPresenter.fetchThumbnailForEntityId(depictedItem)
testScheduler.triggerActions()
verify(view, times(2)).onUrlFetched(depictedItem, "url")
}
}
fun depictedItem(
name: String = "label",
description: String = "desc",
imageUrl: String = "",
instanceOfs: List<String> = listOf(),
isSelected: Boolean = false,
id: String = "entityId"
) = DepictedItem(name, description, imageUrl, isSelected, id)
) = DepictedItem(name, description, imageUrl, instanceOfs, isSelected, id)