test(#515): add KeysViewModel.toggleCategory test (re-applied onto main, +cross-toggle independence) (#515)
This commit is contained in:
1 file changed
+92
@@ -1,13 +1,18 @@
|
|||||||
package com.m57.hermescontrol.ui.keys
|
package com.m57.hermescontrol.ui.keys
|
||||||
|
|
||||||
|
import com.m57.hermescontrol.data.model.EnvVarConfig
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.update
|
||||||
import kotlinx.coroutines.test.StandardTestDispatcher
|
import kotlinx.coroutines.test.StandardTestDispatcher
|
||||||
import kotlinx.coroutines.test.advanceUntilIdle
|
import kotlinx.coroutines.test.advanceUntilIdle
|
||||||
import kotlinx.coroutines.test.resetMain
|
import kotlinx.coroutines.test.resetMain
|
||||||
import kotlinx.coroutines.test.setMain
|
import kotlinx.coroutines.test.setMain
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Assert.assertFalse
|
||||||
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
@@ -54,4 +59,91 @@ class KeysViewModelTest {
|
|||||||
|
|
||||||
assertEquals("dummy_token_value_that_is_long_enough", viewModel.uiState.value.newKeyValue)
|
assertEquals("dummy_token_value_that_is_long_enough", viewModel.uiState.value.newKeyValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testToggleCategory() {
|
||||||
|
// Arrange
|
||||||
|
val viewModel = createViewModel()
|
||||||
|
|
||||||
|
// Seed initial categories via reflection (no test-only seeding path exists in source)
|
||||||
|
val uiStateField = KeysViewModel::class.java.getDeclaredField("_uiState")
|
||||||
|
uiStateField.isAccessible = true
|
||||||
|
val uiStateFlow =
|
||||||
|
uiStateField.get(viewModel) as MutableStateFlow<KeysUiState>
|
||||||
|
|
||||||
|
val initialCategories =
|
||||||
|
listOf(
|
||||||
|
CategorySection(
|
||||||
|
name = "LLM Providers",
|
||||||
|
vars =
|
||||||
|
mapOf(
|
||||||
|
"OPENAI_API_KEY" to
|
||||||
|
EnvVarConfig(
|
||||||
|
isSet = true,
|
||||||
|
category = "LLM Providers",
|
||||||
|
isPassword = true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
expanded = false,
|
||||||
|
),
|
||||||
|
CategorySection(
|
||||||
|
name = "Tool API Keys",
|
||||||
|
vars =
|
||||||
|
mapOf(
|
||||||
|
"WEATHER_API_KEY" to
|
||||||
|
EnvVarConfig(
|
||||||
|
isSet = true,
|
||||||
|
category = "Tool API Keys",
|
||||||
|
isPassword = true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
expanded = true,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
uiStateFlow.update { it.copy(categories = initialCategories) }
|
||||||
|
|
||||||
|
// Act - expand an unexpanded category
|
||||||
|
viewModel.toggleCategory("LLM Providers")
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var categories = viewModel.uiState.value.categories
|
||||||
|
assertEquals(2, categories.size)
|
||||||
|
assertTrue(
|
||||||
|
"LLM Providers should be expanded",
|
||||||
|
categories.first { it.name == "LLM Providers" }.expanded,
|
||||||
|
)
|
||||||
|
assertTrue(
|
||||||
|
"Tool API Keys should remain expanded",
|
||||||
|
categories.first { it.name == "Tool API Keys" }.expanded,
|
||||||
|
)
|
||||||
|
|
||||||
|
// Act - collapse it again
|
||||||
|
viewModel.toggleCategory("LLM Providers")
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
categories = viewModel.uiState.value.categories
|
||||||
|
assertEquals(2, categories.size)
|
||||||
|
assertFalse(
|
||||||
|
"LLM Providers should be collapsed",
|
||||||
|
categories.first { it.name == "LLM Providers" }.expanded,
|
||||||
|
)
|
||||||
|
assertTrue(
|
||||||
|
"Tool API Keys should remain expanded",
|
||||||
|
categories.first { it.name == "Tool API Keys" }.expanded,
|
||||||
|
)
|
||||||
|
|
||||||
|
// Act - toggle the other category, ensure first stays untouched
|
||||||
|
viewModel.toggleCategory("Tool API Keys")
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
categories = viewModel.uiState.value.categories
|
||||||
|
assertFalse(
|
||||||
|
"LLM Providers should stay collapsed",
|
||||||
|
categories.first { it.name == "LLM Providers" }.expanded,
|
||||||
|
)
|
||||||
|
assertFalse(
|
||||||
|
"Tool API Keys should now be collapsed",
|
||||||
|
categories.first { it.name == "Tool API Keys" }.expanded,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user