|
|
|
@ -7,9 +7,8 @@ package org.mozilla.fenix.addons
|
|
|
|
|
import android.view.View
|
|
|
|
|
import android.widget.Button
|
|
|
|
|
import androidx.appcompat.app.AlertDialog
|
|
|
|
|
import mozilla.components.browser.state.action.ExtensionProcessDisabledPopupAction
|
|
|
|
|
import mozilla.components.browser.state.action.ExtensionsProcessAction
|
|
|
|
|
import mozilla.components.browser.state.store.BrowserStore
|
|
|
|
|
import mozilla.components.concept.engine.Engine
|
|
|
|
|
import mozilla.components.support.test.argumentCaptor
|
|
|
|
|
import mozilla.components.support.test.libstate.ext.waitUntilIdle
|
|
|
|
|
import mozilla.components.support.test.robolectric.testContext
|
|
|
|
@ -21,39 +20,41 @@ import org.junit.Rule
|
|
|
|
|
import org.junit.Test
|
|
|
|
|
import org.junit.runner.RunWith
|
|
|
|
|
import org.mockito.Mockito.mock
|
|
|
|
|
import org.mockito.Mockito.never
|
|
|
|
|
import org.mockito.Mockito.times
|
|
|
|
|
import org.mockito.Mockito.verify
|
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
|
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
|
|
|
|
|
|
|
|
|
@RunWith(FenixRobolectricTestRunner::class)
|
|
|
|
|
class ExtensionProcessDisabledControllerTest {
|
|
|
|
|
class ExtensionsProcessDisabledControllerTest {
|
|
|
|
|
|
|
|
|
|
@get:Rule
|
|
|
|
|
val coroutinesTestRule = MainCoroutineRule()
|
|
|
|
|
private val dispatcher = coroutinesTestRule.testDispatcher
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `WHEN showExtensionProcessDisabledPopup is true AND positive button clicked then enable extension process spawning`() {
|
|
|
|
|
fun `WHEN showExtensionsProcessDisabledPrompt is true AND positive button clicked then enable extension process spawning`() {
|
|
|
|
|
val store = BrowserStore()
|
|
|
|
|
val engine: Engine = mock()
|
|
|
|
|
val dialog: AlertDialog = mock()
|
|
|
|
|
val appName = "TestApp"
|
|
|
|
|
val builder: AlertDialog.Builder = mock()
|
|
|
|
|
val controller = ExtensionProcessDisabledController(testContext, store, engine, builder, appName)
|
|
|
|
|
val controller = ExtensionsProcessDisabledController(testContext, store, builder, appName)
|
|
|
|
|
val buttonsContainerCaptor = argumentCaptor<View>()
|
|
|
|
|
|
|
|
|
|
controller.start()
|
|
|
|
|
|
|
|
|
|
whenever(builder.show()).thenReturn(dialog)
|
|
|
|
|
|
|
|
|
|
assertFalse(store.state.showExtensionProcessDisabledPopup)
|
|
|
|
|
assertFalse(store.state.showExtensionsProcessDisabledPrompt)
|
|
|
|
|
assertFalse(store.state.extensionsProcessDisabled)
|
|
|
|
|
|
|
|
|
|
store.dispatch(ExtensionProcessDisabledPopupAction(showPopup = true))
|
|
|
|
|
// Pretend the process has been disabled and we show the dialog.
|
|
|
|
|
store.dispatch(ExtensionsProcessAction.DisabledAction)
|
|
|
|
|
store.dispatch(ExtensionsProcessAction.ShowPromptAction(show = true))
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
store.waitUntilIdle()
|
|
|
|
|
assertTrue(store.state.showExtensionProcessDisabledPopup)
|
|
|
|
|
assertTrue(store.state.showExtensionsProcessDisabledPrompt)
|
|
|
|
|
assertTrue(store.state.extensionsProcessDisabled)
|
|
|
|
|
|
|
|
|
|
verify(builder).setView(buttonsContainerCaptor.capture())
|
|
|
|
|
verify(builder).show()
|
|
|
|
@ -62,32 +63,34 @@ class ExtensionProcessDisabledControllerTest {
|
|
|
|
|
|
|
|
|
|
store.waitUntilIdle()
|
|
|
|
|
|
|
|
|
|
verify(engine).enableExtensionProcessSpawning()
|
|
|
|
|
verify(engine, never()).disableExtensionProcessSpawning()
|
|
|
|
|
assertFalse(store.state.showExtensionProcessDisabledPopup)
|
|
|
|
|
assertFalse(store.state.showExtensionsProcessDisabledPrompt)
|
|
|
|
|
assertFalse(store.state.extensionsProcessDisabled)
|
|
|
|
|
verify(dialog).dismiss()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `WHEN showExtensionProcessDisabledPopup is true AND negative button clicked then dismiss without enabling extension process spawning`() {
|
|
|
|
|
fun `WHEN showExtensionsProcessDisabledPrompt is true AND negative button clicked then dismiss without enabling extension process spawning`() {
|
|
|
|
|
val store = BrowserStore()
|
|
|
|
|
val engine: Engine = mock()
|
|
|
|
|
val appName = "TestApp"
|
|
|
|
|
val dialog: AlertDialog = mock()
|
|
|
|
|
val builder: AlertDialog.Builder = mock()
|
|
|
|
|
val controller = ExtensionProcessDisabledController(testContext, store, engine, builder, appName)
|
|
|
|
|
val controller = ExtensionsProcessDisabledController(testContext, store, builder, appName)
|
|
|
|
|
val buttonsContainerCaptor = argumentCaptor<View>()
|
|
|
|
|
|
|
|
|
|
controller.start()
|
|
|
|
|
|
|
|
|
|
whenever(builder.show()).thenReturn(dialog)
|
|
|
|
|
|
|
|
|
|
assertFalse(store.state.showExtensionProcessDisabledPopup)
|
|
|
|
|
assertFalse(store.state.showExtensionsProcessDisabledPrompt)
|
|
|
|
|
assertFalse(store.state.extensionsProcessDisabled)
|
|
|
|
|
|
|
|
|
|
store.dispatch(ExtensionProcessDisabledPopupAction(showPopup = true))
|
|
|
|
|
// Pretend the process has been disabled and we show the dialog.
|
|
|
|
|
store.dispatch(ExtensionsProcessAction.DisabledAction)
|
|
|
|
|
store.dispatch(ExtensionsProcessAction.ShowPromptAction(show = true))
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
store.waitUntilIdle()
|
|
|
|
|
assertTrue(store.state.showExtensionProcessDisabledPopup)
|
|
|
|
|
assertTrue(store.state.showExtensionsProcessDisabledPrompt)
|
|
|
|
|
assertTrue(store.state.extensionsProcessDisabled)
|
|
|
|
|
|
|
|
|
|
verify(builder).setView(buttonsContainerCaptor.capture())
|
|
|
|
|
verify(builder).show()
|
|
|
|
@ -96,20 +99,18 @@ class ExtensionProcessDisabledControllerTest {
|
|
|
|
|
|
|
|
|
|
store.waitUntilIdle()
|
|
|
|
|
|
|
|
|
|
assertFalse(store.state.showExtensionProcessDisabledPopup)
|
|
|
|
|
verify(engine, never()).enableExtensionProcessSpawning()
|
|
|
|
|
verify(engine).disableExtensionProcessSpawning()
|
|
|
|
|
assertFalse(store.state.showExtensionsProcessDisabledPrompt)
|
|
|
|
|
assertTrue(store.state.extensionsProcessDisabled)
|
|
|
|
|
verify(dialog).dismiss()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `WHEN dispatching the same event twice THEN the dialog should only be created once`() {
|
|
|
|
|
val store = BrowserStore()
|
|
|
|
|
val engine: Engine = mock()
|
|
|
|
|
val appName = "TestApp"
|
|
|
|
|
val dialog: AlertDialog = mock()
|
|
|
|
|
val builder: AlertDialog.Builder = mock()
|
|
|
|
|
val controller = ExtensionProcessDisabledController(testContext, store, engine, builder, appName)
|
|
|
|
|
val controller = ExtensionsProcessDisabledController(testContext, store, builder, appName)
|
|
|
|
|
val buttonsContainerCaptor = argumentCaptor<View>()
|
|
|
|
|
|
|
|
|
|
controller.start()
|
|
|
|
@ -117,12 +118,12 @@ class ExtensionProcessDisabledControllerTest {
|
|
|
|
|
whenever(builder.show()).thenReturn(dialog)
|
|
|
|
|
|
|
|
|
|
// First dispatch...
|
|
|
|
|
store.dispatch(ExtensionProcessDisabledPopupAction(showPopup = true))
|
|
|
|
|
store.dispatch(ExtensionsProcessAction.ShowPromptAction(show = true))
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
store.waitUntilIdle()
|
|
|
|
|
|
|
|
|
|
// Second dispatch... without having dismissed the dialog before!
|
|
|
|
|
store.dispatch(ExtensionProcessDisabledPopupAction(showPopup = true))
|
|
|
|
|
store.dispatch(ExtensionsProcessAction.ShowPromptAction(show = true))
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
store.waitUntilIdle()
|
|
|
|
|
|