From bcc206c44dc8dedd9f81778176777600e3f70646 Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Tue, 19 May 2026 10:09:18 +0200 Subject: [PATCH 1/3] Accept null file size in AttachmentDto --- .../client/api2/mapping/DomainMapping.kt | 2 +- .../client/api2/model/dto/AttachmentDto.kt | 2 +- .../client/api2/mapping/DomainMappingTest.kt | 2 +- .../parser2/AttachmentDtoAdapterTest.kt | 6 +++++ .../parser2/testdata/AttachmentDtoTestData.kt | 27 +++++++++++++++++++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DomainMapping.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DomainMapping.kt index a5939ca392b..82741c09cba 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DomainMapping.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DomainMapping.kt @@ -579,7 +579,7 @@ internal class DomainMapping( authorName = author_name, authorLink = author_link, fallback = fallback, - fileSize = file_size, + fileSize = file_size ?: 0, image = image, imageUrl = image_url, mimeType = mime_type, diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/AttachmentDto.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/AttachmentDto.kt index b9d3ca66c7f..c7f6dea0e9b 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/AttachmentDto.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/AttachmentDto.kt @@ -33,7 +33,7 @@ internal data class AttachmentDto( val author_name: String?, val author_link: String?, val fallback: String?, - val file_size: Int = 0, + val file_size: Int? = 0, val image: String?, val image_url: String?, val mime_type: String?, diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt index c6b5b84507a..ca8f95723d8 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt @@ -550,7 +550,7 @@ internal class DomainMappingTest { authorName = attachmentDto.author_name, authorLink = attachmentDto.author_link, fallback = attachmentDto.fallback, - fileSize = attachmentDto.file_size, + fileSize = attachmentDto.file_size ?: 0, image = attachmentDto.image, imageUrl = attachmentDto.image_url, mimeType = attachmentDto.mime_type, diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/AttachmentDtoAdapterTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/AttachmentDtoAdapterTest.kt index 61bc340ed4e..cb6367f1352 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/AttachmentDtoAdapterTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/AttachmentDtoAdapterTest.kt @@ -49,4 +49,10 @@ internal class AttachmentDtoAdapterTest { val jsonString = parser.toJson(AttachmentDtoTestData.attachmentWithoutExtraData) jsonString.shouldEqualJson(AttachmentDtoTestData.jsonWithoutExtraData) } + + @Test + fun `Deserialize JSON attachment with null file_size`() { + val attachment = parser.fromJson(AttachmentDtoTestData.jsonWithNullFileSize, AttachmentDto::class.java) + attachment shouldBeEqualTo AttachmentDtoTestData.attachmentWithNullFileSize + } } diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/AttachmentDtoTestData.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/AttachmentDtoTestData.kt index 20e1f11ffa8..0504b4bfd7b 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/AttachmentDtoTestData.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/AttachmentDtoTestData.kt @@ -65,6 +65,33 @@ internal object AttachmentDtoTestData { extraData = mapOf("draft" to true), ) + @Language("JSON") + val jsonWithNullFileSize = + """{ + "file_size": null + } + """.withoutWhitespace() + val attachmentWithNullFileSize = AttachmentDto( + asset_url = null, + author_name = null, + author_link = null, + fallback = null, + file_size = null, + image = null, + image_url = null, + mime_type = null, + name = null, + og_scrape_url = null, + text = null, + thumb_url = null, + title = null, + title_link = null, + type = null, + original_width = null, + original_height = null, + extraData = emptyMap(), + ) + @Language("JSON") val jsonWithoutExtraData = """{ From e55ca23c897352a9e3d108e5b4c9f7685c968aeb Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Thu, 21 May 2026 17:49:46 +0200 Subject: [PATCH 2/3] Accept null file_size in direct attachment parser --- .../parser2/direct/AttachmentAdapter.kt | 2 +- .../client/parser2/AttachmentParsingTest.kt | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/direct/AttachmentAdapter.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/direct/AttachmentAdapter.kt index c3a44615ec5..0c96b3a01bd 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/direct/AttachmentAdapter.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/direct/AttachmentAdapter.kt @@ -54,7 +54,7 @@ internal class AttachmentAdapter : JsonAdapter() { "author_name" -> authorName = JsonParsingUtils.readNullableString(reader) "author_link" -> authorLink = JsonParsingUtils.readNullableString(reader) "fallback" -> fallback = JsonParsingUtils.readNullableString(reader) - "file_size" -> fileSize = reader.nextInt() + "file_size" -> fileSize = JsonParsingUtils.readNullableInt(reader) ?: 0 "image" -> image = JsonParsingUtils.readNullableString(reader) "image_url" -> imageUrl = JsonParsingUtils.readNullableString(reader) "mime_type" -> mimeType = JsonParsingUtils.readNullableString(reader) diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/AttachmentParsingTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/AttachmentParsingTest.kt index 6d531a9d1d9..336405dbafa 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/AttachmentParsingTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/AttachmentParsingTest.kt @@ -16,7 +16,6 @@ package io.getstream.chat.android.client.parser2 -import com.squareup.moshi.JsonDataException import io.getstream.chat.android.client.api2.mapping.DomainMapping import io.getstream.chat.android.client.api2.model.dto.AttachmentDto import io.getstream.chat.android.client.parser2.direct.AttachmentAdapter @@ -26,7 +25,6 @@ import io.getstream.chat.android.models.NoOpMessageTransformer import io.getstream.chat.android.models.NoOpUserTransformer import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows internal class AttachmentParsingTest { @@ -92,20 +90,19 @@ internal class AttachmentParsingTest { // endregion - // region file_size: null (non-nullable Int — both paths must throw) + // region file_size: null — coalesces to 0 on both paths @Test - fun `DTO path - throws on file_size null`() { - assertThrows { - parser.fromJson(AttachmentTestData.jsonWithFileSizeNull, AttachmentDto::class.java) - } + fun `DTO path - file_size null coalesces to 0`() { + val dto = parser.fromJson(AttachmentTestData.jsonWithFileSizeNull, AttachmentDto::class.java) + val attachment = with(domainMapping) { dto.toDomain() } + assertEquals(0, attachment.fileSize) } @Test - fun `Direct path - throws on file_size null`() { - assertThrows { - attachmentAdapter.fromJson(AttachmentTestData.jsonWithFileSizeNull) - } + fun `Direct path - file_size null coalesces to 0`() { + val attachment = attachmentAdapter.fromJson(AttachmentTestData.jsonWithFileSizeNull) + assertEquals(0, attachment?.fileSize) } // endregion From 8dde59412de8eba9bcd61fbcf245c7fb3f0f5c67 Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Fri, 22 May 2026 15:59:40 +0200 Subject: [PATCH 3/3] Drop file_size default in AttachmentDto and test null mapping --- .../android/client/api2/model/dto/AttachmentDto.kt | 2 +- .../java/io/getstream/chat/android/client/Mother.kt | 2 +- .../android/client/api2/mapping/DomainMappingTest.kt | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/AttachmentDto.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/AttachmentDto.kt index c7f6dea0e9b..a9965eda3eb 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/AttachmentDto.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/AttachmentDto.kt @@ -33,7 +33,7 @@ internal data class AttachmentDto( val author_name: String?, val author_link: String?, val fallback: String?, - val file_size: Int? = 0, + val file_size: Int?, val image: String?, val image_url: String?, val mime_type: String?, diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/Mother.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/Mother.kt index 6c60ac340ae..71af9da1a7e 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/Mother.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/Mother.kt @@ -746,7 +746,7 @@ internal object Mother { authorName: String? = randomString(), authorLink: String? = randomString(), fallback: String? = randomString(), - fileSize: Int = positiveRandomInt(), + fileSize: Int? = positiveRandomInt(), image: String? = randomString(), imageUrl: String? = randomString(), mimeType: String? = randomString(), diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt index ca8f95723d8..c9625ed4309 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt @@ -568,6 +568,16 @@ internal class DomainMappingTest { assertEquals(expected, attachment) } + @Test + fun `AttachmentDto with null file_size falls back to 0`() { + val attachmentDto = randomAttachmentDto(fileSize = null) + val sut = Fixture().get() + val attachment = with(sut) { + attachmentDto.toDomain() + } + assertEquals(0, attachment.fileSize) + } + @Test fun `BannedUserResponse is correctly mapped to BannedUser`() { val bannedUserResponse = randomBannedUserResponse()