mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2024-11-23 01:45:52 +03:00
Removing error formatting from ViewModel
This commit is contained in:
parent
1d2b8e76a2
commit
45050e8216
6 changed files with 6 additions and 154 deletions
|
@ -21,11 +21,9 @@ import com.airbnb.mvrx.Success
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import im.vector.app.R
|
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||||
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
||||||
import im.vector.app.core.resources.StringProvider
|
|
||||||
import im.vector.app.features.auth.PendingAuthHandler
|
import im.vector.app.features.auth.PendingAuthHandler
|
||||||
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
|
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
|
||||||
import im.vector.app.features.settings.devices.v2.signout.InterceptSignoutFlowResponseUseCase
|
import im.vector.app.features.settings.devices.v2.signout.InterceptSignoutFlowResponseUseCase
|
||||||
|
@ -40,16 +38,13 @@ import org.matrix.android.sdk.api.auth.UIABaseAuth
|
||||||
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
|
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
|
||||||
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
|
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
|
||||||
import org.matrix.android.sdk.api.extensions.orFalse
|
import org.matrix.android.sdk.api.extensions.orFalse
|
||||||
import org.matrix.android.sdk.api.failure.Failure
|
|
||||||
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.net.ssl.HttpsURLConnection
|
|
||||||
import kotlin.coroutines.Continuation
|
import kotlin.coroutines.Continuation
|
||||||
|
|
||||||
class DevicesViewModel @AssistedInject constructor(
|
class DevicesViewModel @AssistedInject constructor(
|
||||||
@Assisted initialState: DevicesViewState,
|
@Assisted initialState: DevicesViewState,
|
||||||
activeSessionHolder: ActiveSessionHolder,
|
activeSessionHolder: ActiveSessionHolder,
|
||||||
private val stringProvider: StringProvider,
|
|
||||||
private val getCurrentSessionCrossSigningInfoUseCase: GetCurrentSessionCrossSigningInfoUseCase,
|
private val getCurrentSessionCrossSigningInfoUseCase: GetCurrentSessionCrossSigningInfoUseCase,
|
||||||
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
|
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
|
||||||
private val refreshDevicesOnCryptoDevicesChangeUseCase: RefreshDevicesOnCryptoDevicesChangeUseCase,
|
private val refreshDevicesOnCryptoDevicesChangeUseCase: RefreshDevicesOnCryptoDevicesChangeUseCase,
|
||||||
|
@ -195,12 +190,7 @@ class DevicesViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
private fun onSignoutFailure(failure: Throwable) {
|
private fun onSignoutFailure(failure: Throwable) {
|
||||||
Timber.e("signout failure", failure)
|
Timber.e("signout failure", failure)
|
||||||
val failureMessage = if (failure is Failure.OtherServerError && failure.httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED) {
|
_viewEvents.post(DevicesViewEvent.SignoutError(failure))
|
||||||
stringProvider.getString(R.string.authentication_error)
|
|
||||||
} else {
|
|
||||||
stringProvider.getString(R.string.matrix_error)
|
|
||||||
}
|
|
||||||
_viewEvents.post(DevicesViewEvent.SignoutError(Exception(failureMessage)))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleSsoAuthDone() {
|
private fun handleSsoAuthDone() {
|
||||||
|
|
|
@ -21,11 +21,9 @@ import com.airbnb.mvrx.Success
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import im.vector.app.R
|
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||||
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
||||||
import im.vector.app.core.resources.StringProvider
|
|
||||||
import im.vector.app.features.auth.PendingAuthHandler
|
import im.vector.app.features.auth.PendingAuthHandler
|
||||||
import im.vector.app.features.settings.devices.v2.GetDeviceFullInfoListUseCase
|
import im.vector.app.features.settings.devices.v2.GetDeviceFullInfoListUseCase
|
||||||
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
||||||
|
@ -39,16 +37,13 @@ import kotlinx.coroutines.launch
|
||||||
import org.matrix.android.sdk.api.auth.UIABaseAuth
|
import org.matrix.android.sdk.api.auth.UIABaseAuth
|
||||||
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
|
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
|
||||||
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
|
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
|
||||||
import org.matrix.android.sdk.api.failure.Failure
|
|
||||||
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.net.ssl.HttpsURLConnection
|
|
||||||
import kotlin.coroutines.Continuation
|
import kotlin.coroutines.Continuation
|
||||||
|
|
||||||
class OtherSessionsViewModel @AssistedInject constructor(
|
class OtherSessionsViewModel @AssistedInject constructor(
|
||||||
@Assisted private val initialState: OtherSessionsViewState,
|
@Assisted private val initialState: OtherSessionsViewState,
|
||||||
activeSessionHolder: ActiveSessionHolder,
|
activeSessionHolder: ActiveSessionHolder,
|
||||||
private val stringProvider: StringProvider,
|
|
||||||
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
|
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
|
||||||
private val signoutSessionsUseCase: SignoutSessionsUseCase,
|
private val signoutSessionsUseCase: SignoutSessionsUseCase,
|
||||||
private val interceptSignoutFlowResponseUseCase: InterceptSignoutFlowResponseUseCase,
|
private val interceptSignoutFlowResponseUseCase: InterceptSignoutFlowResponseUseCase,
|
||||||
|
@ -223,12 +218,7 @@ class OtherSessionsViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
private fun onSignoutFailure(failure: Throwable) {
|
private fun onSignoutFailure(failure: Throwable) {
|
||||||
Timber.e("signout failure", failure)
|
Timber.e("signout failure", failure)
|
||||||
val failureMessage = if (failure is Failure.OtherServerError && failure.httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED) {
|
_viewEvents.post(OtherSessionsViewEvents.SignoutError(failure))
|
||||||
stringProvider.getString(R.string.authentication_error)
|
|
||||||
} else {
|
|
||||||
stringProvider.getString(R.string.matrix_error)
|
|
||||||
}
|
|
||||||
_viewEvents.post(OtherSessionsViewEvents.SignoutError(Exception(failureMessage)))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleSsoAuthDone() {
|
private fun handleSsoAuthDone() {
|
||||||
|
|
|
@ -21,11 +21,9 @@ import com.airbnb.mvrx.Success
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import im.vector.app.R
|
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||||
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
||||||
import im.vector.app.core.resources.StringProvider
|
|
||||||
import im.vector.app.features.auth.PendingAuthHandler
|
import im.vector.app.features.auth.PendingAuthHandler
|
||||||
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
||||||
import im.vector.app.features.settings.devices.v2.VectorSessionsListViewModel
|
import im.vector.app.features.settings.devices.v2.VectorSessionsListViewModel
|
||||||
|
@ -44,16 +42,13 @@ import org.matrix.android.sdk.api.auth.UIABaseAuth
|
||||||
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
|
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
|
||||||
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
|
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
|
||||||
import org.matrix.android.sdk.api.extensions.orFalse
|
import org.matrix.android.sdk.api.extensions.orFalse
|
||||||
import org.matrix.android.sdk.api.failure.Failure
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel
|
import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel
|
||||||
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.net.ssl.HttpsURLConnection
|
|
||||||
import kotlin.coroutines.Continuation
|
import kotlin.coroutines.Continuation
|
||||||
|
|
||||||
class SessionOverviewViewModel @AssistedInject constructor(
|
class SessionOverviewViewModel @AssistedInject constructor(
|
||||||
@Assisted val initialState: SessionOverviewViewState,
|
@Assisted val initialState: SessionOverviewViewState,
|
||||||
private val stringProvider: StringProvider,
|
|
||||||
private val getDeviceFullInfoUseCase: GetDeviceFullInfoUseCase,
|
private val getDeviceFullInfoUseCase: GetDeviceFullInfoUseCase,
|
||||||
private val checkIfCurrentSessionCanBeVerifiedUseCase: CheckIfCurrentSessionCanBeVerifiedUseCase,
|
private val checkIfCurrentSessionCanBeVerifiedUseCase: CheckIfCurrentSessionCanBeVerifiedUseCase,
|
||||||
private val signoutSessionUseCase: SignoutSessionUseCase,
|
private val signoutSessionUseCase: SignoutSessionUseCase,
|
||||||
|
@ -196,12 +191,7 @@ class SessionOverviewViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
private fun onSignoutFailure(failure: Throwable) {
|
private fun onSignoutFailure(failure: Throwable) {
|
||||||
Timber.e("signout failure", failure)
|
Timber.e("signout failure", failure)
|
||||||
val failureMessage = if (failure is Failure.OtherServerError && failure.httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED) {
|
_viewEvents.post(SessionOverviewViewEvent.SignoutError(failure))
|
||||||
stringProvider.getString(R.string.authentication_error)
|
|
||||||
} else {
|
|
||||||
stringProvider.getString(R.string.matrix_error)
|
|
||||||
}
|
|
||||||
_viewEvents.post(SessionOverviewViewEvent.SignoutError(Exception(failureMessage)))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleSsoAuthDone() {
|
private fun handleSsoAuthDone() {
|
||||||
|
|
|
@ -19,7 +19,6 @@ package im.vector.app.features.settings.devices.v2
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import com.airbnb.mvrx.Success
|
import com.airbnb.mvrx.Success
|
||||||
import com.airbnb.mvrx.test.MavericksTestRule
|
import com.airbnb.mvrx.test.MavericksTestRule
|
||||||
import im.vector.app.R
|
|
||||||
import im.vector.app.core.session.clientinfo.MatrixClientInfoContent
|
import im.vector.app.core.session.clientinfo.MatrixClientInfoContent
|
||||||
import im.vector.app.features.settings.devices.v2.details.extended.DeviceExtendedInfo
|
import im.vector.app.features.settings.devices.v2.details.extended.DeviceExtendedInfo
|
||||||
import im.vector.app.features.settings.devices.v2.list.DeviceType
|
import im.vector.app.features.settings.devices.v2.list.DeviceType
|
||||||
|
@ -30,7 +29,6 @@ import im.vector.app.features.settings.devices.v2.verification.GetCurrentSession
|
||||||
import im.vector.app.test.fakes.FakeActiveSessionHolder
|
import im.vector.app.test.fakes.FakeActiveSessionHolder
|
||||||
import im.vector.app.test.fakes.FakePendingAuthHandler
|
import im.vector.app.test.fakes.FakePendingAuthHandler
|
||||||
import im.vector.app.test.fakes.FakeSignoutSessionsUseCase
|
import im.vector.app.test.fakes.FakeSignoutSessionsUseCase
|
||||||
import im.vector.app.test.fakes.FakeStringProvider
|
|
||||||
import im.vector.app.test.fakes.FakeVerificationService
|
import im.vector.app.test.fakes.FakeVerificationService
|
||||||
import im.vector.app.test.test
|
import im.vector.app.test.test
|
||||||
import im.vector.app.test.testDispatcher
|
import im.vector.app.test.testDispatcher
|
||||||
|
@ -49,20 +47,16 @@ import org.junit.After
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.matrix.android.sdk.api.failure.Failure
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel
|
import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel
|
||||||
import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
|
import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
|
||||||
import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo
|
import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo
|
||||||
import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel
|
import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel
|
||||||
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
||||||
import javax.net.ssl.HttpsURLConnection
|
|
||||||
|
|
||||||
private const val A_CURRENT_DEVICE_ID = "current-device-id"
|
private const val A_CURRENT_DEVICE_ID = "current-device-id"
|
||||||
private const val A_DEVICE_ID_1 = "device-id-1"
|
private const val A_DEVICE_ID_1 = "device-id-1"
|
||||||
private const val A_DEVICE_ID_2 = "device-id-2"
|
private const val A_DEVICE_ID_2 = "device-id-2"
|
||||||
private const val A_PASSWORD = "password"
|
private const val A_PASSWORD = "password"
|
||||||
private const val AUTH_ERROR_MESSAGE = "auth-error-message"
|
|
||||||
private const val AN_ERROR_MESSAGE = "error-message"
|
|
||||||
|
|
||||||
class DevicesViewModelTest {
|
class DevicesViewModelTest {
|
||||||
|
|
||||||
|
@ -70,7 +64,6 @@ class DevicesViewModelTest {
|
||||||
val mavericksTestRule = MavericksTestRule(testDispatcher = testDispatcher)
|
val mavericksTestRule = MavericksTestRule(testDispatcher = testDispatcher)
|
||||||
|
|
||||||
private val fakeActiveSessionHolder = FakeActiveSessionHolder()
|
private val fakeActiveSessionHolder = FakeActiveSessionHolder()
|
||||||
private val fakeStringProvider = FakeStringProvider()
|
|
||||||
private val getCurrentSessionCrossSigningInfoUseCase = mockk<GetCurrentSessionCrossSigningInfoUseCase>()
|
private val getCurrentSessionCrossSigningInfoUseCase = mockk<GetCurrentSessionCrossSigningInfoUseCase>()
|
||||||
private val getDeviceFullInfoListUseCase = mockk<GetDeviceFullInfoListUseCase>()
|
private val getDeviceFullInfoListUseCase = mockk<GetDeviceFullInfoListUseCase>()
|
||||||
private val refreshDevicesOnCryptoDevicesChangeUseCase = mockk<RefreshDevicesOnCryptoDevicesChangeUseCase>(relaxed = true)
|
private val refreshDevicesOnCryptoDevicesChangeUseCase = mockk<RefreshDevicesOnCryptoDevicesChangeUseCase>(relaxed = true)
|
||||||
|
@ -84,7 +77,6 @@ class DevicesViewModelTest {
|
||||||
return DevicesViewModel(
|
return DevicesViewModel(
|
||||||
initialState = DevicesViewState(),
|
initialState = DevicesViewState(),
|
||||||
activeSessionHolder = fakeActiveSessionHolder.instance,
|
activeSessionHolder = fakeActiveSessionHolder.instance,
|
||||||
stringProvider = fakeStringProvider.instance,
|
|
||||||
getCurrentSessionCrossSigningInfoUseCase = getCurrentSessionCrossSigningInfoUseCase,
|
getCurrentSessionCrossSigningInfoUseCase = getCurrentSessionCrossSigningInfoUseCase,
|
||||||
getDeviceFullInfoListUseCase = getDeviceFullInfoListUseCase,
|
getDeviceFullInfoListUseCase = getDeviceFullInfoListUseCase,
|
||||||
refreshDevicesOnCryptoDevicesChangeUseCase = refreshDevicesOnCryptoDevicesChangeUseCase,
|
refreshDevicesOnCryptoDevicesChangeUseCase = refreshDevicesOnCryptoDevicesChangeUseCase,
|
||||||
|
@ -257,37 +249,12 @@ class DevicesViewModelTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `given server error during multiSignout when handling multiSignout other sessions action then signout process is performed`() {
|
|
||||||
// Given
|
|
||||||
val serverError = Failure.OtherServerError(errorBody = "", httpCode = HttpsURLConnection.HTTP_UNAUTHORIZED)
|
|
||||||
fakeSignoutSessionsUseCase.givenSignoutError(listOf(A_DEVICE_ID_1, A_DEVICE_ID_2), serverError)
|
|
||||||
val expectedViewState = givenInitialViewState(deviceId1 = A_DEVICE_ID_1, deviceId2 = A_DEVICE_ID_2)
|
|
||||||
fakeStringProvider.given(R.string.authentication_error, AUTH_ERROR_MESSAGE)
|
|
||||||
|
|
||||||
// When
|
|
||||||
val viewModel = createViewModel()
|
|
||||||
val viewModelTest = viewModel.test()
|
|
||||||
viewModel.handle(DevicesAction.MultiSignoutOtherSessions)
|
|
||||||
|
|
||||||
// Then
|
|
||||||
viewModelTest
|
|
||||||
.assertStatesChanges(
|
|
||||||
expectedViewState,
|
|
||||||
{ copy(isLoading = true) },
|
|
||||||
{ copy(isLoading = false) }
|
|
||||||
)
|
|
||||||
.assertEvent { it is DevicesViewEvent.SignoutError && it.error.message == AUTH_ERROR_MESSAGE }
|
|
||||||
.finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `given unexpected error during multiSignout when handling multiSignout action then signout process is performed`() {
|
fun `given unexpected error during multiSignout when handling multiSignout action then signout process is performed`() {
|
||||||
// Given
|
// Given
|
||||||
val error = Exception()
|
val error = Exception()
|
||||||
fakeSignoutSessionsUseCase.givenSignoutError(listOf(A_DEVICE_ID_1, A_DEVICE_ID_2), error)
|
fakeSignoutSessionsUseCase.givenSignoutError(listOf(A_DEVICE_ID_1, A_DEVICE_ID_2), error)
|
||||||
val expectedViewState = givenInitialViewState(deviceId1 = A_DEVICE_ID_1, deviceId2 = A_DEVICE_ID_2)
|
val expectedViewState = givenInitialViewState(deviceId1 = A_DEVICE_ID_1, deviceId2 = A_DEVICE_ID_2)
|
||||||
fakeStringProvider.given(R.string.matrix_error, AN_ERROR_MESSAGE)
|
|
||||||
|
|
||||||
// When
|
// When
|
||||||
val viewModel = createViewModel()
|
val viewModel = createViewModel()
|
||||||
|
@ -301,7 +268,7 @@ class DevicesViewModelTest {
|
||||||
{ copy(isLoading = true) },
|
{ copy(isLoading = true) },
|
||||||
{ copy(isLoading = false) }
|
{ copy(isLoading = false) }
|
||||||
)
|
)
|
||||||
.assertEvent { it is DevicesViewEvent.SignoutError && it.error.message == AN_ERROR_MESSAGE }
|
.assertEvent { it is DevicesViewEvent.SignoutError && it.error == error }
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@ package im.vector.app.features.settings.devices.v2.othersessions
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import com.airbnb.mvrx.Success
|
import com.airbnb.mvrx.Success
|
||||||
import com.airbnb.mvrx.test.MavericksTestRule
|
import com.airbnb.mvrx.test.MavericksTestRule
|
||||||
import im.vector.app.R
|
|
||||||
import im.vector.app.features.settings.devices.v2.DeviceFullInfo
|
import im.vector.app.features.settings.devices.v2.DeviceFullInfo
|
||||||
import im.vector.app.features.settings.devices.v2.GetDeviceFullInfoListUseCase
|
import im.vector.app.features.settings.devices.v2.GetDeviceFullInfoListUseCase
|
||||||
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
||||||
|
@ -28,7 +27,6 @@ import im.vector.app.features.settings.devices.v2.signout.InterceptSignoutFlowRe
|
||||||
import im.vector.app.test.fakes.FakeActiveSessionHolder
|
import im.vector.app.test.fakes.FakeActiveSessionHolder
|
||||||
import im.vector.app.test.fakes.FakePendingAuthHandler
|
import im.vector.app.test.fakes.FakePendingAuthHandler
|
||||||
import im.vector.app.test.fakes.FakeSignoutSessionsUseCase
|
import im.vector.app.test.fakes.FakeSignoutSessionsUseCase
|
||||||
import im.vector.app.test.fakes.FakeStringProvider
|
|
||||||
import im.vector.app.test.fakes.FakeVerificationService
|
import im.vector.app.test.fakes.FakeVerificationService
|
||||||
import im.vector.app.test.fixtures.aDeviceFullInfo
|
import im.vector.app.test.fixtures.aDeviceFullInfo
|
||||||
import im.vector.app.test.test
|
import im.vector.app.test.test
|
||||||
|
@ -46,16 +44,12 @@ import org.junit.After
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.matrix.android.sdk.api.failure.Failure
|
|
||||||
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
||||||
import javax.net.ssl.HttpsURLConnection
|
|
||||||
|
|
||||||
private const val A_TITLE_RES_ID = 1
|
private const val A_TITLE_RES_ID = 1
|
||||||
private const val A_DEVICE_ID_1 = "device-id-1"
|
private const val A_DEVICE_ID_1 = "device-id-1"
|
||||||
private const val A_DEVICE_ID_2 = "device-id-2"
|
private const val A_DEVICE_ID_2 = "device-id-2"
|
||||||
private const val A_PASSWORD = "password"
|
private const val A_PASSWORD = "password"
|
||||||
private const val AUTH_ERROR_MESSAGE = "auth-error-message"
|
|
||||||
private const val AN_ERROR_MESSAGE = "error-message"
|
|
||||||
|
|
||||||
class OtherSessionsViewModelTest {
|
class OtherSessionsViewModelTest {
|
||||||
|
|
||||||
|
@ -69,7 +63,6 @@ class OtherSessionsViewModelTest {
|
||||||
)
|
)
|
||||||
|
|
||||||
private val fakeActiveSessionHolder = FakeActiveSessionHolder()
|
private val fakeActiveSessionHolder = FakeActiveSessionHolder()
|
||||||
private val fakeStringProvider = FakeStringProvider()
|
|
||||||
private val fakeGetDeviceFullInfoListUseCase = mockk<GetDeviceFullInfoListUseCase>()
|
private val fakeGetDeviceFullInfoListUseCase = mockk<GetDeviceFullInfoListUseCase>()
|
||||||
private val fakeRefreshDevicesUseCase = mockk<RefreshDevicesUseCase>(relaxed = true)
|
private val fakeRefreshDevicesUseCase = mockk<RefreshDevicesUseCase>(relaxed = true)
|
||||||
private val fakeSignoutSessionsUseCase = FakeSignoutSessionsUseCase()
|
private val fakeSignoutSessionsUseCase = FakeSignoutSessionsUseCase()
|
||||||
|
@ -79,7 +72,6 @@ class OtherSessionsViewModelTest {
|
||||||
private fun createViewModel(viewState: OtherSessionsViewState = OtherSessionsViewState(defaultArgs)) =
|
private fun createViewModel(viewState: OtherSessionsViewState = OtherSessionsViewState(defaultArgs)) =
|
||||||
OtherSessionsViewModel(
|
OtherSessionsViewModel(
|
||||||
initialState = viewState,
|
initialState = viewState,
|
||||||
stringProvider = fakeStringProvider.instance,
|
|
||||||
activeSessionHolder = fakeActiveSessionHolder.instance,
|
activeSessionHolder = fakeActiveSessionHolder.instance,
|
||||||
getDeviceFullInfoListUseCase = fakeGetDeviceFullInfoListUseCase,
|
getDeviceFullInfoListUseCase = fakeGetDeviceFullInfoListUseCase,
|
||||||
signoutSessionsUseCase = fakeSignoutSessionsUseCase.instance,
|
signoutSessionsUseCase = fakeSignoutSessionsUseCase.instance,
|
||||||
|
@ -392,38 +384,6 @@ class OtherSessionsViewModelTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `given server error during multiSignout when handling multiSignout action then signout process is performed`() {
|
|
||||||
// Given
|
|
||||||
val deviceFullInfo1 = aDeviceFullInfo(A_DEVICE_ID_1, isSelected = false)
|
|
||||||
val deviceFullInfo2 = aDeviceFullInfo(A_DEVICE_ID_2, isSelected = true)
|
|
||||||
val devices: List<DeviceFullInfo> = listOf(deviceFullInfo1, deviceFullInfo2)
|
|
||||||
givenGetDeviceFullInfoListReturns(filterType = defaultArgs.defaultFilter, devices)
|
|
||||||
val serverError = Failure.OtherServerError(errorBody = "", httpCode = HttpsURLConnection.HTTP_UNAUTHORIZED)
|
|
||||||
fakeSignoutSessionsUseCase.givenSignoutError(listOf(A_DEVICE_ID_1, A_DEVICE_ID_2), serverError)
|
|
||||||
val expectedViewState = OtherSessionsViewState(
|
|
||||||
devices = Success(listOf(deviceFullInfo1, deviceFullInfo2)),
|
|
||||||
currentFilter = defaultArgs.defaultFilter,
|
|
||||||
excludeCurrentDevice = defaultArgs.excludeCurrentDevice,
|
|
||||||
)
|
|
||||||
fakeStringProvider.given(R.string.authentication_error, AUTH_ERROR_MESSAGE)
|
|
||||||
|
|
||||||
// When
|
|
||||||
val viewModel = createViewModel()
|
|
||||||
val viewModelTest = viewModel.test()
|
|
||||||
viewModel.handle(OtherSessionsAction.MultiSignout)
|
|
||||||
|
|
||||||
// Then
|
|
||||||
viewModelTest
|
|
||||||
.assertStatesChanges(
|
|
||||||
expectedViewState,
|
|
||||||
{ copy(isLoading = true) },
|
|
||||||
{ copy(isLoading = false) }
|
|
||||||
)
|
|
||||||
.assertEvent { it is OtherSessionsViewEvents.SignoutError && it.error.message == AUTH_ERROR_MESSAGE }
|
|
||||||
.finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `given unexpected error during multiSignout when handling multiSignout action then signout process is performed`() {
|
fun `given unexpected error during multiSignout when handling multiSignout action then signout process is performed`() {
|
||||||
// Given
|
// Given
|
||||||
|
@ -438,7 +398,6 @@ class OtherSessionsViewModelTest {
|
||||||
currentFilter = defaultArgs.defaultFilter,
|
currentFilter = defaultArgs.defaultFilter,
|
||||||
excludeCurrentDevice = defaultArgs.excludeCurrentDevice,
|
excludeCurrentDevice = defaultArgs.excludeCurrentDevice,
|
||||||
)
|
)
|
||||||
fakeStringProvider.given(R.string.matrix_error, AN_ERROR_MESSAGE)
|
|
||||||
|
|
||||||
// When
|
// When
|
||||||
val viewModel = createViewModel()
|
val viewModel = createViewModel()
|
||||||
|
@ -452,7 +411,7 @@ class OtherSessionsViewModelTest {
|
||||||
{ copy(isLoading = true) },
|
{ copy(isLoading = true) },
|
||||||
{ copy(isLoading = false) }
|
{ copy(isLoading = false) }
|
||||||
)
|
)
|
||||||
.assertEvent { it is OtherSessionsViewEvents.SignoutError && it.error.message == AN_ERROR_MESSAGE }
|
.assertEvent { it is OtherSessionsViewEvents.SignoutError && it.error == error }
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ import android.os.SystemClock
|
||||||
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
|
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
|
||||||
import com.airbnb.mvrx.Success
|
import com.airbnb.mvrx.Success
|
||||||
import com.airbnb.mvrx.test.MavericksTestRule
|
import com.airbnb.mvrx.test.MavericksTestRule
|
||||||
import im.vector.app.R
|
|
||||||
import im.vector.app.features.settings.devices.v2.DeviceFullInfo
|
import im.vector.app.features.settings.devices.v2.DeviceFullInfo
|
||||||
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
||||||
import im.vector.app.features.settings.devices.v2.notification.GetNotificationsStatusUseCase
|
import im.vector.app.features.settings.devices.v2.notification.GetNotificationsStatusUseCase
|
||||||
|
@ -30,7 +29,6 @@ import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSes
|
||||||
import im.vector.app.test.fakes.FakeActiveSessionHolder
|
import im.vector.app.test.fakes.FakeActiveSessionHolder
|
||||||
import im.vector.app.test.fakes.FakePendingAuthHandler
|
import im.vector.app.test.fakes.FakePendingAuthHandler
|
||||||
import im.vector.app.test.fakes.FakeSignoutSessionUseCase
|
import im.vector.app.test.fakes.FakeSignoutSessionUseCase
|
||||||
import im.vector.app.test.fakes.FakeStringProvider
|
|
||||||
import im.vector.app.test.fakes.FakeTogglePushNotificationUseCase
|
import im.vector.app.test.fakes.FakeTogglePushNotificationUseCase
|
||||||
import im.vector.app.test.fakes.FakeVerificationService
|
import im.vector.app.test.fakes.FakeVerificationService
|
||||||
import im.vector.app.test.test
|
import im.vector.app.test.test
|
||||||
|
@ -51,15 +49,11 @@ import org.junit.After
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.matrix.android.sdk.api.failure.Failure
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel
|
import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel
|
||||||
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
|
||||||
import javax.net.ssl.HttpsURLConnection
|
|
||||||
|
|
||||||
private const val A_SESSION_ID_1 = "session-id-1"
|
private const val A_SESSION_ID_1 = "session-id-1"
|
||||||
private const val A_SESSION_ID_2 = "session-id-2"
|
private const val A_SESSION_ID_2 = "session-id-2"
|
||||||
private const val AUTH_ERROR_MESSAGE = "auth-error-message"
|
|
||||||
private const val AN_ERROR_MESSAGE = "error-message"
|
|
||||||
private const val A_PASSWORD = "password"
|
private const val A_PASSWORD = "password"
|
||||||
|
|
||||||
class SessionOverviewViewModelTest {
|
class SessionOverviewViewModelTest {
|
||||||
|
@ -75,7 +69,6 @@ class SessionOverviewViewModelTest {
|
||||||
)
|
)
|
||||||
private val getDeviceFullInfoUseCase = mockk<GetDeviceFullInfoUseCase>(relaxed = true)
|
private val getDeviceFullInfoUseCase = mockk<GetDeviceFullInfoUseCase>(relaxed = true)
|
||||||
private val fakeActiveSessionHolder = FakeActiveSessionHolder()
|
private val fakeActiveSessionHolder = FakeActiveSessionHolder()
|
||||||
private val fakeStringProvider = FakeStringProvider()
|
|
||||||
private val checkIfCurrentSessionCanBeVerifiedUseCase = mockk<CheckIfCurrentSessionCanBeVerifiedUseCase>()
|
private val checkIfCurrentSessionCanBeVerifiedUseCase = mockk<CheckIfCurrentSessionCanBeVerifiedUseCase>()
|
||||||
private val fakeSignoutSessionUseCase = FakeSignoutSessionUseCase()
|
private val fakeSignoutSessionUseCase = FakeSignoutSessionUseCase()
|
||||||
private val interceptSignoutFlowResponseUseCase = mockk<InterceptSignoutFlowResponseUseCase>()
|
private val interceptSignoutFlowResponseUseCase = mockk<InterceptSignoutFlowResponseUseCase>()
|
||||||
|
@ -87,7 +80,6 @@ class SessionOverviewViewModelTest {
|
||||||
|
|
||||||
private fun createViewModel() = SessionOverviewViewModel(
|
private fun createViewModel() = SessionOverviewViewModel(
|
||||||
initialState = SessionOverviewViewState(args),
|
initialState = SessionOverviewViewState(args),
|
||||||
stringProvider = fakeStringProvider.instance,
|
|
||||||
getDeviceFullInfoUseCase = getDeviceFullInfoUseCase,
|
getDeviceFullInfoUseCase = getDeviceFullInfoUseCase,
|
||||||
checkIfCurrentSessionCanBeVerifiedUseCase = checkIfCurrentSessionCanBeVerifiedUseCase,
|
checkIfCurrentSessionCanBeVerifiedUseCase = checkIfCurrentSessionCanBeVerifiedUseCase,
|
||||||
signoutSessionUseCase = fakeSignoutSessionUseCase.instance,
|
signoutSessionUseCase = fakeSignoutSessionUseCase.instance,
|
||||||
|
@ -286,41 +278,6 @@ class SessionOverviewViewModelTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `given another session and server error during signout when handling signout action then signout process is performed`() {
|
|
||||||
// Given
|
|
||||||
val deviceFullInfo = mockk<DeviceFullInfo>()
|
|
||||||
every { deviceFullInfo.isCurrentDevice } returns false
|
|
||||||
every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo)
|
|
||||||
val serverError = Failure.OtherServerError(errorBody = "", httpCode = HttpsURLConnection.HTTP_UNAUTHORIZED)
|
|
||||||
fakeSignoutSessionUseCase.givenSignoutError(A_SESSION_ID_1, serverError)
|
|
||||||
val signoutAction = SessionOverviewAction.SignoutOtherSession
|
|
||||||
givenCurrentSessionIsTrusted()
|
|
||||||
val expectedViewState = SessionOverviewViewState(
|
|
||||||
deviceId = A_SESSION_ID_1,
|
|
||||||
isCurrentSessionTrusted = true,
|
|
||||||
deviceInfo = Success(deviceFullInfo),
|
|
||||||
isLoading = false,
|
|
||||||
notificationsStatus = notificationsStatus,
|
|
||||||
)
|
|
||||||
fakeStringProvider.given(R.string.authentication_error, AUTH_ERROR_MESSAGE)
|
|
||||||
|
|
||||||
// When
|
|
||||||
val viewModel = createViewModel()
|
|
||||||
val viewModelTest = viewModel.test()
|
|
||||||
viewModel.handle(signoutAction)
|
|
||||||
|
|
||||||
// Then
|
|
||||||
viewModelTest
|
|
||||||
.assertStatesChanges(
|
|
||||||
expectedViewState,
|
|
||||||
{ copy(isLoading = true) },
|
|
||||||
{ copy(isLoading = false) }
|
|
||||||
)
|
|
||||||
.assertEvent { it is SessionOverviewViewEvent.SignoutError && it.error.message == AUTH_ERROR_MESSAGE }
|
|
||||||
.finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `given another session and unexpected error during signout when handling signout action then signout process is performed`() {
|
fun `given another session and unexpected error during signout when handling signout action then signout process is performed`() {
|
||||||
// Given
|
// Given
|
||||||
|
@ -338,7 +295,6 @@ class SessionOverviewViewModelTest {
|
||||||
isLoading = false,
|
isLoading = false,
|
||||||
notificationsStatus = notificationsStatus,
|
notificationsStatus = notificationsStatus,
|
||||||
)
|
)
|
||||||
fakeStringProvider.given(R.string.matrix_error, AN_ERROR_MESSAGE)
|
|
||||||
|
|
||||||
// When
|
// When
|
||||||
val viewModel = createViewModel()
|
val viewModel = createViewModel()
|
||||||
|
@ -352,7 +308,7 @@ class SessionOverviewViewModelTest {
|
||||||
{ copy(isLoading = true) },
|
{ copy(isLoading = true) },
|
||||||
{ copy(isLoading = false) }
|
{ copy(isLoading = false) }
|
||||||
)
|
)
|
||||||
.assertEvent { it is SessionOverviewViewEvent.SignoutError && it.error.message == AN_ERROR_MESSAGE }
|
.assertEvent { it is SessionOverviewViewEvent.SignoutError && it.error == error }
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue