diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectWrapper.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectWrapper.kt index 69181c5eaa..726257e929 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectWrapper.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectWrapper.kt @@ -162,7 +162,7 @@ sealed class ObjectWrapper { val id: Id by default val uniqueKey: String? by default val name: String? by default - val sourceObject: Id? by default + val sourceObject: Id? get() = getSingleValue(Relations.SOURCE_OBJECT) val description: String? by default val isArchived: Boolean? by default val iconEmoji: String? by default @@ -265,6 +265,13 @@ sealed class ObjectWrapper { null } + inline fun getSingleValue(relation: Key): T? = + when (val value = map.getOrDefault(relation, null)) { + is T -> value + is List<*> -> value.typeOf().firstOrNull() + else -> null + } + inline fun getValues(relation: Key): List { return when (val value = map.getOrDefault(relation, emptyList())) { is T -> listOf(value) diff --git a/domain/src/test/java/com/anytypeio/anytype/domain/misc/GetObjectTypeTest.kt b/domain/src/test/java/com/anytypeio/anytype/domain/misc/GetObjectTypeTest.kt index 8a95e5d365..2c134d7c47 100644 --- a/domain/src/test/java/com/anytypeio/anytype/domain/misc/GetObjectTypeTest.kt +++ b/domain/src/test/java/com/anytypeio/anytype/domain/misc/GetObjectTypeTest.kt @@ -9,6 +9,7 @@ import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.util.dispatchers import com.anytypeio.anytype.test_utils.MockDataFactory import kotlin.test.assertEquals +import kotlin.test.assertNull import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.runBlocking import org.junit.Assert @@ -89,6 +90,139 @@ class GetObjectTypeTest { } } + @Test + fun `should return source object when Struct returns String`() { + + val sourceObject = MockDataFactory.randomUuid() + val type1 = ObjectWrapper.Type( + mapOf( + Relations.ID to MockDataFactory.randomUuid(), + Relations.UNIQUE_KEY to MockDataFactory.randomUuid(), + Relations.SOURCE_OBJECT to sourceObject + ) + ) + + runBlocking { + stubGetObjectTypes(types = listOf(type1)) + + val firstTimeResult = usecase.execute(params = defaultParams) + firstTimeResult.fold( + onFailure = { Assert.fail() }, + onSuccess = { results -> + assertEquals( + expected = sourceObject, + actual = results.first().sourceObject + ) + } + ) + } + } + + @Test + fun `type should has source object when Struct returns list of one element`() { + + val sourceObject = MockDataFactory.randomUuid() + val type1 = ObjectWrapper.Type( + mapOf( + Relations.ID to MockDataFactory.randomUuid(), + Relations.UNIQUE_KEY to MockDataFactory.randomUuid(), + Relations.SOURCE_OBJECT to listOf(sourceObject) + ) + ) + + runBlocking { + stubGetObjectTypes(types = listOf(type1)) + + val firstTimeResult = usecase.execute(params = defaultParams) + firstTimeResult.fold( + onFailure = { Assert.fail() }, + onSuccess = { results -> + assertEquals( + expected = sourceObject, + actual = results.first().sourceObject + ) + } + ) + } + } + + @Test + fun `type should has source object when Struct returns list of several elements`() { + + val sourceObject = MockDataFactory.randomUuid() + val sourceObject2 = MockDataFactory.randomUuid() + val sourceObject3 = MockDataFactory.randomUuid() + val type1 = ObjectWrapper.Type( + mapOf( + Relations.ID to MockDataFactory.randomUuid(), + Relations.UNIQUE_KEY to MockDataFactory.randomUuid(), + Relations.SOURCE_OBJECT to listOf(sourceObject, sourceObject2, sourceObject3) + ) + ) + + runBlocking { + stubGetObjectTypes(types = listOf(type1)) + + val firstTimeResult = usecase.execute(params = defaultParams) + firstTimeResult.fold( + onFailure = { Assert.fail() }, + onSuccess = { results -> + assertEquals( + expected = sourceObject, + actual = results.first().sourceObject + ) + } + ) + } + } + + @Test + fun `type should has no source object when Struct returns empty list of`() { + + val type1 = ObjectWrapper.Type( + mapOf( + Relations.ID to MockDataFactory.randomUuid(), + Relations.UNIQUE_KEY to MockDataFactory.randomUuid(), + Relations.SOURCE_OBJECT to emptyList() + ) + ) + + runBlocking { + stubGetObjectTypes(types = listOf(type1)) + + val firstTimeResult = usecase.execute(params = defaultParams) + firstTimeResult.fold( + onFailure = { Assert.fail() }, + onSuccess = { results -> + assertNull(results.first().sourceObject) + } + ) + } + } + + @Test + fun `type should has no source object when Struct returns null`() { + + val type1 = ObjectWrapper.Type( + mapOf( + Relations.ID to MockDataFactory.randomUuid(), + Relations.UNIQUE_KEY to MockDataFactory.randomUuid() + ) + ) + + runBlocking { + stubGetObjectTypes(types = listOf(type1)) + + val firstTimeResult = usecase.execute(params = defaultParams) + firstTimeResult.fold( + onFailure = { Assert.fail() }, + onSuccess = { results -> + assertNull(results.first().sourceObject) + } + ) + } + } + private fun stubGetObjectTypes(types: List) { usecase.stub { onBlocking {