Skip to content

Commit

Permalink
DROID-1984 Protocol | Fix | Type source object as list (#581)
Browse files Browse the repository at this point in the history
  • Loading branch information
konstantiniiv authored Nov 21, 2023
1 parent 918ff2e commit 9ba0385
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -265,6 +265,13 @@ sealed class ObjectWrapper {
null
}

inline fun <reified T> getSingleValue(relation: Key): T? =
when (val value = map.getOrDefault(relation, null)) {
is T -> value
is List<*> -> value.typeOf<T>().firstOrNull()
else -> null
}

inline fun <reified T> getValues(relation: Key): List<T> {
return when (val value = map.getOrDefault(relation, emptyList<T>())) {
is T -> listOf(value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<String>()
)
)

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<ObjectWrapper.Type>) {
usecase.stub {
onBlocking {
Expand Down

0 comments on commit 9ba0385

Please sign in to comment.