feat(#1121): add multiplexed gateway awareness (#1127)

This commit is contained in:
M57 authored and GitHub committed 2026-09-15 15:56:32 +03:00
1 parent fe465ad93c
commit 528ec4f28f
20 files changed
+1065 -8

No files matched your search

@@ -12,6 +12,7 @@ import com.m57.hermescontrol.data.model.ProfileInfo
import com.m57.hermescontrol.data.model.ProfileSetupCommandResponse
import com.m57.hermescontrol.data.model.ProfilesResponse
import com.m57.hermescontrol.data.model.RenameProfileRequest
import com.m57.hermescontrol.data.model.StatusResponse
import com.m57.hermescontrol.data.remote.ApiClient
import com.m57.hermescontrol.data.remote.HermesApiService
import com.m57.hermescontrol.data.remote.NetworkError
@@ -62,6 +63,7 @@ class ProfilesViewModelTest {
coEvery { mockApi.getProfiles() } returns
Response.success(ProfilesResponse(listOf(ProfileInfo(name = "default", is_default = true))))
coEvery { mockApi.getActiveProfile() } returns Response.success(ActiveProfileResponse(active = "default"))
coEvery { mockApi.getStatus() } returns Response.success(StatusResponse())
}
@Before
@@ -360,6 +362,53 @@ class ProfilesViewModelTest {
)
}
@Test
fun `loadProfiles displays normalized shared gateway profiles`() {
coEvery { mockApi.getProfiles() } returns
Response.success(
ProfilesResponse(
listOf(
ProfileInfo(name = "default", is_default = true),
ProfileInfo(name = "coding"),
),
),
)
coEvery { mockApi.getStatus() } returns
Response.success(
StatusResponse(
gatewaySharedWith = listOf("default", "coding", "coding", " ", ""),
),
)
val vm = createViewModel()
vm.loadProfiles()
testDispatcher.scheduler.advanceUntilIdle()
assertEquals(listOf("default", "coding"), vm.uiState.value.sharedGatewayProfiles)
assertNull(vm.uiState.value.errorMessage)
}
@Test
fun `loadProfiles keeps profiles usable when optional status request fails`() {
coEvery { mockApi.getStatus() } returns errorResponse(404)
val vm = createViewModel()
vm.loadProfiles()
testDispatcher.scheduler.advanceUntilIdle()
assertEquals(
listOf("default"),
vm.uiState.value.profiles
.map { it.name },
)
assertEquals("default", vm.uiState.value.activeProfileName)
assertTrue(
vm.uiState.value.sharedGatewayProfiles
.isEmpty(),
)
assertNull(vm.uiState.value.errorMessage)
}
@Test
fun `cloneProfile success calls createProfile with clone_from and reloads`() {
coEvery { mockApi.createProfile(any()) } returns Response.success(Unit)