diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt index dd92f451536..05bfc6f1639 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt @@ -43,6 +43,7 @@ import io.getstream.chat.android.models.Member import io.getstream.chat.android.models.MemberData import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.MessageTransformer +import io.getstream.chat.android.models.MessageType import io.getstream.chat.android.models.Mute import io.getstream.chat.android.models.Reaction import io.getstream.chat.android.models.User @@ -53,6 +54,8 @@ internal class DtoMapping( private val userTransformer: UserTransformer, ) { + private val supportedUpstreamMessageTypes = setOf(MessageType.REGULAR, MessageType.SYSTEM) + /** * Converts [Attachment] to [AttachmentDto]. */ @@ -121,6 +124,7 @@ internal class DtoMapping( internal fun Message.toDto(): UpstreamMessageDto = messageTransformer.transform(this) .run { + val upstreamType = if (type in supportedUpstreamMessageTypes) type else "" UpstreamMessageDto( attachments = attachments.map { it.toDto() }, cid = cid, @@ -128,7 +132,7 @@ internal class DtoMapping( args = null, html = html, id = id, - type = type, + type = upstreamType, mentioned_users = mentionedUsersIds, parent_id = parentId, pin_expires = pinExpires, diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt index baedd9a6b3c..cc155118c90 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt @@ -35,6 +35,7 @@ import io.getstream.chat.android.client.api2.model.dto.UpstreamReactionDto import io.getstream.chat.android.client.api2.model.dto.UpstreamUserDto import io.getstream.chat.android.client.test.randomConnectedEvent import io.getstream.chat.android.models.MessageTransformer +import io.getstream.chat.android.models.MessageType import io.getstream.chat.android.models.NoOpMessageTransformer import io.getstream.chat.android.models.NoOpUserTransformer import io.getstream.chat.android.models.UserTransformer @@ -49,6 +50,9 @@ import io.getstream.chat.android.randomReaction import io.getstream.chat.android.randomUser import org.amshove.kluent.shouldBeEqualTo import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource import org.mockito.kotlin.spy import org.mockito.kotlin.times import org.mockito.kotlin.verify @@ -168,7 +172,7 @@ internal class DtoMappingTest { @Test fun `Message is correctly mapped to Dto`() { val messageTransformer = spy(NoOpMessageTransformer) - val message = randomMessage() + val message = randomMessage(type = MessageType.REGULAR) val mapping = Fixture() .withMessageTransformer(messageTransformer) .get() @@ -203,6 +207,17 @@ internal class DtoMappingTest { verify(messageTransformer, times(1)).transform(message) } + @ParameterizedTest + @MethodSource("messageTypeCoercionInput") + fun `Message toDto coerces type to allowed upstream values`(inputType: String, expectedType: String) { + val message = randomMessage(type = inputType) + val mapping = Fixture().get() + + val dto = with(mapping) { message.toDto() } + + dto.type shouldBeEqualTo expectedType + } + @Test fun `Mute is correctly mapped to Dto`() { val mute = randomMute() @@ -313,6 +328,20 @@ internal class DtoMappingTest { dto shouldBeEqualTo expected } + companion object { + @JvmStatic + fun messageTypeCoercionInput(): List = listOf( + Arguments.of(MessageType.REGULAR, MessageType.REGULAR), + Arguments.of(MessageType.SYSTEM, MessageType.SYSTEM), + Arguments.of(MessageType.REPLY, ""), + Arguments.of(MessageType.EPHEMERAL, ""), + Arguments.of(MessageType.ERROR, ""), + Arguments.of(MessageType.FAILED, ""), + Arguments.of("some-unknown-type", ""), + Arguments.of("", ""), + ) + } + internal class Fixture { private var messageTransformer: MessageTransformer = NoOpMessageTransformer