Implement driver route lifecycle flow

This commit is contained in:
admin
2026-07-07 12:29:12 +02:00
parent 1834763f19
commit 13159c576e
22 changed files with 1687 additions and 110 deletions
@@ -7,6 +7,7 @@ import org.junit.Assert.assertTrue
import org.junit.Test
import pl.firmatpp.kierowca.data.model.DriverRouteDto
import pl.firmatpp.kierowca.data.model.DispatchSheetReminderDto
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity
class DriverUiRulesTest {
@@ -246,6 +247,44 @@ class DriverUiRulesTest {
assertEquals("Popraw", dispatchSheetPrimaryActionLabel(dispatchReminder(status = "uploaded"), hasQueuedUpload = false))
}
@Test
fun routeStageFormRequiresPositiveWeightAndAtLeastOnePhotoOrQueuedUpload() {
assertTrue(canSubmitRouteStageForm(weightText = "12,5", serverPhotoCount = 1, localUploadCount = 0))
assertTrue(canSubmitRouteStageForm(weightText = "12.5", serverPhotoCount = 0, localUploadCount = 1))
assertFalse(canSubmitRouteStageForm(weightText = "", serverPhotoCount = 1, localUploadCount = 0))
assertFalse(canSubmitRouteStageForm(weightText = "0", serverPhotoCount = 1, localUploadCount = 0))
assertFalse(canSubmitRouteStageForm(weightText = "12.5", serverPhotoCount = 0, localUploadCount = 0))
}
@Test
fun filtersRoutePhotosByStageWithOtherFallback() {
val photos = listOf(
photo("1", stage = "loading"),
photo("2", stage = "unloading"),
photo("3", stage = null),
)
assertEquals(listOf("1"), routePhotosForStage(photos, "loading").map { it.id })
assertEquals(listOf("2"), routePhotosForStage(photos, "unloading").map { it.id })
assertEquals(listOf("3"), routePhotosForStage(photos, "other").map { it.id })
}
@Test
fun choosesAdaptiveGpsUploadIntervalForActiveRoute() {
assertEquals(45, activeRouteUploadIntervalSeconds(isMoving = false))
assertEquals(20, activeRouteUploadIntervalSeconds(isMoving = true))
assertEquals(5, activeRouteUploadIntervalSeconds(isMoving = true, isUrbanOrTurning = true))
assertEquals(5, activeRouteUploadIntervalSeconds(isMoving = true, isNearDestination = true))
assertEquals(20, activeRouteUploadIntervalSeconds(isMoving = true, isHighwayStable = true))
assertEquals(3, activeRouteUploadIntervalSeconds(isMoving = true, isLikelyOffRoute = true))
}
@Test
fun notificationTapTargetsFinishScreenOnlyAfterArrival() {
assertEquals(DriverScreen.Detail, activeRouteNotificationTarget(arrived = false))
assertEquals(DriverScreen.FinishRoute, activeRouteNotificationTarget(arrived = true))
}
private fun route(status: String): DriverRouteDto =
DriverRouteDto(
id = "1",
@@ -279,6 +318,24 @@ class DriverUiRulesTest {
serverPhotoId = serverPhotoId,
)
private fun photo(id: String, stage: String?): RoutePhotoDto =
RoutePhotoDto(
id = id,
routeId = "10",
clientRequestId = null,
contentSha256 = null,
source = "camera",
stage = stage ?: "other",
mimeType = "image/jpeg",
size = 1200,
url = "https://example.test/$id.jpg",
takenAt = null,
latitude = null,
longitude = null,
locationAccuracyMeters = null,
createdAt = null,
)
private fun dispatchReminder(status: String, dueToday: Boolean = true): DispatchSheetReminderDto =
DispatchSheetReminderDto(
enabled = dueToday,