Skip to content

Commit

Permalink
feat: migrate dagger/hilt to koin for multiplatform DI (#434)
Browse files Browse the repository at this point in the history
  • Loading branch information
David Ly committed Sep 12, 2023
1 parent d500aa4 commit 147bc9c
Show file tree
Hide file tree
Showing 228 changed files with 1,464 additions and 1,490 deletions.
23 changes: 12 additions & 11 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import java.util.Properties
plugins {
id("ly.david.android.application")
id("ly.david.android.compose")
alias(libs.plugins.hilt)
alias(libs.plugins.ksp)
alias(libs.plugins.paparazzi)
}
Expand Down Expand Up @@ -99,28 +98,30 @@ dependencies {
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
implementation(libs.firebase.crashlytics)
implementation(libs.hilt.android)
implementation(libs.hilt.navigation.compose)
implementation(libs.koin.android)
implementation(libs.koin.androidx.compose)
implementation(libs.koin.annotations)
implementation(libs.koin.core)
implementation(libs.timber)

debugImplementation(libs.compose.ui.tooling)
debugImplementation(libs.leakcanary.android)

testImplementation(projects.testData)
testImplementation(libs.junit)
testImplementation(libs.koin.test)
testImplementation(libs.bundles.kotlinx.coroutines)

androidTestImplementation(projects.testData)
androidTestImplementation(libs.coil.test)
androidTestImplementation(libs.compose.ui.test)
androidTestImplementation(libs.hilt.android.testing)
androidTestImplementation(libs.bundles.kotlinx.coroutines)
androidTestImplementation(libs.room.testing)
androidTestImplementation(libs.androidx.test.junit)
androidTestImplementation(libs.androidx.test.espresso.core)
androidTestImplementation(libs.androidx.arch.core.testing)
androidTestImplementation(libs.bundles.kotlinx.coroutines)
androidTestImplementation(libs.coil.test)
androidTestImplementation(libs.compose.ui.test)
androidTestImplementation(libs.koin.test)
androidTestImplementation(libs.room.testing)

ksp(libs.hilt.android.compiler)

kspAndroidTest(libs.hilt.android.compiler)
ksp(libs.koin.ksp.compiler)
kspAndroidTest(libs.koin.ksp.compiler)
}
1 change: 1 addition & 0 deletions app/config/baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<ID>ComposableParamOrder:SeriesStatsScreen.kt$SeriesStatsScreen</ID>
<ID>ComposableParamOrder:WorkDetailsScreen.kt$WorkDetailsScreen</ID>
<ID>ComposableParamOrder:WorkStatsScreen.kt$WorkGroupStatsScreen</ID>
<ID>LongParameterList:TopLevelViewModel.kt$TopLevelViewModel$( val appPreferences: AppPreferences, private val musicBrainzOAuthInfo: MusicBrainzOAuthInfo, private val collectionDao: CollectionDao, private val collectionEntityDao: CollectionEntityDao, private val musicBrainzApi: MusicBrainzApi, private val musicBrainzAuthStore: MusicBrainzAuthStore, private val authRequest: AuthorizationRequest, private val authService: AuthorizationService, private val clientAuth: ClientAuthentication, private val lookupHistoryRepository: LookupHistoryRepository, )</ID>
<ID>MaxLineLength:InstrumentDetailsScreen.kt$description</ID>
<ID>MaxLineLength:RecordingsByWorkViewModel.kt$RecordingsByWorkViewModel$)</ID>
<ID>ModifierWithoutDefault:ReleaseGroupsByArtistScreen.kt$modifier</ID>
Expand Down
3 changes: 1 addition & 2 deletions app/src/androidTest/java/ly/david/mbjc/CustomTestRunner.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import android.content.Context
import android.os.Bundle
import android.os.StrictMode
import androidx.test.runner.AndroidJUnitRunner
import dagger.hilt.android.testing.HiltTestApplication

// A custom runner to set up the instrumented application class for tests.
// It shows as unused but it's used in our build.gradle file.
Expand All @@ -18,6 +17,6 @@ class CustomTestRunner : AndroidJUnitRunner() {
}

override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application {
return super.newApplication(cl, HiltTestApplication::class.java.name, context)
return super.newApplication(cl, TestApplication::class.java.name, context)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package ly.david.mbjc
import androidx.activity.compose.setContent
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import dagger.hilt.android.testing.HiltAndroidTest
import kotlinx.coroutines.test.runTest
import ly.david.data.core.network.MusicBrainzEntity
import ly.david.mbjc.ui.TopLevelScaffold
Expand All @@ -14,7 +13,6 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@HiltAndroidTest
@RunWith(Parameterized::class)
internal class LookupEachEntityErrorTest(
private val entity: MusicBrainzEntity
Expand Down
13 changes: 9 additions & 4 deletions app/src/androidTest/java/ly/david/mbjc/MainActivityTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,21 @@ import androidx.compose.ui.test.onAllNodesWithText
import androidx.compose.ui.test.onFirst
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import dagger.hilt.android.testing.HiltAndroidRule
import ly.david.data.room.MusicSearchRoomDatabase
import ly.david.mbjc.ui.MainActivity
import org.junit.Rule
import org.koin.test.KoinTest
import org.koin.test.inject

internal abstract class MainActivityTest : KoinTest {

private val database: MusicSearchRoomDatabase by inject()

internal abstract class MainActivityTest {
@get:Rule(order = 0)
val hiltRule: HiltAndroidRule by lazy { HiltAndroidRule(this) }
val musicSearchRoomDatabaseTestRule = MusicSearchRoomDatabaseTestRule(database)

@get:Rule(order = 1)
var instantTaskExecutorRule = InstantTaskExecutorRule()
val instantTaskExecutorRule = InstantTaskExecutorRule()

// val composeTestRule = createComposeRule() if we don't need activity
// great for testing individual UI pieces
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ly.david.mbjc

import ly.david.data.room.MusicSearchRoomDatabase
import org.junit.rules.TestWatcher
import org.junit.runner.Description

class MusicSearchRoomDatabaseTestRule(
private val database: MusicSearchRoomDatabase,
) : TestWatcher() {
override fun starting(description: Description) {
super.starting(description)
}

override fun finished(description: Description) {
super.finished(description)
database.clearAllTables()
}
}
51 changes: 51 additions & 0 deletions app/src/androidTest/java/ly/david/mbjc/TestAndroidAppModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package ly.david.mbjc

import ly.david.data.coverart.CoverArtDataModule
import ly.david.data.di.auth.AuthStoreModule
import ly.david.data.di.coroutines.coroutinesScopesModule
import ly.david.data.di.logging.loggingModule
import ly.david.data.di.musicbrainz.musicBrainzAuthModule
import ly.david.data.di.room.databaseDaoModule
import ly.david.data.domain.DomainDataModule
import ly.david.data.musicbrainz.auth.MusicBrainzDataModule
import ly.david.data.spotify.di.SpotifyDataModule
import ly.david.mbjc.di.appDataModule
import ly.david.mbjc.di.testCoroutineDispatchersModule
import ly.david.mbjc.di.testDatabaseModule
import ly.david.mbjc.di.testImageModule
import ly.david.mbjc.di.testNetworkModule
import ly.david.mbjc.di.testPreferencesDataStoreModule
import ly.david.ui.collections.CollectionUiModule
import ly.david.ui.common.CommonUiModule
import ly.david.ui.history.HistoryUiModule
import ly.david.ui.nowplaying.NowPlayingUiModule
import ly.david.ui.settings.SettingsUiModule
import org.koin.dsl.module
import org.koin.ksp.generated.module

val testAndroidAppModule = module {
includes(
testCoroutineDispatchersModule,
testNetworkModule,
testPreferencesDataStoreModule,
testDatabaseModule,
testImageModule,

ViewModelsModule().module,
appDataModule,
coroutinesScopesModule,
loggingModule,
musicBrainzAuthModule,
databaseDaoModule,
CoverArtDataModule().module,
DomainDataModule().module,
MusicBrainzDataModule().module,
SpotifyDataModule().module,
AuthStoreModule().module,
CollectionUiModule().module,
CommonUiModule().module,
HistoryUiModule().module,
NowPlayingUiModule().module,
SettingsUiModule().module,
)
}
21 changes: 21 additions & 0 deletions app/src/androidTest/java/ly/david/mbjc/TestApplication.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ly.david.mbjc

import android.app.Application
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin

class TestApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@TestApplication)
modules(testAndroidAppModule)
}
}

override fun onTerminate() {
super.onTerminate()
stopKoin()
}
}
45 changes: 0 additions & 45 deletions app/src/androidTest/java/ly/david/mbjc/di/FakeImageModule.kt

This file was deleted.

52 changes: 0 additions & 52 deletions app/src/androidTest/java/ly/david/mbjc/di/FakeNetworkModule.kt

This file was deleted.

This file was deleted.

Loading

0 comments on commit 147bc9c

Please sign in to comment.