adding tests around the state resetting

This commit is contained in:
Adam Brown 2022-07-27 17:17:36 +01:00
parent a32a78751a
commit c4831510ac
3 changed files with 139 additions and 0 deletions

View File

@ -22,7 +22,9 @@ import im.vector.app.R
import im.vector.app.features.login.LoginConfig import im.vector.app.features.login.LoginConfig
import im.vector.app.features.login.LoginMode import im.vector.app.features.login.LoginMode
import im.vector.app.features.login.ReAuthHelper import im.vector.app.features.login.ReAuthHelper
import im.vector.app.features.login.ServerType
import im.vector.app.features.login.SignMode import im.vector.app.features.login.SignMode
import im.vector.app.features.onboarding.RegistrationStateFixture.aRegistrationState
import im.vector.app.features.onboarding.StartAuthenticationFlowUseCase.StartAuthenticationResult import im.vector.app.features.onboarding.StartAuthenticationFlowUseCase.StartAuthenticationResult
import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeActiveSessionHolder
import im.vector.app.test.fakes.FakeAnalyticsTracker import im.vector.app.test.fakes.FakeAnalyticsTracker
@ -78,6 +80,7 @@ private const val A_USERNAME = "hello-world"
private const val A_DEVICE_NAME = "a-device-name" private const val A_DEVICE_NAME = "a-device-name"
private const val A_MATRIX_ID = "@$A_USERNAME:matrix.org" private const val A_MATRIX_ID = "@$A_USERNAME:matrix.org"
private const val A_LOGIN_TOKEN = "a-login-token" private const val A_LOGIN_TOKEN = "a-login-token"
private val A_REGISTRATION_STATE = aRegistrationState(email = AN_EMAIL)
class OnboardingViewModelTest { class OnboardingViewModelTest {
@ -782,6 +785,107 @@ class OnboardingViewModelTest {
.finish() .finish()
} }
@Test
fun `given homeserver state, when resetting homeserver url, then resets auth service and state`() = runTest {
viewModelWith(initialState.copy(isLoading = true, selectedHomeserver = SELECTED_HOMESERVER_STATE))
val test = viewModel.test()
fakeAuthenticationService.expectReset()
viewModel.handle(OnboardingAction.ResetHomeServerUrl)
test
.assertStatesChanges(
initialState,
{ copy(isLoading = false, selectedHomeserver = SelectedHomeserverState()) },
)
.assertNoEvents()
.finish()
fakeAuthenticationService.verifyReset()
}
@Test
fun `given server type, when resetting homeserver type, then resets state`() = runTest {
viewModelWith(initialState.copy(serverType = ServerType.EMS))
val test = viewModel.test()
viewModel.handle(OnboardingAction.ResetHomeServerType)
test
.assertStatesChanges(
initialState,
{ copy(serverType = ServerType.Unknown) },
)
.assertNoEvents()
.finish()
}
@Test
fun `given sign mode, when resetting sign mode, then resets state`() = runTest {
viewModelWith(initialState.copy(isLoading = true, signMode = SignMode.SignIn))
val test = viewModel.test()
viewModel.handle(OnboardingAction.ResetSignMode)
test
.assertStatesChanges(
initialState,
{ copy(isLoading = false, signMode = SignMode.Unknown) },
)
.assertNoEvents()
.finish()
}
@Test
fun `given registration state, when resetting authentication attempt, then cancels pending logic or registration and resets state`() = runTest {
viewModelWith(initialState.copy(isLoading = true, registrationState = A_REGISTRATION_STATE))
val test = viewModel.test()
fakeAuthenticationService.expectedCancelsPendingLogin()
viewModel.handle(OnboardingAction.ResetAuthenticationAttempt)
test
.assertStatesChanges(
initialState,
{ copy(isLoading = false, registrationState = RegistrationState()) },
)
.assertNoEvents()
.finish()
fakeAuthenticationService.verifyCancelsPendingLogin()
}
@Test
fun `given reset state, when resetting reset state, then resets state`() = runTest {
viewModelWith(initialState.copy(isLoading = true, resetState = ResetState(AN_EMAIL)))
val test = viewModel.test()
viewModel.handle(OnboardingAction.ResetResetPassword)
test
.assertStatesChanges(
initialState,
{ copy(isLoading = false, resetState = ResetState()) },
)
.assertNoEvents()
.finish()
}
@Test
fun `given registration state, when resetting user name, then resets state`() = runTest {
viewModelWith(initialState.copy(registrationState = A_REGISTRATION_STATE))
val test = viewModel.test()
viewModel.handle(OnboardingAction.ResetSelectedRegistrationUserName)
test
.assertStatesChanges(
initialState,
{ copy(registrationState = RegistrationState()) },
)
.assertNoEvents()
.finish()
}
private fun viewModelWith(state: OnboardingViewState) { private fun viewModelWith(state: OnboardingViewState) {
OnboardingViewModel( OnboardingViewModel(
state, state,

View File

@ -0,0 +1,26 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.onboarding
object RegistrationStateFixture {
fun aRegistrationState(
email: String? = null,
isUserNameAvailable: Boolean = false,
selectedMatrixId: String? = null,
) = RegistrationState(email, isUserNameAvailable, selectedMatrixId)
}

View File

@ -18,6 +18,7 @@ package im.vector.app.test.fakes
import io.mockk.coEvery import io.mockk.coEvery
import io.mockk.coJustRun import io.mockk.coJustRun
import io.mockk.coVerify
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import org.matrix.android.sdk.api.auth.AuthenticationService import org.matrix.android.sdk.api.auth.AuthenticationService
@ -68,4 +69,12 @@ class FakeAuthenticationService : AuthenticationService by mockk() {
fun givenDirectAuthenticationThrows(config: HomeServerConnectionConfig, matrixId: String, password: String, deviceName: String, cause: Throwable) { fun givenDirectAuthenticationThrows(config: HomeServerConnectionConfig, matrixId: String, password: String, deviceName: String, cause: Throwable) {
coEvery { directAuthentication(config, matrixId, password, deviceName) } throws cause coEvery { directAuthentication(config, matrixId, password, deviceName) } throws cause
} }
fun verifyReset() {
coVerify { reset() }
}
fun verifyCancelsPendingLogin() {
coVerify { cancelPendingLoginOrRegistration() }
}
} }