Skip to content

Commit

Permalink
Add attachment verifier
Browse files Browse the repository at this point in the history
  • Loading branch information
kanat authored and JcMinarro committed Jul 4, 2023
1 parent d1ff267 commit 15079e9
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3070,10 +3070,10 @@ internal constructor(
mutableClientState = MutableClientState(module.networkStateProvider),
).apply {
attachmentsSender = AttachmentsSender(
appContext,
uploadAttachmentsNetworkType,
clientState,
clientScope
context = appContext,
networkType = uploadAttachmentsNetworkType,
clientState = clientState,
scope = clientScope
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ internal class AttachmentsSender(
private val networkType: UploadAttachmentsNetworkType,
private val clientState: ClientState,
private val scope: CoroutineScope,
private val verifier: AttachmentsVerifier = AttachmentsVerifier()
) {

private var jobsMap: Map<String, Job> = emptyMap()
Expand All @@ -59,7 +60,7 @@ internal class AttachmentsSender(
isRetrying: Boolean,
repositoryFacade: RepositoryFacade,
): Result<Message> {
return if (!isRetrying) {
val result = if (!isRetrying) {
if (message.hasPendingAttachments()) {
logger.d {
"[sendAttachments] Message ${message.id}" +
Expand All @@ -74,6 +75,7 @@ internal class AttachmentsSender(
logger.d { "[sendAttachments] Retrying Message ${message.id}" }
retryMessage(message, channelType, channelId, repositoryFacade)
}
return verifier.verifyAttachments(result)
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.getstream.chat.android.client.attachment

import io.getstream.chat.android.models.Message
import io.getstream.log.taggedLogger
import io.getstream.result.Error
import io.getstream.result.Result

internal class AttachmentsVerifier {

private val logger by taggedLogger("Chat:AttachmentVerifier")

internal fun verifyAttachments(result: Result<Message>): Result<Message> {
val message = result.getOrNull() ?: return result
logger.d { "[verifyAttachments] #uploader; uploadedAttachments: ${message.attachments}" }
val corruptedAttachment = message.attachments.find {
it.upload != null && it.imageUrl == null && it.assetUrl == null
}
if (corruptedAttachment != null) {
logger.e {
"[verifyAttachments] #uploader; message(${message.id}) has corrupted attachment: $corruptedAttachment"
}
return Result.Failure(
Error.GenericError("Message(${message.id}) contains corrupted attachment: $corruptedAttachment")
)
}
return result
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package io.getstream.chat.android.client.attachment

import io.getstream.chat.android.client.test.randomMessage
import io.getstream.chat.android.models.Attachment
import io.getstream.chat.android.test.TestLoggingHelper
import io.getstream.result.Result
import org.amshove.kluent.`should be equal to`
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import java.io.File

internal class AttachmentsVerifierTests {

private lateinit var verifier: AttachmentsVerifier

@BeforeEach
fun setUp() {
verifier = AttachmentsVerifier()

TestLoggingHelper.initialize()
}

@Test
fun `when verify message with non-File attachment, result must be Successful`() {
/* Given */
val locationAttachment = Attachment(
type = "location",
extraData = mutableMapOf("latitude" to 1.0, "longitude" to 2.0),
uploadState = Attachment.UploadState.Success,
)
val message = randomMessage(attachments = arrayListOf(locationAttachment))
val result = Result.Success(message)

/* When */
val verified = verifier.verifyAttachments(result)

/* Then */
verified.isSuccess `should be equal to` true
}

@Test
fun `when verify message with File attachment, result must be Failure if no CDN urls`() {
/* Given */
val fileAttachment = Attachment(
type = "audio",
mimeType = "audio/mp3",
upload = File("./some.mp3"),
assetUrl = null,
imageUrl = null,
uploadState = Attachment.UploadState.Success,
)
val message = randomMessage(attachments = arrayListOf(fileAttachment))
val result = Result.Success(message)

/* When */
val verified = verifier.verifyAttachments(result)

/* Then */
verified.isFailure `should be equal to` true
}

}

0 comments on commit 15079e9

Please sign in to comment.