[fenix] For https://github.com/mozilla-mobile/fenix/issues/12457 - Add MockK matcher for nav directions (https://github.com/mozilla-mobile/fenix/pull/12262)
parent
431459d181
commit
09c37671a8
@ -0,0 +1,58 @@
|
||||
/* 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.addons
|
||||
|
||||
import androidx.navigation.NavController
|
||||
import mozilla.components.feature.addons.Addon
|
||||
import mozilla.components.feature.addons.ui.AddonsManagerAdapterDelegate
|
||||
|
||||
/**
|
||||
* View used for managing add-ons.
|
||||
*/
|
||||
class AddonsManagementView(
|
||||
private val navController: NavController,
|
||||
private val showPermissionDialog: (Addon) -> Unit
|
||||
) : AddonsManagerAdapterDelegate {
|
||||
|
||||
override fun onAddonItemClicked(addon: Addon) {
|
||||
if (addon.isInstalled()) {
|
||||
showInstalledAddonDetailsFragment(addon)
|
||||
} else {
|
||||
showDetailsFragment(addon)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onInstallAddonButtonClicked(addon: Addon) {
|
||||
showPermissionDialog(addon)
|
||||
}
|
||||
|
||||
override fun onNotYetSupportedSectionClicked(unsupportedAddons: List<Addon>) {
|
||||
showNotYetSupportedAddonFragment(unsupportedAddons)
|
||||
}
|
||||
|
||||
private fun showInstalledAddonDetailsFragment(addon: Addon) {
|
||||
val directions =
|
||||
AddonsManagementFragmentDirections.actionAddonsManagementFragmentToInstalledAddonDetails(
|
||||
addon
|
||||
)
|
||||
navController.navigate(directions)
|
||||
}
|
||||
|
||||
private fun showDetailsFragment(addon: Addon) {
|
||||
val directions =
|
||||
AddonsManagementFragmentDirections.actionAddonsManagementFragmentToAddonDetailsFragment(
|
||||
addon
|
||||
)
|
||||
navController.navigate(directions)
|
||||
}
|
||||
|
||||
private fun showNotYetSupportedAddonFragment(unsupportedAddons: List<Addon>) {
|
||||
val directions =
|
||||
AddonsManagementFragmentDirections.actionAddonsManagementFragmentToNotYetSupportedAddonFragment(
|
||||
unsupportedAddons.toTypedArray()
|
||||
)
|
||||
navController.navigate(directions)
|
||||
}
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
/* 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.addons
|
||||
|
||||
import androidx.navigation.NavController
|
||||
import io.mockk.MockKAnnotations
|
||||
import io.mockk.every
|
||||
import io.mockk.impl.annotations.RelaxedMockK
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import mozilla.components.feature.addons.Addon
|
||||
import mozilla.components.feature.addons.ui.AddonsManagerAdapterDelegate
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.addons.AddonsManagementFragmentDirections.Companion.actionAddonsManagementFragmentToInstalledAddonDetails
|
||||
import org.mozilla.fenix.ext.directionsEq
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class AddonsManagementViewTest {
|
||||
|
||||
@RelaxedMockK private lateinit var navController: NavController
|
||||
@RelaxedMockK private lateinit var showPermissionDialog: (Addon) -> Unit
|
||||
private lateinit var managementView: AddonsManagerAdapterDelegate
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
MockKAnnotations.init(this)
|
||||
managementView = AddonsManagementView(navController, showPermissionDialog)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `onAddonItemClicked shows installed details if addon is installed`() {
|
||||
val addon = mockk<Addon> {
|
||||
every { isInstalled() } returns true
|
||||
}
|
||||
managementView.onAddonItemClicked(addon)
|
||||
|
||||
verify {
|
||||
navController.navigate(
|
||||
directionsEq(actionAddonsManagementFragmentToInstalledAddonDetails(addon))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `onAddonItemClicked shows details if addon is not installed`() {
|
||||
val addon = mockk<Addon> {
|
||||
every { isInstalled() } returns false
|
||||
}
|
||||
managementView.onAddonItemClicked(addon)
|
||||
|
||||
val expected = AddonsManagementFragmentDirections.actionAddonsManagementFragmentToAddonDetailsFragment(addon)
|
||||
verify {
|
||||
navController.navigate(directionsEq(expected))
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `onInstallAddonButtonClicked shows permission dialog`() {
|
||||
val addon = mockk<Addon>()
|
||||
managementView.onInstallAddonButtonClicked(addon)
|
||||
verify { showPermissionDialog(addon) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `onNotYetSupportedSectionClicked shows not yet supported fragment`() {
|
||||
val addons = listOf<Addon>(mockk(), mockk())
|
||||
managementView.onNotYetSupportedSectionClicked(addons)
|
||||
|
||||
val expected = AddonsManagementFragmentDirections.actionAddonsManagementFragmentToNotYetSupportedAddonFragment(
|
||||
addons.toTypedArray()
|
||||
)
|
||||
verify {
|
||||
navController.navigate(directionsEq(expected))
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package org.mozilla.fenix.ext
|
||||
|
||||
import androidx.navigation.NavDirections
|
||||
import io.mockk.Matcher
|
||||
import io.mockk.MockKMatcherScope
|
||||
import io.mockk.internalSubstitute
|
||||
import mozilla.components.support.ktx.android.os.contentEquals
|
||||
|
||||
/**
|
||||
* Verify that an equal [NavDirections] object was passed in a MockK verify call.
|
||||
*/
|
||||
fun MockKMatcherScope.directionsEq(value: NavDirections) = match(EqNavDirectionsMatcher(value))
|
||||
|
||||
private data class EqNavDirectionsMatcher(private val value: NavDirections) : Matcher<NavDirections> {
|
||||
|
||||
override fun match(arg: NavDirections?): Boolean =
|
||||
value.actionId == arg?.actionId && value.arguments contentEquals arg.arguments
|
||||
|
||||
override fun substitute(map: Map<Any, Any>) =
|
||||
copy(value = value.internalSubstitute(map))
|
||||
}
|
Loading…
Reference in New Issue