2019-12-05 02:51:15 +01:00
package org.mozilla.fenix.components.searchengine
import android.content.Context
2020-05-29 02:43:40 +02:00
import io.mockk.every
import io.mockk.mockk
2020-04-16 17:18:35 +02:00
import io.mockk.Runs
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.just
import io.mockk.mockkObject
2019-12-05 02:51:15 +01:00
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runBlockingTest
import mozilla.components.browser.search.SearchEngine
import mozilla.components.browser.search.provider.SearchEngineList
2020-02-19 02:28:35 +01:00
import mozilla.components.browser.search.provider.localization.LocaleSearchLocalizationProvider
import mozilla.components.browser.search.provider.localization.SearchLocalizationProvider
2019-12-07 02:13:50 +01:00
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
2019-12-05 02:51:15 +01:00
import org.junit.Before
import org.junit.Test
2019-12-07 02:13:50 +01:00
import org.junit.runner.RunWith
2020-04-01 23:00:32 +02:00
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
2019-12-05 02:51:15 +01:00
@ExperimentalCoroutinesApi
2020-04-01 23:00:32 +02:00
@RunWith ( FenixRobolectricTestRunner :: class )
2019-12-05 02:51:15 +01:00
class FenixSearchEngineProviderTest {
private lateinit var fenixSearchEngineProvider : FenixSearchEngineProvider
@Before
fun before ( ) {
fenixSearchEngineProvider = FakeFenixSearchEngineProvider ( testContext )
2020-04-16 17:18:35 +02:00
mockkObject ( CustomSearchEngineStore )
fenixSearchEngineProvider . let {
every { CustomSearchEngineStore . loadCustomSearchEngines ( testContext ) } returns listOf (
( it as FakeFenixSearchEngineProvider ) . mockSearchEngine ( " my custom site " , " my custom site " )
)
}
2019-12-05 02:51:15 +01:00
}
/ *
TODO TEST :
- public API happy path
- list ordering
- deduping
- the above after adding / removing
* /
2020-04-16 17:18:35 +02:00
@Suppress ( " DEPRECATION " )
@Test
fun `add custom engine` ( ) = runBlockingTest {
val engineName = " Ecosia "
val engineQuery = " www.ecosia.com/%s "
val searchEngine : SearchEngine = mockk ( relaxed = true )
every { searchEngine . getSearchTemplate ( ) } returns engineQuery
every { searchEngine . name } returns engineName
mockkObject ( CustomSearchEngineStore )
coEvery {
CustomSearchEngineStore . addSearchEngine (
testContext ,
engineName ,
engineQuery
)
} just Runs
fenixSearchEngineProvider . installSearchEngine ( testContext , searchEngine , true )
coVerify { CustomSearchEngineStore . addSearchEngine ( testContext , engineName , engineQuery ) }
}
2019-12-05 02:51:15 +01:00
@Test
2020-02-19 02:28:35 +01:00
fun `GIVEN sharedprefs does not contain installed engines WHEN installedSearchEngineIdentifiers THEN defaultEngines + customEngines ids are returned` ( ) = runBlockingTest {
2019-12-07 02:13:50 +01:00
val expectedDefaults = fenixSearchEngineProvider . baseSearchEngines . toIdSet ( )
val expectedCustom = fenixSearchEngineProvider . customSearchEngines . toIdSet ( )
val expected = expectedDefaults + expectedCustom
2019-12-05 02:51:15 +01:00
2019-12-07 02:13:50 +01:00
val actual = fenixSearchEngineProvider . installedSearchEngineIdentifiers ( testContext )
assertEquals ( expected , actual )
2019-12-05 02:51:15 +01:00
}
2019-12-07 02:13:50 +01:00
@Test
fun `GIVEN sharedprefs contains installed engines WHEN installedSearchEngineIdentifiers THEN defaultEngines + customEngines ids are returned` ( ) = runBlockingTest {
2020-05-13 16:48:02 +02:00
val sp = testContext . getSharedPreferences ( FenixSearchEngineProvider . PREF _FILE _SEARCH _ENGINES , Context . MODE _PRIVATE )
2020-02-19 02:28:35 +01:00
sp . edit ( ) . putStringSet ( fenixSearchEngineProvider . localeAwareInstalledEnginesKey ( ) , persistedInstalledEngines ) . apply ( )
2019-12-05 02:51:15 +01:00
2019-12-07 02:22:37 +01:00
val expectedStored = persistedInstalledEngines
2019-12-07 02:13:50 +01:00
val expectedCustom = fenixSearchEngineProvider . customSearchEngines . toIdSet ( )
val expected = expectedStored + expectedCustom
2019-12-05 02:51:15 +01:00
2019-12-07 02:13:50 +01:00
val actual = fenixSearchEngineProvider . installedSearchEngineIdentifiers ( testContext )
assertEquals ( expected , actual )
}
2019-12-05 02:51:15 +01:00
}
2019-12-07 02:13:50 +01:00
private suspend fun Deferred < SearchEngineList > . toIdSet ( ) =
await ( ) . list . map { it . identifier } . toSet ( )
2019-12-07 02:22:37 +01:00
private val persistedInstalledEngines = setOf ( " bing " , " ecosia " )
2019-12-07 02:13:50 +01:00
2019-12-05 02:51:15 +01:00
class FakeFenixSearchEngineProvider ( context : Context ) : FenixSearchEngineProvider ( context ) {
2020-02-19 02:28:35 +01:00
override val localizationProvider : SearchLocalizationProvider
get ( ) = LocaleSearchLocalizationProvider ( )
override var baseSearchEngines : Deferred < SearchEngineList >
set ( _ ) { throw NotImplementedError ( " Setting not currently supported on this fake " ) }
2019-12-05 02:51:15 +01:00
get ( ) {
val google = mockSearchEngine ( id = " google-b-1-m " , n = " Google " )
return CompletableDeferred (
SearchEngineList (
listOf (
google ,
mockSearchEngine ( " bing " , " Bing " ) ,
mockSearchEngine ( " amazondotcom " , " Amazon.com " )
) , default = google
)
)
}
2019-12-07 02:13:50 +01:00
override val bundledSearchEngines = CompletableDeferred (
2019-12-05 02:51:15 +01:00
SearchEngineList (
listOf (
mockSearchEngine ( " ecosia " , " Ecosia " ) ,
mockSearchEngine ( " reddit " , " Reddit " ) ,
mockSearchEngine ( " startpage " , " Startpage.com " )
) , default = null
)
)
2020-04-16 17:18:35 +02:00
override var customSearchEngines : Deferred < SearchEngineList > = CompletableDeferred (
SearchEngineList (
listOf (
mockSearchEngine ( " my custom site " , " my custom site " )
) , default = null
)
)
2019-12-05 02:51:15 +01:00
2020-02-19 02:28:35 +01:00
override fun updateBaseSearchEngines ( ) { }
2020-04-16 17:18:35 +02:00
fun mockSearchEngine (
2019-12-05 02:51:15 +01:00
id : String ,
n : String = id
) : SearchEngine {
2020-05-29 02:43:40 +02:00
val engine = mockk < SearchEngine > ( )
every { engine . identifier } returns id
every { engine . name } returns n
every { engine . icon } returns mockk ( )
return engine
2019-12-05 02:51:15 +01:00
}
}