From 7380dbbdeaca660ad7b75151395e49ad19ee4ad9 Mon Sep 17 00:00:00 2001 From: Jens Reinemann Date: Wed, 13 May 2026 23:31:42 +0200 Subject: [PATCH] feat(di): Add DatabaseModule with Hilt providers for Room DB and DAOs (#19) - DatabaseModule: @Module + @InstallIn(SingletonComponent) with @Singleton-scoped Room.databaseBuilder provider and four @Provides methods for ItemDao, CategoryDao, LocationDao and SettingsDao - DatabaseModuleTest: smoke-test verifies all four DAO providers return non-null objects using an in-memory Room database --- .../krisenvorrat/app/di/DatabaseModuleTest.kt | 46 +++++++++++++++++++ .../de/krisenvorrat/app/di/DatabaseModule.kt | 37 +++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 app/src/androidTest/java/de/krisenvorrat/app/di/DatabaseModuleTest.kt create mode 100644 app/src/main/java/de/krisenvorrat/app/di/DatabaseModule.kt diff --git a/app/src/androidTest/java/de/krisenvorrat/app/di/DatabaseModuleTest.kt b/app/src/androidTest/java/de/krisenvorrat/app/di/DatabaseModuleTest.kt new file mode 100644 index 0000000..7908a4a --- /dev/null +++ b/app/src/androidTest/java/de/krisenvorrat/app/di/DatabaseModuleTest.kt @@ -0,0 +1,46 @@ +package de.krisenvorrat.app.di + +import android.content.Context +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import de.krisenvorrat.app.data.db.KrisenvorratDatabase +import org.junit.After +import org.junit.Assert.assertNotNull +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +internal class DatabaseModuleTest { + + private lateinit var db: KrisenvorratDatabase + + @After + fun tearDown() { + if (::db.isInitialized) { + db.close() + } + } + + @Test + fun test_provideAllDaos_withInMemoryDb_allDaosAreNonNull() { + // Given + val context = ApplicationProvider.getApplicationContext() + val module = DatabaseModule + + // When + db = Room.inMemoryDatabaseBuilder(context, KrisenvorratDatabase::class.java) + .allowMainThreadQueries() + .build() + val itemDao = module.provideItemDao(db) + val categoryDao = module.provideCategoryDao(db) + val locationDao = module.provideLocationDao(db) + val settingsDao = module.provideSettingsDao(db) + + // Then + assertNotNull(itemDao) + assertNotNull(categoryDao) + assertNotNull(locationDao) + assertNotNull(settingsDao) + } +} diff --git a/app/src/main/java/de/krisenvorrat/app/di/DatabaseModule.kt b/app/src/main/java/de/krisenvorrat/app/di/DatabaseModule.kt new file mode 100644 index 0000000..8d972c2 --- /dev/null +++ b/app/src/main/java/de/krisenvorrat/app/di/DatabaseModule.kt @@ -0,0 +1,37 @@ +package de.krisenvorrat.app.di + +import android.content.Context +import androidx.room.Room +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import de.krisenvorrat.app.data.db.KrisenvorratDatabase +import de.krisenvorrat.app.data.db.dao.CategoryDao +import de.krisenvorrat.app.data.db.dao.ItemDao +import de.krisenvorrat.app.data.db.dao.LocationDao +import de.krisenvorrat.app.data.db.dao.SettingsDao +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object DatabaseModule { + + @Provides + @Singleton + fun provideDatabase(@ApplicationContext context: Context): KrisenvorratDatabase = + Room.databaseBuilder(context, KrisenvorratDatabase::class.java, "krisenvorrat.db").build() + + @Provides + fun provideItemDao(db: KrisenvorratDatabase): ItemDao = db.itemDao() + + @Provides + fun provideCategoryDao(db: KrisenvorratDatabase): CategoryDao = db.categoryDao() + + @Provides + fun provideLocationDao(db: KrisenvorratDatabase): LocationDao = db.locationDao() + + @Provides + fun provideSettingsDao(db: KrisenvorratDatabase): SettingsDao = db.settingsDao() +}