Bug 1847740 - Add navigation middleware for review quality check
parent
e4da26fb34
commit
790be45d7b
@ -0,0 +1,51 @@
|
||||
/* 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.shopping.middleware
|
||||
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import mozilla.components.lib.state.Middleware
|
||||
import mozilla.components.lib.state.MiddlewareContext
|
||||
import org.mozilla.fenix.shopping.store.ReviewQualityCheckAction
|
||||
import org.mozilla.fenix.shopping.store.ReviewQualityCheckState
|
||||
|
||||
/**
|
||||
* Middleware that handles navigation events for the review quality check feature.
|
||||
*
|
||||
* @property openLink Callback used to open an url.
|
||||
* @property scope [CoroutineScope] used to launch coroutines.
|
||||
*/
|
||||
class ReviewQualityCheckNavigationMiddleware(
|
||||
private val openLink: (String, Boolean) -> Unit,
|
||||
private val scope: CoroutineScope,
|
||||
) : Middleware<ReviewQualityCheckState, ReviewQualityCheckAction> {
|
||||
|
||||
override fun invoke(
|
||||
context: MiddlewareContext<ReviewQualityCheckState, ReviewQualityCheckAction>,
|
||||
next: (ReviewQualityCheckAction) -> Unit,
|
||||
action: ReviewQualityCheckAction,
|
||||
) {
|
||||
next(action)
|
||||
when (action) {
|
||||
is ReviewQualityCheckAction.NavigationMiddlewareAction -> processAction(action)
|
||||
else -> {
|
||||
// no-op
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun processAction(
|
||||
action: ReviewQualityCheckAction.NavigationMiddlewareAction,
|
||||
) = scope.launch {
|
||||
when (action) {
|
||||
is ReviewQualityCheckAction.OpenLink -> {
|
||||
when (action.link) {
|
||||
is ReviewQualityCheckState.LinkType.ExternalLink -> openLink(action.link.url, true)
|
||||
is ReviewQualityCheckState.LinkType.AnalyzeLink -> openLink(action.link.url, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
package org.mozilla.fenix.shopping.middleware
|
||||
|
||||
import mozilla.components.support.test.ext.joinBlocking
|
||||
import mozilla.components.support.test.libstate.ext.waitUntilIdle
|
||||
import mozilla.components.support.test.rule.MainCoroutineRule
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.mozilla.fenix.shopping.store.ReviewQualityCheckAction
|
||||
import org.mozilla.fenix.shopping.store.ReviewQualityCheckState
|
||||
import org.mozilla.fenix.shopping.store.ReviewQualityCheckStore
|
||||
|
||||
class ReviewQualityCheckNavigationMiddlewareTest {
|
||||
|
||||
@get:Rule
|
||||
val coroutinesTestRule = MainCoroutineRule()
|
||||
private val dispatcher = coroutinesTestRule.testDispatcher
|
||||
private val scope = coroutinesTestRule.scope
|
||||
|
||||
@Test
|
||||
fun `WHEN opening an external link THEN the link should be opened in a new tab`() {
|
||||
var isOpenedInSelectedTab = false
|
||||
var isOpenedInNewTab = false
|
||||
val store = ReviewQualityCheckStore(
|
||||
middleware = listOf(
|
||||
ReviewQualityCheckNavigationMiddleware(
|
||||
openLink = { _, openInNewTab ->
|
||||
if (openInNewTab) {
|
||||
isOpenedInNewTab = true
|
||||
} else {
|
||||
isOpenedInSelectedTab = true
|
||||
}
|
||||
},
|
||||
scope = scope,
|
||||
),
|
||||
),
|
||||
)
|
||||
store.waitUntilIdle()
|
||||
dispatcher.scheduler.advanceUntilIdle()
|
||||
|
||||
store.dispatch(ReviewQualityCheckAction.OpenLink(ReviewQualityCheckState.LinkType.ExternalLink("www.mozilla.com"))).joinBlocking()
|
||||
store.waitUntilIdle()
|
||||
|
||||
assertEquals(true, isOpenedInNewTab)
|
||||
assertEquals(false, isOpenedInSelectedTab)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN re-analzying a product THEN the link should be opened in the currently selected tab`() {
|
||||
var isOpenedInSelectedTab = false
|
||||
var isOpenedInNewTab = false
|
||||
val store = ReviewQualityCheckStore(
|
||||
middleware = listOf(
|
||||
ReviewQualityCheckNavigationMiddleware(
|
||||
openLink = { _, openInNewTab ->
|
||||
if (openInNewTab) {
|
||||
isOpenedInNewTab = true
|
||||
} else {
|
||||
isOpenedInSelectedTab = true
|
||||
}
|
||||
},
|
||||
scope = scope,
|
||||
),
|
||||
),
|
||||
)
|
||||
store.waitUntilIdle()
|
||||
dispatcher.scheduler.advanceUntilIdle()
|
||||
|
||||
store.dispatch(ReviewQualityCheckAction.OpenLink(ReviewQualityCheckState.LinkType.AnalyzeLink("www.mozilla.com"))).joinBlocking()
|
||||
store.waitUntilIdle()
|
||||
|
||||
assertEquals(true, isOpenedInSelectedTab)
|
||||
assertEquals(false, isOpenedInNewTab)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue