You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavTaskAdapterTest.kt

211 lines
5.6 KiB
Kotlin

package com.todoroo.astrid.adapter
import com.natpryce.makeiteasy.MakeItEasy.with
import com.natpryce.makeiteasy.PropertyValue
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.service.TaskMover
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking
import org.junit.Assert.*
import org.junit.Before
import org.junit.Test
import org.tasks.LocalBroadcastManager
import org.tasks.data.*
import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule
import org.tasks.makers.TaskContainerMaker.PARENT
import org.tasks.makers.TaskContainerMaker.newTaskContainer
import javax.inject.Inject
@UninstallModules(ProductionModule::class)
@HiltAndroidTest
class CaldavTaskAdapterTest : InjectingTestCase() {
@Inject lateinit var taskDao: TaskDao
@Inject lateinit var caldavDao: CaldavDao
@Inject lateinit var googleTaskDao: GoogleTaskDao
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var taskMover: TaskMover
private lateinit var adapter: TaskAdapter
private val tasks = ArrayList<TaskContainer>()
@Before
override fun setUp() {
super.setUp()
tasks.clear()
adapter = TaskAdapter(false, googleTaskDao, caldavDao, taskDao, localBroadcastManager, taskMover)
adapter.setDataSource(object : TaskAdapterDataSource {
override fun getItem(position: Int) = tasks[position]
override fun getTaskCount() = tasks.size
})
}
@Test
fun canMoveTask() {
addTask()
addTask()
assertTrue(adapter.canMove(tasks[0], 0, tasks[1], 1))
}
@Test
fun cantMoveTaskToChildPosition() {
addTask()
addTask(with(PARENT, tasks[0]))
addTask(with(PARENT, tasks[0]))
assertFalse(adapter.canMove(tasks[0], 0, tasks[1], 1))
assertFalse(adapter.canMove(tasks[0], 0, tasks[2], 2))
}
@Test
fun canMoveChildAboveParent() {
addTask()
addTask(with(PARENT, tasks[0]))
assertTrue(adapter.canMove(tasks[1], 1, tasks[0], 0))
}
@Test
fun canMoveChildBetweenSiblings() {
addTask()
addTask(with(PARENT, tasks[0]))
addTask(with(PARENT, tasks[0]))
assertTrue(adapter.canMove(tasks[1], 1, tasks[2], 2))
assertTrue(adapter.canMove(tasks[2], 2, tasks[1], 1))
}
@Test
fun maxIndentNoChildren() {
addTask()
addTask()
assertEquals(1, adapter.maxIndent(0, tasks[1]))
}
@Test
fun maxIndentMultiLevelSubtask() {
addTask()
addTask(with(PARENT, tasks[0]))
addTask()
assertEquals(1, adapter.maxIndent(0, tasks[1]))
assertEquals(2, adapter.maxIndent(1, tasks[2]))
}
@Test
fun minIndentInMiddleOfSubtasks() {
addTask()
addTask(with(PARENT, tasks[0]))
addTask(with(PARENT, tasks[0]))
assertEquals(1, adapter.minIndent(2, tasks[1]))
}
@Test
fun minIndentAtEndOfSubtasks() {
addTask()
addTask(with(PARENT, tasks[0]))
addTask(with(PARENT, tasks[0]))
addTask()
assertEquals(0, adapter.minIndent(3, tasks[2]))
}
@Test
fun minIndentAtEndOfMultiLevelSubtask() {
addTask()
addTask(with(PARENT, tasks[0]))
addTask(with(PARENT, tasks[1]))
addTask()
assertEquals(0, adapter.minIndent(2, tasks[1]))
}
@Test
fun minIndentInMiddleOfMultiLevelSubtasks() {
addTask()
addTask(with(PARENT, tasks[0]))
addTask(with(PARENT, tasks[1]))
addTask(with(PARENT, tasks[0]))
addTask()
assertEquals(1, adapter.minIndent(3, tasks[2]))
}
@Test
fun movingTaskToNewParentSetsId() = runBlocking {
addTask()
addTask()
adapter.moved(1, 1, 1)
assertEquals(tasks[0].id, taskDao.fetch(tasks[1].id)!!.parent)
}
@Test
fun movingTaskToNewParentSetsRemoteId() = runBlocking {
addTask()
addTask()
adapter.moved(1, 1, 1)
val parentId = caldavDao.getTask(tasks[0].id)!!.remoteId!!
assertTrue(parentId.isNotBlank())
assertEquals(parentId, caldavDao.getTask(tasks[1].id)!!.remoteParent)
}
@Test
fun unindentingTaskRemovesParent() = runBlocking {
addTask()
addTask(with(PARENT, tasks[0]))
adapter.moved(1, 1, 0)
assertTrue(caldavDao.getTask(tasks[1].id)!!.remoteParent.isNullOrBlank())
assertEquals(0, taskDao.fetch(tasks[1].id)!!.parent)
}
@Test
fun moveSubtaskUpToParent() = runBlocking {
addTask()
addTask(with(PARENT, tasks[0]))
addTask(with(PARENT, tasks[1]))
adapter.moved(2, 2, 1)
assertEquals(tasks[0].id, taskDao.fetch(tasks[2].id)!!.parent)
}
@Test
fun moveSubtaskUpToGrandparent() = runBlocking {
addTask()
addTask(with(PARENT, tasks[0]))
addTask(with(PARENT, tasks[1]))
addTask(with(PARENT, tasks[2]))
adapter.moved(3, 3, 1)
assertEquals(tasks[0].id, taskDao.fetch(tasks[3].id)!!.parent)
}
private fun addTask(vararg properties: PropertyValue<in TaskContainer?, *>) = runBlocking {
val t = newTaskContainer(*properties)
val task = t.task
taskDao.createNew(task)
val caldavTask = CaldavTask(task = t.id, calendar = "calendar")
if (task.parent > 0) {
caldavTask.remoteParent = caldavDao.getRemoteIdForTask(task.parent)
}
caldavTask.id = caldavDao.insert(caldavTask)
tasks.add(
t.copy(caldavTask = caldavTask)
)
}
}