refactor(#1375): typed params for approval.* and session.active_list (#1385)

This commit is contained in:
m57 authored and GitHub committed 2026-09-29 18:51:02 +03:00
1 parent c5b34ff471
commit 717b5b0361
11 files changed
+611 -63

No files matched your search

@@ -1,7 +1,10 @@
package com.m57.hermescontrol.ui.chat
import com.m57.hermescontrol.data.remote.OkHttpProvider
import com.m57.hermescontrol.data.ws.WsEvent
import com.m57.hermescontrol.data.ws.WsMethods
import com.m57.hermescontrol.data.ws.contract.RpcMethod
import com.m57.hermescontrol.data.ws.contract.TypedRpcSender
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.StandardTestDispatcher
@@ -9,6 +12,8 @@ import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import org.junit.Assert.assertEquals
@@ -25,7 +30,7 @@ class ChatApprovalsDelegateTest {
private val uiState = MutableStateFlow(ChatUiState(currentSessionId = "storage-session-1"))
private var runtimeId: String? = null
private val sentMethods = mutableListOf<String>()
private val sentParams = mutableListOf<Map<String, Any>>()
private val sentParams = mutableListOf<JsonObject>()
private val trackedRequests = mutableListOf<Pair<String, String>>()
private val systemMessages = mutableListOf<String>()
@@ -35,11 +40,22 @@ class ChatApprovalsDelegateTest {
ioDispatcher = testDispatcher,
uiState = uiState,
runtimeSessionId = { runtimeId },
wsSend = { method, params, onSent ->
sentMethods.add(method)
sentParams.add(params)
onSent?.invoke("req-id-${sentMethods.size}")
},
rpc =
object : TypedRpcSender {
override fun <P> send(
method: RpcMethod<P, *>,
params: P,
onSent: ((String) -> Unit)?,
): String {
sentMethods.add(method.name)
sentParams.add(
OkHttpProvider.json.encodeToJsonElement(method.params, params) as JsonObject,
)
val id = "req-id-${sentMethods.size}"
onSent?.invoke(id)
return id
}
},
trackRequest = { id, method -> trackedRequests.add(id to method) },
addSystemMessage = { text -> systemMessages.add(text) },
)
@@ -98,8 +114,8 @@ class ChatApprovalsDelegateTest {
assertFalse(uiState.value.isAgentTyping)
assertEquals(listOf(WsMethods.APPROVAL_RECEIVED), sentMethods)
assertEquals("runtime-session-xyz", sentParams.first()["session_id"])
assertEquals("req-123", sentParams.first()["request_id"])
assertEquals(JsonPrimitive("runtime-session-xyz"), sentParams.first()["session_id"])
assertEquals(JsonPrimitive("req-123"), sentParams.first()["request_id"])
}
@Test
@@ -125,11 +141,11 @@ class ChatApprovalsDelegateTest {
advanceUntilIdle()
assertEquals(listOf(WsMethods.APPROVAL_RESPOND, WsMethods.APPROVAL_PENDING), sentMethods)
assertEquals("once", sentParams[0]["choice"])
assertEquals("req-999", sentParams[0]["request_id"])
assertEquals(false, sentParams[0]["all"])
assertEquals("runtime-session-xyz", sentParams[0]["session_id"])
assertEquals("runtime-session-xyz", sentParams[1]["session_id"])
assertEquals(JsonPrimitive("once"), sentParams[0]["choice"])
assertEquals(JsonPrimitive("req-999"), sentParams[0]["request_id"])
assertEquals(JsonPrimitive(false), sentParams[0]["all"])
assertEquals(JsonPrimitive("runtime-session-xyz"), sentParams[0]["session_id"])
assertEquals(JsonPrimitive("runtime-session-xyz"), sentParams[1]["session_id"])
}
@Test
@@ -270,7 +286,14 @@ class ChatApprovalsDelegateTest {
ioDispatcher = testDispatcher,
uiState = uiState,
runtimeSessionId = { "session-1" },
wsSend = { _, _, _ -> error("new approval must not use legacy response") },
rpc =
object : TypedRpcSender {
override fun <P> send(
method: RpcMethod<P, *>,
params: P,
onSent: ((String) -> Unit)?,
): String = error("new approval must not use legacy response")
},
trackRequest = { _, _ -> },
addSystemMessage = { },
respondToServerRequest = { id, result -> responses += id to result },
@@ -6619,9 +6619,9 @@ class ChatViewModelTest {
HermesWsClient.send(
WsMethods.APPROVAL_RESPOND,
withArg { params ->
assertEquals(sessionId, params["session_id"])
assertEquals("once", params["choice"])
assertEquals("req-42", params["request_id"])
assertEquals(JsonPrimitive(sessionId), params["session_id"])
assertEquals(JsonPrimitive("once"), params["choice"])
assertEquals(JsonPrimitive("req-42"), params["request_id"])
},
any(),
)
@@ -6653,8 +6653,8 @@ class ChatViewModelTest {
HermesWsClient.send(
WsMethods.APPROVAL_RESPOND,
withArg { params ->
assertEquals("session", params["choice"])
assertEquals("req-7", params["request_id"])
assertEquals(JsonPrimitive("session"), params["choice"])
assertEquals(JsonPrimitive("req-7"), params["request_id"])
},
any(),
)
@@ -6684,7 +6684,7 @@ class ChatViewModelTest {
HermesWsClient.send(
WsMethods.APPROVAL_RESPOND,
withArg { params ->
assertEquals("deny", params["choice"])
assertEquals(JsonPrimitive("deny"), params["choice"])
assertFalse(params.containsKey("request_id"))
},
any(),
@@ -6717,7 +6717,7 @@ class ChatViewModelTest {
HermesWsClient.send(
WsMethods.APPROVAL_PENDING,
withArg { params ->
assertEquals(sessionId, params["session_id"])
assertEquals(JsonPrimitive(sessionId), params["session_id"])
},
any(),
)
@@ -6763,8 +6763,8 @@ class ChatViewModelTest {
HermesWsClient.send(
WsMethods.APPROVAL_RECEIVED,
withArg { params ->
assertEquals("runtime-sid-999", params["session_id"])
assertEquals("req-runtime-test", params["request_id"])
assertEquals(JsonPrimitive("runtime-sid-999"), params["session_id"])
assertEquals(JsonPrimitive("req-runtime-test"), params["request_id"])
},
any(),
)
@@ -6777,16 +6777,16 @@ class ChatViewModelTest {
HermesWsClient.send(
WsMethods.APPROVAL_RESPOND,
withArg { params ->
assertEquals("runtime-sid-999", params["session_id"])
assertEquals("once", params["choice"])
assertEquals("req-runtime-test", params["request_id"])
assertEquals(JsonPrimitive("runtime-sid-999"), params["session_id"])
assertEquals(JsonPrimitive("once"), params["choice"])
assertEquals(JsonPrimitive("req-runtime-test"), params["request_id"])
},
any(),
)
HermesWsClient.send(
WsMethods.APPROVAL_PENDING,
withArg { params ->
assertEquals("runtime-sid-999", params["session_id"])
assertEquals(JsonPrimitive("runtime-sid-999"), params["session_id"])
},
any(),
)