Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af41314f authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Correctness, tests

parent 60303f32
Loading
Loading
Loading
Loading
+20 −19
Original line number Diff line number Diff line
@@ -16,33 +16,34 @@ import android.provider.ContactsContract
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import at.bitfire.vcard4android.impl.TestAddressBook
import org.junit.After
import org.junit.*
import org.junit.Assert.*
import org.junit.Before
import org.junit.Rule
import org.junit.Test

class AndroidAddressBookTest {

    companion object {
        @JvmField
    @Rule
        @ClassRule
        val permissionRule = GrantPermissionRule.grant(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)!!

        private val testAccount = Account("AndroidAddressBookTest", "at.bitfire.vcard4android")
        private lateinit var provider: ContentProviderClient

	@Before
        @BeforeClass
        @JvmStatic
        fun connect() {
            val context = InstrumentationRegistry.getInstrumentation().context
            provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!!
            assertNotNull(provider)
        }

	@After
        @BeforeClass
        @JvmStatic
        fun disconnect() {
            @Suppress("DEPRECATION")
            provider.release()
        }
    }


    @Test
+23 −22
Original line number Diff line number Diff line
@@ -24,19 +24,17 @@ import ezvcard.property.Address
import ezvcard.property.Birthday
import ezvcard.property.Email
import ezvcard.util.PartialDate
import org.junit.After
import org.junit.*
import org.junit.Assert.*
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import java.io.ByteArrayOutputStream
import java.io.StringReader
import java.text.SimpleDateFormat

class AndroidContactTest {

    companion object {
        @JvmField
    @Rule
        @ClassRule
        val permissionRule = GrantPermissionRule.grant(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)!!

        private val testAccount = Account("AndroidContactTest", "at.bitfire.vcard4android")
@@ -44,7 +42,8 @@ class AndroidContactTest {
        private lateinit var provider: ContentProviderClient
        private lateinit var addressBook: TestAddressBook

    @Before
        @BeforeClass
        @JvmStatic
        fun connect() {
            val context = InstrumentationRegistry.getInstrumentation().context
            provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!!
@@ -53,11 +52,13 @@ class AndroidContactTest {
            addressBook = TestAddressBook(testAccount, provider)
        }

    @After
        @BeforeClass
        @JvmStatic
        fun disconnect() {
            @Suppress("DEPRECATION")
            provider.release()
        }
    }


    @Test
+23 −20
Original line number Diff line number Diff line
@@ -15,17 +15,17 @@ import android.provider.ContactsContract
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import at.bitfire.vcard4android.impl.TestAddressBook
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Before
import org.junit.Rule
import org.junit.BeforeClass
import org.junit.ClassRule
import org.junit.Test

class AndroidGroupTest {

    companion object {
        @JvmField
    @Rule
        @ClassRule
        val permissionRule = GrantPermissionRule.grant(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)!!

        private val testAccount = Account("AndroidContactGroupTest", "at.bitfire.vcard4android")
@@ -33,7 +33,8 @@ class AndroidGroupTest {
        private lateinit var provider: ContentProviderClient
        private lateinit var addressBook: TestAddressBook

    @Before
        @BeforeClass
        @JvmStatic
        fun connect() {
            val context = InstrumentationRegistry.getInstrumentation().context
            provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!!
@@ -42,11 +43,13 @@ class AndroidGroupTest {
            addressBook = TestAddressBook(testAccount, provider)
        }

    @After
        @BeforeClass
        @JvmStatic
        fun disconnect() {
            @Suppress("DEPRECATION")
            provider.release()
        }
    }


    @Test
+21 −8
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ import android.provider.ContactsContract.RawContacts
import at.bitfire.vcard4android.Utils.toContentValues
import java.io.FileNotFoundException
import java.util.*
import kotlin.jvm.Throws

open class AndroidAddressBook<T1: AndroidContact, T2: AndroidGroup>(
        var account: Account,
@@ -62,25 +61,39 @@ open class AndroidAddressBook<T1: AndroidContact, T2: AndroidGroup>(

    fun queryContacts(where: String?, whereArgs: Array<String>?): List<T1> {
        val contacts = LinkedList<T1>()
        provider!!.query(rawContactsSyncUri(),
                null, where, whereArgs, null)?.use { cursor ->
        provider!!.query(rawContactsSyncUri(), null,
                where, whereArgs, null)?.use { cursor ->
            while (cursor.moveToNext())
                contacts += contactFactory.fromProvider(this, cursor.toContentValues())
        }
        return contacts
    }

    fun queryGroups(where: String?, whereArgs: Array<String>?, callback: (T2) -> Unit) {
        provider!!.query(groupsSyncUri(), null,
            where, whereArgs, null)?.use { cursor ->
            while (cursor.moveToNext()) {
                val group = groupFactory.fromProvider(this, cursor.toContentValues())
                callback(group)
            }
        }
    }

    fun queryGroups(where: String?, whereArgs: Array<String>?): List<T2> {
        val groups = LinkedList<T2>()
        provider!!.query(groupsSyncUri(),
                arrayOf(Groups._ID, AndroidGroup.COLUMN_FILENAME, AndroidGroup.COLUMN_ETAG),
                where, whereArgs, null)?.use { cursor ->
            while (cursor.moveToNext())
                groups += groupFactory.fromProvider(this, cursor.toContentValues())
        queryGroups(where, whereArgs) { group ->
            groups += group
        }
        return groups
    }


    fun allGroups(callback: (T2) -> Unit) {
        queryGroups("${Groups.ACCOUNT_TYPE}=? AND ${Groups.ACCOUNT_NAME}=?", arrayOf(account.type, account.name)) { group ->
            callback(group)
        }
    }

    @Throws(FileNotFoundException::class)
    fun findContactById(id: Long) =
            queryContacts("${RawContacts._ID}=?", arrayOf(id.toString())).firstOrNull() ?: throw FileNotFoundException()
+2 −7
Original line number Diff line number Diff line
@@ -48,8 +48,7 @@ open class AndroidContact(
    /**
     * Creates a new instance, initialized with some metadata. Usually used to insert a contact to an address book.
     */
    constructor(addressBook: AndroidAddressBook<out AndroidContact, out AndroidGroup>, _contact: Contact, _fileName: String?, _eTag: String?)
            : this(addressBook) {
    constructor(addressBook: AndroidAddressBook<out AndroidContact, out AndroidGroup>, _contact: Contact, _fileName: String?, _eTag: String?): this(addressBook) {
        fileName = _fileName
        eTag = _eTag
        setContact(_contact)
@@ -59,10 +58,6 @@ open class AndroidContact(
     * Creates a new instance, initialized with metadata from the content provider. Usually used when reading a contact from an address book.
     */
    constructor(addressBook: AndroidAddressBook<out AndroidContact, out AndroidGroup>, values: ContentValues): this(addressBook) {
        initializeFromContentValues(values)
    }

    protected open fun initializeFromContentValues(values: ContentValues) {
        id = values.getAsLong(RawContacts._ID)
        fileName = values.getAsString(COLUMN_FILENAME)
        eTag = values.getAsString(COLUMN_ETAG)
Loading