@ -1,11 +1,7 @@
package org.mozilla.fenix.components.searchengine
package org.mozilla.fenix.components.searchengine
import android.content.Context
import android.content.Context
import android.content.SharedPreferences
import android.graphics.Bitmap
import android.graphics.Bitmap
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ExperimentalCoroutinesApi
@ -17,27 +13,22 @@ import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.mockito.Mockito.mock
import org.mozilla.fenix.TestApplication
import org.mozilla.fenix.TestApplication
import org.mozilla.fenix.components.searchengine.FenixSearchEngineProvider.Companion.INSTALLED_ENGINES_KEY
import org.mozilla.fenix.components.searchengine.FenixSearchEngineProvider.Companion.INSTALLED_ENGINES_KEY
import org.robolectric.RobolectricTestRunner
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.robolectric.annotation.Config
import java.util.UUID
@ExperimentalCoroutinesApi
@ExperimentalCoroutinesApi
@RunWith ( RobolectricTestRunner :: class )
@RunWith ( RobolectricTestRunner :: class )
@Config ( application = TestApplication :: class )
@Config ( application = TestApplication :: class )
class FenixSearchEngineProviderTest {
class FenixSearchEngineProviderTest {
// private val testContext = mockk<Context>()
private lateinit var fenixSearchEngineProvider : FenixSearchEngineProvider
private lateinit var fenixSearchEngineProvider : FenixSearchEngineProvider
@Before
@Before
fun before ( ) {
fun before ( ) {
// mockSharedPreferences(installedEngines = null)
fenixSearchEngineProvider = FakeFenixSearchEngineProvider ( testContext )
fenixSearchEngineProvider = FakeFenixSearchEngineProvider ( testContext )
}
}
@ -62,9 +53,9 @@ class FenixSearchEngineProviderTest {
@Test
@Test
fun `GIVEN sharedprefs contains installed engines WHEN installedSearchEngineIdentifiers THEN defaultEngines + customEngines ids are returned` ( ) = runBlockingTest {
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 )
val sp = testContext . getSharedPreferences ( FenixSearchEngineProvider . PREF _FILE , Context . MODE _PRIVATE )
sp . edit ( ) . putStringSet ( INSTALLED _ENGINES _KEY , STORED_INSTALLED _ENGINES ) . apply ( )
sp . edit ( ) . putStringSet ( INSTALLED _ENGINES _KEY , persistedInstalledEngines ) . apply ( )
val expectedStored = STORED_INSTALLED _ENGINES
val expectedStored = persistedInstalledEngines
val expectedCustom = fenixSearchEngineProvider . customSearchEngines . toIdSet ( )
val expectedCustom = fenixSearchEngineProvider . customSearchEngines . toIdSet ( )
val expected = expectedStored + expectedCustom
val expected = expectedStored + expectedCustom
@ -76,7 +67,7 @@ class FenixSearchEngineProviderTest {
private suspend fun Deferred < SearchEngineList > . toIdSet ( ) =
private suspend fun Deferred < SearchEngineList > . toIdSet ( ) =
await ( ) . list . map { it . identifier } . toSet ( )
await ( ) . list . map { it . identifier } . toSet ( )
private val STORED_INSTALLED _ENGINES = setOf ( " bing " , " ecosia " )
private val persistedInstalledEngines = setOf ( " bing " , " ecosia " )
class FakeFenixSearchEngineProvider ( context : Context ) : FenixSearchEngineProvider ( context ) {
class FakeFenixSearchEngineProvider ( context : Context ) : FenixSearchEngineProvider ( context ) {
override val baseSearchEngines : Deferred < SearchEngineList >
override val baseSearchEngines : Deferred < SearchEngineList >
@ -114,18 +105,13 @@ class FakeFenixSearchEngineProvider(context: Context) : FenixSearchEngineProvide
)
)
)
)
}
}
set ( _ ) = throw RuntimeException ( " Setting not currently supported on this fake " )
set ( _ ) = throw NotImplementedError ( " Setting not currently supported on this fake " )
private fun mockSearchEngine (
private fun mockSearchEngine (
id : String ,
id : String ,
n : String = id
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 {
) : SearchEngine {
// Uses Mockito because of a strange Mockk error. Feel free to rewrite
return mock ( SearchEngine :: class . java ) . apply {
return mock ( SearchEngine :: class . java ) . apply {
`when` ( identifier ) . thenReturn ( id )
`when` ( identifier ) . thenReturn ( id )
`when` ( name ) . thenReturn ( n )
`when` ( name ) . thenReturn ( n )