anytype-kotlin-wild/presentation/src/test/java/com/anytypeio/anytype/presentation/templates/SetByTypeViewerTypeAndTemplateTest.kt

618 lines
22 KiB
Kotlin

package com.anytypeio.anytype.presentation.templates
import com.anytypeio.anytype.core_models.Block
import com.anytypeio.anytype.core_models.ObjectType
import com.anytypeio.anytype.core_models.ObjectTypeIds
import com.anytypeio.anytype.core_models.Relations
import com.anytypeio.anytype.core_models.StubDataView
import com.anytypeio.anytype.core_models.StubDataViewView
import com.anytypeio.anytype.core_models.StubDataViewViewRelation
import com.anytypeio.anytype.core_models.StubObject
import com.anytypeio.anytype.core_models.StubRelationLink
import com.anytypeio.anytype.core_models.StubRelationObject
import com.anytypeio.anytype.core_models.primitives.TypeKey
import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewObject
import com.anytypeio.anytype.presentation.sets.DataViewViewState
import com.anytypeio.anytype.presentation.sets.ObjectSetViewModel
import com.anytypeio.anytype.presentation.sets.main.ObjectSetViewModelTestSetup
import com.anytypeio.anytype.presentation.sets.subscription.DefaultDataViewSubscription
import com.anytypeio.anytype.presentation.templates.TemplateView.Companion.DEFAULT_TEMPLATE_ID_BLANK
import kotlin.test.assertTrue
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
import net.bytebuddy.utility.RandomString
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.times
import org.mockito.kotlin.verifyBlocking
@OptIn(ExperimentalCoroutinesApi::class)
class SetByTypeViewerTypeAndTemplateTest : ObjectSetViewModelTestSetup() {
private lateinit var viewModel: ObjectSetViewModel
private lateinit var closable: AutoCloseable
private val customType1Id = "customType1-${RandomString.make()}"
private val customType1Key = TypeKey("customTypeKey-${RandomString.make()}")
private val template1 = StubObject(
id = "template1-${RandomString.make()}",
objectType = ObjectTypeIds.TEMPLATE,
targetObjectType = customType1Id
)
private val template2 = StubObject(
id = "template2-${RandomString.make()}",
objectType = ObjectTypeIds.TEMPLATE,
targetObjectType = customType1Id
)
private val setObjDetails = mapOf(
Relations.ID to root,
Relations.LAYOUT to ObjectType.Layout.SET.code.toDouble(),
Relations.SET_OF to listOf(customType1Id)
)
@Before
fun setup() {
closable = MockitoAnnotations.openMocks(this)
viewModel = givenViewModel()
}
@After
fun after() {
rule.advanceTime()
closable.close()
}
/**
* Set by type,
* SetOf: Type1
* Type1 default template : empty
* View default type : empty
* View default template : empty
*/
@Test
fun `set by type, type default template is empty, views settings are empty`() = runTest {
val spaceId = RandomString.make()
val subscriptionId = DefaultDataViewSubscription.getSubscriptionId(root)
val relationObject1 = StubRelationObject()
val dvViewerRelation1 =
StubDataViewViewRelation(key = relationObject1.key, isVisible = true)
val relationLink1 = StubRelationLink(relationObject1.key)
val viewer = StubDataViewView(
viewerRelations = listOf(dvViewerRelation1),
defaultObjectType = null,
defaultTemplateId = null
)
val dv = StubDataView(views = listOf(viewer), relationLinks = listOf(relationLink1))
val dvKeys = listOf(relationObject1.key)
val customType1Map = mapOf(
Relations.ID to customType1Id,
Relations.UNIQUE_KEY to customType1Key.key,
Relations.LAYOUT to ObjectType.Layout.OBJECT_TYPE.code.toDouble(),
Relations.RECOMMENDED_LAYOUT to ObjectType.Layout.TODO.code.toDouble(),
Relations.NAME to "name-$customType1Id",
Relations.DEFAULT_TEMPLATE_ID to null
)
val details = Block.Details(
details = mapOf(
root to Block.Fields(map = setObjDetails),
customType1Id to Block.Fields(map = customType1Map)
)
)
stubSpaceManager(spaceId)
stubInterceptEvents()
stubInterceptThreadStatus()
stubOpenObject(
doc = listOf(dv),
details = details
)
stubTemplatesForTemplatesContainer(
type = customType1Id,
templates = listOf(template1, template2)
)
with(storeOfObjectTypes) {
set(customType1Id, customType1Map)
}
stubSubscriptionResults(
subscription = subscriptionId,
spaceId = spaceId,
storeOfRelations = storeOfRelations,
keys = dvKeys,
sources = listOf(customType1Id),
objects = listOf()
)
stubCreateDataViewObject()
//TESTING
viewModel.onStart(ctx = root)
advanceUntilIdle()
val uiState = viewModel.currentViewer.value as DataViewViewState.Set.NoItems
// ASSERT NEW + BUTTON
assertTrue(uiState.isCreateObjectAllowed)
viewModel.proceedWithDataViewObjectCreate()
advanceUntilIdle()
// ASSERT OBJECT CREATION ON NEW BUTTON CLICK
verifyBlocking(createDataViewObject, times(1)) {
val params = CreateDataViewObject.Params.SetByType(
filters = listOf(),
type = customType1Key,
template = null,
prefilled = emptyMap()
)
async(params)
}
}
/**
* Set by type,
* SetOf: Type1
* Type1 default template : Blank
* View default type : empty
* View default template : empty
*/
@Test
fun `set by type, type default template is blank, views settings are empty`() = runTest {
val spaceId = RandomString.make()
val subscriptionId = DefaultDataViewSubscription.getSubscriptionId(root)
val relationObject1 = StubRelationObject()
val dvViewerRelation1 =
StubDataViewViewRelation(key = relationObject1.key, isVisible = true)
val relationLink1 = StubRelationLink(relationObject1.key)
val viewer = StubDataViewView(
viewerRelations = listOf(dvViewerRelation1),
defaultObjectType = null,
defaultTemplateId = null
)
val dv = StubDataView(views = listOf(viewer), relationLinks = listOf(relationLink1))
val dvKeys = listOf(relationObject1.key)
val customType1Map = mapOf(
Relations.ID to customType1Id,
Relations.UNIQUE_KEY to customType1Key.key,
Relations.LAYOUT to ObjectType.Layout.OBJECT_TYPE.code.toDouble(),
Relations.RECOMMENDED_LAYOUT to ObjectType.Layout.TODO.code.toDouble(),
Relations.NAME to "name-$customType1Id",
Relations.DEFAULT_TEMPLATE_ID to DEFAULT_TEMPLATE_ID_BLANK
)
val details = Block.Details(
details = mapOf(
root to Block.Fields(map = setObjDetails),
customType1Id to Block.Fields(map = customType1Map)
)
)
stubSpaceManager(spaceId)
stubInterceptEvents()
stubInterceptThreadStatus()
stubOpenObject(
doc = listOf(dv),
details = details
)
stubTemplatesForTemplatesContainer(
type = customType1Id,
templates = listOf(template1, template2)
)
with(storeOfObjectTypes) {
set(customType1Id, customType1Map)
}
stubSubscriptionResults(
subscription = subscriptionId,
spaceId = spaceId,
storeOfRelations = storeOfRelations,
keys = dvKeys,
sources = listOf(customType1Id),
objects = listOf()
)
stubCreateDataViewObject()
//TESTING
viewModel.onStart(ctx = root)
advanceUntilIdle()
val uiState = viewModel.currentViewer.value as DataViewViewState.Set.NoItems
// ASSERT NEW + BUTTON
assertTrue(uiState.isCreateObjectAllowed)
viewModel.proceedWithDataViewObjectCreate()
advanceUntilIdle()
// ASSERT OBJECT CREATION ON NEW BUTTON CLICK
verifyBlocking(createDataViewObject, times(1)) {
val params = CreateDataViewObject.Params.SetByType(
filters = listOf(),
type = customType1Key,
template = DEFAULT_TEMPLATE_ID_BLANK,
prefilled = emptyMap()
)
async(params)
}
}
/**
* Set by type,
* SetOf: Type1
* Type1 default template : Template2
* View default type : empty
* View default template : empty
*/
@Test
fun `set by type, type default template is not blank, views settings are empty`() = runTest {
val spaceId = RandomString.make()
val subscriptionId = DefaultDataViewSubscription.getSubscriptionId(root)
val relationObject1 = StubRelationObject()
val dvViewerRelation1 =
StubDataViewViewRelation(key = relationObject1.key, isVisible = true)
val relationLink1 = StubRelationLink(relationObject1.key)
val viewer = StubDataViewView(
viewerRelations = listOf(dvViewerRelation1),
defaultObjectType = null,
defaultTemplateId = null
)
val dv = StubDataView(views = listOf(viewer), relationLinks = listOf(relationLink1))
val dvKeys = listOf(relationObject1.key)
val customType1Map = mapOf(
Relations.ID to customType1Id,
Relations.UNIQUE_KEY to customType1Key.key,
Relations.LAYOUT to ObjectType.Layout.OBJECT_TYPE.code.toDouble(),
Relations.RECOMMENDED_LAYOUT to ObjectType.Layout.TODO.code.toDouble(),
Relations.NAME to "name-$customType1Id",
Relations.DEFAULT_TEMPLATE_ID to template2.id
)
val details = Block.Details(
details = mapOf(
root to Block.Fields(map = setObjDetails),
customType1Id to Block.Fields(map = customType1Map)
)
)
stubSpaceManager(spaceId)
stubInterceptEvents()
stubInterceptThreadStatus()
stubOpenObject(
doc = listOf(dv),
details = details
)
stubTemplatesForTemplatesContainer(
type = customType1Id,
templates = listOf(template1, template2)
)
with(storeOfObjectTypes) {
set(customType1Id, customType1Map)
}
stubSubscriptionResults(
subscription = subscriptionId,
spaceId = spaceId,
storeOfRelations = storeOfRelations,
keys = dvKeys,
sources = listOf(customType1Id),
objects = listOf()
)
stubCreateDataViewObject()
//TESTING
viewModel.onStart(ctx = root)
advanceUntilIdle()
val uiState = viewModel.currentViewer.value as DataViewViewState.Set.NoItems
// ASSERT NEW + BUTTON
assertTrue(uiState.isCreateObjectAllowed)
viewModel.proceedWithDataViewObjectCreate()
advanceUntilIdle()
// ASSERT OBJECT CREATION ON NEW BUTTON CLICK
verifyBlocking(createDataViewObject, times(1)) {
val params = CreateDataViewObject.Params.SetByType(
filters = listOf(),
type = customType1Key,
template = template2.id,
prefilled = emptyMap()
)
async(params)
}
}
/**
* Set by type,
* SetO f: Type1
* Type1 default template : Template2
* View default type : Type2
* View default template : Template1
* In that case we should ignore VIEW default type but use VIEW default template
* But this case should not happen in real life, because it's not possible to set to VIEW a different type other then setOf
*/
@Test
fun `set by type, type default template is not blank, views settings has different type and template`() =
runTest {
val spaceId = RandomString.make()
val subscriptionId = DefaultDataViewSubscription.getSubscriptionId(root)
val relationObject1 = StubRelationObject()
val dvViewerRelation1 =
StubDataViewViewRelation(key = relationObject1.key, isVisible = true)
val relationLink1 = StubRelationLink(relationObject1.key)
val dvKeys = listOf(relationObject1.key)
val customType1Map = mapOf(
Relations.ID to customType1Id,
Relations.UNIQUE_KEY to customType1Key.key,
Relations.LAYOUT to ObjectType.Layout.OBJECT_TYPE.code.toDouble(),
Relations.RECOMMENDED_LAYOUT to ObjectType.Layout.TODO.code.toDouble(),
Relations.NAME to "name-$customType1Id",
Relations.DEFAULT_TEMPLATE_ID to template2.id
)
val customType2Id = "customType2-${RandomString.make()}"
val customType2Key = TypeKey("customTypeKey-${RandomString.make()}")
val customType2Map = mapOf(
Relations.ID to customType2Id,
Relations.UNIQUE_KEY to customType2Key.key,
Relations.LAYOUT to ObjectType.Layout.OBJECT_TYPE.code.toDouble(),
Relations.RECOMMENDED_LAYOUT to ObjectType.Layout.TODO.code.toDouble(),
Relations.NAME to RandomString.make(),
Relations.DEFAULT_TEMPLATE_ID to template1.id
)
val viewer = StubDataViewView(
viewerRelations = listOf(dvViewerRelation1),
defaultObjectType = customType2Id,
defaultTemplateId = template1.id
)
val dv = StubDataView(views = listOf(viewer), relationLinks = listOf(relationLink1))
val details = Block.Details(
details = mapOf(
root to Block.Fields(map = setObjDetails),
customType1Id to Block.Fields(map = customType1Map),
customType2Id to Block.Fields(map = customType2Map)
)
)
stubSpaceManager(spaceId)
stubInterceptEvents()
stubInterceptThreadStatus()
stubOpenObject(
doc = listOf(dv),
details = details
)
stubTemplatesForTemplatesContainer(
type = customType1Id,
templates = listOf(template1, template2)
)
with(storeOfObjectTypes) {
set(customType1Id, customType1Map)
}
stubSubscriptionResults(
subscription = subscriptionId,
spaceId = spaceId,
storeOfRelations = storeOfRelations,
keys = dvKeys,
sources = listOf(customType1Id),
objects = listOf()
)
stubCreateDataViewObject()
//TESTING
viewModel.onStart(ctx = root)
advanceUntilIdle()
val uiState = viewModel.currentViewer.value as DataViewViewState.Set.NoItems
// ASSERT NEW + BUTTON
assertTrue(uiState.isCreateObjectAllowed)
viewModel.proceedWithDataViewObjectCreate()
advanceUntilIdle()
// ASSERT OBJECT CREATION ON NEW BUTTON CLICK
verifyBlocking(createDataViewObject, times(1)) {
val params = CreateDataViewObject.Params.SetByType(
filters = listOf(),
type = customType1Key,
template = template1.id,
prefilled = emptyMap()
)
async(params)
}
}
/**
* Set by type,
* SetOf: Type1
* Type1 default template : Template2
* View default type : empty
* View default template : Template1
*/
@Test
fun `set by type, type default template is not blank, view template is different`() = runTest {
val spaceId = RandomString.make()
val subscriptionId = DefaultDataViewSubscription.getSubscriptionId(root)
val relationObject1 = StubRelationObject()
val dvViewerRelation1 =
StubDataViewViewRelation(key = relationObject1.key, isVisible = true)
val relationLink1 = StubRelationLink(relationObject1.key)
val viewer = StubDataViewView(
viewerRelations = listOf(dvViewerRelation1),
defaultObjectType = null,
defaultTemplateId = template1.id
)
val dv = StubDataView(views = listOf(viewer), relationLinks = listOf(relationLink1))
val dvKeys = listOf(relationObject1.key)
val customType1Map = mapOf(
Relations.ID to customType1Id,
Relations.UNIQUE_KEY to customType1Key.key,
Relations.LAYOUT to ObjectType.Layout.OBJECT_TYPE.code.toDouble(),
Relations.RECOMMENDED_LAYOUT to ObjectType.Layout.TODO.code.toDouble(),
Relations.NAME to "name-$customType1Id",
Relations.DEFAULT_TEMPLATE_ID to template2.id
)
val details = Block.Details(
details = mapOf(
root to Block.Fields(map = setObjDetails),
customType1Id to Block.Fields(map = customType1Map)
)
)
stubSpaceManager(spaceId)
stubInterceptEvents()
stubInterceptThreadStatus()
stubOpenObject(
doc = listOf(dv),
details = details
)
stubTemplatesForTemplatesContainer(
type = customType1Id,
templates = listOf(template1, template2)
)
with(storeOfObjectTypes) {
set(customType1Id, customType1Map)
}
stubSubscriptionResults(
subscription = subscriptionId,
spaceId = spaceId,
storeOfRelations = storeOfRelations,
keys = dvKeys,
sources = listOf(customType1Id),
objects = listOf()
)
stubCreateDataViewObject()
//TESTING
viewModel.onStart(ctx = root)
advanceUntilIdle()
val uiState = viewModel.currentViewer.value as DataViewViewState.Set.NoItems
// ASSERT NEW + BUTTON
assertTrue(uiState.isCreateObjectAllowed)
viewModel.proceedWithDataViewObjectCreate()
advanceUntilIdle()
// ASSERT OBJECT CREATION ON NEW BUTTON CLICK
verifyBlocking(createDataViewObject, times(1)) {
val params = CreateDataViewObject.Params.SetByType(
filters = listOf(),
type = customType1Key,
template = template1.id,
prefilled = emptyMap()
)
async(params)
}
}
/**
* Set by type,
* SetOf: Type1
* Type1 default template : Template2
* View default type : empty
* View default template : Blank
*/
@Test
fun `set by type, type default template is not blank, view template is blank`() = runTest {
val spaceId = RandomString.make()
val subscriptionId = DefaultDataViewSubscription.getSubscriptionId(root)
val relationObject1 = StubRelationObject()
val dvViewerRelation1 =
StubDataViewViewRelation(key = relationObject1.key, isVisible = true)
val relationLink1 = StubRelationLink(relationObject1.key)
val viewer = StubDataViewView(
viewerRelations = listOf(dvViewerRelation1),
defaultObjectType = null,
defaultTemplateId = DEFAULT_TEMPLATE_ID_BLANK
)
val dv = StubDataView(views = listOf(viewer), relationLinks = listOf(relationLink1))
val dvKeys = listOf(relationObject1.key)
val customType1Map = mapOf(
Relations.ID to customType1Id,
Relations.UNIQUE_KEY to customType1Key.key,
Relations.LAYOUT to ObjectType.Layout.OBJECT_TYPE.code.toDouble(),
Relations.RECOMMENDED_LAYOUT to ObjectType.Layout.TODO.code.toDouble(),
Relations.NAME to "name-$customType1Id",
Relations.DEFAULT_TEMPLATE_ID to template2.id
)
val details = Block.Details(
details = mapOf(
root to Block.Fields(map = setObjDetails),
customType1Id to Block.Fields(map = customType1Map)
)
)
stubSpaceManager(spaceId)
stubInterceptEvents()
stubInterceptThreadStatus()
stubOpenObject(
doc = listOf(dv),
details = details
)
stubTemplatesForTemplatesContainer(
type = customType1Id,
templates = listOf(template1, template2)
)
with(storeOfObjectTypes) {
set(customType1Id, customType1Map)
}
stubSubscriptionResults(
subscription = subscriptionId,
spaceId = spaceId,
storeOfRelations = storeOfRelations,
keys = dvKeys,
sources = listOf(customType1Id),
objects = listOf()
)
stubCreateDataViewObject()
//TESTING
viewModel.onStart(ctx = root)
advanceUntilIdle()
val uiState = viewModel.currentViewer.value as DataViewViewState.Set.NoItems
// ASSERT NEW + BUTTON
assertTrue(uiState.isCreateObjectAllowed)
viewModel.proceedWithDataViewObjectCreate()
advanceUntilIdle()
// ASSERT OBJECT CREATION ON NEW BUTTON CLICK
verifyBlocking(createDataViewObject, times(1)) {
val params = CreateDataViewObject.Params.SetByType(
filters = listOf(),
type = customType1Key,
template = DEFAULT_TEMPLATE_ID_BLANK,
prefilled = emptyMap()
)
async(params)
}
}
}