Dodaj pewny outbox uploadu zdjęć
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
package pl.firmatpp.kierowca.data
|
||||
|
||||
import java.io.IOException
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class ApiErrorMapperTest {
|
||||
@Test
|
||||
fun mapsNetworkFailuresToRetryableOfflineMessage() {
|
||||
val error = ApiErrorMapper.map(IOException("timeout"))
|
||||
|
||||
assertEquals(ApiErrorKind.Network, error.kind)
|
||||
assertTrue(error.retryable)
|
||||
assertEquals("Nie udało się połączyć z serwerem. Operacja nie została potwierdzona.", error.message)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun mapsMobileApiProblemCodes() {
|
||||
val error = ApiErrorMapper.mapProblem(
|
||||
statusCode = 422,
|
||||
code = "PHOTO_IDEMPOTENCY_CONFLICT",
|
||||
message = "Ten upload został już użyty dla innego zdjęcia.",
|
||||
retryable = false,
|
||||
)
|
||||
|
||||
assertEquals(ApiErrorKind.Validation, error.kind)
|
||||
assertFalse(error.retryable)
|
||||
assertEquals("PHOTO_IDEMPOTENCY_CONFLICT", error.code)
|
||||
assertEquals("Ten upload został już użyty dla innego zdjęcia.", error.message)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun mapsServerErrorsToRetryableUnconfirmedMessage() {
|
||||
val error = ApiErrorMapper.mapHttpStatus(503, null)
|
||||
|
||||
assertEquals(ApiErrorKind.Server, error.kind)
|
||||
assertTrue(error.retryable)
|
||||
assertEquals("Serwer nie potwierdził operacji. Aplikacja spróbuje ponownie.", error.message)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package pl.firmatpp.kierowca.data.upload
|
||||
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import pl.firmatpp.kierowca.data.model.PhotoUploadReceiptDto
|
||||
|
||||
class PhotoUploadReceiptVerifierTest {
|
||||
private val upload = PhotoUploadEntity(
|
||||
clientRequestId = "6f7a7d10-b7f7-41ab-8f5e-f1afc3e93736",
|
||||
routeId = "10",
|
||||
localPath = "/tmp/photo.jpg",
|
||||
source = "camera",
|
||||
takenAt = null,
|
||||
latitude = null,
|
||||
longitude = null,
|
||||
locationAccuracyMeters = null,
|
||||
mimeType = "image/jpeg",
|
||||
size = 1200,
|
||||
contentSha256 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
)
|
||||
|
||||
@Test
|
||||
fun confirmsOnlyMatchingReceipt() {
|
||||
assertTrue(
|
||||
PhotoUploadReceiptVerifier.matches(
|
||||
upload,
|
||||
PhotoUploadReceiptDto(
|
||||
clientRequestId = upload.clientRequestId,
|
||||
serverPhotoId = "55",
|
||||
contentSha256 = upload.contentSha256.uppercase(),
|
||||
storedAt = "2026-07-01T10:00:00+02:00",
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun rejectsDifferentRequestOrHash() {
|
||||
assertFalse(
|
||||
PhotoUploadReceiptVerifier.matches(
|
||||
upload,
|
||||
PhotoUploadReceiptDto(
|
||||
clientRequestId = "other",
|
||||
serverPhotoId = "55",
|
||||
contentSha256 = upload.contentSha256,
|
||||
storedAt = null,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
assertFalse(
|
||||
PhotoUploadReceiptVerifier.matches(
|
||||
upload,
|
||||
PhotoUploadReceiptDto(
|
||||
clientRequestId = upload.clientRequestId,
|
||||
serverPhotoId = "55",
|
||||
contentSha256 = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||
storedAt = null,
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package pl.firmatpp.kierowca.data.upload
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class PhotoUploadStatusTest {
|
||||
@Test
|
||||
fun onlyConfirmedStatusIsStoredOnServer() {
|
||||
assertFalse(PhotoUploadStatus.Pending.isStoredOnServer)
|
||||
assertFalse(PhotoUploadStatus.Uploading.isStoredOnServer)
|
||||
assertFalse(PhotoUploadStatus.Verifying.isStoredOnServer)
|
||||
assertFalse(PhotoUploadStatus.FailedRetryable.isStoredOnServer)
|
||||
assertFalse(PhotoUploadStatus.FailedPermanent.isStoredOnServer)
|
||||
assertFalse(PhotoUploadStatus.Cancelled.isStoredOnServer)
|
||||
assertTrue(PhotoUploadStatus.Confirmed.isStoredOnServer)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun statusLabelsMakeUnconfirmedStateExplicit() {
|
||||
assertEquals("Czeka na wysłanie", PhotoUploadStatus.Pending.label)
|
||||
assertEquals("Wysyłam zdjęcie", PhotoUploadStatus.Uploading.label)
|
||||
assertEquals("Sprawdzam zapis", PhotoUploadStatus.Verifying.label)
|
||||
assertEquals("Nie wysłano, ponów", PhotoUploadStatus.FailedRetryable.label)
|
||||
assertEquals("Zdjęcie nie zostało zapisane", PhotoUploadStatus.FailedPermanent.label)
|
||||
assertEquals("Zapisane", PhotoUploadStatus.Confirmed.label)
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package pl.firmatpp.kierowca.ui
|
||||
|
||||
import java.time.LocalDate
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
@@ -20,4 +21,13 @@ class DriverUiRulesTest {
|
||||
assertFalse(canManageRoutePhotos("", today))
|
||||
assertFalse(canManageRoutePhotos("not-a-date", today))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun calculatesPhotoGridRowsForTwoColumnInlineGallery() {
|
||||
assertEquals(0, inlinePhotoGridRows(0))
|
||||
assertEquals(1, inlinePhotoGridRows(1))
|
||||
assertEquals(1, inlinePhotoGridRows(2))
|
||||
assertEquals(2, inlinePhotoGridRows(3))
|
||||
assertEquals(3, inlinePhotoGridRows(5))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user