Skip to content

Commit

Permalink
Instrumentation test setup with Hilt
Browse files Browse the repository at this point in the history
  • Loading branch information
philipplackner committed Aug 7, 2023
1 parent c210a96 commit 8630573
Show file tree
Hide file tree
Showing 4 changed files with 157 additions and 0 deletions.
15 changes: 15 additions & 0 deletions buildSrc/src/main/java/com/ivy/buildsrc/IvyPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.android.build.api.dsl.LibraryExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.exclude
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

Expand All @@ -15,6 +16,7 @@ abstract class IvyPlugin : Plugin<Project> {
setProjectSdkVersions(project)

test(project)
androidTest(project)
lint(project)
kspSourceSets(project)
}
Expand Down Expand Up @@ -46,6 +48,19 @@ abstract class IvyPlugin : Plugin<Project> {
}
}

private fun androidTest(project: Project) {
project.dependencies {
androidTestImplementation("com.willowtreeapps.assertk:assertk:${Versions.assertK}")
androidTestImplementation("io.mockk:mockk-android:${Versions.mockk}")
}
project.configurations.getByName("androidTestImplementation") {
exclude(group = "io.mockk", module = "mockk-agent-jvm")
}
project.androidLibrary().defaultConfig {
testInstrumentationRunner = "com.ivy.common.androidtest.HiltTestRunner"
}
}

private fun applyPlugins(project: Project) {
project.apply {
plugin("android-library")
Expand Down
6 changes: 6 additions & 0 deletions common/android-test/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ dependencies {
dependency = { api(it) },
kaptProcessor = { kapt(it) }
)
RoomDB(api = false)
implementation(project(":core:persistence"))
implementation(project(":core:domain"))
implementation(project(":common:main"))
implementation("app.cash.turbine:turbine:${Versions.turbine}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${Versions.coroutines}")

Kotlin(api = false)
Coroutines(api = false)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.ivy.common.androidtest

import android.content.Context
import androidx.datastore.preferences.core.edit
import androidx.test.core.app.ApplicationProvider
import com.ivy.core.persistence.IvyWalletCoreDb
import com.ivy.core.persistence.datastore.dataStore
import dagger.hilt.android.testing.HiltAndroidRule
import kotlinx.coroutines.runBlocking
import org.junit.After
import org.junit.Before
import org.junit.Rule
import javax.inject.Inject

abstract class IvyAndroidTest {

@get:Rule
val hiltRule = HiltAndroidRule(this)

@Inject
lateinit var db: IvyWalletCoreDb

protected lateinit var context: Context

@Before
open fun setUp() {
context = ApplicationProvider.getApplicationContext()
hiltRule.inject()
db.clearAllTables()
clearDataStore()
}

@After
open fun tearDown() {
db.close()
}

private fun clearDataStore() = runBlocking {
context.dataStore.edit {
it.clear()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package com.ivy.common.androidtest

import android.content.Context
import androidx.room.Room
import com.ivy.core.persistence.IvyWalletCoreDb
import com.ivy.core.persistence.algorithm.accountcache.AccountCacheDao
import com.ivy.core.persistence.algorithm.calc.RatesDao
import com.ivy.core.persistence.dao.AttachmentDao
import com.ivy.core.persistence.dao.account.AccountDao
import com.ivy.core.persistence.dao.account.AccountFolderDao
import com.ivy.core.persistence.dao.category.CategoryDao
import com.ivy.core.persistence.dao.exchange.ExchangeRateDao
import com.ivy.core.persistence.dao.exchange.ExchangeRateOverrideDao
import com.ivy.core.persistence.dao.tag.TagDao
import com.ivy.core.persistence.dao.trn.TransactionDao
import com.ivy.core.persistence.dao.trn.TrnLinkRecordDao
import com.ivy.core.persistence.dao.trn.TrnMetadataDao
import com.ivy.core.persistence.dao.trn.TrnTagDao
import com.ivy.core.persistence.di.CorePersistenceModuleDI
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import dagger.hilt.testing.TestInstallIn
import javax.inject.Singleton


@Module
@TestInstallIn(
components = [SingletonComponent::class],
replaces = [CorePersistenceModuleDI::class]
)
object TestCorePersistenceModuleDI {
@Provides
@Singleton
fun provideIvyWalletDb(@ApplicationContext appContext: Context): IvyWalletCoreDb =
Room.inMemoryDatabaseBuilder(appContext, IvyWalletCoreDb::class.java).build()

@Provides
@Singleton
fun provideAccountDao(db: IvyWalletCoreDb): AccountDao = db.accountDao()

@Provides
@Singleton
fun provideAccountCacheDao(db: IvyWalletCoreDb): AccountCacheDao = db.accountCacheDao()

@Provides
@Singleton
fun provideAccountFolderDao(db: IvyWalletCoreDb): AccountFolderDao = db.accountFolderDao()

@Provides
@Singleton
fun provideCategoryDao(db: IvyWalletCoreDb): CategoryDao = db.categoryDao()

@Provides
@Singleton
fun provideExchangeRateDao(db: IvyWalletCoreDb): ExchangeRateDao = db.exchangeRateDao()

@Provides
@Singleton
fun provideExchangeRateOverrideDao(db: IvyWalletCoreDb): ExchangeRateOverrideDao =
db.exchangeRateOverrideDao()

@Provides
@Singleton
fun provideRatesDao(db:IvyWalletCoreDb) : RatesDao =
db.ratesDao()

@Provides
@Singleton
fun provideTagDao(db: IvyWalletCoreDb): TagDao = db.tagDao()

@Provides
@Singleton
fun provideTrnDao(db: IvyWalletCoreDb): TransactionDao = db.trnDao()

@Provides
@Singleton
fun provideTrnLinkRecordDao(db: IvyWalletCoreDb): TrnLinkRecordDao = db.trnLinkRecordDao()

@Provides
@Singleton
fun provideTrnMetadataDao(db: IvyWalletCoreDb): TrnMetadataDao = db.trnMetadataDao()

@Provides
@Singleton
fun provideTrnTagDao(db: IvyWalletCoreDb): TrnTagDao = db.trnTagDao()

@Provides
@Singleton
fun provideAttachmentDao(db: IvyWalletCoreDb): AttachmentDao = db.attachmentDao()
}

0 comments on commit 8630573

Please sign in to comment.