1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 05:47:05 +09:00

DROID-1948 Tech | Object Types Screen returns ObjectWrapper.Type (#586)

This commit is contained in:
Konstantin Ivanov 2023-11-22 16:53:36 +01:00 committed by GitHub
parent 5cae9bc07c
commit c3981413a1
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 185 additions and 275 deletions

View file

@ -48,6 +48,7 @@ import com.anytypeio.anytype.BuildConfig
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Key
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_models.SyncStatus
import com.anytypeio.anytype.core_models.ThemeColor
import com.anytypeio.anytype.core_models.Url
@ -701,7 +702,7 @@ open class EditorFragment : NavigationFragment<FragmentEditorBinding>(R.layout.f
)
binding.objectTypesToolbar.setupClicks(
onItemClick = vm::onObjectTypeChanged,
onItemClick = vm::onTypesWidgetItemClicked,
onSearchClick = vm::onObjectTypesWidgetSearchClicked,
onDoneClick = vm::onObjectTypesWidgetDoneClicked
)
@ -2088,12 +2089,8 @@ open class EditorFragment : NavigationFragment<FragmentEditorBinding>(R.layout.f
vm.proceedToCreateObjectAndAddToTextAsLink(name)
}
override fun onProceedWithUpdateType(item: ObjectTypeView) {
vm.onObjectTypeChanged(item)
}
override fun onProceedWithDraftUpdateType(item: ObjectTypeView) {
vm.onObjectTypeChanged(item)
override fun onProceedWithUpdateType(objType: ObjectWrapper.Type) {
vm.onObjectTypeChanged(objType)
}
override fun onAddRelationToTarget(target: Id, relationKey: Key) {

View file

@ -10,6 +10,7 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_ui.features.objects.ObjectTypeVerticalAdapter
import com.anytypeio.anytype.core_ui.reactive.textChanges
import com.anytypeio.anytype.core_utils.ext.argOrNull
@ -20,7 +21,6 @@ import com.anytypeio.anytype.databinding.FragmentObjectTypeChangeBinding
import com.anytypeio.anytype.presentation.objects.ObjectTypeChangeViewModel
import com.anytypeio.anytype.presentation.objects.ObjectTypeChangeViewModel.Command
import com.anytypeio.anytype.presentation.objects.ObjectTypeChangeViewModelFactory
import com.anytypeio.anytype.presentation.objects.ObjectTypeView
import javax.inject.Inject
abstract class BaseObjectTypeChangeFragment :
@ -28,7 +28,7 @@ abstract class BaseObjectTypeChangeFragment :
abstract fun setTitle()
abstract fun startWithParams()
abstract fun onItemClicked(item: ObjectTypeView)
abstract fun onItemClicked(item: ObjectWrapper.Type)
@Inject
lateinit var factory: ObjectTypeChangeViewModelFactory

View file

@ -3,11 +3,10 @@ package com.anytypeio.anytype.ui.objects.types.pickers
import androidx.core.os.bundleOf
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Key
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_utils.ext.hideSoftInput
import com.anytypeio.anytype.core_utils.ext.withParent
import com.anytypeio.anytype.di.common.componentManager
import com.anytypeio.anytype.presentation.objects.ObjectTypeView
import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment
/**
@ -23,8 +22,8 @@ class AppDefaultObjectTypeFragment : BaseObjectTypeChangeFragment() {
)
}
override fun onItemClicked(item: ObjectTypeView) {
withParent<OnObjectTypeAction> {
override fun onItemClicked(item: ObjectWrapper.Type) {
withParent<OnObjectSelectTypeAction> {
onProceedWithUpdateType(item)
}
hideSoftInput()
@ -48,8 +47,4 @@ class AppDefaultObjectTypeFragment : BaseObjectTypeChangeFragment() {
arguments = bundleOf(ARG_EXCLUDE_TYPES to excludeTypes)
}
}
interface OnObjectTypeAction {
fun onProceedWithUpdateType(item: ObjectTypeView)
}
}

View file

@ -3,10 +3,10 @@ package com.anytypeio.anytype.ui.objects.types.pickers
import androidx.core.os.bundleOf
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_utils.ext.hideSoftInput
import com.anytypeio.anytype.core_utils.ext.withParent
import com.anytypeio.anytype.di.common.componentManager
import com.anytypeio.anytype.presentation.objects.ObjectTypeView
import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment
/**
@ -24,7 +24,7 @@ class DataViewSelectSourceFragment : BaseObjectTypeChangeFragment() {
)
}
override fun onItemClicked(item: ObjectTypeView) {
override fun onItemClicked(item: ObjectWrapper.Type) {
withParent<OnDataViewSelectSourceAction> {
onProceedWithSelectSource(id = item.id)
}

View file

@ -3,10 +3,10 @@ package com.anytypeio.anytype.ui.objects.types.pickers
import androidx.core.os.bundleOf
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_utils.ext.hideSoftInput
import com.anytypeio.anytype.core_utils.ext.withParent
import com.anytypeio.anytype.di.common.componentManager
import com.anytypeio.anytype.presentation.objects.ObjectTypeView
import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment
/**
@ -24,9 +24,9 @@ class DraftObjectSelectTypeFragment : BaseObjectTypeChangeFragment() {
)
}
override fun onItemClicked(item: ObjectTypeView) {
override fun onItemClicked(item: ObjectWrapper.Type) {
withParent<OnObjectSelectTypeAction> {
onProceedWithDraftUpdateType(item)
onProceedWithUpdateType(objType = item)
}
hideSoftInput()
dismiss()

View file

@ -1,10 +1,10 @@
package com.anytypeio.anytype.ui.objects.types.pickers
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_utils.ext.hideSoftInput
import com.anytypeio.anytype.core_utils.ext.withParent
import com.anytypeio.anytype.di.common.componentManager
import com.anytypeio.anytype.presentation.objects.ObjectTypeView
import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment
/**
@ -22,7 +22,7 @@ class EmptyDataViewSelectSourceFragment : BaseObjectTypeChangeFragment() {
)
}
override fun onItemClicked(item: ObjectTypeView) {
override fun onItemClicked(item: ObjectWrapper.Type) {
withParent<OnDataViewSelectSourceAction> {
onProceedWithSelectSource(id = item.id)
}

View file

@ -3,11 +3,10 @@ package com.anytypeio.anytype.ui.objects.types.pickers
import androidx.core.os.bundleOf
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Key
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_utils.ext.hideSoftInput
import com.anytypeio.anytype.core_utils.ext.withParent
import com.anytypeio.anytype.di.common.componentManager
import com.anytypeio.anytype.presentation.objects.ObjectTypeView
import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment
/**
@ -25,7 +24,7 @@ class ObjectSelectTypeFragment : BaseObjectTypeChangeFragment() {
)
}
override fun onItemClicked(item: ObjectTypeView) {
override fun onItemClicked(item: ObjectWrapper.Type) {
withParent<OnObjectSelectTypeAction> {
onProceedWithUpdateType(item)
}

View file

@ -1,8 +1,8 @@
package com.anytypeio.anytype.ui.objects.types.pickers
import com.anytypeio.anytype.presentation.objects.ObjectTypeView
import com.anytypeio.anytype.core_models.ObjectWrapper
interface OnObjectSelectTypeAction {
fun onProceedWithUpdateType(item: ObjectTypeView)
fun onProceedWithDraftUpdateType(item: ObjectTypeView)
fun onProceedWithUpdateType(objType: ObjectWrapper.Type)
}

View file

@ -42,6 +42,7 @@ import com.anytypeio.anytype.BuildConfig
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Key
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_models.SyncStatus
import com.anytypeio.anytype.core_ui.extensions.setEmojiOrNull
import com.anytypeio.anytype.core_ui.features.dataview.ViewerGridAdapter
@ -1246,15 +1247,10 @@ open class ObjectSetFragment :
inflater, container, false
)
override fun onProceedWithUpdateType(item: ObjectTypeView) {
vm.onNewTypeForViewerClicked(item.id)
override fun onProceedWithUpdateType(objType: ObjectWrapper.Type) {
vm.onNewTypeForViewerClicked(objType)
}
override fun onProceedWithDraftUpdateType(item: ObjectTypeView) {
// Do nothing.
}
private fun observeSelectingTemplate() {
val navController = findNavController()
val navBackStackEntry = navController.getBackStackEntry(R.id.objectSetScreen)

View file

@ -7,29 +7,28 @@ import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Key
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_utils.ext.toast
import com.anytypeio.anytype.core_utils.ui.BaseBottomSheetFragment
import com.anytypeio.anytype.core_utils.ui.proceed
import com.anytypeio.anytype.databinding.FragmentUserSettingsBinding
import com.anytypeio.anytype.di.common.componentManager
import com.anytypeio.anytype.presentation.objects.ObjectTypeView
import com.anytypeio.anytype.presentation.settings.PersonalizationSettingsViewModel
import com.anytypeio.anytype.ui.dashboard.ClearCacheAlertFragment
import com.anytypeio.anytype.ui.objects.types.pickers.AppDefaultObjectTypeFragment
import com.anytypeio.anytype.ui.objects.types.pickers.OnObjectSelectTypeAction
import javax.inject.Inject
class PersonalizationSettingsFragment : BaseBottomSheetFragment<FragmentUserSettingsBinding>(),
AppDefaultObjectTypeFragment.OnObjectTypeAction {
OnObjectSelectTypeAction {
@Inject
lateinit var factory: PersonalizationSettingsViewModel.Factory
private val vm by viewModels<PersonalizationSettingsViewModel> { factory }
override fun onProceedWithUpdateType(item: ObjectTypeView) {
vm.proceedWithUpdateType(type = item.id, key = item.key, name = item.name)
override fun onProceedWithUpdateType(objType: ObjectWrapper.Type) {
vm.proceedWithUpdateType(type = objType.id, key = objType.uniqueKey, name = objType.name)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View file

@ -52,30 +52,35 @@ class GetObjectTypeTest {
fun `should return all object types`() {
val type1 = ObjectWrapper.Type(
mapOf(Relations.ID to MockDataFactory.randomUuid())
mapOf(
Relations.ID to MockDataFactory.randomUuid(),
Relations.UNIQUE_KEY to MockDataFactory.randomUuid()
)
)
val type2 = ObjectWrapper.Type(
mapOf(Relations.ID to MockDataFactory.randomUuid())
mapOf(
Relations.ID to MockDataFactory.randomUuid(),
Relations.UNIQUE_KEY to MockDataFactory.randomUuid()
)
)
val type3 = ObjectWrapper.Type(
mapOf(Relations.ID to MockDataFactory.randomUuid())
mapOf(
Relations.ID to MockDataFactory.randomUuid(),
Relations.UNIQUE_KEY to MockDataFactory.randomUuid()
)
)
runBlocking {
stubGetObjectTypes(types = listOf(type1, type2, type3))
val firstTimeResult = usecase.execute(params = defaultParams)
firstTimeResult.fold(
onFailure = { Assert.fail() },
onSuccess = { results ->
assertEquals(
expected = listOf(type1, type2, type3),
actual = results
)
}
)
firstTimeResult.fold(onFailure = { Assert.fail() }, onSuccess = { results ->
assertEquals(
expected = listOf(type1, type2, type3), actual = results
)
})
val secondTimeResult = usecase.execute(params = defaultParams)
assertEquals(firstTimeResult, secondTimeResult)
@ -106,15 +111,11 @@ class GetObjectTypeTest {
stubGetObjectTypes(types = listOf(type1))
val firstTimeResult = usecase.execute(params = defaultParams)
firstTimeResult.fold(
onFailure = { Assert.fail() },
onSuccess = { results ->
assertEquals(
expected = sourceObject,
actual = results.first().sourceObject
)
}
)
firstTimeResult.fold(onFailure = { Assert.fail() }, onSuccess = { results ->
assertEquals(
expected = sourceObject, actual = results.first().sourceObject
)
})
}
}
@ -134,15 +135,11 @@ class GetObjectTypeTest {
stubGetObjectTypes(types = listOf(type1))
val firstTimeResult = usecase.execute(params = defaultParams)
firstTimeResult.fold(
onFailure = { Assert.fail() },
onSuccess = { results ->
assertEquals(
expected = sourceObject,
actual = results.first().sourceObject
)
}
)
firstTimeResult.fold(onFailure = { Assert.fail() }, onSuccess = { results ->
assertEquals(
expected = sourceObject, actual = results.first().sourceObject
)
})
}
}
@ -164,15 +161,11 @@ class GetObjectTypeTest {
stubGetObjectTypes(types = listOf(type1))
val firstTimeResult = usecase.execute(params = defaultParams)
firstTimeResult.fold(
onFailure = { Assert.fail() },
onSuccess = { results ->
assertEquals(
expected = sourceObject,
actual = results.first().sourceObject
)
}
)
firstTimeResult.fold(onFailure = { Assert.fail() }, onSuccess = { results ->
assertEquals(
expected = sourceObject, actual = results.first().sourceObject
)
})
}
}
@ -191,12 +184,9 @@ class GetObjectTypeTest {
stubGetObjectTypes(types = listOf(type1))
val firstTimeResult = usecase.execute(params = defaultParams)
firstTimeResult.fold(
onFailure = { Assert.fail() },
onSuccess = { results ->
assertNull(results.first().sourceObject)
}
)
firstTimeResult.fold(onFailure = { Assert.fail() }, onSuccess = { results ->
assertNull(results.first().sourceObject)
})
}
}
@ -214,12 +204,9 @@ class GetObjectTypeTest {
stubGetObjectTypes(types = listOf(type1))
val firstTimeResult = usecase.execute(params = defaultParams)
firstTimeResult.fold(
onFailure = { Assert.fail() },
onSuccess = { results ->
assertNull(results.first().sourceObject)
}
)
firstTimeResult.fold(onFailure = { Assert.fail() }, onSuccess = { results ->
assertNull(results.first().sourceObject)
})
}
}

View file

@ -4305,12 +4305,22 @@ class EditorViewModel(
)
}
fun onTypesWidgetItemClicked(item: ObjectTypeView) {
Timber.d("onTypesWidgetItemClicked, item:[$item]")
val objType = _objectTypes.firstOrNull { item.id == it.id }
if (objType != null) {
onObjectTypeChanged(objType)
} else {
Timber.e("Error while getting object type from objectTypes list")
}
}
fun onObjectTypeChanged(
item: ObjectTypeView
objType: ObjectWrapper.Type
) {
Timber.d("onObjectTypeChanged, item:[$item]")
Timber.d("onObjectTypeChanged, item:[$objType]")
viewModelScope.launch {
when (item.key) {
when (objType.uniqueKey) {
ObjectTypeIds.SET -> {
proceedWithConvertingToSet()
}
@ -4318,7 +4328,7 @@ class EditorViewModel(
proceedWithConvertingToCollection()
}
else -> {
proceedWithObjectTypeChangeAndApplyTemplate(item)
proceedWithObjectTypeChangeAndApplyTemplate(objType)
}
}
}
@ -4846,6 +4856,8 @@ class EditorViewModel(
getObjectTypes.async(params).fold(
onFailure = { Timber.e(it, "Error while getting library object types") },
onSuccess = { types ->
_objectTypes.clear()
_objectTypes.addAll(types)
val views = types.getObjectTypeViewsForSBPage(
isWithCollection = false,
isWithBookmark = false,
@ -5909,6 +5921,8 @@ class EditorViewModel(
sendHideObjectTypeWidgetEvent()
}
private val _objectTypes = mutableListOf<ObjectWrapper.Type>()
private fun proceedWithGettingObjectTypesForObjectTypeWidget() {
viewModelScope.launch {
val excludeTypes = orchestrator.stores.details.current().details[context]?.type ?: emptyList()
@ -5925,6 +5939,8 @@ class EditorViewModel(
getObjectTypes.async(params).fold(
onFailure = { Timber.e(it, "Error while getting library object types") },
onSuccess = { types ->
_objectTypes.clear()
_objectTypes.addAll(types)
val views = types.getObjectTypeViewsForSBPage(
isWithCollection = true,
isWithBookmark = false,
@ -5956,24 +5972,24 @@ class EditorViewModel(
if (isObjectTypesWidgetVisible) controlPanelInteractor.onEvent(ObjectTypesWidgetEvent.Hide)
}
private fun proceedWithObjectTypeChange(item: ObjectTypeView, onSuccess: (() -> Unit)? = null) {
private fun proceedWithObjectTypeChange(objType: ObjectWrapper.Type, onSuccess: (() -> Unit)? = null) {
val startTime = System.currentTimeMillis()
val internalFlags = getInternalFlagsFromDetails()
val containsTypeFlag = internalFlags.contains(InternalFlags.ShouldSelectType)
viewModelScope.launch {
val params = SetObjectType.Params(
context = context,
objectTypeKey = item.key
objectTypeKey = objType.uniqueKey
)
setObjectType.async(params).fold(
onFailure = { Timber.e(it, "Error while updating object type: [${item.key}]") },
onFailure = { Timber.e(it, "Error while updating object type: [${objType.uniqueKey}]") },
onSuccess = { response ->
Timber.d("proceedWithObjectTypeChange success, key:[${item.key}]")
Timber.d("proceedWithObjectTypeChange success, key:[${objType.uniqueKey}]")
dispatcher.send(response)
sendAnalyticsObjectTypeSelectOrChangeEvent(
analytics = analytics,
startTime = startTime,
sourceObject = item.sourceObject,
sourceObject = objType.sourceObject,
containsFlagType = containsTypeFlag
)
onSuccess?.invoke()
@ -5982,12 +5998,12 @@ class EditorViewModel(
}
}
private fun proceedWithObjectTypeChangeAndApplyTemplate(item: ObjectTypeView) {
proceedWithObjectTypeChange(item) {
private fun proceedWithObjectTypeChangeAndApplyTemplate(objType: ObjectWrapper.Type) {
proceedWithObjectTypeChange(objType) {
val internalFlags = getInternalFlagsFromDetails()
if (internalFlags.contains(InternalFlags.ShouldSelectTemplate)) {
onProceedWithApplyingTemplateByObjectId(
template = item.defaultTemplate
template = objType.defaultTemplateId
)
}
}

View file

@ -47,6 +47,7 @@ class ObjectTypeChangeViewModel(
}
private val setup = MutableSharedFlow<Setup>(replay = 0)
private val _objTypes = MutableStateFlow<List<ObjectWrapper.Type>>(emptyList())
val views = MutableStateFlow<List<ObjectTypeItemView>>(emptyList())
val commands = MutableSharedFlow<Command>()
@ -60,6 +61,7 @@ class ObjectTypeChangeViewModel(
setup = setup,
query = query
)
_objTypes.value = myTypes + marketplaceTypes
val filteredLibraryTypes = filterLibraryTypesByExcluded(
libraryTypes = myTypes,
excludeTypes = setup.excludeTypes
@ -158,9 +160,13 @@ class ObjectTypeChangeViewModel(
}
)
} else {
proceedWithDispatchingType(
item = item
)
val objType = _objTypes.value.firstOrNull { it.id == item.id }
if (objType == null) {
Timber.e("Object Type Change Screen, type is not found in types list")
sendToast("Error while choosing object type by key:${item.key}")
} else {
proceedWithDispatchingType(item = objType)
}
}
}
}
@ -170,16 +176,7 @@ class ObjectTypeChangeViewModel(
val type = struct?.mapToObjectWrapperType()
if (type != null) {
commands.emit(Command.TypeAdded(type = type.name.orEmpty()))
proceedWithDispatchingType(
item = ObjectTypeView(
id = result.id,
key = type.uniqueKey,
name = type.name.orEmpty(),
description = type.description.orEmpty(),
emoji = type.iconEmoji,
defaultTemplate = type.defaultTemplateId
)
)
proceedWithDispatchingType(item = type)
} else {
Timber.e("Type is not valid")
sendToast("Error while adding object type by id:${result.id} to space")
@ -187,7 +184,7 @@ class ObjectTypeChangeViewModel(
}
private suspend fun proceedWithDispatchingType(
item: ObjectTypeView
item: ObjectWrapper.Type
) {
commands.emit(Command.DispatchType(item))
}
@ -299,7 +296,7 @@ class ObjectTypeChangeViewModel(
sealed class Command {
data class DispatchType(
val item: ObjectTypeView
val item: ObjectWrapper.Type
) : Command()
data class TypeAdded(val type: String) : Command()

View file

@ -1578,14 +1578,14 @@ class ObjectSetViewModel(
}
}
fun onNewTypeForViewerClicked(typeId: Id) {
Timber.d("onNewTypeForViewerClicked, typeId:[$typeId]")
fun onNewTypeForViewerClicked(objType: ObjectWrapper.Type) {
Timber.d("onNewTypeForViewerClicked, objType:[$objType]")
viewModelScope.launch {
val type = storeOfObjectTypes.get(typeId)
val type = storeOfObjectTypes.get(objType.id)
if (type != null) {
selectedTypeFlow.value = SelectedType(type.id, type.defaultTemplateId)
} else {
Timber.e("Couldn't find type in store by id:$typeId")
Timber.e("Couldn't find type in store by id:${objType.id}")
}
}
}

View file

@ -21,7 +21,10 @@ import com.anytypeio.anytype.presentation.sets.subscription.DefaultDataViewSubsc
import com.anytypeio.anytype.test_utils.MockDataFactory
import net.bytebuddy.utility.RandomString
class MockSet(context: String, val setOfValue: String = "setOf-${RandomString.make()}") {
class MockSet(context: String,
val setOfValue: String = "setOf-${RandomString.make()}",
val setOfKey: String = "setOfKey-${RandomString.make()}"
) {
val root = context
val title =
@ -184,7 +187,8 @@ class MockSet(context: String, val setOfValue: String = "setOf-${RandomString.ma
),
setOf to Block.Fields(
map = mapOf(
Relations.UNIQUE_KEY to setOf,
Relations.ID to setOf,
Relations.UNIQUE_KEY to setOfKey,
Relations.TYPE to ObjectTypeIds.OBJECT_TYPE,
Relations.RECOMMENDED_LAYOUT to ObjectType.Layout.BASIC.code.toDouble(),
Relations.LAYOUT to ObjectType.Layout.OBJECT_TYPE.code.toDouble(),

View file

@ -47,9 +47,14 @@ class ObjectCreateTest : ObjectSetViewModelTestSetup() {
fun `Should create and open Object with NOTE Layout when clicking on New button in Set By Type`() =
runTest {
val typeUniqueKey = "type-unique-key-${RandomString.make()}"
val setOfId = "setOf-id-${RandomString.make()}"
val setOfKey = "setOf-key-${RandomString.make()}"
mockObjectSet = MockSet(context = root, setOfValue = typeUniqueKey)
mockObjectSet = MockSet(
context = root,
setOfValue = setOfId,
setOfKey = setOfKey
)
// SETUP
stubSpaceManager(mockObjectSet.spaceId)
@ -72,16 +77,16 @@ class ObjectCreateTest : ObjectSetViewModelTestSetup() {
val newObjectId = "objNewNote-${RandomString.make()}"
val result = CreateDataViewObject.Result(
objectId = newObjectId,
objectType = TypeKey(typeUniqueKey),
objectType = TypeKey(setOfKey),
struct = mapOf(
Relations.ID to newObjectId,
Relations.UNIQUE_KEY to typeUniqueKey,
Relations.UNIQUE_KEY to setOfKey,
Relations.LAYOUT to ObjectType.Layout.NOTE.code.toDouble(),
)
)
doReturn(Resultat.success(result)).`when`(createDataViewObject).async(
CreateDataViewObject.Params.SetByType(
type = TypeKey(typeUniqueKey),
type = TypeKey(setOfKey),
filters = mockObjectSet.filters,
template = null
)
@ -100,7 +105,7 @@ class ObjectCreateTest : ObjectSetViewModelTestSetup() {
verifyBlocking(createDataViewObject, times(1)) {
async(
CreateDataViewObject.Params.SetByType(
type = TypeKey(typeUniqueKey),
type = TypeKey(setOfKey),
filters = mockObjectSet.filters,
template = null
)
@ -114,7 +119,14 @@ class ObjectCreateTest : ObjectSetViewModelTestSetup() {
fun `Should create and open Not-Note Object when clicking on New button in Set by Type`() =
runTest {
mockObjectSet = MockSet(context = root, setOfValue = ObjectTypeIds.PAGE)
val setOfId = "setOf-id-${RandomString.make()}"
val setOfKey = ObjectTypeIds.PAGE
mockObjectSet = MockSet(
context = root,
setOfValue = setOfId,
setOfKey = setOfKey
)
// SETUP
stubSpaceManager(mockObjectSet.spaceId)
@ -140,7 +152,7 @@ class ObjectCreateTest : ObjectSetViewModelTestSetup() {
)
doReturn(Resultat.success(result)).`when`(createDataViewObject).async(
CreateDataViewObject.Params.SetByType(
type = TypeKey(ObjectTypeIds.PAGE),
type = TypeKey(setOfKey),
filters = mockObjectSet.filters,
template = null
)
@ -160,7 +172,7 @@ class ObjectCreateTest : ObjectSetViewModelTestSetup() {
verifyBlocking(createDataViewObject, times(1)) {
async(
CreateDataViewObject.Params.SetByType(
type = TypeKey(ObjectTypeIds.PAGE),
type = TypeKey(setOfKey),
filters = mockObjectSet.filters,
template = null
)

View file

@ -6,9 +6,7 @@ import com.anytypeio.anytype.core_models.Block
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_models.Relations
import com.anytypeio.anytype.core_models.StubObjectType
import com.anytypeio.anytype.core_models.StubRelationObject
import com.anytypeio.anytype.core_models.ext.content
import com.anytypeio.anytype.presentation.BuildConfig
import com.anytypeio.anytype.presentation.MockTypicalDocumentFactory
import com.anytypeio.anytype.presentation.editor.EditorViewModel
import com.anytypeio.anytype.presentation.editor.editor.model.BlockView
@ -76,6 +74,7 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val doc = listOf(page, header, title, block, featuredBlock)
val objectTypeId = MockDataFactory.randomString()
val objectTypeKey = MockDataFactory.randomString()
val objectTypeName = MockDataFactory.randomString()
val objectTypeDescription = MockDataFactory.randomString()
@ -83,11 +82,6 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val r2 = MockTypicalDocumentFactory.relationObject("De")
val r3 = MockTypicalDocumentFactory.relationObject("HJ")
val relationObjectType = StubObjectType(
id = objectTypeId,
name = "Object Type"
)
val value1 = MockDataFactory.randomString()
val value2 = MockDataFactory.randomString()
val value3 = MockDataFactory.randomString()
@ -103,6 +97,8 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val objectTypeFields = Block.Fields(
mapOf(
Relations.ID to objectTypeId,
Relations.UNIQUE_KEY to objectTypeKey,
Relations.NAME to objectTypeName,
Relations.DESCRIPTION to objectTypeDescription
)
@ -127,10 +123,6 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
listOf(r1, r2, r3)
)
storeOfObjectTypes.merge(
types = listOf(relationObjectType)
)
val vm = buildViewModel()
vm.onStart(root)
@ -203,6 +195,7 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val doc = listOf(page, header, title, block)
val objectTypeId = MockDataFactory.randomString()
val objectTypeKey = MockDataFactory.randomString()
val objectTypeName = MockDataFactory.randomString()
val objectTypeDescription = MockDataFactory.randomString()
@ -210,11 +203,6 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val r2 = MockTypicalDocumentFactory.relationObject("De")
val r3 = MockTypicalDocumentFactory.relationObject("HJ")
val relationObjectType = StubObjectType(
id = objectTypeId,
name = "Object Type"
)
val value1 = MockDataFactory.randomString()
val value2 = MockDataFactory.randomString()
val value3 = MockDataFactory.randomString()
@ -230,6 +218,8 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val objectTypeFields = Block.Fields(
mapOf(
Relations.ID to objectTypeId,
Relations.UNIQUE_KEY to objectTypeKey,
Relations.NAME to objectTypeName,
Relations.DESCRIPTION to objectTypeDescription
)
@ -253,10 +243,6 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
listOf(r1, r2, r3)
)
storeOfObjectTypes.merge(
listOf(relationObjectType)
)
val vm = buildViewModel()
vm.onStart(root)
@ -311,18 +297,13 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val doc = listOf(page, header, title, block, featuredBlock)
val objectTypeId = MockDataFactory.randomString()
val objectTypeKey = MockDataFactory.randomString()
val objectTypeName = MockDataFactory.randomString()
val objectTypeDescription = MockDataFactory.randomString()
val r1 = MockTypicalDocumentFactory.relationObject("Ad")
val r2 = MockTypicalDocumentFactory.relationObject("De")
val r3 = MockTypicalDocumentFactory.relationObject("HJ")
val relationObjectType = StubRelationObject(
key = Block.Fields.TYPE_KEY,
name = "Object Type",
format = Relation.Format.OBJECT
)
val value1 = MockDataFactory.randomString()
val value2 = MockDataFactory.randomString()
@ -332,13 +313,15 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
r1.key to value1,
r2.key to value2,
r3.key to value3,
relationObjectType.key to objectTypeId,
Relations.TYPE to objectTypeId,
Relations.FEATURED_RELATIONS to emptyList<String>()
)
)
val objectTypeFields = Block.Fields(
mapOf(
Relations.ID to objectTypeId,
Relations.UNIQUE_KEY to objectTypeKey,
Relations.NAME to objectTypeName,
Relations.DESCRIPTION to objectTypeDescription
)
@ -359,7 +342,7 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
)
storeOfRelations.merge(
listOf(r1, r2, r3, relationObjectType)
listOf(r1, r2, r3)
)
val vm = buildViewModel()
@ -417,17 +400,13 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val doc = listOf(page, header, title, block, featuredBlock)
val objectTypeId = MockDataFactory.randomString()
val objectTypeKey = MockDataFactory.randomString()
val objectTypeName = "Movie"
val objectTypeDescription = MockDataFactory.randomString()
val r1 = MockTypicalDocumentFactory.relationObject("Ad")
val r2 = MockTypicalDocumentFactory.relationObject("De")
val r3 = MockTypicalDocumentFactory.relationObject("HJ")
val relationObjectType = StubRelationObject(
key = Block.Fields.TYPE_KEY,
name = "Object Type",
format = Relation.Format.OBJECT
)
val value1 = MockDataFactory.randomString()
val value2 = MockDataFactory.randomString()
@ -437,13 +416,15 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
r1.key to value1,
r2.key to value2,
r3.key to value3,
relationObjectType.key to objectTypeId,
Relations.FEATURED_RELATIONS to listOf(relationObjectType.key, r3.key)
Relations.TYPE to objectTypeId,
Relations.FEATURED_RELATIONS to listOf(Relations.TYPE, r3.key)
)
)
val objectTypeFields = Block.Fields(
mapOf(
Relations.ID to objectTypeId,
Relations.UNIQUE_KEY to objectTypeKey,
Relations.NAME to objectTypeName,
Relations.DESCRIPTION to objectTypeDescription
)
@ -464,7 +445,7 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
)
storeOfRelations.merge(
listOf(r1, r2, relationObjectType)
listOf(r1, r2)
)
val vm = buildViewModel()
@ -542,14 +523,10 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val doc = listOf(page, header, title, block, featuredBlock)
val objectTypeId = MockDataFactory.randomString()
val objectTypeKey = MockDataFactory.randomString()
val objectTypeName = MockDataFactory.randomString()
val objectTypeDescription = MockDataFactory.randomString()
val relationObjectType = StubObjectType(
id = objectTypeId,
name = "Object Type"
)
val value1 = MockDataFactory.randomString()
val value2 = MockDataFactory.randomString()
val value3 = MockDataFactory.randomString()
@ -566,6 +543,8 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val objectTypeFields = Block.Fields(
mapOf(
Relations.ID to objectTypeId,
Relations.UNIQUE_KEY to objectTypeKey,
Relations.NAME to objectTypeName,
Relations.DESCRIPTION to objectTypeDescription
)
@ -590,10 +569,6 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
listOf(r1, r2, r3)
)
storeOfObjectTypes.merge(
listOf(relationObjectType)
)
val vm = buildViewModel()
vm.onStart(root)
@ -678,10 +653,6 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
val r2 = MockTypicalDocumentFactory.relationObject("De")
val r3 = MockTypicalDocumentFactory.relationObject("HJ")
val relationObjectType = StubObjectType(
id = objectTypeId
)
val value1 = MockDataFactory.randomString()
val value2 = MockDataFactory.randomString()
val value3 = MockDataFactory.randomString()
@ -710,10 +681,6 @@ class EditorFeaturedRelationsTest : EditorPresentationTestSetup() {
listOf(r1, r2, r3)
)
storeOfObjectTypes.merge(
types = listOf(relationObjectType)
)
val vm = buildViewModel()
vm.onStart(root)

View file

@ -113,6 +113,7 @@ class EditorNoteLayoutTest : EditorPresentationTestSetup() {
val objectTypeFields = Block.Fields(
mapOf(
Relations.ID to objectTypeId,
Relations.UNIQUE_KEY to objectType.uniqueKey,
Relations.NAME to objectTypeName,
Relations.DESCRIPTION to objectTypeDescription
)
@ -229,6 +230,8 @@ class EditorNoteLayoutTest : EditorPresentationTestSetup() {
val objectTypeFields = Block.Fields(
mapOf(
Relations.ID to objectTypeId,
Relations.UNIQUE_KEY to MockDataFactory.randomString(),
Relations.NAME to objectTypeName,
Relations.DESCRIPTION to objectTypeDescription
)

View file

@ -24,11 +24,14 @@ class ObjectSetDataViewObjectCreateTest : ObjectSetViewModelTestSetup() {
private lateinit var viewModel: ObjectSetViewModel
private lateinit var mockObjectSet: MockSet
private val setOfId = "setOfId"
private val setOfKey = "setOfKey"
@Before
fun setup() {
MockitoAnnotations.openMocks(this)
viewModel = givenViewModel()
mockObjectSet = MockSet(context = root)
mockObjectSet = MockSet(context = root, setOfValue = setOfId, setOfKey = setOfKey)
}
@After
@ -57,7 +60,7 @@ class ObjectSetDataViewObjectCreateTest : ObjectSetViewModelTestSetup() {
)
doReturn(Unit).`when`(createDataViewObject).async(
CreateDataViewObject.Params.SetByType(
type = TypeKey(mockObjectSet.setOf),
type = TypeKey(setOfKey),
filters = mockObjectSet.filters,
template = null
)
@ -80,7 +83,7 @@ class ObjectSetDataViewObjectCreateTest : ObjectSetViewModelTestSetup() {
verifyBlocking(createDataViewObject, times(1)) {
async(
CreateDataViewObject.Params.SetByType(
type = TypeKey(mockObjectSet.setOf),
type = TypeKey(setOfKey),
filters = mockObjectSet.filters,
template = null
)

View file

@ -25,11 +25,14 @@ class SetByRelationTest : ObjectSetViewModelTestSetup() {
private lateinit var viewModel: ObjectSetViewModel
private lateinit var mockObjectSet: MockSet
private val setOfId = "setOfId"
private val setOfKey = "setOfKey"
@Before
fun setup() {
closable = MockitoAnnotations.openMocks(this)
viewModel = givenViewModel()
mockObjectSet = MockSet(context = root)
mockObjectSet = MockSet(context = root, setOfValue = setOfId, setOfKey = setOfKey)
}
@After
@ -60,7 +63,7 @@ class SetByRelationTest : ObjectSetViewModelTestSetup() {
)
doReturn(Unit).`when`(createDataViewObject).async(
CreateDataViewObject.Params.SetByType(
type = TypeKey(mockObjectSet.setOf),
type = TypeKey(setOfKey),
filters = mockObjectSet.filters,
template = null
)
@ -83,7 +86,7 @@ class SetByRelationTest : ObjectSetViewModelTestSetup() {
verifyBlocking(createDataViewObject, times(1)) {
async(
CreateDataViewObject.Params.SetByType(
type = TypeKey(mockObjectSet.setOf),
type = TypeKey(setOfKey),
filters = mockObjectSet.filters,
template = null
)

View file

@ -10,6 +10,7 @@ import com.anytypeio.anytype.core_models.MarketplaceObjectTypeIds
import com.anytypeio.anytype.core_models.ObjectTypeIds
import com.anytypeio.anytype.core_models.Relations
import com.anytypeio.anytype.core_models.StubObjectType
import com.anytypeio.anytype.core_models.ext.mapToObjectWrapperType
import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers
import com.anytypeio.anytype.domain.block.interactor.sets.GetObjectTypes
import com.anytypeio.anytype.domain.block.repo.BlockRepository
@ -31,8 +32,12 @@ import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.ArgumentMatchers.anyList
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.any
import org.mockito.kotlin.anyArray
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.stub
import org.mockito.kotlin.times
@ -474,10 +479,10 @@ class ObjectTypeChangeViewModelTest {
} doReturn listOf(marketplaceType3.map)
}
val expectedType = StubObjectType(
id = expectedInstalledTypeId,
uniqueKey = expectedInstalledTypeUniqueKey,
name = "added type name",
val expectedType = mapOf(
Relations.ID to expectedInstalledTypeId,
Relations.UNIQUE_KEY to expectedInstalledTypeUniqueKey,
Relations.NAME to "added type name",
)
blockRepository.stub {
onBlocking {
@ -528,18 +533,13 @@ class ObjectTypeChangeViewModelTest {
vm.onItemClicked(item)
assertEquals(
expected =
ObjectTypeChangeViewModel.Command.TypeAdded(type = expectedType.name!!),
ObjectTypeChangeViewModel.Command.TypeAdded(type = "added type name"),
actual = awaitItem()
)
val expected = expectedType.mapToObjectWrapperType()!!
assertEquals(
expected = ObjectTypeChangeViewModel.Command.DispatchType(
ObjectTypeView(
id = expectedType.id,
key = expectedType.uniqueKey,
name = expectedType.name.orEmpty(),
description = expectedType.description.orEmpty(),
emoji = null
)
expected
),
actual = awaitItem()
)
@ -554,74 +554,6 @@ class ObjectTypeChangeViewModelTest {
}
}
@Test
fun `should dispatch selected type if one is user types is selected`() = runTest {
// SETUP
val marketplaceType1 = StubObjectType()
val marketplaceType2 = StubObjectType()
val installedType1 = StubObjectType(sourceObject = marketplaceType1.id)
val installedType2 = StubObjectType(sourceObject = marketplaceType2.id)
stubSpaceManager(spaceId)
val vm = givenViewModel()
val expectedMyTypesFilters = ObjectSearchConstants.filterTypes(
spaces = listOf(spaceId),
recommendedLayouts = SupportedLayouts.editorLayouts
)
val expectedMyTypeKeys = ObjectSearchConstants.defaultKeysObjectType
blockRepository.stub {
onBlocking {
searchObjects(
filters = expectedMyTypesFilters,
sorts = ObjectSearchConstants.defaultObjectSearchSorts(),
limit = 0,
offset = 0,
fulltext = "",
keys = expectedMyTypeKeys
)
} doReturn listOf(
installedType1.map, installedType2.map
)
}
// TESTING
vm.onStart(
isWithBookmark = false,
isWithCollection = false,
isSetSource = false,
excludeTypes = emptyList(),
selectedTypes = emptyList()
)
vm.commands.test {
val item = ObjectTypeView(
id = installedType1.id,
key = installedType1.uniqueKey.orEmpty(),
name = installedType1.name.orEmpty(),
description = installedType1.description.orEmpty(),
emoji = installedType1.iconEmoji.orEmpty(),
)
vm.onItemClicked(item)
assertEquals(
expected = ObjectTypeChangeViewModel.Command.DispatchType(item),
actual = awaitItem()
)
}
verifyBlocking(blockRepository, times(0)) {
addObjectListToSpace(
objects = listOf(installedType1.id),
space = spaceId
)
}
}
private fun givenViewModel() = ObjectTypeChangeViewModel(
getObjectTypes = getObjectTypes,
addObjectTypeToSpace = addObjectToSpace,