Skip to content

Commit 2a3d065

Browse files
committed
Refresh health insights when AI keys change
1 parent b8e83a5 commit 2a3d065

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

app/src/main/java/com/driezy/medlog/ui/screen/health/HealthViewModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.util.Log
44
import androidx.lifecycle.ViewModel
55
import com.driezy.medlog.ui.BaseViewModel
66
import androidx.lifecycle.viewModelScope
7+
import com.driezy.medlog.ai.AiApiKeyStore
78
import com.driezy.medlog.data.model.HealthRecord
89
import com.driezy.medlog.data.model.HealthRecordSource
910
import com.driezy.medlog.data.model.HealthType
@@ -96,6 +97,7 @@ class HealthViewModel @Inject constructor(
9697
private val repository: HealthRepository,
9798
private val prefsRepository: UserPreferencesRepository,
9899
private val insightGeneration: HealthInsightGenerationUseCase,
100+
private val apiKeyStore: AiApiKeyStore,
99101
private val voiceInputController: VoiceInputController,
100102
) : BaseViewModel() {
101103

@@ -223,7 +225,8 @@ class HealthViewModel @Inject constructor(
223225
combine(
224226
repository.getAllRecords(),
225227
prefsRepository.settingsFlow,
226-
) { records, settings ->
228+
apiKeyStore.availableProviders,
229+
) { records, settings, _ ->
227230
records to settings.userHeightCm
228231
}
229232
.catch { e -> Log.e("HealthVM", "Failed to build health insights", e) }
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.driezy.medlog.ui.screen.health
2+
3+
import java.io.File
4+
import org.junit.Assert.assertTrue
5+
import org.junit.Test
6+
7+
class HealthInsightsAiConnectionCoverageTest {
8+
private val projectRoot = generateSequence(File("").absoluteFile) { it.parentFile }
9+
.first { File(it, "settings.gradle.kts").exists() }
10+
11+
private fun source(path: String) = File(projectRoot, path).readText()
12+
13+
@Test
14+
fun `health insights refresh when cloud ai key availability changes`() {
15+
val viewModel = source("app/src/main/java/com/driezy/medlog/ui/screen/health/HealthViewModel.kt")
16+
17+
assertTrue(viewModel.contains("private val apiKeyStore: AiApiKeyStore"))
18+
assertTrue(viewModel.contains("apiKeyStore.availableProviders"))
19+
assertTrue(viewModel.contains("generateWithStatus("))
20+
}
21+
22+
@Test
23+
fun `health insight use case reports cloud success and records health insight usage`() {
24+
val useCase = source("app/src/main/java/com/driezy/medlog/domain/health/HealthInsightGenerationUseCase.kt")
25+
val cache = source("app/src/main/java/com/driezy/medlog/domain/health/HealthAiPipelineCache.kt")
26+
27+
assertTrue(useCase.contains("HealthCloudInsightGenerationGate.evaluate"))
28+
assertTrue(useCase.contains("AiExecutionStatus.CloudSuccess"))
29+
assertTrue(useCase.contains("AiExecutionStatus.providerError"))
30+
assertTrue(cache.contains("AiUsageFeature.HEALTH_INSIGHT"))
31+
assertTrue(cache.contains("AiAnalysisKind.HEALTH_INSIGHT"))
32+
}
33+
}

0 commit comments

Comments
 (0)