test(#519): add AuthLoginViewModel probe error-path tests (merge onto #517 file, JUnit4+deterministic) (#519)

This commit is contained in:
M57
2026-07-09 21:36:57 +03:00
committed by GitHub
parent ba2d4cf896
commit 350db20af6
@@ -1,19 +1,26 @@
package com.m57.hermescontrol.ui.authlogin package com.m57.hermescontrol.ui.authlogin
import android.app.Application 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.local.AuthManager
import com.m57.hermescontrol.data.remote.OkHttpProvider import com.m57.hermescontrol.data.remote.OkHttpProvider
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkObject import io.mockk.mockkObject
import io.mockk.mockkStatic
import io.mockk.unmockkAll import io.mockk.unmockkAll
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Response
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.assertFalse
import org.junit.Assert.assertNull import org.junit.Assert.assertNull
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import java.io.IOException
class AuthLoginViewModelTest { class AuthLoginViewModelTest {
private lateinit var viewModel: AuthLoginViewModel private lateinit var viewModel: AuthLoginViewModel
@@ -29,6 +36,12 @@ class AuthLoginViewModelTest {
mockkObject(OkHttpProvider) mockkObject(OkHttpProvider)
every { OkHttpProvider.probe } returns mockk<OkHttpClient>(relaxed = true) every { OkHttpProvider.probe } returns mockk<OkHttpClient>(relaxed = true)
mockkStatic(Log::class)
every { Log.w(any<String>(), any<String>()) } returns 0
every { Log.d(any<String>(), any<String>()) } returns 0
every { app.getString(R.string.auth_login_error_unreachable) } returns "Dashboard unreachable"
viewModel = AuthLoginViewModel(app) viewModel = AuthLoginViewModel(app)
} }
@@ -66,4 +79,34 @@ class AuthLoginViewModelTest {
assertFalse(state.isLoading) assertFalse(state.isLoading)
assertNull(state.errorMessage) assertNull(state.errorMessage)
} }
@Test
fun `probe when status probe throws IOException updates error state`() {
val mockCall = mockk<okhttp3.Call>()
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<okhttp3.Call>()
val mockResponse = mockk<Response>()
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)
}
} }