Add comprehensive tests for ServerCollectionOps (#696)

* Test ServerCollectionOps data manipulation utilities

Added comprehensive unit tests for `ServerCollectionOps.kt` to cover all scenarios for `addOrUpdate`, `selfHealed`, and resolution properties (`resolvedBaseUrl`, `resolvedHost`, `resolvedPort`). Also updated the function name `addOrReplaceServer` to `addOrUpdate` to match the intended signature in the issue description, and updated affected call sites.

* Fix ktlint formatting issues and ensure build succeeds

Fixed ktlint errors in `ServerCollectionOpsTest.kt` by correctly formatting arguments and expressions to comply with project style guidelines. Ran `assembleDebug` and tests locally to verify build health.
This commit is contained in:
M57 authored and GitHub committed 2026-07-23 13:04:10 +03:00
1 parent 992de56059
commit dcf26f1a16
3 files changed
+181 -4

No files matched your search

@@ -0,0 +1,177 @@
package com.m57.hermescontrol.data.config
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
class ServerCollectionOpsTest {
@Test
fun addOrUpdate_addsNewProfile() {
val initialState =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = "http://192.168.1.1:9119"),
),
)
val newProfile = ConnectionProfile(id = "2", name = "Profile 2", baseUrl = "http://192.168.1.2:9119")
val result = initialState.addOrUpdate(newProfile)
assertEquals(2, result.connectionProfiles.size)
assertEquals(newProfile, result.connectionProfiles[1])
}
@Test
fun addOrUpdate_replacesExistingProfile() {
val initialState =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = "http://192.168.1.1:9119"),
ConnectionProfile(id = "2", name = "Profile 2", baseUrl = "http://192.168.1.2:9119"),
),
)
val updatedProfile =
ConnectionProfile(id = "1", name = "Updated Profile 1", baseUrl = "http://192.168.1.100:9119")
val result = initialState.addOrUpdate(updatedProfile)
assertEquals(2, result.connectionProfiles.size)
// Should retain the order implicitly, or just check it exists
val replaced = result.connectionProfiles.find { it.id == "1" }
assertEquals("Updated Profile 1", replaced?.name)
assertEquals("http://192.168.1.100:9119", replaced?.baseUrl)
}
@Test
fun selfHealed_keepsActiveProfile() {
val initialState =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = "http://192.168.1.1:9119"),
ConnectionProfile(id = "2", name = "Profile 2", baseUrl = "http://192.168.1.2:9119"),
),
selectedProfileId = "2",
)
val result = initialState.selfHealed()
assertEquals("2", result.selectedProfileId)
}
@Test
fun selfHealed_nullifiesMissingProfile() {
val initialState =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = "http://192.168.1.1:9119"),
),
selectedProfileId = "3",
)
val result = initialState.selfHealed()
assertNull(result.selectedProfileId)
}
@Test
fun selfHealed_handlesAlreadyNull() {
val initialState =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = "http://192.168.1.1:9119"),
),
selectedProfileId = null,
)
val result = initialState.selfHealed()
assertNull(result.selectedProfileId)
}
@Test
fun resolvedBaseUrl_usesSelectedProfileBaseUrl() {
val state =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = "http://192.168.1.1:9119"),
),
selectedProfileId = "1",
baseUrl = "http://top.level.base.url:9119", // Should be ignored
)
val result = state.resolvedBaseUrl
assertEquals("http://192.168.1.1:9119/", result)
}
@Test
fun resolvedBaseUrl_fallsBackToTopLevelBaseUrl() {
val state =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = null), // Selected but no baseUrl
),
selectedProfileId = "1",
baseUrl = "http://top.level.base.url:9119", // Should be used as fallback
)
val result = state.resolvedBaseUrl
assertEquals("http://top.level.base.url:9119/", result)
}
@Test
fun resolvedBaseUrl_fallsBackToLegacyLoopback() {
val state =
ServerStoreState(
connectionProfiles = emptyList(), // No selected profile
selectedProfileId = null,
baseUrl = null, // No top-level baseUrl
host = "127.0.0.1",
port = 9119,
)
val result = state.resolvedBaseUrl
assertEquals("http://127.0.0.1:9119/", result)
}
@Test
fun resolvedHost_extractsCorrectHost() {
val state =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = "https://my.server.local:443"),
),
selectedProfileId = "1",
)
val result = state.resolvedHost
assertEquals("my.server.local", result)
}
@Test
fun resolvedPort_extractsCorrectPort() {
val state =
ServerStoreState(
connectionProfiles =
listOf(
ConnectionProfile(id = "1", name = "Profile 1", baseUrl = "https://my.server.local:8443"),
),
selectedProfileId = "1",
)
val result = state.resolvedPort
assertEquals(8443, result)
}
}
@@ -20,17 +20,17 @@ class ServerStoreTest {
}
@Test
fun testPureOps_addOrReplaceServer() {
fun testPureOps_addOrUpdate() {
val state = ServerStoreState()
val profile = ConnectionProfile(id = "1", name = "Test", host = "10.0.0.1", port = 8080)
val newState = state.addOrReplaceServer(profile)
val newState = state.addOrUpdate(profile)
assertEquals(1, newState.connectionProfiles.size)
assertEquals(profile, newState.connectionProfiles[0])
// Replace
val updatedProfile = profile.copy(host = "10.0.0.2")
val finalState = newState.addOrReplaceServer(updatedProfile)
val finalState = newState.addOrUpdate(updatedProfile)
assertEquals(1, finalState.connectionProfiles.size)
assertEquals("10.0.0.2", finalState.connectionProfiles[0].host)
}