diff options
author | Ricki Hirner <hirner@bitfire.at> | 2021-10-05 13:28:29 +0300 |
---|---|---|
committer | Ricki Hirner <hirner@bitfire.at> | 2021-10-05 13:28:29 +0300 |
commit | af41314f13114f0b2cf9f93e18138cffb24a4d91 (patch) | |
tree | fe5484d93e50269d06e125ae07d90a8438db434d | |
parent | 60303f320b756e2865a6b3dea65ebd7a188ca823 (diff) |
Correctness, tests
6 files changed, 92 insertions, 83 deletions
diff --git a/src/androidTest/java/at/bitfire/vcard4android/AndroidAddressBookTest.kt b/src/androidTest/java/at/bitfire/vcard4android/AndroidAddressBookTest.kt index c0442a4..518dcd1 100644 --- a/src/androidTest/java/at/bitfire/vcard4android/AndroidAddressBookTest.kt +++ b/src/androidTest/java/at/bitfire/vcard4android/AndroidAddressBookTest.kt @@ -16,32 +16,33 @@ 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 { - @JvmField - @Rule - val permissionRule = GrantPermissionRule.grant(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)!! + companion object { + @JvmField + @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 + private val testAccount = Account("AndroidAddressBookTest", "at.bitfire.vcard4android") + private lateinit var provider: ContentProviderClient - @Before - fun connect() { - val context = InstrumentationRegistry.getInstrumentation().context - provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!! - assertNotNull(provider) - } + @BeforeClass + @JvmStatic + fun connect() { + val context = InstrumentationRegistry.getInstrumentation().context + provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!! + assertNotNull(provider) + } - @After - fun disconnect() { - @Suppress("DEPRECATION") - provider.release() + @BeforeClass + @JvmStatic + fun disconnect() { + @Suppress("DEPRECATION") + provider.release() + } } diff --git a/src/androidTest/java/at/bitfire/vcard4android/AndroidContactTest.kt b/src/androidTest/java/at/bitfire/vcard4android/AndroidContactTest.kt index b366b83..63df5b1 100644 --- a/src/androidTest/java/at/bitfire/vcard4android/AndroidContactTest.kt +++ b/src/androidTest/java/at/bitfire/vcard4android/AndroidContactTest.kt @@ -24,39 +24,40 @@ 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 { - @JvmField - @Rule - val permissionRule = GrantPermissionRule.grant(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)!! + companion object { + @JvmField + @ClassRule + val permissionRule = GrantPermissionRule.grant(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)!! - private val testAccount = Account("AndroidContactTest", "at.bitfire.vcard4android") - - private lateinit var provider: ContentProviderClient - private lateinit var addressBook: TestAddressBook + private val testAccount = Account("AndroidContactTest", "at.bitfire.vcard4android") - @Before - fun connect() { - val context = InstrumentationRegistry.getInstrumentation().context - provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!! - assertNotNull(provider) + private lateinit var provider: ContentProviderClient + private lateinit var addressBook: TestAddressBook - addressBook = TestAddressBook(testAccount, provider) - } + @BeforeClass + @JvmStatic + fun connect() { + val context = InstrumentationRegistry.getInstrumentation().context + provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!! + assertNotNull(provider) + + addressBook = TestAddressBook(testAccount, provider) + } - @After - fun disconnect() { - @Suppress("DEPRECATION") - provider.release() + @BeforeClass + @JvmStatic + fun disconnect() { + @Suppress("DEPRECATION") + provider.release() + } } diff --git a/src/androidTest/java/at/bitfire/vcard4android/AndroidGroupTest.kt b/src/androidTest/java/at/bitfire/vcard4android/AndroidGroupTest.kt index ca6cb1e..b0012f9 100644 --- a/src/androidTest/java/at/bitfire/vcard4android/AndroidGroupTest.kt +++ b/src/androidTest/java/at/bitfire/vcard4android/AndroidGroupTest.kt @@ -15,37 +15,40 @@ 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 { - @JvmField - @Rule - val permissionRule = GrantPermissionRule.grant(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)!! + companion object { + @JvmField + @ClassRule + val permissionRule = GrantPermissionRule.grant(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)!! - private val testAccount = Account("AndroidContactGroupTest", "at.bitfire.vcard4android") + private val testAccount = Account("AndroidContactGroupTest", "at.bitfire.vcard4android") - private lateinit var provider: ContentProviderClient - private lateinit var addressBook: TestAddressBook + private lateinit var provider: ContentProviderClient + private lateinit var addressBook: TestAddressBook - @Before - fun connect() { - val context = InstrumentationRegistry.getInstrumentation().context - provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!! - assertNotNull(provider) + @BeforeClass + @JvmStatic + fun connect() { + val context = InstrumentationRegistry.getInstrumentation().context + provider = context.contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY)!! + assertNotNull(provider) - addressBook = TestAddressBook(testAccount, provider) - } + addressBook = TestAddressBook(testAccount, provider) + } - @After - fun disconnect() { - @Suppress("DEPRECATION") - provider.release() + @BeforeClass + @JvmStatic + fun disconnect() { + @Suppress("DEPRECATION") + provider.release() + } } diff --git a/src/main/java/at/bitfire/vcard4android/AndroidAddressBook.kt b/src/main/java/at/bitfire/vcard4android/AndroidAddressBook.kt index c534ede..9d75bef 100644 --- a/src/main/java/at/bitfire/vcard4android/AndroidAddressBook.kt +++ b/src/main/java/at/bitfire/vcard4android/AndroidAddressBook.kt @@ -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() diff --git a/src/main/java/at/bitfire/vcard4android/AndroidContact.kt b/src/main/java/at/bitfire/vcard4android/AndroidContact.kt index 385ae04..d1ec734 100644 --- a/src/main/java/at/bitfire/vcard4android/AndroidContact.kt +++ b/src/main/java/at/bitfire/vcard4android/AndroidContact.kt @@ -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) @@ -58,11 +57,7 @@ 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) { + constructor(addressBook: AndroidAddressBook<out AndroidContact, out AndroidGroup>, values: ContentValues): this(addressBook) { id = values.getAsLong(RawContacts._ID) fileName = values.getAsString(COLUMN_FILENAME) eTag = values.getAsString(COLUMN_ETAG) diff --git a/src/main/java/at/bitfire/vcard4android/AndroidGroup.kt b/src/main/java/at/bitfire/vcard4android/AndroidGroup.kt index 8447184..4461053 100644 --- a/src/main/java/at/bitfire/vcard4android/AndroidGroup.kt +++ b/src/main/java/at/bitfire/vcard4android/AndroidGroup.kt @@ -37,7 +37,9 @@ open class AndroidGroup( var eTag: String? = null constructor(addressBook: AndroidAddressBook<out AndroidContact, out AndroidGroup>, values: ContentValues): this(addressBook) { - initializeFromContentValues(values) + id = values.getAsLong(Groups._ID) + fileName = values.getAsString(COLUMN_FILENAME) + eTag = values.getAsString(COLUMN_ETAG) } constructor(addressBook: AndroidAddressBook<out AndroidContact, out AndroidGroup>, contact: Contact, fileName: String? = null, eTag: String? = null): this(addressBook) { @@ -46,12 +48,6 @@ open class AndroidGroup( this.eTag = eTag } - protected open fun initializeFromContentValues(values: ContentValues) { - id = values.getAsLong(Groups._ID) - fileName = values.getAsString(COLUMN_FILENAME) - eTag = values.getAsString(COLUMN_ETAG) - } - /** * Cached copy of the [Contact]. If this is null, [getContact] must generate the [Contact] |