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