@@ -33,6 +33,7 @@ import im.vector.app.test.fakes.FakeHomeServerConnectionConfigFactory
3333import im.vector.app.test.fakes.FakeHomeServerHistoryService
3434import im.vector.app.test.fakes.FakeLoginWizard
3535import im.vector.app.test.fakes.FakeRegistrationActionHandler
36+ import im.vector.app.test.fakes.FakeRegistrationWizard
3637import im.vector.app.test.fakes.FakeSession
3738import im.vector.app.test.fakes.FakeStartAuthenticationFlowUseCase
3839import im.vector.app.test.fakes.FakeStringProvider
@@ -41,6 +42,7 @@ import im.vector.app.test.fakes.FakeUriFilenameResolver
4142import im.vector.app.test.fakes.FakeVectorFeatures
4243import im.vector.app.test.fakes.FakeVectorOverrides
4344import im.vector.app.test.fakes.toTestString
45+ import im.vector.app.test.fixtures.a401ServerError
4446import im.vector.app.test.fixtures.aBuildMeta
4547import im.vector.app.test.fixtures.aHomeServerCapabilities
4648import im.vector.app.test.test
@@ -50,11 +52,13 @@ import org.junit.Rule
5052import org.junit.Test
5153import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
5254import org.matrix.android.sdk.api.auth.registration.Stage
55+ import org.matrix.android.sdk.api.failure.Failure
5356import org.matrix.android.sdk.api.session.Session
5457import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
5558
5659private const val A_DISPLAY_NAME = " a display name"
5760private const val A_PICTURE_FILENAME = " a-picture.png"
61+ private val A_SERVER_ERROR = a401ServerError()
5862private val AN_ERROR = RuntimeException (" an error!" )
5963private val A_LOADABLE_REGISTER_ACTION = RegisterAction .StartRegistration
6064private val A_NON_LOADABLE_REGISTER_ACTION = RegisterAction .CheckIfEmailHasBeenValidated (delayMillis = - 1L )
@@ -64,7 +68,7 @@ private val ANY_CONTINUING_REGISTRATION_RESULT = RegistrationActionHandler.Resul
6468private val A_DIRECT_LOGIN = OnboardingAction .AuthenticateAction .LoginDirect (" @a-user:id.org" , " a-password" , " a-device-name" )
6569private const val A_HOMESERVER_URL = " https://edited-homeserver.org"
6670private val A_HOMESERVER_CONFIG = HomeServerConnectionConfig (FakeUri ().instance)
67- private val SELECTED_HOMESERVER_STATE = SelectedHomeserverState (preferredLoginMode = LoginMode .Password )
71+ private val SELECTED_HOMESERVER_STATE = SelectedHomeserverState (preferredLoginMode = LoginMode .Password , userFacingUrl = A_HOMESERVER_URL )
6872private val SELECTED_HOMESERVER_STATE_SUPPORTED_LOGOUT_DEVICES = SelectedHomeserverState (isLogoutDevicesSupported = true )
6973private const val AN_EMAIL = " [email protected] " 7074private const val A_PASSWORD = " a-password"
@@ -323,6 +327,93 @@ class OnboardingViewModelTest {
323327 .finish()
324328 }
325329
330+ @Test
331+ fun `given available username, when a register username is entered, then emits available registration state` () = runTest {
332+ viewModelWith(initialRegistrationState(A_HOMESERVER_URL ))
333+ val onlyUsername = " a-username"
334+ givenUserNameIsAvailable(onlyUsername)
335+ val test = viewModel.test()
336+
337+ viewModel.handle(OnboardingAction .UserNameEnteredAction .Registration (onlyUsername))
338+
339+ test
340+ .assertStatesChanges(
341+ initialState,
342+ { copy(registrationState = availableRegistrationState(onlyUsername, A_HOMESERVER_URL )) }
343+ )
344+ .assertNoEvents()
345+ .finish()
346+ }
347+
348+ @Test
349+ fun `given unavailable username, when a register username is entered, then emits availability error` () = runTest {
350+ viewModelWith(initialRegistrationState(A_HOMESERVER_URL ))
351+ val onlyUsername = " a-username"
352+ givenUserNameIsUnavailable(onlyUsername, A_SERVER_ERROR )
353+ val test = viewModel.test()
354+
355+ viewModel.handle(OnboardingAction .UserNameEnteredAction .Registration (onlyUsername))
356+
357+ test
358+ .assertState(initialState)
359+ .assertEvents(OnboardingViewEvents .Failure (A_SERVER_ERROR ))
360+ .finish()
361+ }
362+
363+ @Test
364+ fun `given available full matrix id, when a register username is entered, then changes homeserver and emits available registration state` () = runTest {
365+ viewModelWith(initialRegistrationState(" ignored-url" ))
366+ givenCanSuccessfullyUpdateHomeserver(A_HOMESERVER_URL , SELECTED_HOMESERVER_STATE )
367+ val userName = " a-user"
368+ val fullMatrixId = " @$userName :${A_HOMESERVER_URL .removePrefix(" https://" )} "
369+ givenUserNameIsAvailable(userName)
370+ val test = viewModel.test()
371+
372+ viewModel.handle(OnboardingAction .UserNameEnteredAction .Registration (fullMatrixId))
373+
374+ test
375+ .assertStatesChanges(
376+ initialState,
377+ { copy(isLoading = true ) },
378+ { copy(selectedHomeserver = SELECTED_HOMESERVER_STATE ) },
379+ { copy(registrationState = availableRegistrationState(userName, A_HOMESERVER_URL )) },
380+ { copy(isLoading = false ) },
381+ )
382+ .assertEvents(OnboardingViewEvents .OnHomeserverEdited )
383+ .finish()
384+ }
385+
386+ @Test
387+ fun `given unavailable full matrix id, when a register username is entered, then emits availability error` () = runTest {
388+ viewModelWith(initialRegistrationState(" ignored-url" ))
389+ givenCanSuccessfullyUpdateHomeserver(A_HOMESERVER_URL , SELECTED_HOMESERVER_STATE )
390+ val userName = " a-user"
391+ val fullMatrixId = " @$userName :${A_HOMESERVER_URL .removePrefix(" https://" )} "
392+ givenUserNameIsUnavailable(userName, A_SERVER_ERROR )
393+ val test = viewModel.test()
394+
395+ viewModel.handle(OnboardingAction .UserNameEnteredAction .Registration (fullMatrixId))
396+
397+ test
398+ .assertStatesChanges(
399+ initialState,
400+ { copy(isLoading = true ) },
401+ { copy(selectedHomeserver = SELECTED_HOMESERVER_STATE ) },
402+ { copy(isLoading = false ) },
403+ )
404+ .assertEvents(OnboardingViewEvents .OnHomeserverEdited , OnboardingViewEvents .Failure (A_SERVER_ERROR ))
405+ .finish()
406+ }
407+
408+ private fun availableRegistrationState (userName : String , homeServerUrl : String ) = RegistrationState (
409+ isUserNameAvailable = true ,
410+ selectedMatrixId = " @$userName :${homeServerUrl.removePrefix(" https://" )} "
411+ )
412+
413+ private fun initialRegistrationState (homeServerUrl : String ) = initialState.copy(
414+ onboardingFlow = OnboardingFlow .SignUp , selectedHomeserver = SelectedHomeserverState (userFacingUrl = homeServerUrl)
415+ )
416+
326417 @Test
327418 fun `given in the sign up flow, when editing homeserver errors, then does not update the selected homeserver state and emits error` () = runTest {
328419 viewModelWith(initialState.copy(onboardingFlow = OnboardingFlow .SignUp ))
@@ -639,6 +730,14 @@ class OnboardingViewModelTest {
639730 givenRegistrationResultFor(RegisterAction .StartRegistration , RegistrationActionHandler .Result .Error (error))
640731 fakeHomeServerHistoryService.expectUrlToBeAdded(A_HOMESERVER_CONFIG .homeServerUri.toString())
641732 }
733+
734+ private fun givenUserNameIsAvailable (userName : String ) {
735+ fakeAuthenticationService.givenRegistrationWizard(FakeRegistrationWizard ().also { it.givenUserNameIsAvailable(userName) })
736+ }
737+
738+ private fun givenUserNameIsUnavailable (userName : String , failure : Failure .ServerError ) {
739+ fakeAuthenticationService.givenRegistrationWizard(FakeRegistrationWizard ().also { it.givenUserNameIsUnavailable(userName, failure) })
740+ }
642741}
643742
644743private fun HomeServerCapabilities.toPersonalisationState () = PersonalizationState (
0 commit comments