diff --git a/AGENTS.md b/AGENTS.md index 9494667..39ab94a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -23,11 +23,14 @@ cd backend && go test ./... mise up_mobile [device|emulator] # défaut: emulator cd mobile-kotlin && ./gradlew :app:assembleDebug +# Frontend tests (JVM, Robolectric + Room in-memory) +cd mobile-kotlin && ./gradlew :app:testDebugUnitTest + # PostgreSQL (via docker-compose) docker compose up postgres -d ``` -Il n'y a **pas** de tests mobiles (pas de dossier `src/test` ni `src/androidTest`). +Tests mobiles : JVM unit tests dans `app/src/test` (JUnit + Robolectric + Room in-memory), lancés via `:app:testDebugUnitTest`. Pas de tests instrumentés (`androidTest`). ## Backend Structure diff --git a/mobile-kotlin/app/build.gradle.kts b/mobile-kotlin/app/build.gradle.kts index 31aa8a5..c9f0a78 100644 --- a/mobile-kotlin/app/build.gradle.kts +++ b/mobile-kotlin/app/build.gradle.kts @@ -40,6 +40,11 @@ android { compose = true buildConfig = true } + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } } dependencies { @@ -81,4 +86,11 @@ dependencies { implementation(libs.coil.compose) debugImplementation(libs.androidx.compose.ui.tooling) + + testImplementation(libs.junit) + testImplementation(libs.robolectric) + testImplementation(libs.androidx.test.core) + testImplementation(libs.androidx.arch.core.testing) + testImplementation(libs.kotlinx.coroutines.test) + testImplementation(libs.androidx.room.testing) } \ No newline at end of file diff --git a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FileRepository.kt b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FileRepository.kt index ca78539..ff46ba1 100644 --- a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FileRepository.kt +++ b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FileRepository.kt @@ -8,6 +8,7 @@ import com.vaultdrop.mobile.data.local.entity.FileStatus import com.vaultdrop.mobile.data.remote.ApiClient import com.vaultdrop.mobile.data.remote.dto.FileDto import com.vaultdrop.mobile.domain.GenerateId +import com.vaultdrop.mobile.domain.SyncPlacement import com.vaultdrop.mobile.domain.computeCategory import kotlinx.coroutines.flow.Flow import javax.inject.Inject @@ -173,7 +174,7 @@ class FileRepository @Inject constructor( // Le snapshot serveur confirme la présence cloud : si une copie // physique existe aussi, placement local-cloud (jamais d'écrasement // de l'uri / de régression du placement). - syncStatus = if (existing?.uri != null) FileStatus.LOCAL_CLOUD else FileStatus.CLOUD, + syncStatus = SyncPlacement.confirmed(existing?.uri != null), processed = existing?.processed ?: false, addedAt = existing?.addedAt ?: now, updatedAt = now, diff --git a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FolderRepository.kt b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FolderRepository.kt index 7dc57d0..497cb0b 100644 --- a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FolderRepository.kt +++ b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FolderRepository.kt @@ -9,6 +9,7 @@ import com.vaultdrop.mobile.data.remote.ApiClient import com.vaultdrop.mobile.data.remote.dto.FolderDto import com.vaultdrop.mobile.domain.DeviceIdentity import com.vaultdrop.mobile.domain.GenerateId +import com.vaultdrop.mobile.domain.SyncPlacement import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -77,7 +78,7 @@ class FolderRepository @Inject constructor( // Le snapshot serveur confirme la présence cloud : si une copie // physique existe aussi, placement local-cloud (jamais d'écrasement // de l'uri / de régression du placement). - syncStatus = if (existing?.uri != null) FolderStatus.LOCAL_CLOUD else FolderStatus.CLOUD, + syncStatus = SyncPlacement.confirmed(existing?.uri != null), addedAt = existing?.addedAt ?: now, updatedAt = now, ) diff --git a/mobile-kotlin/gradle/libs.versions.toml b/mobile-kotlin/gradle/libs.versions.toml index 8f4dc14..12a6e9e 100644 --- a/mobile-kotlin/gradle/libs.versions.toml +++ b/mobile-kotlin/gradle/libs.versions.toml @@ -17,6 +17,11 @@ moshi = "1.15.1" securityCrypto = "1.0.0" timber = "5.0.1" coil = "2.7.0" +junit = "4.13.2" +robolectric = "4.14.1" +androidxTestCore = "1.6.1" +archCore = "2.2.0" +coroutinesTest = "1.9.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -50,6 +55,12 @@ moshi-kotlin = { group = "com.squareup.moshi", name = "moshi-kotlin", version.re androidx-security-crypto = { group = "androidx.security", name = "security-crypto", version.ref = "securityCrypto" } timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" } +androidx-test-core = { group = "androidx.test", name = "core-ktx", version.ref = "androidxTestCore" } +androidx-arch-core-testing = { group = "androidx.arch.core", name = "core-testing", version.ref = "archCore" } +kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutinesTest" } +androidx-room-testing = { group = "androidx.room", name = "room-testing", version.ref = "room" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }