diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/SecureTabsTrayBinding.kt b/app/src/main/java/org/mozilla/fenix/tabstray/SecureTabsTrayBinding.kt index b4c2e987b2..0023d0bc94 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/SecureTabsTrayBinding.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/SecureTabsTrayBinding.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.tabstray +import androidx.fragment.app.Fragment import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect @@ -21,7 +22,7 @@ import org.mozilla.fenix.utils.Settings class SecureTabsTrayBinding( store: TabsTrayStore, private val settings: Settings, - private val tabsTrayFragment: TabsTrayFragment + private val fragment: Fragment ) : AbstractBinding(store) { override suspend fun onState(flow: Flow) { @@ -33,9 +34,9 @@ class SecureTabsTrayBinding( } .collect { state -> if (state.selectedPage == Page.PrivateTabs) { - tabsTrayFragment.secure() + fragment.secure() } else if (!settings.lastKnownMode.isPrivate) { - tabsTrayFragment.removeSecure() + fragment.removeSecure() } } } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index a85565df4a..be75b9833a 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -273,7 +273,7 @@ class TabsTrayFragment : AppCompatDialogFragment() { feature = SecureTabsTrayBinding( store = tabsTrayStore, settings = requireComponents.settings, - tabsTrayFragment = this + fragment = this ), owner = this, view = view diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/SecureTabsTrayBindingTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/SecureTabsTrayBindingTest.kt new file mode 100644 index 0000000000..9177074761 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/tabstray/SecureTabsTrayBindingTest.kt @@ -0,0 +1,92 @@ +/* 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.tabstray + +import androidx.appcompat.content.res.AppCompatResources +import androidx.fragment.app.Fragment +import io.mockk.Runs +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestCoroutineDispatcher +import mozilla.components.support.test.libstate.ext.waitUntilIdle +import mozilla.components.support.test.rule.MainCoroutineRule +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.ext.removeSecure +import org.mozilla.fenix.ext.secure +import org.mozilla.fenix.utils.Settings + +class SecureTabsTrayBindingTest { + + @OptIn(ExperimentalCoroutinesApi::class) + @get:Rule + val coroutinesTestRule = MainCoroutineRule(TestCoroutineDispatcher()) + + private val settings: Settings = mockk(relaxed = true) + private val fragment: Fragment = mockk(relaxed = true) + + @Before + fun setup() { + mockkStatic(AppCompatResources::class) + every { AppCompatResources.getDrawable(any(), any()) } returns mockk(relaxed = true) + every { fragment.secure() } just Runs + every { fragment.removeSecure() } just Runs + } + + @Test + fun `WHEN tab selected page switches to private THEN set fragment to secure`() { + val tabsTrayStore = TabsTrayStore(TabsTrayState()) + val secureTabsTrayBinding = SecureTabsTrayBinding( + store = tabsTrayStore, + settings = settings, + fragment = fragment + ) + + secureTabsTrayBinding.start() + tabsTrayStore.dispatch(TabsTrayAction.PageSelected(Page.positionToPage(Page.PrivateTabs.ordinal))) + tabsTrayStore.waitUntilIdle() + + verify { fragment.secure() } + } + + @Test + fun `GIVEN not in private mode WHEN tab selected page switches to normal tabs from private THEN set fragment to un-secure`() { + every { settings.lastKnownMode.isPrivate } returns false + val tabsTrayStore = TabsTrayStore(TabsTrayState()) + val secureTabsTrayBinding = SecureTabsTrayBinding( + store = tabsTrayStore, + settings = settings, + fragment = fragment + ) + + secureTabsTrayBinding.start() + tabsTrayStore.dispatch(TabsTrayAction.PageSelected(Page.positionToPage(Page.NormalTabs.ordinal))) + tabsTrayStore.waitUntilIdle() + + verify { fragment.removeSecure() } + } + + @Test + fun `GIVEN private mode WHEN tab selected page switches to normal tabs from private THEN do nothing`() { + every { settings.lastKnownMode.isPrivate } returns true + val tabsTrayStore = TabsTrayStore(TabsTrayState()) + val secureTabsTrayBinding = SecureTabsTrayBinding( + store = tabsTrayStore, + settings = settings, + fragment = fragment + ) + + secureTabsTrayBinding.start() + tabsTrayStore.dispatch(TabsTrayAction.PageSelected(Page.positionToPage(Page.NormalTabs.ordinal))) + tabsTrayStore.waitUntilIdle() + + verify(exactly = 0) { fragment.removeSecure() } + } +}