package com.craigvg.lichun_android.network import android.content.Context import com.craigvg.lichun_android.domain.models.AnswerOption import com.craigvg.lichun_android.managers.ToastManager import io.mockk.mockk import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import okhttp3.Request import okhttp3.WebSocket import okio.ByteString import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Test class EventV2ResponsePayloadTest { @Test fun `sendAnswer emits eventResponse payload with eventId and choiceId`() { val context = mockk(relaxed = true) val manager = WebSocketManager(context, ToastManager()) val socket = CapturingWebSocket() setPrivateWebSocket(manager, socket) manager.sendAnswer( answer = AnswerOption(option = "Help", id = "help"), questionId = "event_adult" ) val sent = socket.lastText assertNotNull(sent) val jsonObject = Json.parseToJsonElement(sent!!).jsonObject assertEquals("eventResponse", jsonObject["type"]?.jsonPrimitive?.content) val message = jsonObject["message"]?.jsonObject assertEquals("event_adult", message?.get("eventId")?.jsonPrimitive?.content) assertEquals("help", message?.get("choiceId")?.jsonPrimitive?.content) } private fun setPrivateWebSocket(manager: WebSocketManager, socket: WebSocket) { val field = WebSocketManager::class.java.getDeclaredField("webSocket") field.isAccessible = true field.set(manager, socket) } private class CapturingWebSocket : WebSocket { var lastText: String? = null override fun request(): Request = Request.Builder().url("ws://localhost").build() override fun queueSize(): Long = 0L override fun send(text: String): Boolean { lastText = text return true } override fun send(bytes: ByteString): Boolean = false override fun close(code: Int, reason: String?): Boolean = true override fun cancel() = Unit } }