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:
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)
}
}