Skip to content
This repository was archived by the owner on Jun 9, 2025. It is now read-only.

Commit a12b2a6

Browse files
committed
Refactor task list creation and management
1 parent 6cfbbc2 commit a12b2a6

File tree

8 files changed

+152
-147
lines changed

8 files changed

+152
-147
lines changed

lib/src/androidTest/kotlin/at/bitfire/ical4android/DmfsStyleProvidersTaskTest.kt renamed to lib/src/androidTest/kotlin/at/bitfire/ical4android/AbstractTaskProvidersTest.kt

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,13 @@ package at.bitfire.ical4android
88

99
import androidx.test.platform.app.InstrumentationRegistry
1010
import androidx.test.rule.GrantPermissionRule
11-
import org.junit.After
1211
import org.junit.Assume
13-
import org.junit.Before
1412
import org.junit.Rule
1513
import org.junit.runner.RunWith
1614
import org.junit.runners.Parameterized
17-
import java.util.logging.Logger
1815

1916
@RunWith(Parameterized::class)
20-
21-
abstract class DmfsStyleProvidersTaskTest(
17+
abstract class AbstractTaskProvidersTest(
2218
val providerName: TaskProvider.ProviderName
2319
) {
2420

@@ -28,25 +24,15 @@ abstract class DmfsStyleProvidersTaskTest(
2824
fun taskProviders() = listOf(TaskProvider.ProviderName.OpenTasks,TaskProvider.ProviderName.TasksOrg)
2925
}
3026

31-
@JvmField
32-
@Rule
33-
val permissionRule = GrantPermissionRule.grant(*providerName.permissions)
34-
35-
var providerOrNull: TaskProvider? = null
36-
lateinit var provider: TaskProvider
27+
@get:Rule
28+
val permissionRule: GrantPermissionRule = GrantPermissionRule.grant(*providerName.permissions)
3729

38-
@Before
39-
open fun prepare() {
40-
providerOrNull = TaskProvider.acquire(InstrumentationRegistry.getInstrumentation().context, providerName)
41-
Assume.assumeNotNull(providerOrNull) // will halt here if providerOrNull is null
4230

43-
provider = providerOrNull!!
44-
Logger.getLogger(javaClass.name).fine("Using task provider: $provider")
45-
}
31+
fun acquireTasksProvider(): TaskProvider {
32+
val providerOrNull = TaskProvider.acquire(InstrumentationRegistry.getInstrumentation().context, providerName)
33+
Assume.assumeNotNull(providerOrNull) // will throw here if providerOrNull is null
4634

47-
@After
48-
open fun shutdown() {
49-
providerOrNull?.close()
35+
return providerOrNull!!
5036
}
5137

5238
}

lib/src/androidTest/kotlin/at/bitfire/ical4android/DmfsTaskListTest.kt

Lines changed: 72 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -12,103 +12,102 @@ import android.content.ContentValues
1212
import android.database.DatabaseUtils
1313
import at.bitfire.ical4android.impl.TestTask
1414
import at.bitfire.ical4android.impl.TestTaskList
15+
import at.bitfire.ical4android.impl.TestTaskListStore
1516
import net.fortuna.ical4j.model.property.RelatedTo
1617
import org.dmfs.tasks.contract.TaskContract
1718
import org.dmfs.tasks.contract.TaskContract.Properties
1819
import org.dmfs.tasks.contract.TaskContract.Property.Relation
1920
import org.dmfs.tasks.contract.TaskContract.Tasks
21+
import org.junit.After
2022
import org.junit.Assert.assertEquals
21-
import org.junit.Assert.assertNotNull
2223
import org.junit.Assert.assertTrue
24+
import org.junit.Before
2325
import org.junit.Test
2426

25-
class DmfsTaskListTest(providerName: TaskProvider.ProviderName):
26-
DmfsStyleProvidersTaskTest(providerName) {
27+
class DmfsTaskListTest(
28+
providerName: TaskProvider.ProviderName
29+
) : AbstractTaskProvidersTest(providerName) {
2730

2831
private val testAccount = Account("AndroidTaskListTest", TaskContract.LOCAL_ACCOUNT_TYPE)
2932

33+
private lateinit var provider: TaskProvider
34+
lateinit var taskList: TestTaskList
3035

31-
private fun createTaskList(): TestTaskList {
32-
val info = ContentValues()
33-
info.put(TaskContract.TaskLists.LIST_NAME, "Test Task List")
34-
info.put(TaskContract.TaskLists.LIST_COLOR, 0xffff0000)
35-
info.put(TaskContract.TaskLists.OWNER, "[email protected]")
36-
info.put(TaskContract.TaskLists.SYNC_ENABLED, 1)
37-
info.put(TaskContract.TaskLists.VISIBLE, 1)
36+
@Before
37+
fun setUp() {
38+
val provider = acquireTasksProvider()
3839

39-
val uri = DmfsTaskList.create(testAccount, provider.client, providerName, info)
40-
assertNotNull(uri)
40+
val store = TestTaskListStore(testAccount, providerName, provider.client)
41+
taskList = store.provideTestTaskList()
42+
}
43+
44+
@After
45+
fun cleanUp() {
46+
taskList.delete()
4147

42-
return DmfsTaskList.findByID(testAccount, provider.client, providerName, TestTaskList.Factory, ContentUris.parseId(uri))
48+
if (this::provider.isInitialized)
49+
provider.close()
4350
}
4451

4552

4653
@Test
4754
fun testManageTaskLists() {
48-
val taskList = createTaskList()
49-
50-
try {
51-
// sync URIs
52-
assertEquals("true", taskList.taskListSyncUri().getQueryParameter(TaskContract.CALLER_IS_SYNCADAPTER))
53-
assertEquals(testAccount.type, taskList.taskListSyncUri().getQueryParameter(TaskContract.ACCOUNT_TYPE))
54-
assertEquals(testAccount.name, taskList.taskListSyncUri().getQueryParameter(TaskContract.ACCOUNT_NAME))
55-
56-
assertEquals("true", taskList.tasksSyncUri().getQueryParameter(TaskContract.CALLER_IS_SYNCADAPTER))
57-
assertEquals(testAccount.type, taskList.tasksSyncUri().getQueryParameter(TaskContract.ACCOUNT_TYPE))
58-
assertEquals(testAccount.name, taskList.tasksSyncUri().getQueryParameter(TaskContract.ACCOUNT_NAME))
59-
} finally {
60-
// delete task list
61-
assertTrue(taskList.delete())
62-
}
55+
// sync URIs
56+
assertEquals("true", taskList.taskListSyncUri().getQueryParameter(TaskContract.CALLER_IS_SYNCADAPTER))
57+
assertEquals(testAccount.type, taskList.taskListSyncUri().getQueryParameter(TaskContract.ACCOUNT_TYPE))
58+
assertEquals(testAccount.name, taskList.taskListSyncUri().getQueryParameter(TaskContract.ACCOUNT_NAME))
59+
60+
assertEquals("true", taskList.tasksSyncUri().getQueryParameter(TaskContract.CALLER_IS_SYNCADAPTER))
61+
assertEquals(testAccount.type, taskList.tasksSyncUri().getQueryParameter(TaskContract.ACCOUNT_TYPE))
62+
assertEquals(testAccount.name, taskList.tasksSyncUri().getQueryParameter(TaskContract.ACCOUNT_NAME))
6363
}
6464

6565
@Test
6666
fun testTouchRelations() {
67-
val taskList = createTaskList()
68-
try {
69-
val parent = Task()
70-
parent.uid = "parent"
71-
parent.summary = "Parent task"
72-
73-
val child = Task()
74-
child.uid = "child"
75-
child.summary = "Child task"
76-
child.relatedTo.add(RelatedTo(parent.uid))
77-
78-
// insert child before parent
79-
val childContentUri = TestTask(taskList, child).add()
80-
val childId = ContentUris.parseId(childContentUri)
81-
val parentContentUri = TestTask(taskList, parent).add()
82-
val parentId = ContentUris.parseId(parentContentUri)
83-
84-
// OpenTasks should provide the correct relation
85-
taskList.provider.query(taskList.tasksPropertiesSyncUri(), null,
86-
"${Properties.TASK_ID}=?", arrayOf(childId.toString()),
87-
null, null)!!.use { cursor ->
88-
assertEquals(1, cursor.count)
89-
cursor.moveToNext()
90-
91-
val row = ContentValues()
92-
DatabaseUtils.cursorRowToContentValues(cursor, row)
93-
94-
assertEquals(Relation.CONTENT_ITEM_TYPE, row.getAsString(Properties.MIMETYPE))
95-
assertEquals(parentId, row.getAsLong(Relation.RELATED_ID))
96-
assertEquals(parent.uid, row.getAsString(Relation.RELATED_UID))
97-
assertEquals(Relation.RELTYPE_PARENT, row.getAsInteger(Relation.RELATED_TYPE))
98-
}
99-
100-
// touch the relations to update parent_id values
101-
taskList.touchRelations()
102-
103-
// now parent_id should bet set
104-
taskList.provider.query(childContentUri, arrayOf(Tasks.PARENT_ID),
105-
null, null, null)!!.use { cursor ->
106-
assertTrue(cursor.moveToNext())
107-
assertEquals(parentId, cursor.getLong(0))
108-
}
109-
} finally {
110-
taskList.delete()
67+
val parent = Task()
68+
parent.uid = "parent"
69+
parent.summary = "Parent task"
70+
71+
val child = Task()
72+
child.uid = "child"
73+
child.summary = "Child task"
74+
child.relatedTo.add(RelatedTo(parent.uid))
75+
76+
// insert child before parent
77+
val childContentUri = TestTask(taskList, child).add()
78+
val childId = ContentUris.parseId(childContentUri)
79+
val parentContentUri = TestTask(taskList, parent).add()
80+
val parentId = ContentUris.parseId(parentContentUri)
81+
82+
// OpenTasks should provide the correct relation
83+
taskList.provider.query(
84+
taskList.tasksPropertiesSyncUri(), null,
85+
"${Properties.TASK_ID}=?", arrayOf(childId.toString()),
86+
null, null
87+
)!!.use { cursor ->
88+
assertEquals(1, cursor.count)
89+
cursor.moveToNext()
90+
91+
val row = ContentValues()
92+
DatabaseUtils.cursorRowToContentValues(cursor, row)
93+
94+
assertEquals(Relation.CONTENT_ITEM_TYPE, row.getAsString(Properties.MIMETYPE))
95+
assertEquals(parentId, row.getAsLong(Relation.RELATED_ID))
96+
assertEquals(parent.uid, row.getAsString(Relation.RELATED_UID))
97+
assertEquals(Relation.RELTYPE_PARENT, row.getAsInteger(Relation.RELATED_TYPE))
98+
}
99+
100+
// touch the relations to update parent_id values
101+
taskList.touchRelations()
102+
103+
// now parent_id should bet set
104+
taskList.provider.query(
105+
childContentUri, arrayOf(Tasks.PARENT_ID),
106+
null, null, null
107+
)!!.use { cursor ->
108+
assertTrue(cursor.moveToNext())
109+
assertEquals(parentId, cursor.getLong(0))
111110
}
112111
}
113112

114-
}
113+
}

lib/src/androidTest/kotlin/at/bitfire/ical4android/DmfsTaskTest.kt

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import android.accounts.Account
1010
import android.content.ContentUris
1111
import android.content.ContentValues
1212
import android.database.DatabaseUtils
13-
import android.net.Uri
1413
import at.bitfire.ical4android.impl.TestTask
1514
import at.bitfire.ical4android.impl.TestTaskList
15+
import at.bitfire.ical4android.impl.TestTaskListStore
1616
import at.bitfire.ical4android.util.DateUtils
1717
import net.fortuna.ical4j.model.Date
1818
import net.fortuna.ical4j.model.DateList
@@ -55,31 +55,31 @@ import java.time.ZoneId
5555

5656
class DmfsTaskTest(
5757
providerName: TaskProvider.ProviderName
58-
): DmfsStyleProvidersTaskTest(providerName) {
58+
) : AbstractTaskProvidersTest(providerName) {
5959

6060
private val tzVienna = DateUtils.ical4jTimeZone("Europe/Vienna")!!
6161
private val tzChicago = DateUtils.ical4jTimeZone("America/Chicago")!!
6262
private val tzDefault = DateUtils.ical4jTimeZone(ZoneId.systemDefault().id)!!
6363

6464
private val testAccount = Account("AndroidTaskTest", LOCAL_ACCOUNT_TYPE)
6565

66-
private lateinit var taskListUri: Uri
66+
private lateinit var provider: TaskProvider
6767
private var taskList: TestTaskList? = null
6868

6969
@Before
70-
override fun prepare() {
71-
super.prepare()
70+
fun setUp() {
71+
provider = acquireTasksProvider()
7272

73-
taskList = TestTaskList.create(testAccount, provider)
74-
assertNotNull("Couldn't find/create test task list", taskList)
75-
76-
taskListUri = ContentUris.withAppendedId(provider.taskListsUri(), taskList!!.id)
73+
val store = TestTaskListStore(testAccount, providerName, provider.client)
74+
taskList = store.provideTestTaskList()
7775
}
7876

7977
@After
80-
override fun shutdown() {
78+
fun cleanUp() {
8179
taskList?.delete()
82-
super.shutdown()
80+
81+
if (this::provider.isInitialized)
82+
provider.close()
8383
}
8484

8585

@@ -496,8 +496,10 @@ class DmfsTaskTest(
496496
}.let { result ->
497497
val id = result.getAsLong(Tasks._ID)
498498
val uri = taskList!!.tasksPropertiesSyncUri()
499-
provider.client.query(uri, arrayOf(Category.CATEGORY_NAME), "${Properties.MIMETYPE}=? AND ${PropertyColumns.TASK_ID}=?",
500-
arrayOf(Category.CONTENT_ITEM_TYPE, id.toString()), null)!!.use { cursor ->
499+
provider.client.query(
500+
uri, arrayOf(Category.CATEGORY_NAME), "${Properties.MIMETYPE}=? AND ${PropertyColumns.TASK_ID}=?",
501+
arrayOf(Category.CONTENT_ITEM_TYPE, id.toString()), null
502+
)!!.use { cursor ->
501503
while (cursor.moveToNext())
502504
when (cursor.getString(0)) {
503505
"Cat_1" -> hasCat1 = true
@@ -517,8 +519,10 @@ class DmfsTaskTest(
517519
}.let { result ->
518520
val id = result.getAsLong(Tasks._ID)
519521
val uri = taskList!!.tasksPropertiesSyncUri()
520-
provider.client.query(uri, arrayOf(Property.Comment.COMMENT), "${Properties.MIMETYPE}=? AND ${PropertyColumns.TASK_ID}=?",
521-
arrayOf(Property.Comment.CONTENT_ITEM_TYPE, id.toString()), null)!!.use { cursor ->
522+
provider.client.query(
523+
uri, arrayOf(Property.Comment.COMMENT), "${Properties.MIMETYPE}=? AND ${PropertyColumns.TASK_ID}=?",
524+
arrayOf(Property.Comment.CONTENT_ITEM_TYPE, id.toString()), null
525+
)!!.use { cursor ->
522526
if (cursor.moveToNext())
523527
hasComment = cursor.getString(0) == "Comment value"
524528
}
@@ -534,18 +538,22 @@ class DmfsTaskTest(
534538
}.let { result ->
535539
val id = result.getAsLong(Tasks._ID)
536540
val uri = taskList!!.tasksPropertiesSyncUri()
537-
provider.client.query(uri, arrayOf(Property.Comment.COMMENT), "${Properties.MIMETYPE}=? AND ${PropertyColumns.TASK_ID}=?",
538-
arrayOf(Property.Comment.CONTENT_ITEM_TYPE, id.toString()), null)!!.use { cursor ->
539-
hasComment = cursor.count > 0
541+
provider.client.query(
542+
uri, arrayOf(Property.Comment.COMMENT), "${Properties.MIMETYPE}=? AND ${PropertyColumns.TASK_ID}=?",
543+
arrayOf(Property.Comment.CONTENT_ITEM_TYPE, id.toString()), null
544+
)!!.use { cursor ->
545+
hasComment = cursor.count > 0
540546
}
541547
}
542548
assertFalse(hasComment)
543549
}
544550

545551
private fun firstProperty(taskId: Long, mimeType: String): ContentValues? {
546552
val uri = taskList!!.tasksPropertiesSyncUri()
547-
provider.client.query(uri, null, "${Properties.MIMETYPE}=? AND ${PropertyColumns.TASK_ID}=?",
548-
arrayOf(mimeType, taskId.toString()), null)!!.use { cursor ->
553+
provider.client.query(
554+
uri, null, "${Properties.MIMETYPE}=? AND ${PropertyColumns.TASK_ID}=?",
555+
arrayOf(mimeType, taskId.toString()), null
556+
)!!.use { cursor ->
549557
if (cursor.moveToNext()) {
550558
val result = ContentValues(cursor.count)
551559
DatabaseUtils.cursorRowToContentValues(cursor, result)

lib/src/androidTest/kotlin/at/bitfire/ical4android/impl/TestTaskList.kt

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,42 +8,20 @@ package at.bitfire.ical4android.impl
88

99
import android.accounts.Account
1010
import android.content.ContentProviderClient
11-
import android.content.ContentUris
12-
import android.content.ContentValues
1311
import at.bitfire.ical4android.DmfsTaskList
1412
import at.bitfire.ical4android.DmfsTaskListFactory
1513
import at.bitfire.ical4android.TaskProvider
16-
import org.dmfs.tasks.contract.TaskContract
1714

1815
class TestTaskList(
19-
account: Account,
20-
provider: ContentProviderClient,
21-
providerName: TaskProvider.ProviderName,
22-
id: Long
23-
): DmfsTaskList<TestTask>(account, provider, providerName, TestTask.Factory, id) {
16+
account: Account,
17+
provider: ContentProviderClient,
18+
providerName: TaskProvider.ProviderName,
19+
id: Long
20+
) : DmfsTaskList<TestTask>(account, provider, providerName, TestTask.Factory, id) {
2421

25-
companion object {
26-
27-
fun create(
28-
account: Account,
29-
provider: TaskProvider,
30-
): TestTaskList {
31-
val values = ContentValues(4)
32-
values.put(TaskContract.TaskListColumns.LIST_NAME, "Test Task List")
33-
values.put(TaskContract.TaskListColumns.LIST_COLOR, 0xffff0000)
34-
values.put(TaskContract.TaskListColumns.SYNC_ENABLED, 1)
35-
values.put(TaskContract.TaskListColumns.VISIBLE, 1)
36-
val uri = DmfsTaskList.create(account, provider.client, provider.name, values)
37-
38-
return TestTaskList(account, provider.client, provider.name, ContentUris.parseId(uri))
39-
}
40-
41-
}
42-
43-
44-
object Factory: DmfsTaskListFactory<TestTaskList> {
22+
object Factory : DmfsTaskListFactory<TestTaskList> {
4523
override fun newInstance(account: Account, provider: ContentProviderClient, providerName: TaskProvider.ProviderName, id: Long) =
46-
TestTaskList(account, provider, providerName, id)
24+
TestTaskList(account, provider, providerName, id)
4725
}
4826

49-
}
27+
}

0 commit comments

Comments
 (0)