2019-12-05 02:51:15 +01:00
package org.mozilla.fenix.components.searchengine
import android.content.Context
import android.graphics.Bitmap
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
2019-12-05 02:51:15 +01:00
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
2019-12-07 02:13:50 +01:00
import org.mozilla.fenix.TestApplication
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
2019-12-05 02:51:15 +01:00
@ExperimentalCoroutinesApi
2019-12-07 02:13:50 +01:00
@RunWith ( RobolectricTestRunner :: class )
@Config ( application = TestApplication :: class )
2019-12-05 02:51:15 +01:00
class FenixSearchEngineProviderTest {
private lateinit var fenixSearchEngineProvider : FenixSearchEngineProvider
@Before
fun before ( ) {
fenixSearchEngineProvider = FakeFenixSearchEngineProvider ( testContext )
}
/ *
TODO TEST :
- public API happy path
- list ordering
- deduping
- the above after adding / removing
* /
@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 {
val sp = testContext . getSharedPreferences ( FenixSearchEngineProvider . PREF _FILE , 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
)
)
2019-12-07 02:13:50 +01:00
override var customSearchEngines : Deferred < SearchEngineList >
2019-12-05 02:51:15 +01:00
get ( ) {
return CompletableDeferred (
SearchEngineList (
listOf (
mockSearchEngine ( " my custom site " , " my custom site " )
) , default = null
)
)
}
2019-12-07 02:22:37 +01:00
set ( _ ) = throw NotImplementedError ( " Setting not currently supported on this fake " )
2019-12-05 02:51:15 +01:00
2020-02-19 02:28:35 +01:00
override fun updateBaseSearchEngines ( ) { }
2019-12-05 02:51:15 +01:00
private fun mockSearchEngine (
id : String ,
n : String = id
) : SearchEngine {
2019-12-07 02:22:37 +01:00
// Uses Mockito because of a strange Mockk error. Feel free to rewrite
2019-12-05 02:51:15 +01:00
return mock ( SearchEngine :: class . java ) . apply {
`when` ( identifier ) . thenReturn ( id )
`when` ( name ) . thenReturn ( n )
`when` ( icon ) . thenReturn ( mock ( Bitmap :: class . java ) )
}
}
}