From c646709438293ef16a196d4b6028941801c1f6e4 Mon Sep 17 00:00:00 2001 From: Jeena Date: Mon, 9 Mar 2026 12:04:14 +0000 Subject: [PATCH] test(US-11): add failing tests for settings persistence --- app/build.gradle.kts | 1 + .../net/jeena/pacer/SettingsRepositoryTest.kt | 79 +++++++++++++++++++ gradle/libs.versions.toml | 2 + 3 files changed, 82 insertions(+) create mode 100644 app/src/test/kotlin/net/jeena/pacer/SettingsRepositoryTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 24eef48..faaa282 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -55,6 +55,7 @@ dependencies { implementation(libs.lifecycle.viewmodel.compose) testImplementation(libs.junit) + testImplementation(libs.mockito.kotlin) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) diff --git a/app/src/test/kotlin/net/jeena/pacer/SettingsRepositoryTest.kt b/app/src/test/kotlin/net/jeena/pacer/SettingsRepositoryTest.kt new file mode 100644 index 0000000..fdbe464 --- /dev/null +++ b/app/src/test/kotlin/net/jeena/pacer/SettingsRepositoryTest.kt @@ -0,0 +1,79 @@ +package net.jeena.pacer + +import android.content.Context +import android.content.SharedPreferences +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SettingsRepositoryTest { + + private lateinit var prefs: SharedPreferences + private lateinit var editor: SharedPreferences.Editor + private lateinit var context: Context + private lateinit var repo: SettingsRepository + + @Before + fun setUp() { + editor = mock() + whenever(editor.putInt(any(), any())).thenReturn(editor) + whenever(editor.putFloat(any(), any())).thenReturn(editor) + + prefs = mock() + whenever(prefs.edit()).thenReturn(editor) + whenever(prefs.getInt(eq(SettingsRepository.KEY_BPM), any())).thenReturn(120) + whenever(prefs.getFloat(eq(SettingsRepository.KEY_VOLUME), any())).thenReturn(1f) + + context = mock() + whenever(context.getSharedPreferences(any(), any())).thenReturn(prefs) + + repo = SettingsRepository(context) + } + + @Test + fun `saveBpm writes to shared preferences`() { + repo.saveBpm(130) + verify(editor).putInt(SettingsRepository.KEY_BPM, 130) + verify(editor).apply() + } + + @Test + fun `saveVolume writes to shared preferences`() { + repo.saveVolume(0.7f) + verify(editor).putFloat(SettingsRepository.KEY_VOLUME, 0.7f) + verify(editor).apply() + } + + @Test + fun `loadBpm returns stored value`() { + whenever(prefs.getInt(eq(SettingsRepository.KEY_BPM), any())).thenReturn(130) + assertEquals(130, repo.loadBpm()) + } + + @Test + fun `loadVolume returns stored value`() { + whenever(prefs.getFloat(eq(SettingsRepository.KEY_VOLUME), any())).thenReturn(0.5f) + assertEquals(0.5f, repo.loadVolume()) + } + + @Test + fun `loadBpm returns default 120 when nothing saved`() { + whenever(prefs.getInt(eq(SettingsRepository.KEY_BPM), any())).thenAnswer { + it.getArgument(1) as Int + } + assertEquals(120, repo.loadBpm()) + } + + @Test + fun `loadVolume returns default 1f when nothing saved`() { + whenever(prefs.getFloat(eq(SettingsRepository.KEY_VOLUME), any())).thenAnswer { + it.getArgument(1) as Float + } + assertEquals(1f, repo.loadVolume()) + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5b4e13b..3fca397 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,6 +6,7 @@ lifecycleRuntimeKtx = "2.8.3" activityCompose = "1.9.0" composeBom = "2024.06.00" junit = "4.13.2" +mockitoKotlin = "5.4.0" androidxJunit = "1.2.1" espressoCore = "3.6.1" @@ -23,6 +24,7 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit androidx-material3 = { group = "androidx.compose.material3", name = "material3" } lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" } junit = { group = "junit", name = "junit", version.ref = "junit" } +mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockitoKotlin" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidxJunit" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }