Skip to content
This repository was archived by the owner on May 26, 2026. It is now read-only.

Commit c9d8f62

Browse files
committed
Implement StatusHandler with unit test
1 parent 6ce17c1 commit c9d8f62

3 files changed

Lines changed: 93 additions & 8 deletions

File tree

lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/DmfsTaskProcessor.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import at.bitfire.synctools.mapping.tasks.handler.DmfsTaskFieldHandler
1616
import at.bitfire.synctools.mapping.tasks.handler.DmfsTaskPropertyHandler
1717
import at.bitfire.synctools.mapping.tasks.handler.PriorityHandler
1818
import at.bitfire.synctools.mapping.tasks.handler.SequenceHandler
19+
import at.bitfire.synctools.mapping.tasks.handler.StatusHandler
1920
import at.bitfire.synctools.mapping.tasks.handler.TitleHandler
2021
import at.bitfire.synctools.mapping.tasks.handler.UidHandler
2122
import at.bitfire.synctools.storage.tasks.DmfsTask.Companion.UNKNOWN_PROPERTY_DATA
@@ -33,7 +34,6 @@ import net.fortuna.ical4j.model.property.Organizer
3334
import net.fortuna.ical4j.model.property.RDate
3435
import net.fortuna.ical4j.model.property.RRule
3536
import net.fortuna.ical4j.model.property.RelatedTo
36-
import net.fortuna.ical4j.model.property.Status
3737
import org.dmfs.tasks.contract.TaskContract.Properties
3838
import org.dmfs.tasks.contract.TaskContract.Property.Alarm
3939
import org.dmfs.tasks.contract.TaskContract.Property.Category
@@ -60,6 +60,7 @@ class DmfsTaskProcessor(
6060
SequenceHandler(),
6161
PriorityHandler(),
6262
ClassificationHandler(),
63+
StatusHandler(),
6364
)
6465

6566
private val propertyHandlers: Map<String, DmfsTaskPropertyHandler> = mapOf(
@@ -102,13 +103,6 @@ class DmfsTaskProcessor(
102103
values.getAsLong(Tasks.COMPLETED)?.let { to.completedAt = Completed(Instant.ofEpochMilli(it)) }
103104
values.getAsInteger(Tasks.PERCENT_COMPLETE)?.let { to.percentComplete = it }
104105

105-
to.status = when (values.getAsInteger(Tasks.STATUS)) {
106-
Tasks.STATUS_IN_PROCESS -> Status(Status.VALUE_IN_PROCESS)
107-
Tasks.STATUS_COMPLETED -> Status(Status.VALUE_COMPLETED)
108-
Tasks.STATUS_CANCELLED -> Status(Status.VALUE_CANCELLED)
109-
else -> Status(Status.VALUE_NEEDS_ACTION)
110-
}
111-
112106
val allDay = (values.getAsInteger(Tasks.IS_ALLDAY) ?: 0) != 0
113107

114108
val tzID = values.getAsString(Tasks.TZ)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* This file is part of bitfireAT/synctools which is released under GPLv3.
3+
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*/
6+
7+
package at.bitfire.synctools.mapping.tasks.handler
8+
9+
import android.content.ContentValues
10+
import at.bitfire.ical4android.Task
11+
import net.fortuna.ical4j.model.property.Status
12+
import org.dmfs.tasks.contract.TaskContract.Tasks
13+
14+
class StatusHandler : DmfsTaskFieldHandler {
15+
16+
override fun process(from: ContentValues, to: Task) {
17+
to.status = when (from.getAsInteger(Tasks.STATUS)) {
18+
Tasks.STATUS_IN_PROCESS -> Status(Status.VALUE_IN_PROCESS)
19+
Tasks.STATUS_COMPLETED -> Status(Status.VALUE_COMPLETED)
20+
Tasks.STATUS_CANCELLED -> Status(Status.VALUE_CANCELLED)
21+
else -> Status(Status.VALUE_NEEDS_ACTION)
22+
}
23+
}
24+
25+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* This file is part of bitfireAT/synctools which is released under GPLv3.
3+
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*/
6+
7+
package at.bitfire.synctools.mapping.tasks.handler
8+
9+
import android.content.ContentValues
10+
import androidx.core.content.contentValuesOf
11+
import at.bitfire.ical4android.Task
12+
import net.fortuna.ical4j.model.property.Status
13+
import org.dmfs.tasks.contract.TaskContract.Tasks
14+
import org.junit.Assert.assertEquals
15+
import org.junit.Test
16+
import org.junit.runner.RunWith
17+
import org.robolectric.RobolectricTestRunner
18+
19+
@RunWith(RobolectricTestRunner::class)
20+
class StatusHandlerTest {
21+
22+
private val handler = StatusHandler()
23+
24+
@Test
25+
fun `No STATUS defaults to NEEDS-ACTION`() {
26+
val task = Task()
27+
handler.process(ContentValues(), task)
28+
assertEquals(Status(Status.VALUE_NEEDS_ACTION), task.status)
29+
}
30+
31+
@Test
32+
fun `STATUS_NEEDS_ACTION maps to NEEDS-ACTION`() {
33+
val task = Task()
34+
handler.process(contentValuesOf(Tasks.STATUS to Tasks.STATUS_NEEDS_ACTION), task)
35+
assertEquals(Status(Status.VALUE_NEEDS_ACTION), task.status)
36+
}
37+
38+
@Test
39+
fun `STATUS_IN_PROCESS maps to IN-PROCESS`() {
40+
val task = Task()
41+
handler.process(contentValuesOf(Tasks.STATUS to Tasks.STATUS_IN_PROCESS), task)
42+
assertEquals(Status(Status.VALUE_IN_PROCESS), task.status)
43+
}
44+
45+
@Test
46+
fun `STATUS_COMPLETED maps to COMPLETED`() {
47+
val task = Task()
48+
handler.process(contentValuesOf(Tasks.STATUS to Tasks.STATUS_COMPLETED), task)
49+
assertEquals(Status(Status.VALUE_COMPLETED), task.status)
50+
}
51+
52+
@Test
53+
fun `STATUS_CANCELLED maps to CANCELLED`() {
54+
val task = Task()
55+
handler.process(contentValuesOf(Tasks.STATUS to Tasks.STATUS_CANCELLED), task)
56+
assertEquals(Status(Status.VALUE_CANCELLED), task.status)
57+
}
58+
59+
@Test
60+
fun `Unknown STATUS defaults to NEEDS-ACTION`() {
61+
val task = Task()
62+
handler.process(contentValuesOf(Tasks.STATUS to 99), task)
63+
assertEquals(Status(Status.VALUE_NEEDS_ACTION), task.status)
64+
}
65+
66+
}

0 commit comments

Comments
 (0)