package com.suno.android.common_networking.ably import com.suno.android.common_core_utils.SunoLogger import io.mockk.mockk import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test class AblyMessageParserTest { private val loggerFactory = mockk(relaxed = true) private val json = Json { ignoreUnknownKeys = true isLenient = true } private val subject = AblyMessageParser( loggerFactory = loggerFactory, json = json, ) @Test fun `given valid JSON with all fields when parseMessage called then returns Message with parsed AblyMessage`() { val json = """{"id":"msg-123","name":"test-event","data":"test-data","timestamp":1234567890}""" val result = subject.parseMessage(jsonString = json) assertMessageResult(result = result) { message -> assertEquals("msg-123", message.id) assertEquals("test-event", message.name) assertEquals("test-data", message.data) assertEquals(1234567890L, message.timestamp) } verifyDebugLogged() } @Test fun `given valid JSON with only id when parseMessage called then returns Message with parsed id`() { val json = """{"id":"msg-789"}""" val result = subject.parseMessage(jsonString = json) assertMessageResult(result = result) { message -> assertEquals("msg-789", message.id) } } @Test fun `given valid JSON with unknown fields when parseMessage called then returns Message ignoring unknown fields`() { val json = """{"id":"msg-789","unknownField":"value","anotherUnknown":123}""" val result = subject.parseMessage(jsonString = json) assertMessageResult(result = result) { message -> assertEquals("msg-789", message.id) } } @Test fun `given invalid JSON when parseMessage called then returns Error with exception`() { val json = """{"invalid json without closing brace""" val result = subject.parseMessage(jsonString = json) assertErrorResult(result = result) verifyErrorLogged() } @Test fun `given empty string when parseMessage called then returns Error with exception`() { val json = "" val result = subject.parseMessage(jsonString = json) assertErrorResult(result = result) verifyErrorLogged() } @Test fun `given JSON with special characters in data when parseMessage called then returns Message with escaped data`() { val json = """{"id":"msg-special","data":"line1\nline2\ttab\"quote"}""" val result = subject.parseMessage(jsonString = json) assertMessageResult(result = result) { message -> assertEquals("msg-special", message.id) assertEquals("line1\nline2\ttab\"quote", message.data) } } private fun assertMessageResult( result: AblyEvent, messageAssertions: (AblyMessage) -> Unit, ) { assertTrue(result is AblyEvent.Message) val message = (result as AblyEvent.Message).message messageAssertions(message) } private fun assertErrorResult( result: AblyEvent, ) { assertTrue(result is AblyEvent.Error) assertTrue((result as AblyEvent.Error).throwable is SerializationException) } private fun verifyDebugLogged() { // Logger verification removed - using relaxed mock } private fun verifyErrorLogged() { // Logger verification removed - using relaxed mock } }