Skip to content
Open
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
28 changes: 9 additions & 19 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.konan.properties.Properties

plugins {
id("com.android.application")
kotlin("android")
alias(libs.plugins.compose.compiler)
alias(libs.plugins.metro)
alias(libs.plugins.google.services)
alias(libs.plugins.hilt)
alias(libs.plugins.play.publisher)
alias(libs.plugins.simple.flank)
id("com.android.application")
kotlin("android")
id("com.google.firebase.crashlytics")
alias(libs.plugins.compose.compiler)
id("com.google.devtools.ksp")
}

android {
Expand All @@ -25,7 +24,7 @@ android {
applicationId = AppCoordinates.APP_ID
versionCode = AppCoordinates.APP_VERSION_CODE
versionName = AppCoordinates.APP_VERSION_NAME
testInstrumentationRunner = "dev.simonas.quies.HiltTestRunner"
testInstrumentationRunner = "dev.simonas.quies.MetroTestRunner"
vectorDrawables {
useSupportLibrary = true
}
Expand Down Expand Up @@ -94,9 +93,6 @@ android {
packaging {
resources.excludes += "DebugProbesKt.bin"
}
hilt {
enableAggregatingTask = true
}
}

kotlin {
Expand Down Expand Up @@ -124,9 +120,10 @@ dependencies {
implementation(libs.firebase.analytics)
implementation(libs.firebase.analytics.ktx)
implementation(libs.firebase.crashlytics)
implementation(libs.hilt.android)
implementation(libs.hilt.navigation.compose)
implementation(libs.javapoet)
implementation(libs.metro.runtime)
implementation(libs.metrox.android)
implementation(libs.metrox.viewmodel)
implementation(libs.metrox.viewmodel.compose)
implementation(libs.kotlin.math)
implementation(platform(libs.compose.bom))
implementation(platform(libs.firebase.bom))
Expand All @@ -135,31 +132,24 @@ dependencies {
implementation(libs.datastore.preferences)
implementation(libs.mixpanel)

ksp(libs.hilt.android.compiler)

debugImplementation(libs.compose.ui.test.manifest)

kspTest(libs.hilt.android.compiler)
testImplementation(libs.coroutines.android)
testImplementation(libs.coroutines.test)
testImplementation(libs.hilt.android)
testImplementation(libs.junit)
testImplementation(libs.junit.jupiter)
testImplementation(libs.mockito.kotlin)
testImplementation(libs.turbine)
testImplementation(libs.truth)

androidTestImplementation(platform(libs.compose.bom))
androidTestImplementation(libs.hilt.android)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.androidx.test.ext.junit.ktx)
androidTestImplementation(libs.androidx.test.rules)
androidTestImplementation(libs.androidx.test.runner)
androidTestImplementation(libs.compose.ui.test.junit4)
androidTestImplementation(libs.espresso.core)
androidTestImplementation(libs.hilt.testing)
androidTestImplementation(libs.mockito.android)
kspAndroidTest(libs.hilt.android.compiler)
}

simpleFlank {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.device.DeviceController
import androidx.test.rule.GrantPermissionRule
import dagger.hilt.android.testing.HiltAndroidTest
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Rule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ package dev.simonas.quies
import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner
import dagger.hilt.android.testing.HiltTestApplication

class HiltTestRunner : AndroidJUnitRunner() {
class MetroTestRunner : AndroidJUnitRunner() {

override fun newApplication(
cl: ClassLoader?,
Expand All @@ -14,7 +13,7 @@ class HiltTestRunner : AndroidJUnitRunner() {
): Application =
super.newApplication(
cl,
HiltTestApplication::class.java.name,
TestApp::class.java.name,
context,
)
}
2 changes: 0 additions & 2 deletions app/src/androidTest/java/dev/simonas/quies/Screenshots.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@ package dev.simonas.quies

import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import dagger.hilt.android.testing.HiltAndroidTest
import org.junit.Ignore
import org.junit.Test

@HiltAndroidTest
internal class Screenshots : UITest() {

@Ignore("Needs Impl")
Expand Down
30 changes: 0 additions & 30 deletions app/src/androidTest/java/dev/simonas/quies/TestAnalyticsModule.kt

This file was deleted.

88 changes: 88 additions & 0 deletions app/src/androidTest/java/dev/simonas/quies/TestApp.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package dev.simonas.quies

import android.app.Application
import android.content.Context
import dev.simonas.quies.analytics.EventTracker
import dev.simonas.quies.data.DataSource
import dev.simonas.quies.data.EncryptedDataSource
import dev.simonas.quies.data.GameSetRepository
import dev.simonas.quies.data.QuestionRepository
import dev.simonas.quies.data.SourceGameSetRepository
import dev.simonas.quies.data.SourceQuestionsRepository
import dev.simonas.quies.storage.JetpackStore
import dev.simonas.quies.storage.Store
import dev.simonas.quies.utils.SeqRandom
import dev.simonas.quies.utils.logd
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Binds
import dev.zacsweers.metro.DependencyGraph
import dev.zacsweers.metro.Provides
import dev.zacsweers.metro.SingleIn
import dev.zacsweers.metro.createGraphFactory
import dev.zacsweers.metrox.android.MetroAppComponentProviders
import dev.zacsweers.metrox.android.MetroApplication
import dev.zacsweers.metrox.viewmodel.ViewModelGraph
import kotlin.random.Random

@DependencyGraph(AppScope::class)
internal interface TestAppGraph : MetroAppComponentProviders, ViewModelGraph {

val store: Store
val eventTracker: EventTracker

@Provides
@SingleIn(AppScope::class)
fun random(): Random = SeqRandom()

@Provides
@SingleIn(AppScope::class)
fun appCoroutineScope(): AppCoroutineScope = GlobalAppScope()

@Provides
fun context(application: Application): Context = application

@Provides
@SingleIn(AppScope::class)
fun dataSource(context: Context): DataSource =
EncryptedDataSource(context = context)

@Provides
@SingleIn(AppScope::class)
fun questionRepository(source: DataSource): QuestionRepository =
SourceQuestionsRepository(dataSource = source)

@Provides
@SingleIn(AppScope::class)
fun gameSetRepository(source: DataSource): GameSetRepository =
SourceGameSetRepository(dataSource = source)

@Provides
@SingleIn(AppScope::class)
fun eventTracker(): EventTracker =
object : EventTracker {
override fun send(key: String, meta: Map<String, String>) {
logd("EventTracker: $key and $meta")
}
}

@Binds
val JetpackStore.bindStore: Store

@DependencyGraph.Factory
fun interface Factory {
fun create(@Provides application: Application): TestAppGraph
}
}

internal class TestApp : Application(), MetroApplication, AppGraphHolder {

private val testGraph: TestAppGraph by lazy {
createGraphFactory<TestAppGraph.Factory>().create(this)
}

override val appComponentProviders: MetroAppComponentProviders
get() = testGraph

override val store: Store get() = testGraph.store
override val eventTracker get() = testGraph.eventTracker
}
21 changes: 0 additions & 21 deletions app/src/androidTest/java/dev/simonas/quies/TestAppModule.kt

This file was deleted.

24 changes: 6 additions & 18 deletions app/src/androidTest/java/dev/simonas/quies/UITest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,42 +3,30 @@ package dev.simonas.quies
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.rules.ActivityScenarioRule
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import dev.simonas.quies.onboarding.OnboardingRepository
import dev.simonas.quies.storage.Store
import dev.simonas.quies.utils.instrumentationExec
import javax.inject.Inject
import kotlinx.coroutines.runBlocking
import org.junit.Before
import org.junit.Rule
import org.junit.rules.RuleChain

internal typealias ActivityRule = AndroidComposeTestRule<ActivityScenarioRule<MainActivity>, MainActivity>

/**
* Children must be annotated with [HiltAndroidTest]
*/
internal abstract class UITest(
val composeRule: ActivityRule = createAndroidComposeRule<MainActivity>()
): ComposeContentTestRule by composeRule {
) : ComposeContentTestRule by composeRule {

open val skipsOnboarding: Boolean = true

var hiltRule = HiltAndroidRule(this)

@get:Rule
val rule = RuleChain
.outerRule(hiltRule)
.around(composeRule)
val rule = composeRule

@Inject
lateinit var store: Store
val store: Store
get() = (ApplicationProvider.getApplicationContext<TestApp>()).store

@Before
fun hiltInit() {
hiltRule.inject()
fun setUpTestApp() {
runBlocking {
if (skipsOnboarding) {
store.set(OnboardingRepository.KEY_ONBOARDING_COMPLETED, "true")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import dagger.hilt.android.testing.HiltAndroidTest
import dev.simonas.quies.ComponentTest
import dev.simonas.quies.data.Question
import org.junit.Ignore
Expand All @@ -15,7 +14,6 @@ import org.mockito.Mockito.mock
import org.mockito.Mockito.verify

@Ignore("broken due to LocalUiGuides")
@HiltAndroidTest
internal class CardScreenTest : ComponentTest() {

val questionClosed: (Question) -> Unit = mock()
Expand Down
2 changes: 0 additions & 2 deletions app/src/androidTest/java/dev/simonas/quies/card/CardTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@ package dev.simonas.quies.card

import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.onNodeWithText
import dagger.hilt.android.testing.HiltAndroidTest
import dev.simonas.quies.ComponentTest
import org.junit.Ignore
import org.junit.Test

@Ignore("broken due to LocalUiGuides")
@HiltAndroidTest
class CardTest : ComponentTest() {

@Test
Expand Down
2 changes: 0 additions & 2 deletions app/src/androidTest/java/dev/simonas/quies/card/CardUITest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTouchInput
import dagger.hilt.android.testing.HiltAndroidTest
import dev.simonas.quies.UITest
import dev.simonas.quies.card.CardScreen2.questionState
import dev.simonas.quies.gamesets.GameSetsScreen
Expand All @@ -22,7 +21,6 @@ import org.junit.Test
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds

@HiltAndroidTest
internal class CardUITest : UITest() {

private fun onNodeWithState(state: QuestionComponent.State) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@ package dev.simonas.quies.gamesets

import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import dagger.hilt.android.testing.HiltAndroidTest
import dev.simonas.quies.UITest
import dev.simonas.quies.card.showsCardScreen
import org.junit.Test

@HiltAndroidTest
internal class GameSetsUITest : UITest() {

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,16 @@ import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.onNodeWithTag
import androidx.test.espresso.IdlingPolicies
import androidx.test.espresso.IdlingRegistry
import dagger.hilt.android.testing.HiltAndroidTest
import dev.simonas.quies.UITest
import dev.simonas.quies.gamesets.GameSetsScreen
import dev.simonas.quies.gamesets.showsGameSetsScreen
import dev.simonas.quies.onboarding.OnboardingRepository.Companion.KEY_ONBOARDING_COMPLETED
import dev.simonas.quies.storage.Store
import javax.inject.Inject
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import org.junit.Ignore
import org.junit.Test

@HiltAndroidTest
internal class OnboardingUITest : UITest() {

override val skipsOnboarding: Boolean = false
Expand Down
Loading
Loading