Skip to content

Use DI for AccountSettings and Android tests #911

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jul 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ android {

buildConfigField("String", "userAgent", "\"DAVx5\"")

testInstrumentationRunner = "at.bitfire.davdroid.CustomTestRunner"
testInstrumentationRunner = "at.bitfire.davdroid.HiltTestRunner"
}

java {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@

package at.bitfire.davdroid

import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner
import dagger.hilt.android.HiltAndroidApp
import dagger.hilt.android.testing.HiltTestApplication

class CustomTestRunner : AndroidJUnitRunner() {
class HiltTestRunner : AndroidJUnitRunner() {

override fun newApplication(cl: ClassLoader, name: String, context: Context) =
override fun newApplication(cl: ClassLoader, name: String, context: Context): Application =
super.newApplication(cl, HiltTestApplication::class.java.name, context)

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import android.content.ContentUris
import android.content.ContentValues
import android.os.Build
import android.provider.CalendarContract
import androidx.annotation.RequiresApi
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import at.bitfire.davdroid.log.Logger
Expand Down
9 changes: 5 additions & 4 deletions app/src/androidTest/kotlin/at/bitfire/davdroid/TestModules.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package at.bitfire.davdroid

import at.bitfire.davdroid.repository.DavCollectionRepository
import at.bitfire.davdroid.push.PushRegistrationWorker
import at.bitfire.davdroid.repository.DavCollectionRepository
import dagger.Module
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.Multibinds
import dagger.hilt.testing.TestInstallIn
import dagger.multibindings.Multibinds

interface TestModules {

Expand All @@ -14,9 +14,10 @@ interface TestModules {
components = [SingletonComponent::class],
replaces = [PushRegistrationWorker.PushRegistrationWorkerModule::class]
)
abstract class FakePushRegistrationWorkerModule {
// Provides empty set of listeners
abstract class TestPushRegistrationWorkerModule {
// provides empty set of listeners
@Multibinds
abstract fun defaultOnChangeListeners(): Set<DavCollectionRepository.OnChangeListener>
}

}
21 changes: 11 additions & 10 deletions app/src/androidTest/kotlin/at/bitfire/davdroid/db/CollectionTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@

package at.bitfire.davdroid.db

import android.content.Context
import android.security.NetworkSecurityPolicy
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import at.bitfire.dav4jvm.DavResource
import at.bitfire.dav4jvm.property.webdav.ResourceType
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.settings.SettingsManager
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import okhttp3.HttpUrl.Companion.toHttpUrl
Expand All @@ -34,25 +35,25 @@ class CollectionTest {
val hiltRule = HiltAndroidRule(this)

@Inject
lateinit var settingsManager: SettingsManager

@Before
fun inject() {
hiltRule.inject()
}
@ApplicationContext
lateinit var context: Context

@Inject
lateinit var settingsManager: SettingsManager

private lateinit var httpClient: HttpClient
private val server = MockWebServer()

@Before
fun setUp() {
httpClient = HttpClient.Builder(InstrumentationRegistry.getInstrumentation().targetContext).build()
fun setup() {
hiltRule.inject()

httpClient = HttpClient.Builder(context).build()
Assume.assumeTrue(NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted)
}

@After
fun shutDown() {
fun teardown() {
httpClient.close()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET
import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN
import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import dagger.hilt.android.testing.HiltAndroidTest
import io.mockk.every
import io.mockk.junit4.MockKRule
import io.mockk.mockk
Expand All @@ -21,7 +20,6 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test

@HiltAndroidTest
class ConnectionUtilsTest {

@get:Rule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@

package at.bitfire.davdroid.network

import android.content.Context
import android.security.NetworkSecurityPolicy
import androidx.test.platform.app.InstrumentationRegistry
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import okhttp3.Request
Expand All @@ -19,6 +20,7 @@ import org.junit.Assume
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import javax.inject.Inject

@HiltAndroidTest
class HttpClientTest {
Expand All @@ -29,11 +31,15 @@ class HttpClientTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)

@Inject
@ApplicationContext
lateinit var context: Context

@Before
fun setUp() {
hiltRule.inject()

httpClient = HttpClient.Builder(InstrumentationRegistry.getInstrumentation().targetContext).build()
httpClient = HttpClient.Builder(context).build()

server = MockWebServer()
server.start(30000)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package at.bitfire.davdroid.repository

import androidx.test.platform.app.InstrumentationRegistry
import android.content.Context
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.Service
import at.bitfire.davdroid.settings.AccountSettings
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import io.mockk.mockk
Expand All @@ -23,12 +25,17 @@ class DavCollectionRepositoryTest {
var hiltRule = HiltAndroidRule(this)

@Inject
lateinit var serviceRepository: DavServiceRepository
lateinit var accountSettingsFactory: AccountSettings.Factory

@Inject
@ApplicationContext
lateinit var context: Context

@Inject
lateinit var db: AppDatabase

val context = InstrumentationRegistry.getInstrumentation().targetContext
@Inject
lateinit var serviceRepository: DavServiceRepository

var service: Service? = null

Expand All @@ -44,6 +51,7 @@ class DavCollectionRepositoryTest {
serviceRepository.deleteAll()
}


@Test
fun testOnChangeListener_setForceReadOnly() = runBlocking {
val collectionId = db.collectionDao().insertOrUpdateByUrl(
Expand All @@ -55,7 +63,7 @@ class DavCollectionRepositoryTest {
)
)
val testObserver = mockk<DavCollectionRepository.OnChangeListener>(relaxed = true)
val collectionRepository = DavCollectionRepository(context, mutableSetOf(testObserver), serviceRepository, db)
val collectionRepository = DavCollectionRepository(accountSettingsFactory, context, db, mutableSetOf(testObserver), serviceRepository)

assert(db.collectionDao().get(collectionId)?.forceReadOnly == false)
verify(exactly = 0) {
Expand All @@ -76,4 +84,5 @@ class DavCollectionRepositoryTest {
val serviceId = serviceRepository.insertOrReplace(service)
return serviceRepository.get(serviceId)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,37 @@ package at.bitfire.davdroid.resource

import android.accounts.Account
import android.accounts.AccountManager
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.test.platform.app.InstrumentationRegistry
import android.content.Context
import at.bitfire.davdroid.R
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import javax.inject.Inject

@HiltAndroidTest
class LocalAddressBookTest {

@get:Rule
val hiltRule = HiltAndroidRule(this)

val context = InstrumentationRegistry.getInstrumentation().targetContext
@Inject
@ApplicationContext
lateinit var context: Context

val mainAccountType = context.getString(R.string.account_type)
val mainAccount = Account("main", mainAccountType)
private val mainAccountType by lazy { context.getString(R.string.account_type) }
private val mainAccount by lazy { Account("main", mainAccountType) }

val addressBookAccountType = context.getString(R.string.account_type_address_book)
val addressBookAccount = Account("sub", addressBookAccountType)
private val addressBookAccountType by lazy { context.getString(R.string.account_type_address_book) }
private val addressBookAccount by lazy { Account("sub", addressBookAccountType) }

val accountManager = AccountManager.get(context)
private val accountManager by lazy { AccountManager.get(context) }

@Before
fun setUp() {
fun setup() {
hiltRule.inject()

// TODO DOES NOT WORK: the account immediately starts to sync, which creates the sync adapter services.
Expand All @@ -42,7 +45,7 @@ class LocalAddressBookTest {
}

@After
fun cleanup() {
fun teardown() {
accountManager.removeAccount(addressBookAccount, null, null)
accountManager.removeAccount(mainAccount, null, null)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,19 @@ import androidx.test.platform.app.InstrumentationRegistry
import at.bitfire.davdroid.InitCalendarProviderRule
import at.bitfire.ical4android.AndroidCalendar
import at.bitfire.ical4android.Event
import at.bitfire.ical4android.util.MiscUtils.closeCompat
import at.bitfire.ical4android.util.MiscUtils.asSyncAdapter
import at.bitfire.ical4android.util.MiscUtils.closeCompat
import net.fortuna.ical4j.model.property.DtStart
import net.fortuna.ical4j.model.property.RRule
import net.fortuna.ical4j.model.property.RecurrenceId
import net.fortuna.ical4j.model.property.Status
import org.junit.*
import org.junit.After
import org.junit.AfterClass
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.BeforeClass
import org.junit.ClassRule
import org.junit.Test
import org.junit.rules.TestRule

class LocalCalendarTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,22 @@ import at.techbee.jtx.JtxContract.asSyncAdapter
import net.fortuna.ical4j.model.Date
import net.fortuna.ical4j.model.DateList
import net.fortuna.ical4j.model.parameter.Value
import net.fortuna.ical4j.model.property.*
import org.junit.*
import org.junit.Assert.*
import net.fortuna.ical4j.model.property.DtStart
import net.fortuna.ical4j.model.property.ExDate
import net.fortuna.ical4j.model.property.RRule
import net.fortuna.ical4j.model.property.RecurrenceId
import net.fortuna.ical4j.model.property.Status
import org.junit.After
import org.junit.AfterClass
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.BeforeClass
import org.junit.ClassRule
import org.junit.Test
import org.junit.rules.TestRule
import java.util.*
import java.util.UUID

class LocalEventTest {

Expand Down
Loading
Loading