diff --git a/app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.kt b/app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.kt index 022563cd7..931520e5b 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.kt @@ -51,26 +51,42 @@ class DepictsClient @Inject constructor(private val depictsInterface: DepictsInt flatMap(::getEntities) .map { entities -> entities.entities().values.map { entity -> - if (entity.descriptions().byLanguageOrFirstOrEmpty() == "") { - val entities: Entities = getEntities(entity[WikidataProperties.INSTANCE_OF] - .toIds()[0]).blockingGet() - val nameAsDescription = entities.entities().values.first().labels() - .byLanguageOrFirstOrEmpty() - DepictedItem( - entity, - entity.labels().byLanguageOrFirstOrEmpty(), - nameAsDescription - ) - } else { - DepictedItem( - entity, - entity.labels().byLanguageOrFirstOrEmpty(), - entity.descriptions().byLanguageOrFirstOrEmpty() - ) - } + mapToDepictItem(entity) } } + /** + * Convert different entities into DepictedItem + */ + private fun mapToDepictItem(entity: Entities.Entity): DepictedItem { + return if (entity.descriptions().byLanguageOrFirstOrEmpty() == "") { + val instanceOfIDs = entity[WikidataProperties.INSTANCE_OF] + .toIds() + if (instanceOfIDs.isNotEmpty()) { + val entities: Entities = getEntities(instanceOfIDs[0]).blockingGet() + val nameAsDescription = entities.entities().values.first().labels() + .byLanguageOrFirstOrEmpty() + DepictedItem( + entity, + entity.labels().byLanguageOrFirstOrEmpty(), + nameAsDescription + ) + } else { + DepictedItem( + entity, + entity.labels().byLanguageOrFirstOrEmpty(), + "" + ) + } + } else { + DepictedItem( + entity, + entity.labels().byLanguageOrFirstOrEmpty(), + entity.descriptions().byLanguageOrFirstOrEmpty() + ) + } + } + /** * Tries to get Entities.Label by default language from the map. * If that returns null, Tries to retrieve first element from the map. diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/DepictsClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/DepictsClientTest.kt index 505d7e85d..4021bf1d9 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/DepictsClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/DepictsClientTest.kt @@ -3,6 +3,7 @@ package fr.free.nrw.commons.explore.depictions import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever import depictSearchItem +import entity import fr.free.nrw.commons.mwapi.Binding import fr.free.nrw.commons.mwapi.Result import fr.free.nrw.commons.mwapi.SparqlResponse @@ -15,6 +16,7 @@ import org.junit.Test import org.mockito.Mock import org.mockito.MockitoAnnotations import org.wikipedia.wikidata.* +import java.lang.reflect.Method class DepictsClientTest { @@ -108,4 +110,49 @@ class DepictsClientTest { emptyList(), false, "Q10") )) } + + @Test + fun `Test mapToDepictItem when description is not empty`() { + val method: Method = DepictsClient::class.java.getDeclaredMethod( + "mapToDepictItem", + Entities.Entity::class.java + ) + method.isAccessible = true + method.invoke(depictsClient, entity(descriptions = mapOf("en" to "Test"))) + } + + @Test + fun `Test mapToDepictItem when description is empty and P31 doesn't exists`() { + val method: Method = DepictsClient::class.java.getDeclaredMethod( + "mapToDepictItem", + Entities.Entity::class.java + ) + method.isAccessible = true + method.invoke(depictsClient, entity()) + } + + @Test + fun `Test mapToDepictItem when description is empty and P31 exists`() { + val entities = mock() + val entity = mock() + val statementPartial = mock() + whenever(entity.statements).thenReturn(mapOf("P31" to listOf(statementPartial))) + whenever(statementPartial.mainSnak).thenReturn( + Snak_partial("test", "P31", + DataValue.EntityId( + WikiBaseEntityValue("wikibase-entityid", "Q10", 10L) + ) + ) + ) + whenever(depictsInterface.getEntities("Q10")).thenReturn(Single.just(entities)) + whenever(entities.entities()) + .thenReturn(mapOf("test" to entity)) + whenever(entity.id()).thenReturn("Q10") + val method: Method = DepictsClient::class.java.getDeclaredMethod( + "mapToDepictItem", + Entities.Entity::class.java + ) + method.isAccessible = true + method.invoke(depictsClient, entity) + } }