tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 17320010deeb901ffc90b291964077c73f982e53
parent f9560c4992638472c499e196c02efcd83a414abe
Author: mcarare <48995920+mcarare@users.noreply.github.com>
Date:   Thu,  2 Oct 2025 17:19:35 +0000

Bug 1991559 - Migrate SitePermissionOptionsStore to a plain object reducer r=android-reviewers,jonalmeida

This patch refactors `SitePermissionOptionsStore` by moving its reducer logic into a standalone `SitePermissionOptionsScreenReducer` object.

The corresponding tests have been updated to test the reducer directly, simplifying the test setup by removing the need for a store and middleware mocks.

Differential Revision: https://phabricator.services.mozilla.com/D266990

Diffstat:
Mmobile/android/focus-android/app/src/main/java/org/mozilla/focus/settings/permissions/permissionoptions/SitePermissionOptionsScreenStore.kt | 68++++++++++++++++++++++++++++++++++++++++++++------------------------
Mmobile/android/focus-android/app/src/test/java/org/mozilla/focus/sitepermissions/SitePermissionOptionsStoreTest.kt | 62+++++++++++++++++++-------------------------------------------
2 files changed, 63 insertions(+), 67 deletions(-)

diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/settings/permissions/permissionoptions/SitePermissionOptionsScreenStore.kt b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/settings/permissions/permissionoptions/SitePermissionOptionsScreenStore.kt @@ -15,7 +15,7 @@ class SitePermissionOptionsScreenStore( middlewares: List<Middleware<SitePermissionOptionsScreenState, SitePermissionOptionsScreenAction>> = emptyList(), ) : Store<SitePermissionOptionsScreenState, SitePermissionOptionsScreenAction>( initialState, - ::sitePermissionOptionsScreenReducer, + SitePermissionOptionsScreenReducer::reduce, middlewares, ) { init { @@ -42,30 +42,50 @@ sealed class SitePermissionOptionsScreenAction : Action { ) : SitePermissionOptionsScreenAction() } -private fun sitePermissionOptionsScreenReducer( - state: SitePermissionOptionsScreenState, - action: SitePermissionOptionsScreenAction, -): SitePermissionOptionsScreenState { - return when (action) { - is SitePermissionOptionsScreenAction.Select -> { - state.copy(selectedSitePermissionOption = action.selectedSitePermissionOption) - } - is SitePermissionOptionsScreenAction.UpdateSitePermissionOptions -> { - state.copy( - sitePermissionOptionList = action.sitePermissionOptionsList, - selectedSitePermissionOption = action.selectedSitePermissionOption, - sitePermissionLabel = action.sitePermissionLabel, - isAndroidPermissionGranted = action.isAndroidPermissionGranted, - ) - } +/** + * A reducer that takes the current [SitePermissionOptionsScreenState] and an [SitePermissionOptionsScreenAction] + * and returns a new [SitePermissionOptionsScreenState]. + * + * This reducer is responsible for handling actions related to site permission options, such as selecting + * an option, updating the list of options, and initializing the options. + */ +object SitePermissionOptionsScreenReducer { + /** + * Reduces the current [SitePermissionOptionsScreenState] with the given [SitePermissionOptionsScreenAction] + * to produce a new [SitePermissionOptionsScreenState]. + * + * @param state The current state of the site permission options screen. + * @param action The action to be applied to the current state. + * @return The new state after applying the action. + * @throws IllegalStateException if [SitePermissionOptionsScreenAction.InitSitePermissionOptions] is dispatched + * without adding [SitePermissionsOptionsMiddleware] to the [SitePermissionOptionsScreenStore]. + */ + fun reduce( + state: SitePermissionOptionsScreenState, + action: SitePermissionOptionsScreenAction, + ): SitePermissionOptionsScreenState { + return when (action) { + is SitePermissionOptionsScreenAction.Select -> { + state.copy(selectedSitePermissionOption = action.selectedSitePermissionOption) + } + is SitePermissionOptionsScreenAction.UpdateSitePermissionOptions -> { + state.copy( + sitePermissionOptionList = action.sitePermissionOptionsList, + selectedSitePermissionOption = action.selectedSitePermissionOption, + sitePermissionLabel = action.sitePermissionLabel, + isAndroidPermissionGranted = action.isAndroidPermissionGranted, + ) + } - SitePermissionOptionsScreenAction.InitSitePermissionOptions -> { - throw IllegalStateException( - "You need to add SitePermissionsOptionsMiddleware to your SitePermissionsOptionsScreenStore. ($action)", - ) - } - is SitePermissionOptionsScreenAction.AndroidPermission -> { - state.copy(isAndroidPermissionGranted = action.isAndroidPermissionGranted) + SitePermissionOptionsScreenAction.InitSitePermissionOptions -> { + throw IllegalStateException( + "You need to add SitePermissionsOptionsMiddleware " + + "to your SitePermissionsOptionsScreenStore. ($action)", + ) + } + is SitePermissionOptionsScreenAction.AndroidPermission -> { + state.copy(isAndroidPermissionGranted = action.isAndroidPermissionGranted) + } } } } diff --git a/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/sitepermissions/SitePermissionOptionsStoreTest.kt b/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/sitepermissions/SitePermissionOptionsStoreTest.kt @@ -3,65 +3,41 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.focus.sitepermissions -import mozilla.components.support.test.ext.joinBlocking -import mozilla.components.support.test.mock import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue -import org.junit.Before import org.junit.Test -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify import org.mozilla.focus.settings.permissions.AutoplayOption import org.mozilla.focus.settings.permissions.SitePermissionOption -import org.mozilla.focus.settings.permissions.permissionoptions.SitePermission import org.mozilla.focus.settings.permissions.permissionoptions.SitePermissionOptionsScreenAction +import org.mozilla.focus.settings.permissions.permissionoptions.SitePermissionOptionsScreenReducer import org.mozilla.focus.settings.permissions.permissionoptions.SitePermissionOptionsScreenState -import org.mozilla.focus.settings.permissions.permissionoptions.SitePermissionOptionsScreenStore -import org.mozilla.focus.settings.permissions.permissionoptions.SitePermissionOptionsStorage -import org.mozilla.focus.settings.permissions.permissionoptions.SitePermissionOptionsStorageMiddleware - -class SitePermissionOptionsStoreTest { - private lateinit var sitePermissionOptionsStorageMiddleware: SitePermissionOptionsStorageMiddleware - private lateinit var store: SitePermissionOptionsScreenStore - private lateinit var sitePermissionState: SitePermissionOptionsScreenState - private val storage: SitePermissionOptionsStorage = mock() - - @Before - fun setup() { - sitePermissionOptionsStorageMiddleware = SitePermissionOptionsStorageMiddleware(SitePermission.CAMERA, storage) - sitePermissionState = SitePermissionOptionsScreenState() - - doReturn(listOf(SitePermissionOption.AskToAllow(), SitePermissionOption.Blocked())).`when`(storage).getSitePermissionOptions(SitePermission.CAMERA) - doReturn(SitePermissionOption.AskToAllow()).`when`(storage).permissionSelectedOption(SitePermission.CAMERA) - doReturn("Camera").`when`(storage).getSitePermissionLabel(SitePermission.CAMERA) - doReturn(false).`when`(storage).isAndroidPermissionGranted(SitePermission.CAMERA) - - store = SitePermissionOptionsScreenStore(sitePermissionState, listOf(sitePermissionOptionsStorageMiddleware)) - } +class SitePermissionOptionsReducerTest { @Test fun `GIVEN site permission screen store WHEN android permission action is dispatched THEN site permission options screen state is updated`() { - store.dispatch(SitePermissionOptionsScreenAction.AndroidPermission(true)).joinBlocking() + val initialState = SitePermissionOptionsScreenState() - verify(storage).getSitePermissionOptions(SitePermission.CAMERA) - verify(storage).permissionSelectedOption(SitePermission.CAMERA) - verify(storage).getSitePermissionLabel(SitePermission.CAMERA) - verify(storage).isAndroidPermissionGranted(SitePermission.CAMERA) - assertTrue(store.state.isAndroidPermissionGranted) + val finalState = SitePermissionOptionsScreenReducer.reduce(initialState, SitePermissionOptionsScreenAction.AndroidPermission(true)) + + assertTrue(finalState.isAndroidPermissionGranted) } @Test fun `GIVEN site permission screen store WHEN select permission action is dispatched THEN site permission options screen state is updated`() { - store.dispatch(SitePermissionOptionsScreenAction.Select(SitePermissionOption.Blocked())).joinBlocking() + val initialState = SitePermissionOptionsScreenState() + + val finalState = SitePermissionOptionsScreenReducer.reduce(initialState, SitePermissionOptionsScreenAction.Select(SitePermissionOption.Blocked())) - verify(storage).saveCurrentSitePermissionOptionInSharePref(SitePermissionOption.Blocked(), SitePermission.CAMERA) - assertEquals(SitePermissionOption.Blocked(), store.state.selectedSitePermissionOption) + assertEquals(SitePermissionOption.Blocked(), finalState.selectedSitePermissionOption) } @Test fun `GIVEN site permission screen store WHEN update site permission options is dispatched THEN site permission options screen state is updated`() { + val initialState = SitePermissionOptionsScreenState() val sitePermissionLabel = "Autoplay" - store.dispatch( + + val finalState = SitePermissionOptionsScreenReducer.reduce( + initialState, SitePermissionOptionsScreenAction.UpdateSitePermissionOptions( listOf( AutoplayOption.BlockAudioOnly(), @@ -72,18 +48,18 @@ class SitePermissionOptionsStoreTest { sitePermissionLabel, true, ), - ).joinBlocking() + ) - assertEquals(AutoplayOption.AllowAudioVideo(), store.state.selectedSitePermissionOption) - assertTrue(store.state.isAndroidPermissionGranted) + assertEquals(AutoplayOption.AllowAudioVideo(), finalState.selectedSitePermissionOption) + assertTrue(finalState.isAndroidPermissionGranted) assertEquals( listOf( AutoplayOption.BlockAudioOnly(), AutoplayOption.AllowAudioVideo(), AutoplayOption.BlockAudioVideo(), ), - store.state.sitePermissionOptionList, + finalState.sitePermissionOptionList, ) - assertEquals(sitePermissionLabel, store.state.sitePermissionLabel) + assertEquals(sitePermissionLabel, finalState.sitePermissionLabel) } }