2019-12-05 02:51:15 +01:00
package org.mozilla.fenix.components.searchengine
import android.content.Context
2019-12-07 02:13:50 +01:00
import android.content.SharedPreferences
2019-12-05 02:51:15 +01:00
import android.graphics.Bitmap
import io.mockk.every
import io.mockk.mockk
2019-12-07 02:13:50 +01:00
import io.mockk.mockkStatic
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
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
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.mozilla.fenix.components.searchengine.FenixSearchEngineProvider.Companion.INSTALLED_ENGINES_KEY
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
2019-12-05 02:51:15 +01:00
import java.util.UUID
@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 {
2019-12-07 02:13:50 +01:00
// private val testContext = mockk<Context>()
2019-12-05 02:51:15 +01:00
private lateinit var fenixSearchEngineProvider : FenixSearchEngineProvider
@Before
fun before ( ) {
2019-12-07 02:13:50 +01:00
// mockSharedPreferences(installedEngines = null)
2019-12-05 02:51:15 +01:00
fenixSearchEngineProvider = FakeFenixSearchEngineProvider ( testContext )
}
/ *
TODO TEST :
- public API happy path
- list ordering
- deduping
- the above after adding / removing
* /
@Test
2019-12-07 02:13:50 +01:00
fun `GIVEN sharedprefs does not ontain installed engines WHEN installedSearchEngineIdentifiers THEN defaultEngines + customEngines ids are returned` ( ) = runBlockingTest {
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 )
sp . edit ( ) . putStringSet ( INSTALLED _ENGINES _KEY , STORED _INSTALLED _ENGINES ) . apply ( )
2019-12-05 02:51:15 +01:00
2019-12-07 02:13:50 +01:00
val expectedStored = STORED _INSTALLED _ENGINES
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 ( )
private val STORED _INSTALLED _ENGINES = setOf ( " bing " , " ecosia " )
2019-12-05 02:51:15 +01:00
class FakeFenixSearchEngineProvider ( context : Context ) : FenixSearchEngineProvider ( context ) {
2019-12-07 02:13:50 +01:00
override val baseSearchEngines : Deferred < SearchEngineList >
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
)
)
}
set ( _ ) = throw RuntimeException ( " Setting not currently supported on this fake " )
private fun mockSearchEngine (
id : String ,
n : String = id
// TODO this fails with `Missing calls inside every { ... } block`. Not sure why
// ) = mockk<SearchEngine> {
// every { identifier } returns id
// every { name } returns n
// every { icon } returns mockk()
// }
) : SearchEngine {
return mock ( SearchEngine :: class . java ) . apply {
`when` ( identifier ) . thenReturn ( id )
`when` ( name ) . thenReturn ( n )
`when` ( icon ) . thenReturn ( mock ( Bitmap :: class . java ) )
}
}
}