From e81607f982165ab02eb1ac2efe20edcb6dff1e86 Mon Sep 17 00:00:00 2001 From: Filipe de Lima Brito Date: Thu, 30 May 2019 17:09:05 -0300 Subject: [PATCH] Update ReactionsAdapter --- .../chat/rocket/core/RocketChatClient.kt | 2 +- .../rocket/core/internal/ReactionsAdapter.kt | 7 +-- .../kotlin/chat/rocket/core/model/Message.kt | 42 +++++--------- .../core/internal/ReactionsAdapterTest.kt | 57 ++++--------------- .../rocket/core/internal/rest/Constants.kt | 48 ++++++++++++++++ 5 files changed, 74 insertions(+), 82 deletions(-) diff --git a/core/src/main/kotlin/chat/rocket/core/RocketChatClient.kt b/core/src/main/kotlin/chat/rocket/core/RocketChatClient.kt index 90666980..7cf287da 100644 --- a/core/src/main/kotlin/chat/rocket/core/RocketChatClient.kt +++ b/core/src/main/kotlin/chat/rocket/core/RocketChatClient.kt @@ -53,13 +53,13 @@ class RocketChatClient private constructor( .add(SettingsAdapter()) .add(AttachmentAdapterFactory(logger)) .add(RoomListAdapterFactory(logger)) + .add(ReactionsAdapter()) .add(MetaJsonAdapter.ADAPTER_FACTORY) .add(java.lang.Long::class.java, ISO8601Date::class.java, TimestampAdapter(CalendarISO8601Converter())) .add(Long::class.java, ISO8601Date::class.java, TimestampAdapter(CalendarISO8601Converter())) // XXX - MAKE SURE TO KEEP CommonJsonAdapterFactory and CoreJsonAdapterFactory as the latest Adapters... .add(CommonJsonAdapterFactory.INSTANCE) .add(CoreJsonAdapterFactory.INSTANCE) - .add(ReactionsAdapter()) .build() internal lateinit var restUrl: HttpUrl diff --git a/core/src/main/kotlin/chat/rocket/core/internal/ReactionsAdapter.kt b/core/src/main/kotlin/chat/rocket/core/internal/ReactionsAdapter.kt index 896903b9..6df4eafc 100644 --- a/core/src/main/kotlin/chat/rocket/core/internal/ReactionsAdapter.kt +++ b/core/src/main/kotlin/chat/rocket/core/internal/ReactionsAdapter.kt @@ -58,12 +58,7 @@ class ReactionsAdapter : JsonAdapter() { reactions.set(shortname, usernameList, nameList) } - if (reader.peek() == JsonReader.Token.END_OBJECT) { - reader.endObject() - } - if (reader.peek() == JsonReader.Token.END_OBJECT) { - reader.endObject() - } + reader.endObject() return reactions } diff --git a/core/src/main/kotlin/chat/rocket/core/model/Message.kt b/core/src/main/kotlin/chat/rocket/core/model/Message.kt index 451b0dbc..41c86aaf 100644 --- a/core/src/main/kotlin/chat/rocket/core/model/Message.kt +++ b/core/src/main/kotlin/chat/rocket/core/model/Message.kt @@ -14,44 +14,28 @@ import se.ansman.kotshi.JsonSerializable @JsonSerializable data class Message( - @Json(name = "_id") - override val id: String, - @Json(name = "rid") - override val roomId: String, - @JsonDefaultValueString("") - @Json(name = "msg") - override val message: String = "", - @Json(name = "ts") - @ISO8601Date - override val timestamp: Long, - @Json(name = "u") - override val sender: SimpleUser? = null, - @Json(name = "_updatedAt") - @ISO8601Date - val updatedAt: Long? = null, - @ISO8601Date - val editedAt: Long? = null, + @Json(name = "_id") override val id: String, + @Json(name = "rid") override val roomId: String, + @JsonDefaultValueString("") @Json(name = "msg") override val message: String = "", + @Json(name = "ts") @ISO8601Date override val timestamp: Long, + @Json(name = "u") override val sender: SimpleUser? = null, + @Json(name = "_updatedAt") @ISO8601Date val updatedAt: Long? = null, + @ISO8601Date val editedAt: Long? = null, val editedBy: SimpleUser? = null, - @Json(name = "alias") - val senderAlias: String? = null, + @Json(name = "alias") val senderAlias: String? = null, val avatar: String? = null, - @Json(name = "t") - val type: MessageType? = null, - @JsonDefaultValueBoolean(false) - val groupable: Boolean = false, - @JsonDefaultValueBoolean(false) - val parseUrls: Boolean = false, + @Json(name = "t") val type: MessageType? = null, + @JsonDefaultValueBoolean(false) val groupable: Boolean = false, + @JsonDefaultValueBoolean(false) val parseUrls: Boolean = false, val urls: List? = null, val mentions: List? = null, val channels: List? = null, val attachments: List? = null, - @JsonDefaultValueBoolean(false) - val pinned: Boolean = false, + @JsonDefaultValueBoolean(false) val pinned: Boolean = false, val starred: List? = null, val reactions: Reactions? = null, val role: String? = null, - @JsonDefaultValueBoolean(true) - val synced: Boolean = true, // TODO: Remove after we have a db + @JsonDefaultValueBoolean(true) val synced: Boolean = true, // TODO: Remove after we have a db val unread: Boolean? = null ) : BaseMessage diff --git a/core/src/test/kotlin/chat/rocket/core/internal/ReactionsAdapterTest.kt b/core/src/test/kotlin/chat/rocket/core/internal/ReactionsAdapterTest.kt index f5a4cdaa..010652a9 100644 --- a/core/src/test/kotlin/chat/rocket/core/internal/ReactionsAdapterTest.kt +++ b/core/src/test/kotlin/chat/rocket/core/internal/ReactionsAdapterTest.kt @@ -3,7 +3,9 @@ package chat.rocket.core.internal import chat.rocket.common.util.PlatformLogger import chat.rocket.core.RocketChatClient import chat.rocket.core.TokenRepository -import chat.rocket.core.model.Reactions +import chat.rocket.core.internal.rest.MESSAGE_WITHOUT_REACTION +import chat.rocket.core.internal.rest.MESSAGE_WITH_REACTION +import chat.rocket.core.model.Message import com.squareup.moshi.Moshi import okhttp3.OkHttpClient import org.hamcrest.MatcherAssert.assertThat @@ -13,10 +15,6 @@ import org.mockito.Mock import org.mockito.MockitoAnnotations import org.hamcrest.CoreMatchers.`is` as isEqualTo -const val REACTIONS_JSON_PAYLOAD = "{\"reactions\":{\":croissant:\":{\"usernames\":[\"test.user\",\"test.user2\"],\"names\":[\"Test User\",\"Test User 2\"]}, \":thumbsup:\":{\"usernames\":[\"test.user\",\"test.user2\"],\"names\":[\"Test User\",\"Test User 2\"]}}}" -const val REACTIONS_JSON_PAYLOAD_WITHOUT_NAME = "{\"reactions\":{\":croissant:\":{\"usernames\":[\"test.user\"]}}}" -const val REACTIONS_EMPTY_JSON_PAYLOAD = "[]" - class ReactionsAdapterTest { lateinit var moshi: Moshi @Mock private lateinit var tokenProvider: TokenRepository @@ -39,51 +37,18 @@ class ReactionsAdapterTest { } @Test - fun `should deserialize JSON with reactions (with names)`() { - val adapter = moshi.adapter(Reactions::class.java) - adapter.fromJson(REACTIONS_JSON_PAYLOAD)?.let { reactions -> - assertThat(reactions.size, isEqualTo(2)) - assertThat(reactions[":croissant:"]?.first?.size, isEqualTo(2)) - assertThat(reactions[":croissant:"]?.second?.size, isEqualTo(2)) - assertThat(reactions[":croissant:"]?.first?.get(0), isEqualTo("test.user")) - assertThat(reactions[":croissant:"]?.second?.get(0), isEqualTo("Test User")) - } - } - - @Test - fun `should deserialize JSON with reactions (without names)`() { - val adapter = moshi.adapter(Reactions::class.java) - adapter.fromJson(REACTIONS_JSON_PAYLOAD_WITHOUT_NAME)?.let { reactions -> - assertThat(reactions.size, isEqualTo(1)) - assertThat(reactions[":croissant:"]?.first?.size, isEqualTo(1)) - assertThat(reactions[":croissant:"]?.second?.size, isEqualTo(0)) - assertThat(reactions[":croissant:"]?.first?.get(0), isEqualTo("test.user")) + fun `should deserialize JSON with reactions on message (without names)`() { + val adapter = moshi.adapter(Message::class.java) + adapter.fromJson(MESSAGE_WITH_REACTION)?.let { message -> + assertThat(message.reactions?.size, isEqualTo(2)) } } @Test - fun `should serialize back to JSON string (with names)`() { - val adapter = moshi.adapter(Reactions::class.java) - val reactionsFromJson = adapter.fromJson(REACTIONS_JSON_PAYLOAD) - val reactionsToJson = adapter.toJson(reactionsFromJson) - val reactions = adapter.fromJson(reactionsToJson) - assertThat(reactions, isEqualTo(reactionsFromJson)) - } - - @Test - fun `should serialize back to JSON string (without names)`() { - val adapter = moshi.adapter(Reactions::class.java) - val reactionsFromJson = adapter.fromJson(REACTIONS_JSON_PAYLOAD_WITHOUT_NAME) - val reactionsToJson = adapter.toJson(reactionsFromJson) - val reactions = adapter.fromJson(reactionsToJson) - assertThat(reactions, isEqualTo(reactionsFromJson)) - } - - @Test - fun `should deserialize empty reactions JSON`() { - val adapter = moshi.adapter(Reactions::class.java) - adapter.fromJson(REACTIONS_EMPTY_JSON_PAYLOAD)?.let { reactions -> - assertThat(reactions.size, isEqualTo(0)) + fun `should deserialize JSON without reactions on message`() { + val adapter = moshi.adapter(Message::class.java) + adapter.fromJson(MESSAGE_WITHOUT_REACTION)?.let { message -> + assertThat(message.id, isEqualTo("Xo9cGh9Cq6RTB9bw2")) } } } \ No newline at end of file diff --git a/core/src/test/kotlin/chat/rocket/core/internal/rest/Constants.kt b/core/src/test/kotlin/chat/rocket/core/internal/rest/Constants.kt index 30d490ef..334ad57e 100644 --- a/core/src/test/kotlin/chat/rocket/core/internal/rest/Constants.kt +++ b/core/src/test/kotlin/chat/rocket/core/internal/rest/Constants.kt @@ -279,3 +279,51 @@ const val DIRECTORY_CHANNELS_OK = "{\n" + " \"total\": 4,\n" + " \"success\": true\n" + "}" + +const val MESSAGE_WITH_REACTION = " {\n" + + " \"_id\": \"eJ5FZt8K8cSDSix2h\",\n" + + " \"rid\": \"mSCEim3yGNb2rZhev\",\n" + + " \"msg\": \"Team please review :slight_smile:\",\n" + + " \"ts\": \"2019-05-30T11:16:22.879Z\",\n" + + " \"u\": {\n" + + " \"_id\": \"kC5buaCes844QLxYK\",\n" + + " \"username\": \"Shailesh351\",\n" + + " \"name\": \"Shailesh Baldaniya\"\n" + + " },\n" + + " \"_updatedAt\": \"2019-05-30T13:23:33.427Z\",\n" + + " \"mentions\": [],\n" + + " \"channels\": [],\n" + + " \"reactions\": {\n" + + " \":punch:\": {\n" + + " \"usernames\": [\n" + + " \"filipe.brito\"\n" + + " ]\n" + + " },\n" + + " \":thumbsup:\": {\n" + + " \"usernames\": [\n" + + " \"jaytat0\"\n" + + " ]\n" + + " }\n" + + " }\n" + + " }" + +const val MESSAGE_WITHOUT_REACTION = " {\n" + + " \"_id\": \"Xo9cGh9Cq6RTB9bw2\",\n" + + " \"rid\": \"mSCEim3yGNb2rZhev\",\n" + + " \"msg\": \"Thanks for sending that PR @Shailesh351 We will review it soon! Thank you!\",\n" + + " \"ts\": \"2019-05-30T12:34:02.371Z\",\n" + + " \"u\": {\n" + + " \"_id\": \"cBD6dHc7oBvGjkruM\",\n" + + " \"username\": \"filipe.brito\",\n" + + " \"name\": \"Filipe Brito\"\n" + + " },\n" + + " \"_updatedAt\": \"2019-05-30T12:34:02.398Z\",\n" + + " \"mentions\": [\n" + + " {\n" + + " \"_id\": \"kC5buaCes844QLxYK\",\n" + + " \"name\": \"Shailesh Baldaniya\",\n" + + " \"username\": \"Shailesh351\"\n" + + " }\n" + + " ],\n" + + " \"channels\": []\n" + + " }"