Fix start date initialization

pull/1352/head
Alex Baker 3 years ago
parent 0496ea457e
commit 3c9fc2d176

@ -0,0 +1,100 @@
package com.todoroo.astrid.service
import com.todoroo.astrid.api.PermaSql.*
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.DUE_DATE
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL
import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Test
import org.tasks.R
import org.tasks.SuspendFreeze.Companion.freezeAt
import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule
import org.tasks.preferences.Preferences
import org.tasks.time.DateTime
import javax.inject.Inject
@UninstallModules(ProductionModule::class)
@HiltAndroidTest
class TaskCreatorTest : InjectingTestCase() {
@Inject lateinit var preferences: Preferences
@Inject lateinit var taskCreator: TaskCreator
@Test
fun setStartAndDueFromFilter() = runBlocking {
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(mapOf(
HIDE_UNTIL.name!! to VALUE_EOD,
DUE_DATE.name!! to VALUE_EOD_TOMORROW
), null)
}
assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil)
assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 5).millis),
task.dueDate
)
}
@Test
fun setDefaultStartWithFilterDue() = runBlocking {
preferences.setString(R.string.p_default_hideUntil_key, Task.HIDE_UNTIL_DUE.toString())
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(mapOf(
DUE_DATE.name!! to VALUE_EOD
), null)
}
assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil)
}
@Test
fun setStartAndDueFromPreferences() = runBlocking {
preferences.setString(R.string.p_default_urgency_key, Task.URGENCY_TODAY.toString())
preferences.setString(R.string.p_default_hideUntil_key, Task.HIDE_UNTIL_DUE.toString())
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(null, "test")
}
assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil)
assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 4).millis),
task.dueDate
)
}
@Test
fun filterStartOverridesDefaultStart() = runBlocking {
preferences.setString(R.string.p_default_urgency_key, Task.URGENCY_TODAY.toString())
preferences.setString(R.string.p_default_hideUntil_key, Task.HIDE_UNTIL_DUE.toString())
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(mapOf(
HIDE_UNTIL.name!! to VALUE_EOD_NEXT_WEEK
), null)
}
assertEquals(DateTime(2021, 2, 11).millis, task.hideUntil)
}
@Test
fun filterDueOverridesDefaultDue() = runBlocking {
preferences.setString(R.string.p_default_urgency_key, Task.URGENCY_TODAY.toString())
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(mapOf(
DUE_DATE.name!! to VALUE_EOD_TOMORROW
), null)
}
assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 5).millis),
task.dueDate
)
}
}

@ -5,9 +5,9 @@ import org.tasks.time.DateTimeUtils
class SuspendFreeze {
suspend fun thawAfter(run: suspend () -> Unit) {
suspend fun <T> thawAfter(run: suspend () -> T): T {
try {
run()
return run()
} finally {
thaw()
}
@ -15,16 +15,16 @@ class SuspendFreeze {
companion object {
suspend fun freezeClock(run: suspend () -> Unit) {
freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run)
suspend fun <T> freezeClock(run: suspend () -> T): T {
return freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run)
}
suspend fun freezeAt(dateTime: DateTime, run: suspend () -> Unit) {
freezeAt(dateTime.millis, run)
suspend fun <T> freezeAt(dateTime: DateTime, run: suspend () -> T): T {
return freezeAt(dateTime.millis, run)
}
suspend fun freezeAt(timestamp: Long, run: suspend () -> Unit) {
freezeAt(timestamp).thawAfter(run)
suspend fun <T> freezeAt(timestamp: Long, run: suspend () -> T): T {
return freezeAt(timestamp).thawAfter(run)
}
fun freezeAt(dateTime: DateTime): SuspendFreeze {

@ -7,7 +7,10 @@ import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.DUE_DATE
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_NONE
import com.todoroo.astrid.data.Task.Companion.IMPORTANCE
import com.todoroo.astrid.data.Task.Companion.createDueDate
import com.todoroo.astrid.gcal.GCalHelper
import com.todoroo.astrid.helper.UUIDHelper
@ -17,6 +20,7 @@ import org.tasks.Strings.isNullOrEmpty
import org.tasks.data.*
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils.startOfDay
import timber.log.Timber
import java.util.*
import javax.inject.Inject
@ -84,7 +88,7 @@ class TaskCreator @Inject constructor(
* Create task from the given content values, saving it. This version doesn't need to start with a
* base task model.
*/
private suspend fun create(values: Map<String, Any>?, title: String?): Task {
internal suspend fun create(values: Map<String, Any>?, title: String?): Task {
val task = Task()
task.creationDate = DateUtilities.now()
task.modificationDate = DateUtilities.now()
@ -93,13 +97,6 @@ class TaskCreator @Inject constructor(
}
task.uuid = UUIDHelper.newUUID()
task.priority = preferences.defaultPriority
task.hideUntil = task.createHideUntil(
preferences.getIntegerFromString(R.string.p_default_hideUntil_key, HIDE_UNTIL_NONE),
0
)
task.dueDate = createDueDate(
preferences.getIntegerFromString(R.string.p_default_urgency_key, Task.URGENCY_NONE),
0)
preferences.getStringValue(R.string.p_default_recurrence)
?.takeIf { it.isNotBlank() }
?.let {
@ -112,27 +109,27 @@ class TaskCreator @Inject constructor(
?.let { task.putTransitory(Place.KEY, it) }
setDefaultReminders(preferences, task)
val tags = ArrayList<String>()
if (values != null && values.isNotEmpty()) {
for (item in values.entries) {
val key = item.key
var value: Any? = item.value
when (key) {
Tag.KEY -> tags.add(value as String)
GoogleTask.KEY, CaldavTask.KEY, Place.KEY -> task.putTransitory(key, value!!)
else -> {
if (value is String) {
value = PermaSql.replacePlaceholdersForNewTask(value as String?)
}
when (key) {
"dueDate" -> task.dueDate = java.lang.Long.valueOf((value as String?)!!)
"importance" -> task.priority = Integer.valueOf((value as String?)!!)
else -> {
}
}
}
}
values?.entries?.forEach { (key, value) ->
when (key) {
Tag.KEY -> tags.add(value as String)
GoogleTask.KEY, CaldavTask.KEY, Place.KEY -> task.putTransitory(key, value)
DUE_DATE.name -> value.substitute()?.toLongOrNull()?.let { task.dueDate = it }
IMPORTANCE.name -> value.substitute()?.toIntOrNull()?.let { task.priority = it }
HIDE_UNTIL.name ->
value.substitute()?.toLongOrNull()?.let { task.hideUntil = it.startOfDay() }
}
}
if (values?.containsKey(DUE_DATE.name) != true) {
task.dueDate = createDueDate(
preferences.getIntegerFromString(R.string.p_default_urgency_key, Task.URGENCY_NONE),
0)
}
if (values?.containsKey(HIDE_UNTIL.name) != true) {
task.hideUntil = task.createHideUntil(
preferences.getIntegerFromString(R.string.p_default_hideUntil_key, HIDE_UNTIL_NONE),
0
)
}
if (tags.isEmpty()) {
preferences.getStringValue(R.string.p_default_tags)
?.split(",")
@ -167,5 +164,8 @@ class TaskCreator @Inject constructor(
* preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, 0))
task.reminderFlags = preferences.defaultReminders or preferences.defaultRingMode
}
private fun Any?.substitute(): String? =
(this as? String)?.let { PermaSql.replacePlaceholdersForNewTask(it) }
}
}

@ -92,7 +92,7 @@ class StartDateControlSet : TaskEditControlFragment() {
selectedDay = savedInstanceState.getLong(EXTRA_DAY)
selectedTime = savedInstanceState.getInt(EXTRA_TIME)
}
refreshDisplayView()
applySelectionToHideUntil()
}
override val layout = R.layout.control_set_hide

Loading…
Cancel
Save