|
|
|
@ -27,6 +27,7 @@ import mozilla.components.support.test.libstate.ext.waitUntilIdle
|
|
|
|
|
import mozilla.components.support.test.middleware.CaptureActionsMiddleware
|
|
|
|
|
import org.junit.After
|
|
|
|
|
import org.junit.Assert.assertEquals
|
|
|
|
|
import org.junit.Assert.assertTrue
|
|
|
|
|
import org.junit.Before
|
|
|
|
|
import org.junit.Test
|
|
|
|
|
import org.mozilla.fenix.BrowserDirection
|
|
|
|
@ -35,7 +36,6 @@ import org.mozilla.fenix.R
|
|
|
|
|
import org.mozilla.fenix.components.metrics.Event
|
|
|
|
|
import org.mozilla.fenix.components.metrics.MetricController
|
|
|
|
|
import org.mozilla.fenix.components.metrics.MetricsUtils
|
|
|
|
|
|
|
|
|
|
import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalAddonsManagementFragment
|
|
|
|
|
import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalSearchEngineFragment
|
|
|
|
|
import org.mozilla.fenix.settings.SupportUtils
|
|
|
|
@ -50,12 +50,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
@MockK private lateinit var searchEngine: SearchEngine
|
|
|
|
|
@MockK(relaxed = true) private lateinit var metrics: MetricController
|
|
|
|
|
@MockK(relaxed = true) private lateinit var settings: Settings
|
|
|
|
|
@MockK(relaxed = true) private lateinit var clearToolbarFocus: () -> Unit
|
|
|
|
|
@MockK(relaxed = true) private lateinit var focusToolbar: () -> Unit
|
|
|
|
|
@MockK(relaxed = true) private lateinit var clearToolbar: () -> Unit
|
|
|
|
|
@MockK(relaxed = true) private lateinit var dismissDialog: () -> Unit
|
|
|
|
|
|
|
|
|
|
private lateinit var controller: SearchDialogController
|
|
|
|
|
private lateinit var middleware: CaptureActionsMiddleware<BrowserState, BrowserAction>
|
|
|
|
|
private lateinit var browserStore: BrowserStore
|
|
|
|
|
|
|
|
|
@ -73,22 +68,6 @@ class SearchDialogControllerTest {
|
|
|
|
|
every { id } returns R.id.searchDialogFragment
|
|
|
|
|
}
|
|
|
|
|
every { MetricsUtils.createSearchEvent(searchEngine, browserStore, any()) } returns null
|
|
|
|
|
|
|
|
|
|
val tabsUseCases = TabsUseCases(browserStore)
|
|
|
|
|
|
|
|
|
|
controller = SearchDialogController(
|
|
|
|
|
activity = activity,
|
|
|
|
|
store = browserStore,
|
|
|
|
|
tabsUseCases = tabsUseCases,
|
|
|
|
|
fragmentStore = store,
|
|
|
|
|
navController = navController,
|
|
|
|
|
settings = settings,
|
|
|
|
|
metrics = metrics,
|
|
|
|
|
dismissDialog = dismissDialog,
|
|
|
|
|
clearToolbarFocus = clearToolbarFocus,
|
|
|
|
|
focusToolbar = focusToolbar,
|
|
|
|
|
clearToolbar = clearToolbar
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@After
|
|
|
|
@ -100,7 +79,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleUrlCommitted() {
|
|
|
|
|
val url = "https://www.google.com/"
|
|
|
|
|
|
|
|
|
|
controller.handleUrlCommitted(url)
|
|
|
|
|
createController().handleUrlCommitted(url)
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
|
activity.openToBrowserAndLoad(
|
|
|
|
@ -117,18 +96,19 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleBlankUrlCommitted() {
|
|
|
|
|
val url = ""
|
|
|
|
|
|
|
|
|
|
controller.handleUrlCommitted(url)
|
|
|
|
|
var dismissDialogInvoked = false
|
|
|
|
|
createController(dismissDialog = {
|
|
|
|
|
dismissDialogInvoked = true
|
|
|
|
|
}).handleUrlCommitted(url)
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
|
dismissDialog()
|
|
|
|
|
}
|
|
|
|
|
assertTrue(dismissDialogInvoked)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun handleSearchCommitted() {
|
|
|
|
|
val searchTerm = "Firefox"
|
|
|
|
|
|
|
|
|
|
controller.handleUrlCommitted(searchTerm)
|
|
|
|
|
createController().handleUrlCommitted(searchTerm)
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
|
activity.openToBrowserAndLoad(
|
|
|
|
@ -145,7 +125,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
val url = "about:crashes"
|
|
|
|
|
every { activity.packageName } returns "org.mozilla.fenix"
|
|
|
|
|
|
|
|
|
|
controller.handleUrlCommitted(url)
|
|
|
|
|
createController().handleUrlCommitted(url)
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
|
activity.startActivity(any())
|
|
|
|
@ -157,7 +137,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
val url = "about:addons"
|
|
|
|
|
val directions = actionGlobalAddonsManagementFragment()
|
|
|
|
|
|
|
|
|
|
controller.handleUrlCommitted(url)
|
|
|
|
|
createController().handleUrlCommitted(url)
|
|
|
|
|
|
|
|
|
|
verify { navController.navigate(directions) }
|
|
|
|
|
}
|
|
|
|
@ -166,7 +146,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleMozillaUrlCommitted() {
|
|
|
|
|
val url = "moz://a"
|
|
|
|
|
|
|
|
|
|
controller.handleUrlCommitted(url)
|
|
|
|
|
createController().handleUrlCommitted(url)
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
|
activity.openToBrowserAndLoad(
|
|
|
|
@ -181,18 +161,19 @@ class SearchDialogControllerTest {
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun handleEditingCancelled() = runBlockingTest {
|
|
|
|
|
controller.handleEditingCancelled()
|
|
|
|
|
var clearToolbarFocusInvoked = false
|
|
|
|
|
createController(clearToolbarFocus = {
|
|
|
|
|
clearToolbarFocusInvoked = true
|
|
|
|
|
}).handleEditingCancelled()
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
|
clearToolbarFocus()
|
|
|
|
|
}
|
|
|
|
|
assertTrue(clearToolbarFocusInvoked)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun handleTextChangedNonEmpty() {
|
|
|
|
|
val text = "fenix"
|
|
|
|
|
|
|
|
|
|
controller.handleTextChanged(text)
|
|
|
|
|
createController().handleTextChanged(text)
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.UpdateQuery(text)) }
|
|
|
|
|
}
|
|
|
|
@ -201,7 +182,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleTextChangedEmpty() {
|
|
|
|
|
val text = ""
|
|
|
|
|
|
|
|
|
|
controller.handleTextChanged(text)
|
|
|
|
|
createController().handleTextChanged(text)
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.UpdateQuery(text)) }
|
|
|
|
|
}
|
|
|
|
@ -211,7 +192,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
val text = ""
|
|
|
|
|
every { settings.shouldShowSearchShortcuts } returns true
|
|
|
|
|
|
|
|
|
|
controller.handleTextChanged(text)
|
|
|
|
|
createController().handleTextChanged(text)
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(true)) }
|
|
|
|
|
}
|
|
|
|
@ -222,7 +203,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
every { store.state.url } returns "mozilla.org"
|
|
|
|
|
every { settings.shouldShowSearchShortcuts } returns true
|
|
|
|
|
|
|
|
|
|
controller.handleTextChanged(text)
|
|
|
|
|
createController().handleTextChanged(text)
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(true)) }
|
|
|
|
|
}
|
|
|
|
@ -231,7 +212,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun `do not show search shortcuts when setting enabled AND query non-empty`() {
|
|
|
|
|
val text = "mozilla"
|
|
|
|
|
|
|
|
|
|
controller.handleTextChanged(text)
|
|
|
|
|
createController().handleTextChanged(text)
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) }
|
|
|
|
|
}
|
|
|
|
@ -242,7 +223,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
|
|
|
|
|
val text = ""
|
|
|
|
|
|
|
|
|
|
controller.handleTextChanged(text)
|
|
|
|
|
createController().handleTextChanged(text)
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) }
|
|
|
|
|
}
|
|
|
|
@ -253,7 +234,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
|
|
|
|
|
val text = "mozilla"
|
|
|
|
|
|
|
|
|
|
controller.handleTextChanged(text)
|
|
|
|
|
createController().handleTextChanged(text)
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) }
|
|
|
|
|
}
|
|
|
|
@ -262,7 +243,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleUrlTapped() {
|
|
|
|
|
val url = "https://www.google.com/"
|
|
|
|
|
|
|
|
|
|
controller.handleUrlTapped(url)
|
|
|
|
|
createController().handleUrlTapped(url)
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
|
activity.openToBrowserAndLoad(
|
|
|
|
@ -278,7 +259,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleSearchTermsTapped() {
|
|
|
|
|
val searchTerms = "fenix"
|
|
|
|
|
|
|
|
|
|
controller.handleSearchTermsTapped(searchTerms)
|
|
|
|
|
createController().handleSearchTermsTapped(searchTerms)
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
|
activity.openToBrowserAndLoad(
|
|
|
|
@ -295,9 +276,12 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleSearchShortcutEngineSelected() {
|
|
|
|
|
val searchEngine: SearchEngine = mockk(relaxed = true)
|
|
|
|
|
|
|
|
|
|
controller.handleSearchShortcutEngineSelected(searchEngine)
|
|
|
|
|
var focusToolbarInvoked = false
|
|
|
|
|
createController(focusToolbar = {
|
|
|
|
|
focusToolbarInvoked = true
|
|
|
|
|
}).handleSearchShortcutEngineSelected(searchEngine)
|
|
|
|
|
|
|
|
|
|
verify { focusToolbar() }
|
|
|
|
|
assertTrue(focusToolbarInvoked)
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.SearchShortcutEngineSelected(searchEngine)) }
|
|
|
|
|
verify { metrics.track(Event.SearchShortcutSelected(searchEngine, false)) }
|
|
|
|
|
}
|
|
|
|
@ -306,7 +290,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleClickSearchEngineSettings() {
|
|
|
|
|
val directions: NavDirections = actionGlobalSearchEngineFragment()
|
|
|
|
|
|
|
|
|
|
controller.handleClickSearchEngineSettings()
|
|
|
|
|
createController().handleClickSearchEngineSettings()
|
|
|
|
|
|
|
|
|
|
verify { navController.navigate(directions) }
|
|
|
|
|
}
|
|
|
|
@ -315,7 +299,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleSearchShortcutsButtonClicked_alreadyOpen() {
|
|
|
|
|
every { store.state.showSearchShortcuts } returns true
|
|
|
|
|
|
|
|
|
|
controller.handleSearchShortcutsButtonClicked()
|
|
|
|
|
createController().handleSearchShortcutsButtonClicked()
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) }
|
|
|
|
|
}
|
|
|
|
@ -324,14 +308,14 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun handleSearchShortcutsButtonClicked_notYetOpen() {
|
|
|
|
|
every { store.state.showSearchShortcuts } returns false
|
|
|
|
|
|
|
|
|
|
controller.handleSearchShortcutsButtonClicked()
|
|
|
|
|
createController().handleSearchShortcutsButtonClicked()
|
|
|
|
|
|
|
|
|
|
verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(true)) }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun handleExistingSessionSelected() {
|
|
|
|
|
controller.handleExistingSessionSelected("selected")
|
|
|
|
|
createController().handleExistingSessionSelected("selected")
|
|
|
|
|
|
|
|
|
|
browserStore.waitUntilIdle()
|
|
|
|
|
|
|
|
|
@ -344,7 +328,7 @@ class SearchDialogControllerTest {
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun handleExistingSessionSelected_tabId() {
|
|
|
|
|
controller.handleExistingSessionSelected("tab-id")
|
|
|
|
|
createController().handleExistingSessionSelected("tab-id")
|
|
|
|
|
|
|
|
|
|
browserStore.waitUntilIdle()
|
|
|
|
|
|
|
|
|
@ -358,11 +342,32 @@ class SearchDialogControllerTest {
|
|
|
|
|
fun `show camera permissions needed dialog`() {
|
|
|
|
|
val dialogBuilder: AlertDialog.Builder = mockk(relaxed = true)
|
|
|
|
|
|
|
|
|
|
val spyController = spyk(controller)
|
|
|
|
|
val spyController = spyk(createController())
|
|
|
|
|
every { spyController.buildDialog() } returns dialogBuilder
|
|
|
|
|
|
|
|
|
|
spyController.handleCameraPermissionsNeeded()
|
|
|
|
|
|
|
|
|
|
verify { dialogBuilder.show() }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun createController(
|
|
|
|
|
clearToolbarFocus: () -> Unit = { },
|
|
|
|
|
focusToolbar: () -> Unit = { },
|
|
|
|
|
clearToolbar: () -> Unit = { },
|
|
|
|
|
dismissDialog: () -> Unit = { }
|
|
|
|
|
): SearchDialogController {
|
|
|
|
|
return SearchDialogController(
|
|
|
|
|
activity = activity,
|
|
|
|
|
store = browserStore,
|
|
|
|
|
tabsUseCases = TabsUseCases(browserStore),
|
|
|
|
|
fragmentStore = store,
|
|
|
|
|
navController = navController,
|
|
|
|
|
settings = settings,
|
|
|
|
|
metrics = metrics,
|
|
|
|
|
dismissDialog = dismissDialog,
|
|
|
|
|
clearToolbarFocus = clearToolbarFocus,
|
|
|
|
|
focusToolbar = focusToolbar,
|
|
|
|
|
clearToolbar = clearToolbar
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|