mirror of https://github.com/tasks/tasks
Add tests for 11.3 migration
parent
20f74bec33
commit
137a27432a
@ -0,0 +1,243 @@
|
|||||||
|
@file:Suppress("ClassName")
|
||||||
|
|
||||||
|
package com.todoroo.astrid.service
|
||||||
|
|
||||||
|
import android.content.ContentProviderResult
|
||||||
|
import at.bitfire.ical4android.BatchOperation
|
||||||
|
import com.natpryce.makeiteasy.MakeItEasy.with
|
||||||
|
import com.todoroo.astrid.data.Task
|
||||||
|
import com.todoroo.astrid.helper.UUIDHelper
|
||||||
|
import dagger.hilt.android.testing.HiltAndroidTest
|
||||||
|
import dagger.hilt.android.testing.UninstallModules
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import org.dmfs.tasks.contract.TaskContract
|
||||||
|
import org.dmfs.tasks.contract.TaskContract.CALLER_IS_SYNCADAPTER
|
||||||
|
import org.dmfs.tasks.contract.TaskContract.TaskLists
|
||||||
|
import org.junit.Test
|
||||||
|
import org.tasks.SuspendFreeze.Companion.freezeAt
|
||||||
|
import org.tasks.TestUtilities.assertEquals
|
||||||
|
import org.tasks.TestUtilities.fromString
|
||||||
|
import org.tasks.data.*
|
||||||
|
import org.tasks.injection.InjectingTestCase
|
||||||
|
import org.tasks.injection.ProductionModule
|
||||||
|
import org.tasks.makers.CaldavTaskMaker.CALENDAR
|
||||||
|
import org.tasks.makers.CaldavTaskMaker.REMOTE_ID
|
||||||
|
import org.tasks.makers.CaldavTaskMaker.TASK
|
||||||
|
import org.tasks.makers.CaldavTaskMaker.VTODO
|
||||||
|
import org.tasks.makers.CaldavTaskMaker.newCaldavTask
|
||||||
|
import org.tasks.makers.TaskMaker.DUE_DATE
|
||||||
|
import org.tasks.makers.TaskMaker.HIDE_TYPE
|
||||||
|
import org.tasks.makers.TaskMaker.MODIFICATION_TIME
|
||||||
|
import org.tasks.makers.TaskMaker.newTask
|
||||||
|
import org.tasks.time.DateTime
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@UninstallModules(ProductionModule::class)
|
||||||
|
@HiltAndroidTest
|
||||||
|
class Upgrade_11_3_Test : InjectingTestCase() {
|
||||||
|
@Inject lateinit var taskDao: TaskDao
|
||||||
|
@Inject lateinit var caldavDao: CaldavDao
|
||||||
|
@Inject lateinit var openTaskDao: OpenTaskDao
|
||||||
|
@Inject lateinit var upgrader: Upgrade_11_3
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun applyRemoteiCalendarStartDate() = runBlocking {
|
||||||
|
val taskId = taskDao.insert(newTask())
|
||||||
|
caldavDao.insert(newCaldavTask(with(TASK, taskId), with(VTODO, VTODO_WITH_START_DATE)))
|
||||||
|
upgrader.applyiCalendarStartDates()
|
||||||
|
|
||||||
|
assertEquals(DateTime(2021, 1, 21), taskDao.fetch(taskId)?.hideUntil)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun ignoreRemoteiCalendarStartDate() = runBlocking {
|
||||||
|
val taskId = taskDao.insert(newTask(
|
||||||
|
with(DUE_DATE, DateTime(2021, 1, 20)),
|
||||||
|
with(HIDE_TYPE, Task.HIDE_UNTIL_DUE)
|
||||||
|
))
|
||||||
|
caldavDao.insert(newCaldavTask(with(TASK, taskId), with(VTODO, VTODO_WITH_START_DATE)))
|
||||||
|
upgrader.applyiCalendarStartDates()
|
||||||
|
|
||||||
|
assertEquals(DateTime(2021, 1, 20), taskDao.fetch(taskId)?.hideUntil)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun touchTaskWithLocaliCalendarStartDate() = runBlocking {
|
||||||
|
val upgradeTime = DateTime(2021, 1, 21, 11, 47, 32, 450)
|
||||||
|
val taskId = taskDao.insert(newTask(
|
||||||
|
with(DUE_DATE, DateTime(2021, 1, 20)),
|
||||||
|
with(HIDE_TYPE, Task.HIDE_UNTIL_DUE),
|
||||||
|
with(MODIFICATION_TIME, DateTime(2021, 1, 21, 9, 50, 4, 348))
|
||||||
|
))
|
||||||
|
caldavDao.insert(newCaldavTask(with(TASK, taskId), with(VTODO, VTODO_WITH_START_DATE)))
|
||||||
|
|
||||||
|
freezeAt(upgradeTime) {
|
||||||
|
upgrader.applyiCalendarStartDates()
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(upgradeTime, taskDao.fetch(taskId)?.modificationDate)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun dontTouchWhenNoiCalendarStartDate() = runBlocking {
|
||||||
|
val modificationTime = DateTime(2021, 1, 21, 9, 50, 4, 348)
|
||||||
|
val taskId = taskDao.insert(newTask(with(MODIFICATION_TIME, modificationTime)))
|
||||||
|
caldavDao.insert(newCaldavTask(with(TASK, taskId), with(VTODO, VTODO_NO_START_DATE)))
|
||||||
|
|
||||||
|
upgrader.applyiCalendarStartDates()
|
||||||
|
|
||||||
|
assertEquals(modificationTime, taskDao.fetch(taskId)?.modificationDate)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun applyRemoteOpenTaskStartDate() = runBlocking {
|
||||||
|
val (listId, list) = insertList()
|
||||||
|
applyOperation(
|
||||||
|
MyAndroidTask(fromString(VTODO_WITH_START_DATE))
|
||||||
|
.toBuilder(openTaskDao.tasks, true)
|
||||||
|
.withValue(TaskContract.TaskColumns.LIST_ID, listId)
|
||||||
|
)
|
||||||
|
val taskId = taskDao.insert(newTask())
|
||||||
|
caldavDao.insert(newCaldavTask(
|
||||||
|
with(CALENDAR, list.uuid),
|
||||||
|
with(REMOTE_ID, "4586964443060640060"),
|
||||||
|
with(TASK, taskId)
|
||||||
|
))
|
||||||
|
|
||||||
|
upgrader.applyOpenTaskStartDates()
|
||||||
|
|
||||||
|
assertEquals(DateTime(2021, 1, 21), taskDao.fetch(taskId)?.hideUntil)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun ignoreRemoteOpenTaskStartDate() = runBlocking {
|
||||||
|
val (listId, list) = insertList()
|
||||||
|
applyOperation(
|
||||||
|
MyAndroidTask(fromString(VTODO_WITH_START_DATE))
|
||||||
|
.toBuilder(openTaskDao.tasks, true)
|
||||||
|
.withValue(TaskContract.TaskColumns.LIST_ID, listId)
|
||||||
|
)
|
||||||
|
val taskId = taskDao.insert(newTask(
|
||||||
|
with(DUE_DATE, DateTime(2021, 1, 20)),
|
||||||
|
with(HIDE_TYPE, Task.HIDE_UNTIL_DUE)
|
||||||
|
))
|
||||||
|
caldavDao.insert(newCaldavTask(
|
||||||
|
with(CALENDAR, list.uuid),
|
||||||
|
with(REMOTE_ID, "4586964443060640060"),
|
||||||
|
with(TASK, taskId)
|
||||||
|
))
|
||||||
|
|
||||||
|
upgrader.applyOpenTaskStartDates()
|
||||||
|
|
||||||
|
assertEquals(DateTime(2021, 1, 20), taskDao.fetch(taskId)?.hideUntil)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun touchWithOpenTaskStartDate() = runBlocking {
|
||||||
|
val upgradeTime = DateTime(2021, 1, 21, 11, 47, 32, 450)
|
||||||
|
val (listId, list) = insertList()
|
||||||
|
applyOperation(
|
||||||
|
MyAndroidTask(fromString(VTODO_WITH_START_DATE))
|
||||||
|
.toBuilder(openTaskDao.tasks, true)
|
||||||
|
.withValue(TaskContract.TaskColumns.LIST_ID, listId)
|
||||||
|
)
|
||||||
|
val taskId = taskDao.insert(newTask(
|
||||||
|
with(DUE_DATE, DateTime(2021, 1, 20)),
|
||||||
|
with(HIDE_TYPE, Task.HIDE_UNTIL_DUE),
|
||||||
|
with(MODIFICATION_TIME, DateTime(2021, 1, 21, 9, 50, 4, 348))
|
||||||
|
))
|
||||||
|
caldavDao.insert(newCaldavTask(
|
||||||
|
with(CALENDAR, list.uuid),
|
||||||
|
with(REMOTE_ID, "4586964443060640060"),
|
||||||
|
with(TASK, taskId)
|
||||||
|
))
|
||||||
|
|
||||||
|
freezeAt(upgradeTime) {
|
||||||
|
upgrader.applyOpenTaskStartDates()
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(upgradeTime, taskDao.fetch(taskId)?.modificationDate)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun dontTouchNoOpenTaskStartDate() = runBlocking {
|
||||||
|
val modificationTime = DateTime(2021, 1, 21, 9, 50, 4, 348)
|
||||||
|
val (listId, list) = insertList()
|
||||||
|
applyOperation(
|
||||||
|
MyAndroidTask(fromString(VTODO_NO_START_DATE))
|
||||||
|
.toBuilder(openTaskDao.tasks, true)
|
||||||
|
.withValue(TaskContract.TaskColumns.LIST_ID, listId)
|
||||||
|
)
|
||||||
|
val taskId = taskDao.insert(newTask(with(MODIFICATION_TIME, modificationTime)))
|
||||||
|
caldavDao.insert(newCaldavTask(
|
||||||
|
with(CALENDAR, list.uuid),
|
||||||
|
with(REMOTE_ID, "4586964443060640060"),
|
||||||
|
with(TASK, taskId)
|
||||||
|
))
|
||||||
|
|
||||||
|
upgrader.applyOpenTaskStartDates()
|
||||||
|
|
||||||
|
assertEquals(modificationTime, taskDao.fetch(taskId)?.modificationDate)
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun insertList(
|
||||||
|
type: String = OpenTaskDao.ACCOUNT_TYPE_DAVx5,
|
||||||
|
account: String = "account"
|
||||||
|
): Pair<String, CaldavCalendar> {
|
||||||
|
val url = UUIDHelper.newUUID()
|
||||||
|
val uri = openTaskDao.taskLists.buildUpon()
|
||||||
|
.appendQueryParameter(CALLER_IS_SYNCADAPTER, "true")
|
||||||
|
.appendQueryParameter(TaskLists.ACCOUNT_NAME, account)
|
||||||
|
.appendQueryParameter(TaskLists.ACCOUNT_TYPE, type)
|
||||||
|
.build()
|
||||||
|
val result = applyOperation(
|
||||||
|
BatchOperation.CpoBuilder.newInsert(uri)
|
||||||
|
.withValue(TaskContract.CommonSyncColumns._SYNC_ID, url)
|
||||||
|
.withValue(TaskLists.SYNC_ENABLED, "1")
|
||||||
|
)
|
||||||
|
return Pair(result.uri!!.lastPathSegment!!, CaldavCalendar().apply {
|
||||||
|
uuid = UUIDHelper.newUUID()
|
||||||
|
this.account = "$type:$account"
|
||||||
|
this.url = url
|
||||||
|
caldavDao.insert(this)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun applyOperation(build: BatchOperation.CpoBuilder): ContentProviderResult =
|
||||||
|
context.contentResolver.applyBatch(openTaskDao.authority, arrayListOf(build.build()))[0]
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val VTODO_WITH_START_DATE = """
|
||||||
|
BEGIN:VCALENDAR
|
||||||
|
VERSION:2.0
|
||||||
|
PRODID:+//IDN tasks.org//android-110301//EN
|
||||||
|
BEGIN:VTODO
|
||||||
|
DTSTAMP:20210121T153032Z
|
||||||
|
UID:4586964443060640060
|
||||||
|
CREATED:20210121T153000Z
|
||||||
|
LAST-MODIFIED:20210121T153029Z
|
||||||
|
SUMMARY:Test
|
||||||
|
PRIORITY:9
|
||||||
|
X-APPLE-SORT-ORDER:-27
|
||||||
|
DTSTART;VALUE=DATE:20210121
|
||||||
|
END:VTODO
|
||||||
|
END:VCALENDAR
|
||||||
|
""".trimIndent()
|
||||||
|
|
||||||
|
val VTODO_NO_START_DATE = """
|
||||||
|
BEGIN:VCALENDAR
|
||||||
|
VERSION:2.0
|
||||||
|
PRODID:+//IDN tasks.org//android-110301//EN
|
||||||
|
BEGIN:VTODO
|
||||||
|
DTSTAMP:20210121T153032Z
|
||||||
|
UID:4586964443060640060
|
||||||
|
CREATED:20210121T153000Z
|
||||||
|
LAST-MODIFIED:20210121T153029Z
|
||||||
|
SUMMARY:Test
|
||||||
|
PRIORITY:9
|
||||||
|
X-APPLE-SORT-ORDER:-27
|
||||||
|
END:VTODO
|
||||||
|
END:VCALENDAR
|
||||||
|
""".trimIndent()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
@file:Suppress("ClassName")
|
||||||
|
|
||||||
|
package com.todoroo.astrid.service
|
||||||
|
|
||||||
|
import org.tasks.caldav.iCalendar
|
||||||
|
import org.tasks.caldav.iCalendar.Companion.apply
|
||||||
|
import org.tasks.data.OpenTaskDao
|
||||||
|
import org.tasks.data.TaskDao
|
||||||
|
import org.tasks.data.UpgraderDao
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class Upgrade_11_3 @Inject constructor(
|
||||||
|
private val upgraderDao: UpgraderDao,
|
||||||
|
private val openTaskDao: OpenTaskDao,
|
||||||
|
private val taskDao: TaskDao
|
||||||
|
) {
|
||||||
|
internal suspend fun applyiCalendarStartDates() {
|
||||||
|
val (hasStartDate, noStartDate) =
|
||||||
|
upgraderDao.tasksWithVtodos().partition { it.startDate > 0 }
|
||||||
|
for (task in noStartDate) {
|
||||||
|
task.vtodo?.let { iCalendar.fromVtodo(it) }?.dtStart?.let {
|
||||||
|
it.apply(task.task)
|
||||||
|
upgraderDao.setStartDate(task.id, task.startDate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hasStartDate
|
||||||
|
.map { it.id }
|
||||||
|
.let { taskDao.touch(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
internal suspend fun applyOpenTaskStartDates() {
|
||||||
|
openTaskDao.getLists().forEach { list ->
|
||||||
|
val (hasStartDate, noStartDate) =
|
||||||
|
upgraderDao
|
||||||
|
.getOpenTasksForList(list.account!!, list.url!!)
|
||||||
|
.partition { it.startDate > 0 }
|
||||||
|
for (task in noStartDate) {
|
||||||
|
openTaskDao
|
||||||
|
.getTask(list.id, task.remoteId!!)
|
||||||
|
?.dtStart
|
||||||
|
?.let {
|
||||||
|
it.apply(task.task)
|
||||||
|
upgraderDao.setStartDate(task.id, task.startDate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hasStartDate
|
||||||
|
.map { it.id }
|
||||||
|
.let { taskDao.touch(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val VERSION = 110300
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue