Skip to content
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
27 changes: 27 additions & 0 deletions .idea/androidTestResultsUserPreferences.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 31 additions & 13 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ plugins {
alias(libs.plugins.compose.compiler)
alias(libs.plugins.ksp)
alias(libs.plugins.detekt)
alias(libs.plugins.hilt)
alias(libs.plugins.google.secrets.gradle.plugin)
alias(libs.plugins.automattic.measure.builds)
}
Expand All @@ -23,7 +22,7 @@ android {
versionCode = extraString("version_code").toInt()
versionName = extraString("version_name")

testInstrumentationRunner = "com.santimattius.template.CustomTestRunner"
testInstrumentationRunner = "com.santimattius.template.InstrumentationTestRunner"
vectorDrawables {
useSupportLibrary = true
}
Expand Down Expand Up @@ -71,6 +70,11 @@ android {
excludes.add("/META-INF/{AL2.0,LGPL2.1}")
}
}
applicationVariants.forEach { variant ->
variant.sourceSets.forEach {
it.javaDirectories += files("build/generated/ksp/${variant.name}/kotlin")
}
}
}

composeCompiler {
Expand Down Expand Up @@ -105,20 +109,27 @@ measureBuilds {
}
}

ksp {
arg("KOIN_CONFIG_CHECK","true")
}

dependencies {
implementation(project(":core"))
implementation(libs.kotlin.stdlib)
implementation(libs.core.ktx)

implementation(libs.bundles.ui)
implementation(libs.bundles.lifecycle)
implementation(libs.activity.compose)

testImplementation(libs.lifecycle.viewmodel.testing)

implementation(libs.room.ktx)
implementation(libs.room.runtime)
//Compose
implementation(platform(libs.compose.bom))
implementation(libs.bundles.compose)
androidTestImplementation(project(":app"))
debugImplementation(libs.bundles.compose.debug)

testImplementation(platform(libs.compose.bom))
Expand All @@ -131,19 +142,25 @@ dependencies {
implementation(libs.glide.core)
implementation(libs.coil.core)

//Hilt
implementation(libs.hilt.android)
implementation(libs.hilt.navigation.compose)
ksp(libs.hilt.compiler)
ksp(libs.androidx.hilt.compiler)
//Koin
implementation(platform(libs.koin.bom))
implementation(libs.koin.android)
implementation(libs.koin.androidx.compose)
implementation(libs.koin.androidx.startup)

compileOnly(libs.koin.annotations.core)
ksp(libs.koin.annotations.compiler)

testImplementation(libs.koin.annotations.core)
kspTest(libs.koin.annotations.compiler)

// For Robolectric tests.
testImplementation(libs.hilt.test)
kspTest(libs.hilt.android.compiler)
testImplementation(libs.koin.test.core)
testImplementation(libs.koin.test.junit4)

// For instrumented tests.
androidTestImplementation(libs.hilt.test)
kspAndroidTest(libs.hilt.android.compiler)
androidTestImplementation(libs.koin.test.junit4)
androidTestImplementation(libs.koin.android.test)
androidTestImplementation(libs.koin.annotations.core)
kspAndroidTest(libs.koin.annotations.compiler)

//Unit Testing
testImplementation(project(path = ":shared-test"))
Expand All @@ -154,6 +171,7 @@ dependencies {

//Android Testing
debugImplementation(libs.androidx.fragment.testing.manifest)
implementation(libs.androidx.fragment.testing)

androidTestImplementation(libs.junit)
androidTestImplementation(libs.androidx.core.ktx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@ package com.santimattius.template
import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner
import dagger.hilt.android.testing.HiltTestApplication

class CustomTestRunner : AndroidJUnitRunner() {

class InstrumentationTestRunner : AndroidJUnitRunner() {
override fun newApplication(
cl: ClassLoader?,
classLoader: ClassLoader?,
className: String?,
context: Context?
): Application {
return super.newApplication(cl, HiltTestApplication::class.java.name, context)
return super.newApplication(classLoader, TestApplication::class.java.name, context)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.santimattius.template

import android.app.Application
import org.koin.androix.startup.KoinStartup
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.dsl.KoinConfiguration
import org.koin.dsl.module
import org.koin.ksp.generated.com_santimattius_template_di_AppModule
import org.koin.ksp.generated.defaultModule

@OptIn(KoinExperimentalAPI::class)
class TestApplication : Application(), KoinStartup {
override fun onKoinStartup(): KoinConfiguration {
return KoinConfiguration {
//kspAndroidTest no generate FakeDataModule
val fakeDataModule = com.santimattius.template.di.FakeDataModule()
modules(
com_santimattius_template_di_AppModule,
defaultModule,
module {
single { fakeDataModule.provideMovieRepository(get(), get()) }
single { fakeDataModule.provideFakeLocalDataSource() }
single { fakeDataModule.provideRemoteDataSource() }
}
)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,30 @@ import com.santimattius.core.data.datasources.MovieLocalDataSource
import com.santimattius.core.data.datasources.MovieNetworkDataSource
import com.santimattius.core.data.repositories.TMDbRepository
import com.santimattius.core.domain.repositories.MovieRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.components.SingletonComponent
import dagger.hilt.testing.TestInstallIn
import javax.inject.Named
import org.koin.core.annotation.Factory
import org.koin.core.annotation.Module
import org.koin.core.annotation.Named

@Module
@TestInstallIn(
components = [SingletonComponent::class],
replaces = [DataModule::class]
)
class FakeDataModule {

@Provides
@Factory
fun provideMovieRepository(
@Named("fake_remote_data_source") movieNetworkDataSource: MovieNetworkDataSource,
@Named("fake_local_data_source") movieLocalDataSource: MovieLocalDataSource,
@Named("_fake_remote_data_source") movieNetworkDataSource: MovieNetworkDataSource,
@Named("_fake_local_data_source") movieLocalDataSource: MovieLocalDataSource,
): MovieRepository = TMDbRepository(
movieNetworkDataSource = movieNetworkDataSource,
movieLocalDataSource = movieLocalDataSource
)

@Named("fake_local_data_source")
@Provides
@Named("_fake_local_data_source")
@Factory
fun provideFakeLocalDataSource(): MovieLocalDataSource {
return FakeMovieLocalDataSource()
}

@Named("fake_remote_data_source")
@Provides
@Named("_fake_remote_data_source")
@Factory
fun provideRemoteDataSource(): MovieNetworkDataSource {
return FakeMovieNetworkDataSource()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.santimattius.template.rules

import androidx.test.platform.app.InstrumentationRegistry
import org.junit.rules.TestWatcher
import org.junit.runner.Description
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.GlobalContext.getKoinApplicationOrNull
import org.koin.core.context.GlobalContext.unloadKoinModules
import org.koin.core.context.loadKoinModules
import org.koin.core.context.startKoin
import org.koin.core.module.Module

class KoinAndroidTestRule(
private val modules: List<Module>
) : TestWatcher() {

override fun starting(description: Description?) {
val application = getKoinApplicationOrNull()
if (application == null) {
startKoin {
androidContext(InstrumentationRegistry.getInstrumentation().targetContext.applicationContext)
modules(modules)
}
} else {
loadKoinModules(modules = modules)
}

}

override fun finished(description: Description?) {
unloadKoinModules(modules)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,32 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.test.espresso.IdlingPolicies
import com.santimattius.test.rules.MainCoroutinesTestRule
import com.santimattius.template.di.DataModule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import com.santimattius.template.rules.KoinAndroidTestRule
import com.santimattius.template.ui.compose.HomeComposeActivity
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
import com.santimattius.test.rules.MainCoroutinesTestRule
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.koin.ksp.generated.com_santimattius_template_di_AppModule
import org.koin.ksp.generated.com_santimattius_template_di_FakeDataModule
import org.koin.ksp.generated.defaultModule
import java.util.concurrent.TimeUnit


@UninstallModules(DataModule::class)
@HiltAndroidTest
@MediumTest
@RunWith(AndroidJUnit4::class)
class HomeComposeActivityTest {

@get:Rule(order = 0)
var hiltRule = HiltAndroidRule(this)
var koinTestRule = KoinAndroidTestRule(
listOf(
com_santimattius_template_di_FakeDataModule,
com_santimattius_template_di_AppModule,
defaultModule
)
)

@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
Expand All @@ -34,7 +42,6 @@ class HomeComposeActivityTest {

@Before
fun init() {
hiltRule.inject()
composeTestRule.mainClock.autoAdvance = false
IdlingPolicies.setIdlingResourceTimeout(10, TimeUnit.SECONDS)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,41 +6,42 @@ import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import com.santimattius.test.data.MovieMother
import com.santimattius.test.rules.MainCoroutinesTestRule
import com.santimattius.template.R
import com.santimattius.template.di.DataModule
import com.santimattius.template.espresso.RecyclerViewInteraction
import com.santimattius.template.ui.xml.home.HomeViewActivity
import com.santimattius.template.rules.KoinAndroidTestRule
import com.santimattius.template.ui.models.MovieUiModel
import com.santimattius.template.ui.models.mapping.asUiModels
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
import org.junit.Before
import com.santimattius.template.ui.xml.home.HomeViewActivity
import com.santimattius.test.data.MovieMother
import com.santimattius.test.rules.MainCoroutinesTestRule
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.koin.ksp.generated.com_santimattius_template_di_AppModule
import org.koin.ksp.generated.com_santimattius_template_di_FakeDataModule
import org.koin.ksp.generated.defaultModule

@MediumTest
@UninstallModules(DataModule::class)
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class HomeViewActivityTest {

@get:Rule(order = 0)
var hiltRule = HiltAndroidRule(this)
var koinTestRule = KoinAndroidTestRule(
listOf(
com_santimattius_template_di_FakeDataModule,
com_santimattius_template_di_AppModule,
defaultModule
)
)

@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()

@get:Rule(order = 1)
val coroutinesTestRule = MainCoroutinesTestRule()

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

@Test
fun showsTitleOfImageIfThereAreImages() {
val pictures = MovieMother.createDomainMovies()
Expand Down
Binary file added app/src/main/ic_launcher-playstore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading