outbox sync

This commit is contained in:
m
2026-09-13 10:09:21 +02:00
parent bad04b3219
commit 0b12f45b6c
5 changed files with 31 additions and 3 deletions
+4 -1
View File
@@ -23,11 +23,14 @@ cd backend && go test ./...
mise up_mobile [device|emulator] # défaut: emulator mise up_mobile [device|emulator] # défaut: emulator
cd mobile-kotlin && ./gradlew :app:assembleDebug cd mobile-kotlin && ./gradlew :app:assembleDebug
# Frontend tests (JVM, Robolectric + Room in-memory)
cd mobile-kotlin && ./gradlew :app:testDebugUnitTest
# PostgreSQL (via docker-compose) # PostgreSQL (via docker-compose)
docker compose up postgres -d 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 ## Backend Structure
+12
View File
@@ -40,6 +40,11 @@ android {
compose = true compose = true
buildConfig = true buildConfig = true
} }
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
} }
dependencies { dependencies {
@@ -81,4 +86,11 @@ dependencies {
implementation(libs.coil.compose) implementation(libs.coil.compose)
debugImplementation(libs.androidx.compose.ui.tooling) 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)
} }
@@ -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.ApiClient
import com.vaultdrop.mobile.data.remote.dto.FileDto import com.vaultdrop.mobile.data.remote.dto.FileDto
import com.vaultdrop.mobile.domain.GenerateId import com.vaultdrop.mobile.domain.GenerateId
import com.vaultdrop.mobile.domain.SyncPlacement
import com.vaultdrop.mobile.domain.computeCategory import com.vaultdrop.mobile.domain.computeCategory
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import javax.inject.Inject import javax.inject.Inject
@@ -173,7 +174,7 @@ class FileRepository @Inject constructor(
// Le snapshot serveur confirme la présence cloud : si une copie // Le snapshot serveur confirme la présence cloud : si une copie
// physique existe aussi, placement local-cloud (jamais d'écrasement // physique existe aussi, placement local-cloud (jamais d'écrasement
// de l'uri / de régression du placement). // 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, processed = existing?.processed ?: false,
addedAt = existing?.addedAt ?: now, addedAt = existing?.addedAt ?: now,
updatedAt = now, updatedAt = now,
@@ -9,6 +9,7 @@ import com.vaultdrop.mobile.data.remote.ApiClient
import com.vaultdrop.mobile.data.remote.dto.FolderDto import com.vaultdrop.mobile.data.remote.dto.FolderDto
import com.vaultdrop.mobile.domain.DeviceIdentity import com.vaultdrop.mobile.domain.DeviceIdentity
import com.vaultdrop.mobile.domain.GenerateId import com.vaultdrop.mobile.domain.GenerateId
import com.vaultdrop.mobile.domain.SyncPlacement
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@@ -77,7 +78,7 @@ class FolderRepository @Inject constructor(
// Le snapshot serveur confirme la présence cloud : si une copie // Le snapshot serveur confirme la présence cloud : si une copie
// physique existe aussi, placement local-cloud (jamais d'écrasement // physique existe aussi, placement local-cloud (jamais d'écrasement
// de l'uri / de régression du placement). // 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, addedAt = existing?.addedAt ?: now,
updatedAt = now, updatedAt = now,
) )
+11
View File
@@ -17,6 +17,11 @@ moshi = "1.15.1"
securityCrypto = "1.0.0" securityCrypto = "1.0.0"
timber = "5.0.1" timber = "5.0.1"
coil = "2.7.0" 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] [libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } 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" } androidx-security-crypto = { group = "androidx.security", name = "security-crypto", version.ref = "securityCrypto" }
timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" }
coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } 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] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }