@ -18,16 +18,18 @@ import io.mockk.spyk
import io.mockk.verify
import io.mockk.verify
import mozilla.components.browser.domains.autocomplete.BaseDomainAutocompleteProvider
import mozilla.components.browser.domains.autocomplete.BaseDomainAutocompleteProvider
import mozilla.components.browser.state.search.SearchEngine
import mozilla.components.browser.state.search.SearchEngine
import mozilla.components.browser.state.state.SearchState
import mozilla.components.browser.state.state.searchEngines
import mozilla.components.browser.storage.sync.PlacesBookmarksStorage
import mozilla.components.browser.storage.sync.PlacesBookmarksStorage
import mozilla.components.browser.storage.sync.PlacesHistoryStorage
import mozilla.components.browser.storage.sync.PlacesHistoryStorage
import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.browser.toolbar.edit.EditToolbar
import mozilla.components.browser.toolbar.edit.EditToolbar
import mozilla.components.concept.engine.Engine
import mozilla.components.concept.toolbar.Toolbar
import mozilla.components.concept.toolbar.Toolbar
import mozilla.components.feature.awesomebar.provider.SessionAutocompleteProvider
import mozilla.components.feature.awesomebar.provider.SessionAutocompleteProvider
import mozilla.components.feature.syncedtabs.SyncedTabsAutocompleteProvider
import mozilla.components.feature.syncedtabs.SyncedTabsAutocompleteProvider
import mozilla.components.feature.toolbar.ToolbarAutocompleteFeature
import mozilla.components.feature.toolbar.ToolbarAutocompleteFeature
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.ui.autocomplete.InlineAutocompleteEditText
import org.junit.Assert.assertEquals
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNotNull
@ -41,8 +43,10 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.components.Components
import org.mozilla.fenix.components.Components
import org.mozilla.fenix.components.Core
import org.mozilla.fenix.components.Core
import org.mozilla.fenix.components.metrics.MetricsUtils
import org.mozilla.fenix.components.metrics.MetricsUtils
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.search.SearchDialogFragment
import org.mozilla.fenix.search.SearchEngineSource
import org.mozilla.fenix.search.SearchEngineSource
import org.mozilla.fenix.search.SearchFragmentState
import org.mozilla.fenix.search.SearchFragmentState
import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.utils.Settings
@ -53,7 +57,6 @@ class ToolbarViewTest {
@MockK ( relaxed = true )
@MockK ( relaxed = true )
private lateinit var interactor : ToolbarInteractor
private lateinit var interactor : ToolbarInteractor
@MockK private lateinit var engine : Engine
private lateinit var context : Context
private lateinit var context : Context
private lateinit var toolbar : BrowserToolbar
private lateinit var toolbar : BrowserToolbar
private val defaultState : SearchFragmentState = SearchFragmentState (
private val defaultState : SearchFragmentState = SearchFragmentState (
@ -213,142 +216,220 @@ class ToolbarViewTest {
fun `WHEN the default general search engine is selected THEN show text for default engine` ( ) {
fun `WHEN the default general search engine is selected THEN show text for default engine` ( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val defaultEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED , true )
val defaultEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED , true )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . search _hint )
val expectedContentDescription = defaultEngine . name + " , " + context . getString ( R . string . search _hint )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . search _hint ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns defaultEngine . id
defaultEngine = defaultEngine ,
every { searchState . searchEngines } returns listOf ( defaultEngine )
searchEngineSource = SearchEngineSource . Default ( defaultEngine ) ,
every { fragment . toolbarView } returns toolbarView
) ,
every { fragment . requireComponents . core . store . state . search } returns searchState
)
assertEquals ( context . getString ( R . string . search _hint ) , toolbarView . view . edit . hint )
fragment . updateToolbarContentDescription ( defaultEngine , true )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN a general search engine is selected THEN show tex t for general engine`( ) {
fun `WHEN a general search engine is selected THEN show hin t for general engine`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val generalEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED , true )
val generalEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED , true )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . search _hint _general _engine )
val expectedContentDescription = generalEngine . name + " , " + context . getString ( R . string . search _hint _general _engine )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . search _hint _general _engine ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns generalEngine . id
searchEngineSource = SearchEngineSource . Shortcut ( generalEngine ) ,
every { searchState . searchEngines } returns listOf ( generalEngine )
) ,
every { fragment . toolbarView } returns toolbarView
)
every { fragment . requireComponents . core . store . state . search } returns searchState
fragment . updateToolbarContentDescription ( generalEngine , false )
assertEquals ( context . getString ( R . string . search _hint _general _engine ) , toolbarView . view . edit . hint )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN a topic specific search engine is selected THEN show tex t for topic specific engine`( ) {
fun `WHEN a topic specific search engine is selected THEN show hin t for topic specific engine`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val topicSpecificEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED , false )
val topicSpecificEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED , false )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . application _search _hint )
val expectedContentDescription = topicSpecificEngine . name + " , " + context . getString ( R . string . application _search _hint )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . application _search _hint ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns topicSpecificEngine . id
searchEngineSource = SearchEngineSource . Shortcut ( topicSpecificEngine ) ,
every { searchState . searchEngines } returns listOf ( topicSpecificEngine )
) ,
every { fragment . toolbarView } returns toolbarView
)
every { fragment . requireComponents . core . store . state . search } returns searchState
assertEquals ( context . getString ( R . string . application _search _hint ) , toolbarView . view . edit . hint )
fragment . updateToolbarContentDescription ( topicSpecificEngine , false )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN the default additional general search engine is selected THEN show tex t for default engine`( ) {
fun `WHEN the default additional general search engine is selected THEN show hin t for default engine`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val defaultEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED _ADDITIONAL , true )
val defaultEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED _ADDITIONAL , true )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . search _hint )
val expectedContentDescription = defaultEngine . name + " , " + context . getString ( R . string . search _hint )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . search _hint ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns defaultEngine . id
defaultEngine = defaultEngine ,
every { searchState . searchEngines } returns listOf ( defaultEngine )
searchEngineSource = SearchEngineSource . Default ( defaultEngine ) ,
every { fragment . toolbarView } returns toolbarView
) ,
every { fragment . requireComponents . core . store . state . search } returns searchState
)
fragment . updateToolbarContentDescription ( defaultEngine , true )
assertEquals ( context . getString ( R . string . search _hint ) , toolbarView . view . edit . hint )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN a general additional search engine is selected THEN show tex t for general engine`( ) {
fun `WHEN a general additional search engine is selected THEN show hin t for general engine`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val generalEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED _ADDITIONAL , true )
val generalEngine = buildSearchEngine ( SearchEngine . Type . BUNDLED _ADDITIONAL , true )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . search _hint _general _engine )
val expectedContentDescription = generalEngine . name + " , " + context . getString ( R . string . search _hint _general _engine )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . search _hint _general _engine ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns generalEngine . id
searchEngineSource = SearchEngineSource . Shortcut ( generalEngine ) ,
every { searchState . searchEngines } returns listOf ( generalEngine )
) ,
every { fragment . toolbarView } returns toolbarView
)
every { fragment . requireComponents . core . store . state . search } returns searchState
fragment . updateToolbarContentDescription ( generalEngine , false )
assertEquals ( context . getString ( R . string . search _hint _general _engine ) , toolbarView . view . edit . hint )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN the default custom search engine is selected THEN show tex t for default engine`( ) {
fun `WHEN the default custom search engine is selected THEN show hin t for default engine`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val customEngine = buildSearchEngine ( SearchEngine . Type . CUSTOM , true )
val customEngine = buildSearchEngine ( SearchEngine . Type . CUSTOM , true )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . search _hint )
val expectedContentDescription = customEngine . name + " , " + context . getString ( R . string . search _hint )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . search _hint ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns customEngine . id
defaultEngine = customEngine ,
every { searchState . searchEngines } returns listOf ( customEngine )
searchEngineSource = SearchEngineSource . Default ( customEngine ) ,
every { fragment . toolbarView } returns toolbarView
) ,
every { fragment . requireComponents . core . store . state . search } returns searchState
)
assertEquals ( context . getString ( R . string . search _hint ) , toolbarView . view . edit . hint )
fragment . updateToolbarContentDescription ( customEngine , true )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN a custom search engine is selected THEN show tex t for general engine`( ) {
fun `WHEN a custom search engine is selected THEN show hin t for general engine`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val customEngine = buildSearchEngine ( SearchEngine . Type . CUSTOM , true )
val customEngine = buildSearchEngine ( SearchEngine . Type . CUSTOM , true )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . search _hint _general _engine )
val expectedContentDescription = customEngine . name + " , " + context . getString ( R . string . search _hint _general _engine )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . search _hint _general _engine ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns customEngine . id
searchEngineSource = SearchEngineSource . Shortcut ( customEngine ) ,
every { searchState . searchEngines } returns listOf ( customEngine )
) ,
every { fragment . toolbarView } returns toolbarView
)
every { fragment . requireComponents . core . store . state . search } returns searchState
fragment . updateToolbarContentDescription ( customEngine , false )
assertEquals ( context . getString ( R . string . search _hint _general _engine ) , toolbarView . view . edit . hint )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN history is selected as engine THEN show tex t specific for history`( ) {
fun `WHEN history is selected as engine THEN show hin t specific for history`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val historyEngine = buildSearchEngine ( SearchEngine . Type . APPLICATION , false , Core . HISTORY _SEARCH _ENGINE _ID )
val historyEngine = buildSearchEngine ( SearchEngine . Type . APPLICATION , false , Core . HISTORY _SEARCH _ENGINE _ID )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . history _search _hint )
val expectedContentDescription = historyEngine . name + " , " + context . getString ( R . string . history _search _hint )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . history _search _hint ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns historyEngine . id
searchEngineSource = SearchEngineSource . Shortcut ( historyEngine ) ,
every { searchState . searchEngines } returns listOf ( historyEngine )
) ,
every { fragment . toolbarView } returns toolbarView
)
every { fragment . requireComponents . core . store . state . search } returns searchState
assertEquals ( context . getString ( R . string . history _search _hint ) , toolbarView . view . edit . hint )
fragment . updateToolbarContentDescription ( historyEngine , false )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN bookmarks is selected as engine THEN show tex t specific for bookmarks`( ) {
fun `WHEN bookmarks is selected as engine THEN show hin t specific for bookmarks`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val bookmarksEngine = buildSearchEngine ( SearchEngine . Type . APPLICATION , false , Core . BOOKMARKS _SEARCH _ENGINE _ID )
val bookmarksEngine = buildSearchEngine ( SearchEngine . Type . APPLICATION , false , Core . BOOKMARKS _SEARCH _ENGINE _ID )
val fragment = spyk ( SearchDialogFragment ( ) )
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
val searchState = mockk < SearchState > ( )
val expectedHint = context . getString ( R . string . bookmark _search _hint )
val expectedContentDescription = bookmarksEngine . name + " , " + context . getString ( R . string . bookmark _search _hint )
toolbarView . update (
every { fragment . requireContext ( ) . getString ( R . string . bookmark _search _hint ) } returns expectedHint
defaultState . copy (
every { searchState . userSelectedSearchEngineId } returns bookmarksEngine . id
searchEngineSource = SearchEngineSource . Shortcut ( bookmarksEngine ) ,
every { searchState . searchEngines } returns listOf ( bookmarksEngine )
) ,
every { fragment . toolbarView } returns toolbarView
)
every { fragment . requireComponents . core . store . state . search } returns searchState
fragment . updateToolbarContentDescription ( bookmarksEngine , false )
assertEquals ( context . getString ( R . string . bookmark _search _hint ) , toolbarView . view . edit . hint )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test
fun `WHEN tabs is selected as engine THEN show tex t specific for tabs`( ) {
fun `WHEN tabs is selected as engine THEN show hin t specific for tabs`( ) {
val toolbarView = buildToolbarView ( false )
val toolbarView = buildToolbarView ( false )
val tabsEngine = buildSearchEngine ( SearchEngine . Type . APPLICATION , false , Core . TABS _SEARCH _ENGINE _ID )
val tabsEngine = buildSearchEngine ( SearchEngine . Type . APPLICATION , false , Core . TABS _SEARCH _ENGINE _ID )
val fragment = spyk ( SearchDialogFragment ( ) )
toolbarView . update (
fragment . inlineAutocompleteEditText = InlineAutocompleteEditText ( context )
defaultState . copy (
val searchState = mockk < SearchState > ( )
searchEngineSource = SearchEngineSource . Shortcut ( tabsEngine ) ,
val expectedHint = context . getString ( R . string . tab _search _hint )
) ,
val expectedContentDescription = tabsEngine . name + " , " + context . getString ( R . string . tab _search _hint )
)
assertEquals ( context . getString ( R . string . tab _search _hint ) , toolbarView . view . edit . hint )
every { fragment . requireContext ( ) . getString ( R . string . tab _search _hint ) } returns expectedHint
every { searchState . userSelectedSearchEngineId } returns tabsEngine . id
every { searchState . searchEngines } returns listOf ( tabsEngine )
every { fragment . toolbarView } returns toolbarView
every { fragment . requireComponents . core . store . state . search } returns searchState
fragment . updateToolbarContentDescription ( tabsEngine , false )
assertEquals ( expectedHint , fragment . inlineAutocompleteEditText . hint )
assertEquals ( expectedContentDescription , toolbarView . view . contentDescription )
}
}
@Test
@Test