feat(profiles): first-class profile switching — phase 0 baseline port (#820)

* feat(profiles): make profile switching actually scope the app (issue #781 follow-up)

* fix(profiles): inherit connection token when switching to same-dashboard profile (issue #781 follow-up)

* fix(chat): reset open session on profile switch + prefill login profile (desktop parity)

* fix(ws): inject profile into profile-scoped RPC params so chat follows the selected profile

* test(chat): de-poison SlashCommandDispatchRpcTest (drop static Dispatchers mock)

mockkStatic(Dispatchers::class) + a stubbed Dispatchers.IO bleeds JVM-wide and
breaks later classes in suite order (CI 2026-08-06: COMMAND_DISPATCH captures
cross-wired → ComparisonFailure on lower stack PRs). ChatViewModel gains an
injected ioDispatcher (38 sites); the slash test constructs the VM with the
test dispatcher so the IO stub is unnecessary.

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
M57andM57 authored and GitHub committed 2026-08-06 15:06:28 +03:00
1 parent e56d4c9bfa
commit 75ac0c4790
14 files changed
+579 -56

No files matched your search

@@ -392,7 +392,7 @@ class ConnectViewModelTest {
}
@Test
fun testLoadSavedValues_withStaleSelectedId_fallsBackToDefaults() {
fun testLoadSavedValues_withStaleSelectedId_prefillsSelectedId() {
val profile =
ConnectionProfile(
id = "prof-1",
@@ -407,7 +407,10 @@ class ConnectViewModelTest {
val state = viewModel.uiState.value
assertNull(state.selectedProfile)
assertEquals("", state.profileName)
// Profile name prefills the selected id so a re-login after switching
// to a profile created in-app (no saved connection yet) stays on that
// profile instead of silently landing back on default.
assertEquals("nonexistent-id", state.profileName)
assertEquals("https://127.0.0.1:9119/", state.baseUrl)
}