1
0
Fork 0

For #11051 - added/fixed unit tests for voice search

Allow package manager to resolve voice intent
master
Mihai Branescu 2020-08-19 11:23:57 +03:00 committed by Mugurell
parent 3e1bc524b9
commit 6a6e9bc9cd
1 changed files with 37 additions and 5 deletions

View File

@ -7,12 +7,14 @@ package org.mozilla.fenix.widget
import android.app.Activity
import android.content.ComponentName
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.speech.RecognizerIntent.ACTION_RECOGNIZE_SPEECH
import android.speech.RecognizerIntent.EXTRA_LANGUAGE_MODEL
import android.speech.RecognizerIntent.EXTRA_RESULTS
import android.speech.RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
import androidx.appcompat.app.AppCompatActivity.RESULT_OK
import androidx.test.core.app.ApplicationProvider
import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
@ -21,6 +23,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.FenixApplication
import org.mozilla.fenix.HomeActivity.Companion.OPEN_TO_BROWSER_AND_LOAD
import org.mozilla.fenix.IntentReceiverActivity
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@ -28,7 +31,7 @@ import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.PREVIOUS_INTENT
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_REQUEST_CODE
import org.robolectric.Robolectric
import org.robolectric.Shadows
import org.robolectric.Shadows.shadowOf
import org.robolectric.android.controller.ActivityController
import org.robolectric.shadows.ShadowActivity
@ -37,7 +40,7 @@ import org.robolectric.shadows.ShadowActivity
class VoiceSearchActivityTest {
private lateinit var controller: ActivityController<VoiceSearchActivity>
private lateinit var activity: Activity
private lateinit var activity: VoiceSearchActivity
private lateinit var shadow: ShadowActivity
@Before
@ -47,21 +50,36 @@ class VoiceSearchActivityTest {
controller = Robolectric.buildActivity(VoiceSearchActivity::class.java, intent)
activity = controller.get()
shadow = Shadows.shadowOf(activity)
shadow = shadowOf(activity)
}
private fun allowVoiceIntentToResolveActivity() {
val context = ApplicationProvider.getApplicationContext<FenixApplication>()
val shadowPackageManager = shadowOf(context.packageManager)
val component = ComponentName("com.test", "Test")
shadowPackageManager.addActivityIfNotPresent(component)
shadowPackageManager.addIntentFilterForActivity(
component,
IntentFilter(ACTION_RECOGNIZE_SPEECH).apply { addCategory(Intent.CATEGORY_DEFAULT) })
}
@Test
fun `process intent with speech processing set to true`() {
allowVoiceIntentToResolveActivity()
controller.create()
val intentForResult = shadow.peekNextStartedActivityForResult()
assertEquals(SPEECH_REQUEST_CODE, intentForResult.requestCode)
assertEquals(ACTION_RECOGNIZE_SPEECH, intentForResult.intent.action)
assertEquals(LANGUAGE_MODEL_FREE_FORM, intentForResult.intent.getStringExtra(EXTRA_LANGUAGE_MODEL))
assertEquals(
LANGUAGE_MODEL_FREE_FORM,
intentForResult.intent.getStringExtra(EXTRA_LANGUAGE_MODEL)
)
}
@Test
fun `process intent with speech processing set to false`() {
allowVoiceIntentToResolveActivity()
val intent = Intent()
intent.putExtra(SPEECH_PROCESSING, false)
@ -75,6 +93,7 @@ class VoiceSearchActivityTest {
@Test
fun `process null intent`() {
allowVoiceIntentToResolveActivity()
val controller = Robolectric.buildActivity(VoiceSearchActivity::class.java, null)
val activity = controller.get()
@ -85,6 +104,7 @@ class VoiceSearchActivityTest {
@Test
fun `save previous intent to instance state`() {
allowVoiceIntentToResolveActivity()
val previousIntent = Intent().apply {
putExtra(SPEECH_PROCESSING, true)
}
@ -101,6 +121,7 @@ class VoiceSearchActivityTest {
@Test
fun `process intent with speech processing in previous intent set to true`() {
allowVoiceIntentToResolveActivity()
val savedInstanceState = Bundle()
val previousIntent = Intent().apply {
putExtra(SPEECH_PROCESSING, true)
@ -115,6 +136,7 @@ class VoiceSearchActivityTest {
@Test
fun `handle speech result`() {
allowVoiceIntentToResolveActivity()
controller.create()
val resultIntent = Intent().apply {
@ -129,13 +151,17 @@ class VoiceSearchActivityTest {
val browserIntent = shadow.peekNextStartedActivity()
assertTrue(activity.isFinishing)
assertEquals(ComponentName(activity, IntentReceiverActivity::class.java), browserIntent.component)
assertEquals(
ComponentName(activity, IntentReceiverActivity::class.java),
browserIntent.component
)
assertEquals("hello world", browserIntent.getStringExtra(SPEECH_PROCESSING))
assertTrue(browserIntent.getBooleanExtra(OPEN_TO_BROWSER_AND_LOAD, false))
}
@Test
fun `handle invalid result code`() {
allowVoiceIntentToResolveActivity()
controller.create()
val resultIntent = Intent()
@ -147,4 +173,10 @@ class VoiceSearchActivityTest {
assertTrue(activity.isFinishing)
}
@Test
fun `handle no activity able to resolve voice intent`() {
controller.create()
assertTrue(activity.isFinishing)
}
}