From 350db20af6869a91e6a5ef4d52835ae939539a43 Mon Sep 17 00:00:00 2001 From: M57 <41645758+Hy4ri@users.noreply.github.com> Date: Thu, 9 Jul 2026 21:36:57 +0300 Subject: [PATCH] test(#519): add AuthLoginViewModel probe error-path tests (merge onto #517 file, JUnit4+deterministic) (#519) --- .../ui/authlogin/AuthLoginViewModelTest.kt | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/app/src/test/java/com/m57/hermescontrol/ui/authlogin/AuthLoginViewModelTest.kt b/app/src/test/java/com/m57/hermescontrol/ui/authlogin/AuthLoginViewModelTest.kt index 6ebc4172..e60d4d51 100644 --- a/app/src/test/java/com/m57/hermescontrol/ui/authlogin/AuthLoginViewModelTest.kt +++ b/app/src/test/java/com/m57/hermescontrol/ui/authlogin/AuthLoginViewModelTest.kt @@ -1,19 +1,26 @@ package com.m57.hermescontrol.ui.authlogin import android.app.Application +import android.util.Log +import com.m57.hermescontrol.R import com.m57.hermescontrol.data.local.AuthManager import com.m57.hermescontrol.data.remote.OkHttpProvider import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject +import io.mockk.mockkStatic import io.mockk.unmockkAll +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.runBlocking import okhttp3.OkHttpClient +import okhttp3.Response import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNull import org.junit.Before import org.junit.Test +import java.io.IOException class AuthLoginViewModelTest { private lateinit var viewModel: AuthLoginViewModel @@ -29,6 +36,12 @@ class AuthLoginViewModelTest { mockkObject(OkHttpProvider) every { OkHttpProvider.probe } returns mockk(relaxed = true) + mockkStatic(Log::class) + every { Log.w(any(), any()) } returns 0 + every { Log.d(any(), any()) } returns 0 + + every { app.getString(R.string.auth_login_error_unreachable) } returns "Dashboard unreachable" + viewModel = AuthLoginViewModel(app) } @@ -66,4 +79,34 @@ class AuthLoginViewModelTest { assertFalse(state.isLoading) assertNull(state.errorMessage) } + + @Test + fun `probe when status probe throws IOException updates error state`() { + val mockCall = mockk() + every { OkHttpProvider.probe.newCall(any()) } returns mockCall + every { mockCall.execute() } throws IOException("Connection refused") + + viewModel.probe() + + val state = runBlocking { viewModel.uiState.first { !it.probing } } + assertFalse(state.probing) + assertNull(state.authMode) + assertEquals("Dashboard unreachable", state.errorMessage) + } + + @Test + fun `probe when status probe returns unsuccessful updates error state`() { + val mockCall = mockk() + val mockResponse = mockk() + every { OkHttpProvider.probe.newCall(any()) } returns mockCall + every { mockCall.execute() } returns mockResponse + every { mockResponse.isSuccessful } returns false + + viewModel.probe() + + val state = runBlocking { viewModel.uiState.first { !it.probing } } + assertFalse(state.probing) + assertNull(state.authMode) + assertEquals("Dashboard unreachable", state.errorMessage) + } }