feat: move session history to a dedicated history screen (#175)

* feat: move session history to a dedicated history screen

Closes #159.

* fix(ci): fix ktlint style issues and unresolved NavigationController reference
This commit is contained in:
M57 authored and GitHub committed 2026-06-20 22:27:54 +03:00
1 parent 34d339e6c9
commit 64a047f095
8 files changed
+250 -79

No files matched your search

@@ -20,6 +20,8 @@ import com.m57.hermescontrol.data.model.PluginInfo
import com.m57.hermescontrol.data.model.PluginsHubResponse
import com.m57.hermescontrol.data.model.ProfileInfo
import com.m57.hermescontrol.data.model.ProfilesResponse
import com.m57.hermescontrol.data.model.SessionInfo
import com.m57.hermescontrol.data.model.SessionListResponse
import com.m57.hermescontrol.data.model.Skill
import com.m57.hermescontrol.data.model.StatusResponse
import com.m57.hermescontrol.data.model.SystemStatsResponse
@@ -34,6 +36,7 @@ import com.m57.hermescontrol.ui.keys.KeysViewModel
import com.m57.hermescontrol.ui.logs.LogsViewModel
import com.m57.hermescontrol.ui.model.ModelViewModel
import com.m57.hermescontrol.ui.plugins.PluginsViewModel
import com.m57.hermescontrol.ui.sessions.SessionsViewModel
import com.m57.hermescontrol.ui.skills.SkillsViewModel
import com.m57.hermescontrol.ui.system.SystemViewModel
import io.mockk.*
@@ -407,6 +410,44 @@ class E2eIntegrationTest {
)
}
// Sessions History Screen:
@Test
fun testSessionsListing_success() =
runTest {
val session = SessionInfo("session-123", "Session 1", "2026-06-15T15:10:00Z", 5, "active")
coEvery { mockApiService.getSessions() } returns Response.success(SessionListResponse(listOf(session)))
val viewModel = SessionsViewModel()
viewModel.loadSessions()
assertTrue(viewModel.uiState.value.isLoading)
advanceUntilIdle()
assertFalse(viewModel.uiState.value.isLoading)
assertEquals(1, viewModel.uiState.value.sessions.size)
assertEquals("session-123", viewModel.uiState.value.sessions[0].id)
assertEquals("Session 1", viewModel.uiState.value.sessions[0].title)
assertEquals(5, viewModel.uiState.value.sessions[0].message_count)
assertEquals("active", viewModel.uiState.value.sessions[0].status)
}
@Test
fun testSessionsLoad_failure() =
runTest {
coEvery { mockApiService.getSessions() } returns createErrorResponse(500)
val viewModel = SessionsViewModel()
viewModel.loadSessions()
advanceUntilIdle()
assertFalse(viewModel.uiState.value.isLoading)
assertNotNull(viewModel.uiState.value.errorMessage)
assertTrue(
viewModel.uiState.value.errorMessage!!
.contains("HTTP 500"),
)
}
@Test
fun testCronJobsRefresh() =
runTest {