No issue: uplift three dot menu redesign for beta. (#19312)
* For #19005: new tab three-dot menu sync sign in (#19037) * Show synced tabs or sync account in new tab menu * Sync sign in item navigates to account settings * Check account auth and get sync item title * Look for sync sign in item on home menu for UI test * Sync sign in menu item UI test * For #19114: check state of sync account when navigating from sync sign in menu item (#19118) * For #18591 - Make the navbar sticky in the new menu * Turn on feature flag for three-dot menu redesign for beta. (#19111) * For #18591 - Update tests Some tests trying to "Add to top sites" may fail because of the sticky navbar now covering that menu item -> scroll the menu up a little. Some tests that previously were trying to scroll to the bottom of the menu to interact with navbar options now don't have to. Them trying to interact with navbar option with the menu opened as collapsed is a good test for the navbar stickyness. Co-authored-by: Mugurell <Mugurell@users.noreply.github.com>pull/420/head
parent
fc1fa6ce78
commit
9fc6a87697
@ -0,0 +1,52 @@
|
||||
/* 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.ui.robots
|
||||
|
||||
import androidx.test.espresso.Espresso.onView
|
||||
import androidx.test.espresso.assertion.ViewAssertions.matches
|
||||
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
|
||||
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
|
||||
import androidx.test.espresso.matcher.ViewMatchers.withText
|
||||
import androidx.test.espresso.matcher.ViewMatchers.Visibility
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import androidx.test.uiautomator.UiDevice
|
||||
import org.hamcrest.CoreMatchers.allOf
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.helpers.click
|
||||
|
||||
/**
|
||||
* Implementation of Robot Pattern for Sync Sign In sub menu.
|
||||
*/
|
||||
class SyncSignInRobot {
|
||||
|
||||
fun verifyAccountSettingsMenuHeader() = assertAccountSettingsMenuHeader()
|
||||
fun verifySyncSignInMenuHeader() = assertSyncSignInMenuHeader()
|
||||
|
||||
class Transition {
|
||||
val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())!!
|
||||
|
||||
fun goBack(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
|
||||
goBackButton().click()
|
||||
|
||||
BrowserRobot().interact()
|
||||
return BrowserRobot.Transition()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun goBackButton() =
|
||||
onView(allOf(withContentDescription("Navigate up")))
|
||||
|
||||
private fun assertAccountSettingsMenuHeader() {
|
||||
// Replaced with the new string here, the test is assuming we are NOT signed in
|
||||
// Sync tests in SettingsSyncTest are still TO-DO, so I'm not sure that we have a test for signing into Sync
|
||||
onView(withText(R.string.preferences_account_settings))
|
||||
.check((matches(withEffectiveVisibility(Visibility.VISIBLE))))
|
||||
}
|
||||
|
||||
private fun assertSyncSignInMenuHeader() {
|
||||
onView(withText(R.string.sign_in_with_camera))
|
||||
.check((matches(withEffectiveVisibility(Visibility.VISIBLE))))
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
/* 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.components.accounts
|
||||
|
||||
import android.content.Context
|
||||
import mozilla.components.service.fxa.manager.FxaAccountManager
|
||||
import org.mozilla.fenix.ext.components
|
||||
|
||||
/**
|
||||
* Component which holds a reference to [FxaAccountManager]. Manages account authentication,
|
||||
* profiles, and profile state observers.
|
||||
*/
|
||||
open class FenixAccountManager(context: Context) {
|
||||
val accountManager = context.components.backgroundServices.accountManager
|
||||
|
||||
val authenticatedAccount
|
||||
get() = accountManager.authenticatedAccount() != null
|
||||
|
||||
val accountProfileEmail
|
||||
get() = accountManager.accountProfile()?.email
|
||||
|
||||
/**
|
||||
* Check if the current account is signed in and authenticated.
|
||||
*/
|
||||
fun signedInToFxa(): Boolean {
|
||||
val account = accountManager.authenticatedAccount()
|
||||
val needsReauth = accountManager.accountNeedsReauth()
|
||||
|
||||
return account != null && !needsReauth
|
||||
}
|
||||
}
|
@ -0,0 +1,101 @@
|
||||
/* 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.components.accounts
|
||||
|
||||
import android.content.Context
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import mozilla.components.concept.sync.OAuthAccount
|
||||
import mozilla.components.concept.sync.Profile
|
||||
import mozilla.components.service.fxa.manager.FxaAccountManager
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.ext.components
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class FenixAccountManagerTest {
|
||||
|
||||
private lateinit var fenixFxaManager: FenixAccountManager
|
||||
private lateinit var accountManagerComponent: FxaAccountManager
|
||||
private lateinit var context: Context
|
||||
private lateinit var account: OAuthAccount
|
||||
private lateinit var profile: Profile
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
context = mockk(relaxed = true)
|
||||
account = mockk(relaxed = true)
|
||||
profile = mockk(relaxed = true)
|
||||
accountManagerComponent = mockk(relaxed = true)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN an account exists THEN fetch the associated email address`() {
|
||||
every { accountManagerComponent.authenticatedAccount() } returns account
|
||||
every { accountManagerComponent.accountProfile() } returns profile
|
||||
every { context.components.backgroundServices.accountManager } returns accountManagerComponent
|
||||
|
||||
fenixFxaManager = FenixAccountManager(context)
|
||||
|
||||
val emailAddress = "firefoxIsFun@test.com"
|
||||
every { accountManagerComponent.accountProfile()?.email } returns emailAddress
|
||||
|
||||
val result = fenixFxaManager.accountProfileEmail
|
||||
assertEquals(emailAddress, result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN an account does not exist THEN return null when fetching the associated email address`() {
|
||||
every { accountManagerComponent.authenticatedAccount() } returns null
|
||||
every { accountManagerComponent.accountProfile() } returns null
|
||||
every { context.components.backgroundServices.accountManager } returns accountManagerComponent
|
||||
|
||||
fenixFxaManager = FenixAccountManager(context)
|
||||
|
||||
val result = fenixFxaManager.accountProfileEmail
|
||||
assertEquals(null, result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN an account is signed in and authenticated THEN check returns true`() {
|
||||
every { accountManagerComponent.authenticatedAccount() } returns account
|
||||
every { accountManagerComponent.accountNeedsReauth() } returns false
|
||||
every { context.components.backgroundServices.accountManager } returns accountManagerComponent
|
||||
|
||||
fenixFxaManager = FenixAccountManager(context)
|
||||
|
||||
val signedIn = fenixFxaManager.signedInToFxa()
|
||||
assertTrue(signedIn)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN an account is signed in and NOT authenticated THEN check returns false`() {
|
||||
every { accountManagerComponent.authenticatedAccount() } returns account
|
||||
every { accountManagerComponent.accountNeedsReauth() } returns true
|
||||
every { context.components.backgroundServices.accountManager } returns accountManagerComponent
|
||||
|
||||
fenixFxaManager = FenixAccountManager(context)
|
||||
|
||||
val signedIn = fenixFxaManager.signedInToFxa()
|
||||
assertFalse(signedIn)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN an account is not signed in THEN check returns false`() {
|
||||
every { accountManagerComponent.authenticatedAccount() } returns null
|
||||
every { accountManagerComponent.accountNeedsReauth() } returns true
|
||||
every { context.components.backgroundServices.accountManager } returns accountManagerComponent
|
||||
|
||||
fenixFxaManager = FenixAccountManager(context)
|
||||
|
||||
val signedIn = fenixFxaManager.signedInToFxa()
|
||||
assertFalse(signedIn)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue