From b2aa08de239c00eae430cebe76644de371851ade Mon Sep 17 00:00:00 2001 From: M57 <41645758+Hy4ri@users.noreply.github.com> Date: Wed, 16 Sep 2026 11:00:25 +0300 Subject: [PATCH] test(chat): cover post-switch dispatch recovery --- .../ui/chat/ChatViewModelTest.kt | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/app/src/test/java/com/m57/hermescontrol/ui/chat/ChatViewModelTest.kt b/app/src/test/java/com/m57/hermescontrol/ui/chat/ChatViewModelTest.kt index 289de8a0..b6846926 100644 --- a/app/src/test/java/com/m57/hermescontrol/ui/chat/ChatViewModelTest.kt +++ b/app/src/test/java/com/m57/hermescontrol/ui/chat/ChatViewModelTest.kt @@ -75,6 +75,7 @@ class ChatViewModelTest { /** Counter used to generate unique WS request IDs. */ private var reqCount = 0 + private val sentRequestMethods = mutableListOf>() @Test fun mergeTranscriptWithLive_collapsesDuplicateIdsKeepingLatestMessage() { @@ -118,6 +119,7 @@ class ChatViewModelTest { fun setUp() { Dispatchers.setMain(testDispatcher) reqCount = 0 + sentRequestMethods.clear() mockkStatic(Log::class) every { Log.d(any(), any()) } returns 0 @@ -185,6 +187,7 @@ class ChatViewModelTest { every { HermesWsClient.send(any(), any(), any()) } answers { reqCount++ val id = "req-id-$reqCount" + sentRequestMethods += arg(0) to id arg<((String) -> Unit)?>(2)?.invoke(id) id } @@ -2123,6 +2126,39 @@ class ChatViewModelTest { val state = viewModel.uiState.value assertEquals("session-456", state.currentSessionId) assertNull(state.errorMessage) + + val resumeRequestId = sentRequestMethods.last { it.first == WsMethods.SESSION_RESUME }.second + mockEventsFlow.emit( + WsEvent.RpcResult( + resumeRequestId, + mapOf("session_id" to "session-456"), + ), + ) + advanceUntilIdle() + mockEventsFlow.emit( + WsEvent.SessionUsage( + data = mapOf("usage" to mapOf("output" to 9000L)), + sessionId = "session-456", + ), + ) + advanceUntilIdle() + viewModel.sendMessage("Send in the new session") + advanceUntilIdle() + + assertEquals( + 9000L, + viewModel.streamingState.value.turnUsageBaseline + ?.outputTokens, + ) + assertTrue(viewModel.streamingState.value.turnUsageBaselineCaptured) + verify { + HermesWsClient.sendMessage( + "session-456", + match { it.contains("Send in the new session") }, + any(), + any(), + ) + } } @Test