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 db124811efc..48290b4775f 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 @@ -38,7 +38,6 @@ import io.getstream.chat.android.client.api2.model.dto.DownstreamModerationDto import io.getstream.chat.android.client.api2.model.dto.DownstreamMuteDto import io.getstream.chat.android.client.api2.model.dto.DownstreamPendingMessageDto import io.getstream.chat.android.client.api2.model.dto.DownstreamPollDto -import io.getstream.chat.android.client.api2.model.dto.DownstreamPollOptionDto import io.getstream.chat.android.client.api2.model.dto.DownstreamPushPreferenceDto import io.getstream.chat.android.client.api2.model.dto.DownstreamReactionDto import io.getstream.chat.android.client.api2.model.dto.DownstreamReactionGroupDto @@ -663,11 +662,11 @@ internal class DomainMapping( val votes = latest_votes_by_option ?.values ?.flatten() - ?.filter { it.is_answer != true } + ?.filter { it.isAnswer != true } ?.map { it.toDomain() } ?: emptyList() val ownVotes = ( own_votes - .filter { it.is_answer != true } + .filter { it.isAnswer != true } .map { it.toDomain() } + votes.filter { it.user?.id == ownUserId } ) @@ -681,7 +680,7 @@ internal class DomainMapping( id = id, name = name, description = description, - options = options.map { it.toDomain() }, + options = options.map { it.toOption() }, votingVisibility = voting_visibility.toVotingVisibility(), enforceUniqueVote = enforce_unique_vote, maxVotesAllowed = max_votes_allowed, @@ -787,8 +786,7 @@ internal class DomainMapping( /** * Transforms [PollOptionResponseData] to [Option]. * - * Not named `toDomain` because that maps to [PollOption], mirroring the hand-written - * [DownstreamPollOptionDto.toDomain] / [DownstreamPollOptionDto.toPollOption] pair. + * Not named `toDomain` because that name maps to [PollOption] instead. */ internal fun PollOptionResponseData.toOption(): Option = Option( id = id, @@ -805,27 +803,6 @@ internal class DomainMapping( extraData = custom.mapNotNull { (key, value) -> value?.let { key to it } }.toMap(), ) - /** - * Transforms [DownstreamPollOptionDto] to [Option] - * - * @return Option - */ - internal fun DownstreamPollOptionDto.toDomain(): Option = Option( - id = id, - text = text, - extraData = extraData ?: emptyMap(), - ) - - /** - * Transforms [DownstreamPollOptionDto] to [PollOption]. - * Note: Not following the naming convention because of clash with the existing [DownstreamPollOptionDto.toDomain]. - */ - internal fun DownstreamPollOptionDto.toPollOption(): PollOption = PollOption( - id = id, - text = text, - extraData = extraData ?: emptyMap(), - ) - /** * Transforms DownstreamVoteDto to Vote * diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/PollsDtos.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/PollsDtos.kt index 43130e1107e..ecfdb0ba08b 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/PollsDtos.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/PollsDtos.kt @@ -17,22 +17,10 @@ package io.getstream.chat.android.client.api2.model.dto import com.squareup.moshi.JsonClass +import io.getstream.chat.android.network.models.PollOptionResponseData +import io.getstream.chat.android.network.models.PollVoteResponseData import java.util.Date -/** - * Represents the DTO for the option of a poll. - * - * @property id The id of the option. - * @property text The text of the option. - * @property extraData Any extra data associated with the option. - */ -@JsonClass(generateAdapter = true) -internal data class DownstreamPollOptionDto( - val id: String, - val text: String, - val extraData: Map?, -) : ExtraDataDto - /** * Represents the DTO for a vote in a poll. * @@ -94,12 +82,12 @@ internal data class DownstreamPollDto( val enforce_unique_vote: Boolean, val id: String, val is_closed: Boolean?, - val latest_answers: List?, - val latest_votes_by_option: Map>?, + val latest_answers: List?, + val latest_votes_by_option: Map>?, val max_votes_allowed: Int?, val name: String, - val options: List, - val own_votes: List, + val options: List, + val own_votes: List, val updated_at: Date, val vote_count: Int, val vote_counts_by_option: Map?, diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/MoshiChatParser.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/MoshiChatParser.kt index 40f11127a7e..2636db78a98 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/MoshiChatParser.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/MoshiChatParser.kt @@ -43,7 +43,6 @@ import io.getstream.chat.android.client.parser2.adapters.DownstreamMemberInfoDto import io.getstream.chat.android.client.parser2.adapters.DownstreamMessageDtoAdapter import io.getstream.chat.android.client.parser2.adapters.DownstreamModerationDetailsDtoAdapter import io.getstream.chat.android.client.parser2.adapters.DownstreamPollDtoAdapter -import io.getstream.chat.android.client.parser2.adapters.DownstreamPollOptionDtoAdapter import io.getstream.chat.android.client.parser2.adapters.DownstreamReactionDtoAdapter import io.getstream.chat.android.client.parser2.adapters.DownstreamThreadDtoAdapter import io.getstream.chat.android.client.parser2.adapters.DownstreamThreadInfoDtoAdapter @@ -119,7 +118,6 @@ internal class MoshiChatParser( .add(DownstreamThreadDtoAdapter) .add(DownstreamThreadInfoDtoAdapter) .add(DownstreamPollDtoAdapter) - .add(DownstreamPollOptionDtoAdapter) .add(CreatePollRequestAdapter) .add(UpdatePollRequestAdapter) .add(CreatePollOptionRequestAdapter) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/PollDtoAdapters.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/PollDtoAdapters.kt index 3947a8ce2b1..3ed7fb7f00b 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/PollDtoAdapters.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/PollDtoAdapters.kt @@ -22,7 +22,6 @@ import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonWriter import com.squareup.moshi.ToJson import io.getstream.chat.android.client.api2.model.dto.DownstreamPollDto -import io.getstream.chat.android.client.api2.model.dto.DownstreamPollOptionDto import io.getstream.chat.android.network.models.CreatePollOptionRequest import io.getstream.chat.android.network.models.CreatePollRequest import io.getstream.chat.android.network.models.PollOptionInput @@ -47,24 +46,6 @@ internal object DownstreamPollDtoAdapter : CustomObjectDtoAdapter(DownstreamPollOptionDto::class) { - - @FromJson - fun fromJson( - jsonReader: JsonReader, - mapAdapter: JsonAdapter>, - optionAdapter: JsonAdapter, - ): DownstreamPollOptionDto? = parseWithExtraData(jsonReader, mapAdapter, optionAdapter) - - @ToJson - fun toJson(jsonWriter: JsonWriter, value: DownstreamPollOptionDto): Unit = error("Can't convert this to Json") -} - // The generated poll write-request models carry custom data in a `custom` field that must be // flattened to the JSON root on the wire; extraDataPropertyName matches their @Json(name = "custom"). 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 df123c37ca8..e9abef6012a 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 @@ -40,7 +40,6 @@ import io.getstream.chat.android.client.api2.model.dto.DownstreamModerationDto import io.getstream.chat.android.client.api2.model.dto.DownstreamMuteDto import io.getstream.chat.android.client.api2.model.dto.DownstreamPendingMessageDto import io.getstream.chat.android.client.api2.model.dto.DownstreamPollDto -import io.getstream.chat.android.client.api2.model.dto.DownstreamPollOptionDto import io.getstream.chat.android.client.api2.model.dto.DownstreamPushPreferenceDto import io.getstream.chat.android.client.api2.model.dto.DownstreamReactionDto import io.getstream.chat.android.client.api2.model.dto.DownstreamReactionGroupDto @@ -1224,14 +1223,16 @@ internal object Mother { maxVotesAllowed: Int? = randomInt(), allowUserSuggestedOptions: Boolean = randomBoolean(), allowAnswers: Boolean = randomBoolean(), - options: List = listOf(randomDownstreamOptionDto()), + options: List = listOf(randomPollOptionResponseData()), voteCountsByOption: Map = emptyMap(), - latestVotesByOption: Map> = emptyMap(), - latestAnswers: List = listOf(randomAnswerDownstreamVoteDto()), + latestVotesByOption: Map> = emptyMap(), + latestAnswers: List = listOf( + randomPollVoteResponseData(isAnswer = true, answerText = randomString()), + ), createdAt: Date = randomDate(), createdBy: DownstreamUserDto = randomDownstreamUserDto(), createdById: String = randomString(), - ownVotes: List = listOf(randomDownstreamVoteDto()), + ownVotes: List = listOf(randomPollVoteResponseData()), updatedAt: Date = randomDate(), voteCount: Int = randomInt(), answersCount: Int = randomInt(), @@ -1271,16 +1272,6 @@ internal object Mother { custom = custom, ) - fun randomDownstreamOptionDto( - id: String = randomString(), - text: String = randomString(), - extraData: Map = randomExtraData(1), - ): DownstreamPollOptionDto = DownstreamPollOptionDto( - id = id, - text = text, - extraData = extraData, - ) - fun randomDownstreamVoteDto( id: String = randomString(), pollId: String = randomString(), @@ -1301,27 +1292,6 @@ internal object Mother { answer_text = null, ) - fun randomAnswerDownstreamVoteDto( - id: String = randomString(), - pollId: String = randomString(), - optionId: String = randomString(), - createdAt: Date = randomDate(), - updatedAt: Date = randomDate(), - userId: String = randomString(), - user: DownstreamUserDto? = randomDownstreamUserDto(id = userId), - answerText: String = randomString(), - ): DownstreamVoteDto = DownstreamVoteDto( - id = id, - poll_id = pollId, - option_id = optionId, - created_at = createdAt, - updated_at = updatedAt, - user = user, - user_id = userId, - is_answer = true, - answer_text = answerText, - ) - fun randomUpdatePollRequest( id: String = randomString(), name: String = randomString(), @@ -1415,12 +1385,18 @@ internal object Mother { id: String = randomString(), pollId: String = randomString(), optionId: String = randomString(), + isAnswer: Boolean? = null, + answerText: String? = null, + user: UserResponse? = null, ): PollVoteResponseData = PollVoteResponseData( id = id, pollId = pollId, optionId = optionId, createdAt = randomDate(), updatedAt = randomDate(), + isAnswer = isAnswer, + answerText = answerText, + user = user, ) fun randomQueryPollsResponse( 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 91517fab57f..48858e9911b 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 @@ -20,7 +20,6 @@ import io.getstream.chat.android.PrivacySettings import io.getstream.chat.android.ReadReceipts import io.getstream.chat.android.TypingIndicators import io.getstream.chat.android.client.Mother -import io.getstream.chat.android.client.Mother.randomAnswerDownstreamVoteDto import io.getstream.chat.android.client.Mother.randomAppResponseFields import io.getstream.chat.android.client.Mother.randomAppSettingsResponse import io.getstream.chat.android.client.Mother.randomAttachmentDto @@ -43,7 +42,6 @@ import io.getstream.chat.android.client.Mother.randomDownstreamMessageDto import io.getstream.chat.android.client.Mother.randomDownstreamModerationDetailsDto import io.getstream.chat.android.client.Mother.randomDownstreamModerationDto import io.getstream.chat.android.client.Mother.randomDownstreamMuteDto -import io.getstream.chat.android.client.Mother.randomDownstreamOptionDto import io.getstream.chat.android.client.Mother.randomDownstreamPendingMessageDto import io.getstream.chat.android.client.Mother.randomDownstreamPollDto import io.getstream.chat.android.client.Mother.randomDownstreamReactionDto @@ -53,10 +51,11 @@ import io.getstream.chat.android.client.Mother.randomDownstreamThreadDto import io.getstream.chat.android.client.Mother.randomDownstreamThreadInfoDto import io.getstream.chat.android.client.Mother.randomDownstreamUserDto import io.getstream.chat.android.client.Mother.randomDownstreamUserGroupDto -import io.getstream.chat.android.client.Mother.randomDownstreamVoteDto import io.getstream.chat.android.client.Mother.randomFileUploadConfig import io.getstream.chat.android.client.Mother.randomFullUserResponse +import io.getstream.chat.android.client.Mother.randomPollOptionResponseData import io.getstream.chat.android.client.Mother.randomPollResponseData +import io.getstream.chat.android.client.Mother.randomPollVoteResponseData import io.getstream.chat.android.client.Mother.randomPollVotesResponse import io.getstream.chat.android.client.Mother.randomPrivacySettingsDto import io.getstream.chat.android.client.Mother.randomQueryPollsResponse @@ -1035,12 +1034,12 @@ internal class DomainMappingTest { @Suppress("LongMethod") fun `DownstreamPollDto is correctly mapped to Poll`() { val options = listOf( - randomDownstreamOptionDto(), - randomDownstreamOptionDto(), + randomPollOptionResponseData(custom = mapOf("optionKey" to "optionValue")), + randomPollOptionResponseData(), ) - val ownVote = randomDownstreamVoteDto() - val otherVote = randomDownstreamVoteDto() - val answer = randomAnswerDownstreamVoteDto() + val ownVote = randomPollVoteResponseData(user = randomUserResponse()) + val otherVote = randomPollVoteResponseData(user = randomUserResponse()) + val answer = randomPollVoteResponseData(isAnswer = true, answerText = randomString()) val pollDto = randomDownstreamPollDto( options = options, ownVotes = listOf(ownVote), @@ -1056,9 +1055,10 @@ internal class DomainMappingTest { id = pollDto.id, name = pollDto.name, description = pollDto.description, - options = options.map { - Option(it.id, it.text, it.extraData ?: emptyMap()) - }, + options = listOf( + Option(options[0].id, options[0].text, mapOf("optionKey" to "optionValue")), + Option(options[1].id, options[1].text, emptyMap()), + ), votingVisibility = VotingVisibility.PUBLIC, enforceUniqueVote = pollDto.enforce_unique_vote, maxVotesAllowed = pollDto.max_votes_allowed ?: 1, @@ -1069,28 +1069,28 @@ internal class DomainMappingTest { votes = listOf( Vote( id = ownVote.id, - pollId = ownVote.poll_id, - optionId = ownVote.option_id, - createdAt = ownVote.created_at, - updatedAt = ownVote.updated_at, + pollId = ownVote.pollId, + optionId = ownVote.optionId, + createdAt = ownVote.createdAt, + updatedAt = ownVote.updatedAt, user = with(sut) { ownVote.user?.toDomain() }, ), Vote( id = otherVote.id, - pollId = otherVote.poll_id, - optionId = otherVote.option_id, - createdAt = otherVote.created_at, - updatedAt = otherVote.updated_at, + pollId = otherVote.pollId, + optionId = otherVote.optionId, + createdAt = otherVote.createdAt, + updatedAt = otherVote.updatedAt, user = with(sut) { otherVote.user?.toDomain() }, ), ), ownVotes = listOf( Vote( id = ownVote.id, - pollId = ownVote.poll_id, - optionId = ownVote.option_id, - createdAt = ownVote.created_at, - updatedAt = ownVote.updated_at, + pollId = ownVote.pollId, + optionId = ownVote.optionId, + createdAt = ownVote.createdAt, + updatedAt = ownVote.updatedAt, user = with(sut) { ownVote.user?.toDomain() }, ), ), @@ -1101,10 +1101,10 @@ internal class DomainMappingTest { answers = listOf( Answer( id = answer.id, - pollId = answer.poll_id, - text = answer.answer_text ?: "", - createdAt = answer.created_at, - updatedAt = answer.updated_at, + pollId = answer.pollId, + text = answer.answerText ?: "", + createdAt = answer.createdAt, + updatedAt = answer.updatedAt, user = with(sut) { answer.user?.toDomain() }, ), ), diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/DownstreamPollOptionDtoAdapterTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/DownstreamPollOptionDtoAdapterTest.kt deleted file mode 100644 index 53c61d3dc34..00000000000 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/DownstreamPollOptionDtoAdapterTest.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.chat.android.client.parser2 - -import io.getstream.chat.android.client.api2.model.dto.DownstreamPollOptionDto -import io.getstream.chat.android.client.parser2.testdata.PollDtoTestData -import org.junit.jupiter.api.Assertions -import org.junit.jupiter.api.Test - -internal class DownstreamPollOptionDtoAdapterTest { - private val parser = ParserFactory.createMoshiChatParser() - - @Test - fun `Deserialize JSON poll option with custom fields`() { - val option = parser.fromJson( - PollDtoTestData.downstreamPollOptionJson, - DownstreamPollOptionDto::class.java, - ) - Assertions.assertEquals(PollDtoTestData.downstreamPollOption, option) - } - - @Test - fun `Deserialize JSON poll option without custom fields`() { - val option = parser.fromJson( - PollDtoTestData.downstreamPollOptionJsonWithoutExtraData, - DownstreamPollOptionDto::class.java, - ) - Assertions.assertEquals(PollDtoTestData.downstreamPollOptionWithoutExtraData, option) - } -} diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/OptionParsingTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/OptionParsingTest.kt index 0b42f972cb3..9527de0c6e2 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/OptionParsingTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/OptionParsingTest.kt @@ -18,12 +18,12 @@ 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.DownstreamPollOptionDto import io.getstream.chat.android.client.parser2.direct.OptionAdapter import io.getstream.chat.android.client.parser2.testdata.OptionTestData import io.getstream.chat.android.models.NoOpChannelTransformer import io.getstream.chat.android.models.NoOpMessageTransformer import io.getstream.chat.android.models.NoOpUserTransformer +import io.getstream.chat.android.network.models.PollOptionResponseData import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -41,19 +41,19 @@ internal class OptionParsingTest { private val adapter = OptionAdapter() - // region DTO path (JSON → DownstreamPollOptionDto → Option) + // region Response-model path (JSON → PollOptionResponseData → Option) @Test - fun `DTO path - deserializes all fields`() { - val dto = parser.fromJson(OptionTestData.jsonAllFields, DownstreamPollOptionDto::class.java) - val domain = with(domainMapping) { dto.toDomain() } + fun `Response path - deserializes all fields`() { + val dto = parser.fromJson(OptionTestData.jsonAllFields, PollOptionResponseData::class.java) + val domain = with(domainMapping) { dto.toOption() } assertEquals(OptionTestData.expectedAllFields, domain) } @Test - fun `DTO path - deserializes with optional fields missing`() { - val dto = parser.fromJson(OptionTestData.jsonOptionalFieldsMissing, DownstreamPollOptionDto::class.java) - val domain = with(domainMapping) { dto.toDomain() } + fun `Response path - deserializes with optional fields missing`() { + val dto = parser.fromJson(OptionTestData.jsonOptionalFieldsMissing, PollOptionResponseData::class.java) + val domain = with(domainMapping) { dto.toOption() } assertEquals(OptionTestData.expectedOptionalFieldsMissing, domain) } @@ -78,9 +78,9 @@ internal class OptionParsingTest { // region Error message parity @Test - fun `DTO path - throws on missing id`() { + fun `Response path - throws on missing id`() { assertThrows { - parser.fromJson(OptionTestData.jsonMissingId, DownstreamPollOptionDto::class.java) + parser.fromJson(OptionTestData.jsonMissingId, PollOptionResponseData::class.java) } } @@ -92,9 +92,9 @@ internal class OptionParsingTest { } @Test - fun `DTO path - throws on missing text`() { + fun `Response path - throws on missing text`() { assertThrows { - parser.fromJson(OptionTestData.jsonMissingText, DownstreamPollOptionDto::class.java) + parser.fromJson(OptionTestData.jsonMissingText, PollOptionResponseData::class.java) } } diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/PollDtoTestData.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/PollDtoTestData.kt index 653d5862e06..a55226d9d42 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/PollDtoTestData.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/PollDtoTestData.kt @@ -17,11 +17,11 @@ package io.getstream.chat.android.client.parser2.testdata import io.getstream.chat.android.client.api2.model.dto.DownstreamPollDto -import io.getstream.chat.android.client.api2.model.dto.DownstreamPollOptionDto import io.getstream.chat.android.network.models.CreatePollOptionRequest import io.getstream.chat.android.network.models.CreatePollRequest import io.getstream.chat.android.network.models.PollOptionInput import io.getstream.chat.android.network.models.PollOptionRequest +import io.getstream.chat.android.network.models.PollOptionResponseData import io.getstream.chat.android.network.models.UpdatePollOptionRequest import io.getstream.chat.android.network.models.UpdatePollRequest import org.intellij.lang.annotations.Language @@ -29,45 +29,6 @@ import java.util.Date internal object PollDtoTestData { - // DownstreamPollOptionDto Test Data - - @Language("JSON") - val downstreamPollOptionJson = - """{ - "id": "option1", - "text": "Option 1", - "extraData": { - "key1": "value1", - "key2": true - }, - "customKey": "customValue" - }""" - - val downstreamPollOption = DownstreamPollOptionDto( - id = "option1", - text = "Option 1", - extraData = mapOf( - "extraData" to mapOf( - "key1" to "value1", - "key2" to true, - ), - "customKey" to "customValue", - ), - ) - - @Language("JSON") - val downstreamPollOptionJsonWithoutExtraData = - """{ - "id": "option2", - "text": "Option 2" - }""" - - val downstreamPollOptionWithoutExtraData = DownstreamPollOptionDto( - id = "option2", - text = "Option 2", - extraData = emptyMap(), - ) - // DownstreamPollDto Test Data @Language("JSON") @@ -122,10 +83,9 @@ internal object PollDtoTestData { max_votes_allowed = 1, name = "Poll Name", options = listOf( - DownstreamPollOptionDto( + PollOptionResponseData( id = "option1", text = "Option 1", - extraData = emptyMap(), ), ), own_votes = emptyList(), diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/PollTestData.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/PollTestData.kt index e4ad84061a5..0c0439ed90d 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/PollTestData.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/PollTestData.kt @@ -29,7 +29,7 @@ internal object PollTestData { @Language("JSON") val jsonAllFields = - """{"id":"poll1","name":"Favorite color","description":"Choose your favorite color","options":[{"id":"option1","text":"Red","shade":"crimson"},{"id":"option2","text":"Blue"}],"voting_visibility":"public","enforce_unique_vote":true,"max_votes_allowed":1,"allow_user_suggested_options":false,"allow_answers":true,"vote_count":2,"vote_counts_by_option":{"option1":1,"option2":1},"latest_votes_by_option":{"option1":[{"id":"vote1","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true},"is_answer":false}],"option2":[{"id":"vote2","poll_id":"poll1","option_id":"option2","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user2","role":"user","banned":false,"online":true},"is_answer":false}]},"own_votes":[{"id":"vote1","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true},"is_answer":false}],"created_at":"2024-01-01T09:00:00.000Z","updated_at":"2024-01-01T12:00:00.000Z","is_closed":false,"answers_count":1,"latest_answers":[{"id":"answer1","poll_id":"poll1","option_id":"","answer_text":"Purple","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user3","role":"user","banned":false,"online":true},"is_answer":true}],"created_by":{"id":"admin","role":"admin","banned":false,"online":true},"created_by_id":"admin"}""" + """{"id":"poll1","name":"Favorite color","description":"Choose your favorite color","options":[{"id":"option1","text":"Red","shade":"crimson"},{"id":"option2","text":"Blue"}],"voting_visibility":"public","enforce_unique_vote":true,"max_votes_allowed":1,"allow_user_suggested_options":false,"allow_answers":true,"vote_count":2,"vote_counts_by_option":{"option1":1,"option2":1},"latest_votes_by_option":{"option1":[{"id":"vote1","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":false}],"option2":[{"id":"vote2","poll_id":"poll1","option_id":"option2","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user2","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":false}]},"own_votes":[{"id":"vote1","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":false}],"created_at":"2024-01-01T09:00:00.000Z","updated_at":"2024-01-01T12:00:00.000Z","is_closed":false,"answers_count":1,"latest_answers":[{"id":"answer1","poll_id":"poll1","option_id":"","answer_text":"Purple","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user3","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":true}],"created_by":{"id":"admin","role":"admin","banned":false,"online":true},"created_by_id":"admin"}""" @Language("JSON") val jsonOptionalFieldsMissing = @@ -57,7 +57,7 @@ internal object PollTestData { @Language("JSON") val jsonWithMixedVotesAndAnswers = - """{"id":"poll1","name":"Favorite color","description":"Choose your favorite color","options":[{"id":"option1","text":"Red"}],"enforce_unique_vote":true,"allow_user_suggested_options":false,"allow_answers":true,"vote_count":2,"vote_counts_by_option":{"option1":2},"latest_votes_by_option":{"option1":[{"id":"vote1","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true},"is_answer":false},{"id":"answer1","poll_id":"poll1","option_id":"","answer_text":"Purple","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user2","role":"user","banned":false,"online":true},"is_answer":true},{"id":"vote2","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user3","role":"user","banned":false,"online":true},"is_answer":false}]},"own_votes":[{"id":"vote1","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true},"is_answer":false},{"id":"answer2","poll_id":"poll1","option_id":"","answer_text":"Green","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true},"is_answer":true}],"created_at":"2024-01-01T09:00:00.000Z","updated_at":"2024-01-01T12:00:00.000Z","answers_count":2,"latest_answers":[{"id":"answer1","poll_id":"poll1","option_id":"","answer_text":"Purple","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user2","role":"user","banned":false,"online":true},"is_answer":true},{"id":"answer2","poll_id":"poll1","option_id":"","answer_text":"Green","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true},"is_answer":true}],"created_by_id":"admin"}""" + """{"id":"poll1","name":"Favorite color","description":"Choose your favorite color","options":[{"id":"option1","text":"Red"}],"enforce_unique_vote":true,"allow_user_suggested_options":false,"allow_answers":true,"vote_count":2,"vote_counts_by_option":{"option1":2},"latest_votes_by_option":{"option1":[{"id":"vote1","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":false},{"id":"answer1","poll_id":"poll1","option_id":"","answer_text":"Purple","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user2","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":true},{"id":"vote2","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user3","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":false}]},"own_votes":[{"id":"vote1","poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":false},{"id":"answer2","poll_id":"poll1","option_id":"","answer_text":"Green","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":true}],"created_at":"2024-01-01T09:00:00.000Z","updated_at":"2024-01-01T12:00:00.000Z","answers_count":2,"latest_answers":[{"id":"answer1","poll_id":"poll1","option_id":"","answer_text":"Purple","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user2","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":true},{"id":"answer2","poll_id":"poll1","option_id":"","answer_text":"Green","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":true}],"created_by_id":"admin"}""" @Language("JSON") val jsonWithExtraData = @@ -85,7 +85,16 @@ internal object PollTestData { optionId = "option1", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user1", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user1", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), Vote( id = "vote2", @@ -93,7 +102,16 @@ internal object PollTestData { optionId = "option2", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user2", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user2", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), ), ownVotes = listOf( @@ -103,7 +121,16 @@ internal object PollTestData { optionId = "option1", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user1", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user1", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), ), createdAt = Date(1704099600000L), @@ -117,7 +144,16 @@ internal object PollTestData { text = "Purple", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user3", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user3", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), ), createdBy = User(id = "admin", role = "admin", invisible = null, banned = false, online = true), @@ -166,7 +202,16 @@ internal object PollTestData { optionId = "option1", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user1", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user1", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), Vote( id = "vote2", @@ -174,7 +219,16 @@ internal object PollTestData { optionId = "option1", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user3", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user3", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), ), ownVotes = listOf( @@ -184,7 +238,16 @@ internal object PollTestData { optionId = "option1", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user1", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user1", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), ), createdAt = Date(1704099600000L), @@ -198,7 +261,16 @@ internal object PollTestData { text = "Purple", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user2", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user2", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), Answer( id = "answer2", @@ -206,7 +278,16 @@ internal object PollTestData { text = "Green", createdAt = Date(1704103200000L), updatedAt = Date(1704106800000L), - user = User(id = "user1", role = "user", invisible = null, banned = false, online = true), + user = User( + id = "user1", + role = "user", + invisible = null, + banned = false, + online = true, + language = "en", + createdAt = Date(1704096000000L), + updatedAt = Date(1704097800000L), + ), ), ), createdBy = null, @@ -268,7 +349,7 @@ internal object PollTestData { /** Poll JSON where a vote in own_votes is missing the required "id" field. */ @Language("JSON") val jsonWithMalformedVoteMissingId = - """{"id":"poll1","name":"Favorite color","description":"Choose your favorite color","options":[{"id":"option1","text":"Red"}],"enforce_unique_vote":true,"allow_user_suggested_options":false,"allow_answers":false,"vote_count":1,"own_votes":[{"poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true},"is_answer":false}],"created_at":"2024-01-01T09:00:00.000Z","updated_at":"2024-01-01T12:00:00.000Z","answers_count":0,"created_by_id":"admin"}""" + """{"id":"poll1","name":"Favorite color","description":"Choose your favorite color","options":[{"id":"option1","text":"Red"}],"enforce_unique_vote":true,"allow_user_suggested_options":false,"allow_answers":false,"vote_count":1,"own_votes":[{"poll_id":"poll1","option_id":"option1","created_at":"2024-01-01T10:00:00.000Z","updated_at":"2024-01-01T11:00:00.000Z","user":{"id":"user1","role":"user","banned":false,"online":true,"language":"en","created_at":"2024-01-01T08:00:00.000Z","updated_at":"2024-01-01T08:30:00.000Z"},"is_answer":false}],"created_at":"2024-01-01T09:00:00.000Z","updated_at":"2024-01-01T12:00:00.000Z","answers_count":0,"created_by_id":"admin"}""" // endregion }