diff --git a/app/build.gradle b/app/build.gradle index 5aa00055f..461678419 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.michaldrabik.showly2" minSdkVersion 21 targetSdkVersion 29 - versionCode 44 - versionName "1.1.2" + versionCode 45 + versionName "1.1.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -85,6 +85,8 @@ dependencies { debugImplementation 'com.amitshekhar.android:debug-db:1.0.6' testImplementation 'junit:junit:4.12' + testImplementation 'io.mockk:mockk:1.9.3' + testImplementation 'com.google.truth:truth:1.0.1' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } diff --git a/app/src/test/java/com/michaldrabik/showly2/repository/settings/SettingsRepositoryTest.kt b/app/src/test/java/com/michaldrabik/showly2/repository/settings/SettingsRepositoryTest.kt new file mode 100644 index 000000000..17f6436ba --- /dev/null +++ b/app/src/test/java/com/michaldrabik/showly2/repository/settings/SettingsRepositoryTest.kt @@ -0,0 +1,95 @@ +package com.michaldrabik.showly2.repository.settings + +import androidx.room.withTransaction +import com.google.common.truth.Truth.assertThat +import com.michaldrabik.showly2.R +import com.michaldrabik.showly2.model.Settings +import com.michaldrabik.showly2.model.mappers.Mappers +import com.michaldrabik.showly2.model.mappers.SettingsMapper +import com.michaldrabik.storage.database.AppDatabase +import com.michaldrabik.storage.database.dao.SettingsDao +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.confirmVerified +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.mockkStatic +import io.mockk.slot +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test + +class SettingsRepositoryTest { + + @MockK lateinit var database: AppDatabase + @MockK lateinit var settingsDao: SettingsDao + @MockK lateinit var mappers: Mappers + + private lateinit var SUT: SettingsRepository + + @Before + fun setUp() { + MockKAnnotations.init(this) + mockkStatic("androidx.room.RoomDatabaseKt") + val lambda = slot R>() + coEvery { database.withTransaction(capture(lambda)) } coAnswers { lambda.captured.invoke() } + + every { database.settingsDao() } returns settingsDao + + SUT = SettingsRepository(database, mappers) + } + + @Test + fun `Should be initialized if there are settings in database`() { + runBlocking { + coEvery { settingsDao.getCount() } returns 1 + assertThat(SUT.isInitialized()).isTrue() + } + } + + @Test + fun `Should not be initialized if there are no settings in database`() { + runBlocking { + coEvery { settingsDao.getCount() } returns 0 + assertThat(SUT.isInitialized()).isFalse() + } + } + + @Test + fun `Should load settings properly`() { + runBlocking { + val mapper = SettingsMapper() + val settings = Settings.createInitial() + val settingsDb = mapper.toDatabase(settings) + + coEvery { mappers.settings } returns mapper + coEvery { settingsDao.getAll() } returns settingsDb + + val loaded = SUT.load() + + assertThat(loaded).isEqualTo(settings) + coVerify { settingsDao.getAll() } + confirmVerified(settingsDao) + } + } + + @Test + fun `Should update settings properly`() { + runBlocking { + val mapper = SettingsMapper() + val settings = Settings.createInitial() + val settingsDb = mapper.toDatabase(settings) + + coEvery { mappers.settings } returns mapper + coEvery { settingsDao.upsert(settingsDb) } just Runs + + SUT.update(settings) + + coVerify { settingsDao.upsert(settingsDb) } + confirmVerified(settingsDao) + } + } +} \ No newline at end of file