refactor(mcp): extract AddServerRequestBuilder and McpImportSummary

Extract request building and import summary formatting helpers.
Wire into McpServersViewModel with unit test coverage.
This commit is contained in:
Hy4ri committed 2026-09-11 18:00:47 +03:00
1 parent 9eaf9663f3
commit 4a93772b93
5 files changed
+195 -39

No files matched your search

@@ -0,0 +1,95 @@
package com.m57.hermescontrol.ui.mcp
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
class AddServerRequestBuilderTest {
@Test
fun `build HTTP mode creates request with url and auth`() {
val request =
AddServerRequestBuilder.build(
name = " weather-server ",
mode = AddServerMode.HTTP,
url = " https://api.weather.com/mcp ",
command = "ignored-cmd",
args = "ignored-arg",
auth = "header",
bearerToken = " secret-token ",
)
assertEquals("weather-server", request.name)
assertEquals("https://api.weather.com/mcp", request.url)
assertNull(request.command)
assertNull(request.args)
assertEquals("header", request.auth)
assertEquals("secret-token", request.bearerToken)
}
@Test
fun `build HTTP mode with none auth nulls auth and bearerToken`() {
val request =
AddServerRequestBuilder.build(
name = "public-server",
mode = AddServerMode.HTTP,
url = "https://example.com/mcp",
command = "",
args = "",
auth = "none",
bearerToken = "should-be-ignored",
)
assertEquals("public-server", request.name)
assertEquals("https://example.com/mcp", request.url)
assertNull(request.auth)
assertNull(request.bearerToken)
}
@Test
fun `build Stdio mode creates request with command and parsed args`() {
val request =
AddServerRequestBuilder.build(
name = "local-tools",
mode = AddServerMode.Stdio,
url = "https://ignored.com",
command = " python3 ",
args = " -m mcp_server --debug ",
auth = "header",
bearerToken = "token",
)
assertEquals("local-tools", request.name)
assertNull(request.url)
assertEquals("python3", request.command)
assertEquals(listOf("-m", "mcp_server", "--debug"), request.args)
assertNull(request.auth)
assertNull(request.bearerToken)
}
@Test
fun `build Stdio mode with empty args nulls args`() {
val request =
AddServerRequestBuilder.build(
name = "npx-server",
mode = AddServerMode.Stdio,
url = "",
command = "npx server",
args = " ",
auth = "none",
bearerToken = "",
)
assertEquals("npx server", request.command)
assertNull(request.args)
}
@Test
fun `build from McpServersUiState populates fields correctly`() {
val state =
McpServersUiState(
addServerName = "state-server",
addMode = AddServerMode.HTTP,
addServerUrl = "https://state.com",
addServerAuth = "none",
)
val request = AddServerRequestBuilder.build(state)
assertEquals("state-server", request.name)
assertEquals("https://state.com", request.url)
}
}
@@ -0,0 +1,24 @@
package com.m57.hermescontrol.ui.mcp
import org.junit.Assert.assertEquals
import org.junit.Test
class McpImportSummaryTest {
@Test
fun `formatSummary returns success message when zero errors`() {
val result = McpImportSummary.formatSummary(3, emptyList())
assertEquals("Successfully imported 3 server(s)", result)
}
@Test
fun `formatSummary returns partial success message when some failed`() {
val result = McpImportSummary.formatSummary(2, listOf("serverA: timeout", "serverB: 404"))
assertEquals("Imported 2 server(s), 2 failed: serverA: timeout; serverB: 404", result)
}
@Test
fun `formatSummary returns failure message when all failed`() {
val result = McpImportSummary.formatSummary(0, listOf("serverA: connection refused"))
assertEquals("Failed to import: serverA: connection refused", result)
}
}