test(#519): add AuthLoginViewModel probe error-path tests (merge onto #517 file, JUnit4+deterministic) (#519)
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user