2019-07-13 01:32:00 +02:00
|
|
|
/* 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.search
|
|
|
|
|
2019-07-26 16:49:25 +02:00
|
|
|
import android.content.Context
|
2019-07-13 01:32:00 +02:00
|
|
|
import androidx.navigation.NavController
|
|
|
|
import androidx.navigation.NavDirections
|
2019-11-18 13:14:38 +01:00
|
|
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
2019-07-13 01:32:00 +02:00
|
|
|
import io.mockk.Runs
|
|
|
|
import io.mockk.every
|
|
|
|
import io.mockk.just
|
|
|
|
import io.mockk.mockk
|
2019-12-04 10:48:22 +01:00
|
|
|
import io.mockk.mockkObject
|
2020-01-22 20:15:30 +01:00
|
|
|
import io.mockk.verify
|
2019-07-13 01:32:00 +02:00
|
|
|
import mozilla.components.browser.search.SearchEngine
|
|
|
|
import mozilla.components.browser.search.SearchEngineManager
|
2019-07-26 16:49:25 +02:00
|
|
|
import mozilla.components.browser.session.Session
|
2019-11-18 13:14:38 +01:00
|
|
|
import mozilla.components.support.test.robolectric.testContext
|
2019-07-13 01:32:00 +02:00
|
|
|
import org.junit.Test
|
2019-11-18 13:14:38 +01:00
|
|
|
import org.junit.runner.RunWith
|
2019-07-13 01:32:00 +02:00
|
|
|
import org.mozilla.fenix.BrowserDirection
|
2019-07-26 16:49:25 +02:00
|
|
|
import org.mozilla.fenix.FenixApplication
|
2019-07-13 01:32:00 +02:00
|
|
|
import org.mozilla.fenix.HomeActivity
|
2019-12-18 16:09:12 +01:00
|
|
|
import org.mozilla.fenix.TestApplication
|
|
|
|
import org.mozilla.fenix.components.metrics.Event
|
2019-12-04 10:48:22 +01:00
|
|
|
import org.mozilla.fenix.components.searchengine.CustomSearchEngineStore.PREF_FILE_SEARCH_ENGINES
|
2019-07-13 01:32:00 +02:00
|
|
|
import org.mozilla.fenix.ext.metrics
|
|
|
|
import org.mozilla.fenix.ext.searchEngineManager
|
2019-11-18 13:14:38 +01:00
|
|
|
import org.mozilla.fenix.ext.settings
|
|
|
|
import org.mozilla.fenix.utils.Settings
|
|
|
|
import org.mozilla.fenix.whatsnew.clear
|
|
|
|
import org.robolectric.annotation.Config
|
2019-07-13 01:32:00 +02:00
|
|
|
|
2019-11-18 13:14:38 +01:00
|
|
|
@RunWith(AndroidJUnit4::class)
|
|
|
|
@Config(application = TestApplication::class)
|
2019-07-13 01:32:00 +02:00
|
|
|
class SearchInteractorTest {
|
|
|
|
@Test
|
|
|
|
fun onUrlCommitted() {
|
2019-12-06 20:12:23 +01:00
|
|
|
val context: HomeActivity = mockk(relaxed = true)
|
2019-08-30 15:21:34 +02:00
|
|
|
val store: SearchFragmentStore = mockk()
|
|
|
|
val state: SearchFragmentState = mockk()
|
2019-07-13 01:32:00 +02:00
|
|
|
val searchEngineManager: SearchEngineManager = mockk(relaxed = true)
|
2019-12-06 20:12:23 +01:00
|
|
|
val searchEngine = SearchEngineSource.Default(mockk(relaxed = true))
|
2019-12-18 16:09:12 +01:00
|
|
|
val searchAccessPoint: Event.PerformedSearch.SearchAccessPoint = mockk(relaxed = true)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
every { context.metrics } returns mockk(relaxed = true)
|
|
|
|
every { context.searchEngineManager } returns searchEngineManager
|
|
|
|
every { context.openToBrowserAndLoad(any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
|
|
|
|
every { store.state } returns state
|
|
|
|
every { state.session } returns null
|
|
|
|
every { state.searchEngineSource } returns searchEngine
|
2019-12-18 16:09:12 +01:00
|
|
|
every { state.searchAccessPoint } returns searchAccessPoint
|
2019-07-13 01:32:00 +02:00
|
|
|
|
2019-12-04 10:48:22 +01:00
|
|
|
every {
|
|
|
|
context.getSharedPreferences(
|
|
|
|
PREF_FILE_SEARCH_ENGINES,
|
|
|
|
Context.MODE_PRIVATE
|
|
|
|
)
|
|
|
|
} returns mockk(relaxed = true)
|
|
|
|
|
2019-08-20 18:07:00 +02:00
|
|
|
val searchController: SearchController = DefaultSearchController(
|
|
|
|
context,
|
|
|
|
store,
|
|
|
|
mockk()
|
|
|
|
)
|
|
|
|
val interactor = SearchInteractor(searchController)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
interactor.onUrlCommitted("test")
|
|
|
|
|
|
|
|
verify {
|
|
|
|
context.openToBrowserAndLoad(
|
|
|
|
searchTermOrURL = "test",
|
|
|
|
newTab = true,
|
|
|
|
from = BrowserDirection.FromSearch,
|
|
|
|
engine = searchEngine.searchEngine
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
fun onEditingCanceled() {
|
|
|
|
val navController: NavController = mockk(relaxed = true)
|
2020-01-22 20:15:30 +01:00
|
|
|
val store: SearchFragmentStore = mockk(relaxed = true)
|
2019-07-11 19:24:58 +02:00
|
|
|
|
|
|
|
every { store.state } returns mockk(relaxed = true)
|
|
|
|
|
2019-08-20 18:07:00 +02:00
|
|
|
val searchController: SearchController = DefaultSearchController(
|
|
|
|
mockk(),
|
|
|
|
store,
|
|
|
|
navController
|
|
|
|
)
|
|
|
|
val interactor = SearchInteractor(searchController)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
interactor.onEditingCanceled()
|
|
|
|
|
|
|
|
verify {
|
2020-01-22 20:15:30 +01:00
|
|
|
store.dispatch(SearchFragmentAction.UpdateEditingCanceled)
|
2019-07-13 01:32:00 +02:00
|
|
|
navController.navigateUp()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
fun onTextChanged() {
|
2019-08-30 15:21:34 +02:00
|
|
|
val store: SearchFragmentStore = mockk(relaxed = true)
|
2019-11-18 13:14:38 +01:00
|
|
|
val context: HomeActivity = mockk(relaxed = true)
|
|
|
|
val settings = testContext.settings().apply { testContext.settings().clear() }
|
|
|
|
|
|
|
|
mockkObject(Settings)
|
|
|
|
every { Settings.getInstance(context = context) } returns settings
|
2019-07-11 19:24:58 +02:00
|
|
|
|
|
|
|
every { store.state } returns mockk(relaxed = true)
|
|
|
|
|
2019-08-20 18:07:00 +02:00
|
|
|
val searchController: SearchController = DefaultSearchController(
|
2019-11-18 13:14:38 +01:00
|
|
|
context,
|
2019-08-20 18:07:00 +02:00
|
|
|
store,
|
|
|
|
mockk()
|
|
|
|
)
|
|
|
|
val interactor = SearchInteractor(searchController)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
interactor.onTextChanged("test")
|
|
|
|
|
2019-08-30 15:21:34 +02:00
|
|
|
verify { store.dispatch(SearchFragmentAction.UpdateQuery("test")) }
|
2019-11-18 13:14:38 +01:00
|
|
|
verify { store.dispatch(SearchFragmentAction.ShowSearchSuggestionsHint(false)) }
|
2019-07-13 01:32:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
fun onUrlTapped() {
|
|
|
|
val context: HomeActivity = mockk()
|
2019-08-30 15:21:34 +02:00
|
|
|
val store: SearchFragmentStore = mockk()
|
|
|
|
val state: SearchFragmentState = mockk()
|
2019-12-04 10:48:22 +01:00
|
|
|
val searchEngine = SearchEngineSource.Default(mockk(relaxed = true))
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
every { context.metrics } returns mockk(relaxed = true)
|
|
|
|
every { context.openToBrowserAndLoad(any(), any(), any()) } just Runs
|
|
|
|
|
|
|
|
every { store.state } returns state
|
|
|
|
every { state.session } returns null
|
2019-12-04 10:48:22 +01:00
|
|
|
every { state.searchEngineSource } returns searchEngine
|
|
|
|
|
|
|
|
every {
|
|
|
|
context.getSharedPreferences(
|
|
|
|
PREF_FILE_SEARCH_ENGINES,
|
|
|
|
Context.MODE_PRIVATE
|
|
|
|
)
|
|
|
|
} returns mockk(relaxed = true)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
2019-08-20 18:07:00 +02:00
|
|
|
val searchController: SearchController = DefaultSearchController(
|
|
|
|
context,
|
|
|
|
store,
|
|
|
|
mockk()
|
|
|
|
)
|
|
|
|
val interactor = SearchInteractor(searchController)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
interactor.onUrlTapped("test")
|
|
|
|
|
|
|
|
verify {
|
|
|
|
context.openToBrowserAndLoad(
|
|
|
|
"test",
|
|
|
|
true,
|
|
|
|
BrowserDirection.FromSearch
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
fun onSearchTermsTapped() {
|
2019-12-06 20:12:23 +01:00
|
|
|
val context: HomeActivity = mockk(relaxed = true)
|
2019-08-30 15:21:34 +02:00
|
|
|
val store: SearchFragmentStore = mockk()
|
|
|
|
val state: SearchFragmentState = mockk()
|
2019-07-13 01:32:00 +02:00
|
|
|
val searchEngineManager: SearchEngineManager = mockk(relaxed = true)
|
2019-12-06 20:12:23 +01:00
|
|
|
val searchEngine = SearchEngineSource.Default(mockk(relaxed = true))
|
2019-12-18 16:09:12 +01:00
|
|
|
val searchAccessPoint: Event.PerformedSearch.SearchAccessPoint = mockk(relaxed = true)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
every { context.metrics } returns mockk(relaxed = true)
|
|
|
|
every { context.searchEngineManager } returns searchEngineManager
|
|
|
|
every { context.openToBrowserAndLoad(any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
|
|
|
|
every { store.state } returns state
|
|
|
|
every { state.session } returns null
|
|
|
|
every { state.searchEngineSource } returns searchEngine
|
2019-12-18 16:09:12 +01:00
|
|
|
every { state.searchAccessPoint } returns searchAccessPoint
|
2019-07-13 01:32:00 +02:00
|
|
|
|
2019-12-04 10:48:22 +01:00
|
|
|
every {
|
|
|
|
context.getSharedPreferences(
|
|
|
|
PREF_FILE_SEARCH_ENGINES,
|
|
|
|
Context.MODE_PRIVATE
|
|
|
|
)
|
|
|
|
} returns mockk(relaxed = true)
|
|
|
|
|
2019-08-20 18:07:00 +02:00
|
|
|
val searchController: SearchController = DefaultSearchController(
|
|
|
|
context,
|
|
|
|
store,
|
|
|
|
mockk()
|
|
|
|
)
|
|
|
|
|
|
|
|
val interactor = SearchInteractor(searchController)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
interactor.onSearchTermsTapped("test")
|
2019-08-20 18:07:00 +02:00
|
|
|
verify {
|
|
|
|
context.openToBrowserAndLoad(
|
|
|
|
searchTermOrURL = "test",
|
|
|
|
newTab = true,
|
|
|
|
from = BrowserDirection.FromSearch,
|
|
|
|
engine = searchEngine.searchEngine,
|
|
|
|
forceSearch = true
|
|
|
|
)
|
|
|
|
}
|
2019-07-13 01:32:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
fun onSearchShortcutEngineSelected() {
|
|
|
|
val context: HomeActivity = mockk(relaxed = true)
|
|
|
|
|
|
|
|
every { context.metrics } returns mockk(relaxed = true)
|
|
|
|
|
2019-08-30 15:21:34 +02:00
|
|
|
val store: SearchFragmentStore = mockk(relaxed = true)
|
|
|
|
val state: SearchFragmentState = mockk(relaxed = true)
|
2019-07-11 19:24:58 +02:00
|
|
|
|
|
|
|
every { store.state } returns state
|
|
|
|
|
2019-08-20 18:07:00 +02:00
|
|
|
val searchController: SearchController = DefaultSearchController(
|
|
|
|
context,
|
|
|
|
store,
|
|
|
|
mockk()
|
|
|
|
)
|
|
|
|
val interactor = SearchInteractor(searchController)
|
2019-07-13 01:32:00 +02:00
|
|
|
val searchEngine: SearchEngine = mockk(relaxed = true)
|
|
|
|
|
|
|
|
interactor.onSearchShortcutEngineSelected(searchEngine)
|
|
|
|
|
2019-08-30 15:21:34 +02:00
|
|
|
verify { store.dispatch(SearchFragmentAction.SearchShortcutEngineSelected(searchEngine)) }
|
2019-07-13 01:32:00 +02:00
|
|
|
}
|
|
|
|
|
2019-10-18 14:43:39 +02:00
|
|
|
@Test
|
|
|
|
fun onSearchShortcutsButtonClicked() {
|
|
|
|
val searchController: SearchController = mockk(relaxed = true)
|
|
|
|
val interactor = SearchInteractor(searchController)
|
|
|
|
|
|
|
|
interactor.onSearchShortcutsButtonClicked()
|
|
|
|
|
|
|
|
verify { searchController.handleSearchShortcutsButtonClicked() }
|
|
|
|
}
|
|
|
|
|
2019-07-13 01:32:00 +02:00
|
|
|
@Test
|
|
|
|
fun onClickSearchEngineSettings() {
|
|
|
|
val navController: NavController = mockk()
|
2019-08-30 15:21:34 +02:00
|
|
|
val store: SearchFragmentStore = mockk()
|
2019-07-11 19:24:58 +02:00
|
|
|
|
|
|
|
every { store.state } returns mockk(relaxed = true)
|
|
|
|
|
2019-08-20 18:07:00 +02:00
|
|
|
val searchController: SearchController = DefaultSearchController(
|
|
|
|
mockk(),
|
|
|
|
store,
|
|
|
|
navController
|
|
|
|
)
|
|
|
|
val interactor = SearchInteractor(searchController)
|
2019-07-13 01:32:00 +02:00
|
|
|
|
|
|
|
every { navController.navigate(any() as NavDirections) } just Runs
|
|
|
|
|
|
|
|
interactor.onClickSearchEngineSettings()
|
|
|
|
|
|
|
|
verify {
|
|
|
|
navController.navigate(SearchFragmentDirections.actionSearchFragmentToSearchEngineFragment())
|
|
|
|
}
|
|
|
|
}
|
2019-07-26 16:49:25 +02:00
|
|
|
|
|
|
|
@Test
|
|
|
|
fun onExistingSessionSelected() {
|
|
|
|
val navController: NavController = mockk(relaxed = true)
|
2020-01-21 20:08:12 +01:00
|
|
|
val context: HomeActivity = mockk(relaxed = true)
|
2019-07-26 16:49:25 +02:00
|
|
|
val applicationContext: FenixApplication = mockk(relaxed = true)
|
|
|
|
every { context.applicationContext } returns applicationContext
|
2019-08-30 15:21:34 +02:00
|
|
|
val store: SearchFragmentStore = mockk()
|
2020-01-21 20:08:12 +01:00
|
|
|
every { context.openToBrowser(any(), any()) } just Runs
|
|
|
|
|
2019-07-11 19:24:58 +02:00
|
|
|
every { store.state } returns mockk(relaxed = true)
|
2019-08-20 18:07:00 +02:00
|
|
|
|
|
|
|
val searchController: SearchController = DefaultSearchController(
|
|
|
|
context,
|
|
|
|
store,
|
|
|
|
navController
|
|
|
|
)
|
|
|
|
val interactor = SearchInteractor(searchController)
|
2019-07-26 16:49:25 +02:00
|
|
|
val session = Session("http://mozilla.org", false)
|
|
|
|
|
|
|
|
interactor.onExistingSessionSelected(session)
|
|
|
|
|
|
|
|
verify {
|
2020-01-21 20:08:12 +01:00
|
|
|
context.openToBrowser(BrowserDirection.FromSearch)
|
2019-07-26 16:49:25 +02:00
|
|
|
}
|
|
|
|
}
|
2019-07-13 01:32:00 +02:00
|
|
|
}
|