Bug 1809998 - Part 1: Refactor CurrentMode to OnboardingAccountObserver
parent
da50506daa
commit
2a8b39a127
@ -0,0 +1,48 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
package org.mozilla.fenix.onboarding
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.annotation.VisibleForTesting
|
||||||
|
import mozilla.components.concept.sync.AccountObserver
|
||||||
|
import mozilla.components.concept.sync.AuthType
|
||||||
|
import mozilla.components.concept.sync.OAuthAccount
|
||||||
|
import mozilla.components.concept.sync.Profile
|
||||||
|
import org.mozilla.fenix.ext.components
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Observes various account-related events and dispatches the [OnboardingState] based on whether
|
||||||
|
* or not the account is authenticated.
|
||||||
|
*/
|
||||||
|
class OnboardingAccountObserver(
|
||||||
|
private val context: Context,
|
||||||
|
private val dispatchChanges: (state: OnboardingState) -> Unit,
|
||||||
|
) : AccountObserver {
|
||||||
|
|
||||||
|
private val accountManager by lazy { context.components.backgroundServices.accountManager }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current [OnboardingState] based on the account state.
|
||||||
|
*/
|
||||||
|
fun getOnboardingState(): OnboardingState {
|
||||||
|
val account = accountManager.authenticatedAccount()
|
||||||
|
|
||||||
|
return if (account != null) {
|
||||||
|
OnboardingState.SignedIn
|
||||||
|
} else {
|
||||||
|
OnboardingState.SignedOutNoAutoSignIn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
internal fun emitChanges() {
|
||||||
|
dispatchChanges(getOnboardingState())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onAuthenticated(account: OAuthAccount, authType: AuthType) = emitChanges()
|
||||||
|
override fun onAuthenticationProblems() = emitChanges()
|
||||||
|
override fun onLoggedOut() = emitChanges()
|
||||||
|
override fun onProfileUpdated(profile: Profile) = emitChanges()
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
package org.mozilla.fenix.onboarding
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockk
|
||||||
|
import io.mockk.spyk
|
||||||
|
import io.mockk.verify
|
||||||
|
import mozilla.components.service.fxa.manager.FxaAccountManager
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.mozilla.fenix.ext.components
|
||||||
|
|
||||||
|
class OnboardingAccountObserverTest {
|
||||||
|
|
||||||
|
private lateinit var context: Context
|
||||||
|
private lateinit var accountManager: FxaAccountManager
|
||||||
|
private lateinit var observer: OnboardingAccountObserver
|
||||||
|
private lateinit var dispatchChanges: (mode: OnboardingState) -> Unit
|
||||||
|
|
||||||
|
private var dispatchChangesResult: OnboardingState? = null
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setup() {
|
||||||
|
context = mockk(relaxed = true)
|
||||||
|
accountManager = mockk(relaxed = true)
|
||||||
|
|
||||||
|
dispatchChangesResult = null
|
||||||
|
dispatchChanges = {
|
||||||
|
dispatchChangesResult = it
|
||||||
|
}
|
||||||
|
|
||||||
|
every { context.components.backgroundServices.accountManager } returns accountManager
|
||||||
|
|
||||||
|
observer = spyk(
|
||||||
|
OnboardingAccountObserver(
|
||||||
|
context = context,
|
||||||
|
dispatchChanges = dispatchChanges,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `WHEN account is authenticated THEN return signed in state`() {
|
||||||
|
every { accountManager.authenticatedAccount() } returns mockk()
|
||||||
|
|
||||||
|
assertEquals(OnboardingState.SignedIn, observer.getOnboardingState())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `WHEN account is not authenticated THEN return signed out state`() {
|
||||||
|
every { accountManager.authenticatedAccount() } returns null
|
||||||
|
|
||||||
|
assertEquals(OnboardingState.SignedOutNoAutoSignIn, observer.getOnboardingState())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `WHEN account observer receives a state change THEN emit state changes`() {
|
||||||
|
observer.onAuthenticated(mockk(), mockk())
|
||||||
|
observer.onAuthenticationProblems()
|
||||||
|
observer.onLoggedOut()
|
||||||
|
observer.onProfileUpdated(mockk())
|
||||||
|
|
||||||
|
verify(exactly = 4) { observer.emitChanges() }
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue