From 3eb9e09f86710f68906411379dadf2a77d1e00fb Mon Sep 17 00:00:00 2001 From: M57 <41645758+Hy4ri@users.noreply.github.com> Date: Sat, 20 Jun 2026 23:41:31 +0300 Subject: [PATCH] test: Add tests for malformed Base64 decoding in ConnectViewModel (#183) --- .../ui/connect/ConnectViewModelTest.kt | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/app/src/test/java/com/m57/hermescontrol/ui/connect/ConnectViewModelTest.kt b/app/src/test/java/com/m57/hermescontrol/ui/connect/ConnectViewModelTest.kt index 80c87e78..2e07a7be 100644 --- a/app/src/test/java/com/m57/hermescontrol/ui/connect/ConnectViewModelTest.kt +++ b/app/src/test/java/com/m57/hermescontrol/ui/connect/ConnectViewModelTest.kt @@ -36,6 +36,7 @@ class ConnectViewModelTest { mockkObject(AuthManager) mockkObject(ApiClient) + mockkStatic(android.util.Base64::class) mockApiService = mockk() every { ApiClient.hermesApi } returns mockApiService @@ -292,4 +293,33 @@ class ConnectViewModelTest { assertFalse(state.connectionSuccess) assertEquals("Connection failed: Something went wrong", state.errorMessage) } + + @Test + fun testOnPairingString_malformedBase64_showsError() { + val viewModel = ConnectViewModel() + + // Mock Base64.decode to throw IllegalArgumentException for an invalid short string + every { android.util.Base64.decode(any(), any()) } throws IllegalArgumentException("bad base64") + + viewModel.onPairingString("short-invalid-string") + + val state = viewModel.uiState.value + assertEquals("Malformed pairing string — expected URL or Base64-encoded JSON", state.errorMessage) + } + + @Test + fun testOnPairingString_malformedBase64_validRawToken() { + val viewModel = ConnectViewModel() + + // Mock Base64.decode to throw IllegalArgumentException + every { android.util.Base64.decode(any(), any()) } throws IllegalArgumentException("bad base64") + + // A string that is >= 32 chars and alphanumeric matching the raw token regex + val validToken = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" + viewModel.onPairingString(validToken) + + val state = viewModel.uiState.value + assertEquals(validToken, state.token) + assertNull(state.errorMessage) + } }