Add Testing for main activity
Fix: 307479881
Test: atest HealthConnectControllerUITests:MainActivityTest
Change-Id: I8847f5ee8487f6820178b7f0e13dd3611e593100
diff --git a/apk/src/com/android/healthconnect/controller/MainActivity.kt b/apk/src/com/android/healthconnect/controller/MainActivity.kt
index 0032ab3..4b13be6 100644
--- a/apk/src/com/android/healthconnect/controller/MainActivity.kt
+++ b/apk/src/com/android/healthconnect/controller/MainActivity.kt
@@ -51,7 +51,7 @@
openOnboardingActivity.launch(1)
}
- val currentMigrationState = runBlocking { migrationViewModel.getCurrentMigrationUiState() }
+ val currentMigrationState = migrationViewModel.getCurrentMigrationUiState()
if (maybeRedirectToMigrationActivity(this, currentMigrationState)) {
return
@@ -66,7 +66,7 @@
override fun onResume() {
super.onResume()
- val currentMigrationState = runBlocking { migrationViewModel.getCurrentMigrationUiState() }
+ val currentMigrationState = migrationViewModel.getCurrentMigrationUiState()
if (maybeRedirectToMigrationActivity(this, currentMigrationState)) {
return
diff --git a/apk/src/com/android/healthconnect/controller/data/DataManagementActivity.kt b/apk/src/com/android/healthconnect/controller/data/DataManagementActivity.kt
index 20f19c0..6031655 100644
--- a/apk/src/com/android/healthconnect/controller/data/DataManagementActivity.kt
+++ b/apk/src/com/android/healthconnect/controller/data/DataManagementActivity.kt
@@ -60,7 +60,7 @@
openOnboardingActivity.launch(1)
}
- val currentMigrationState = runBlocking { migrationViewModel.getCurrentMigrationUiState() }
+ val currentMigrationState = migrationViewModel.getCurrentMigrationUiState()
if (maybeRedirectToMigrationActivity(this, currentMigrationState)) {
return
@@ -98,9 +98,9 @@
override fun onResume() {
super.onResume()
- val currentMigrationState = runBlocking { migrationViewModel.getCurrentMigrationUiState() }
+ val currentMigrationState = migrationViewModel.getCurrentMigrationUiState()
- if (MigrationActivity.maybeRedirectToMigrationActivity(this, currentMigrationState)) {
+ if (maybeRedirectToMigrationActivity(this, currentMigrationState)) {
return
}
}
diff --git a/apk/src/com/android/healthconnect/controller/migration/MigrationViewModel.kt b/apk/src/com/android/healthconnect/controller/migration/MigrationViewModel.kt
index 6388512..0d10032 100644
--- a/apk/src/com/android/healthconnect/controller/migration/MigrationViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/migration/MigrationViewModel.kt
@@ -24,6 +24,7 @@
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
@HiltViewModel
class MigrationViewModel
@@ -40,15 +41,15 @@
loadHealthConnectMigrationUiState()
}
- fun loadHealthConnectMigrationUiState() {
+ private fun loadHealthConnectMigrationUiState() {
viewModelScope.launch {
_migrationState.postValue(
MigrationFragmentState.WithData(loadMigrationStateUseCase.invoke()))
}
}
- suspend fun getCurrentMigrationUiState(): MigrationState {
- return loadMigrationStateUseCase.invoke()
+ fun getCurrentMigrationUiState(): MigrationState {
+ return runBlocking { loadMigrationStateUseCase.invoke() }
}
sealed class MigrationFragmentState {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt
new file mode 100644
index 0000000..2e5c434
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt
@@ -0,0 +1,106 @@
+package com.android.healthconnect.controller.tests
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import androidx.lifecycle.MutableLiveData
+import androidx.test.core.app.ActivityScenario.launchActivityForResult
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.scrollTo
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.healthconnect.controller.MainActivity
+import com.android.healthconnect.controller.migration.MigrationViewModel
+import com.android.healthconnect.controller.migration.MigrationViewModel.MigrationFragmentState.WithData
+import com.android.healthconnect.controller.migration.api.MigrationState
+import com.android.healthconnect.controller.tests.utils.showOnboarding
+import com.android.healthconnect.controller.tests.utils.whenever
+import dagger.hilt.android.testing.BindValue
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runTest
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.Mockito
+
+@HiltAndroidTest
+@OptIn(ExperimentalCoroutinesApi::class)
+class MainActivityTest {
+
+ @get:Rule val hiltRule = HiltAndroidRule(this)
+
+ @BindValue val viewModel: MigrationViewModel = Mockito.mock(MigrationViewModel::class.java)
+
+ private lateinit var context: Context
+
+ @Before
+ fun setup() {
+ hiltRule.inject()
+ context = InstrumentationRegistry.getInstrumentation().context
+
+ showOnboarding(context, show = false)
+ }
+
+ @Test
+ fun homeSettingsIntent_onboardingDone_launchesMainActivity() = runTest {
+ whenever(viewModel.getCurrentMigrationUiState()).then { MigrationState.COMPLETE_IDLE }
+ whenever(viewModel.migrationState).then {
+ MutableLiveData(WithData(MigrationState.COMPLETE_IDLE))
+ }
+
+ val startActivityIntent =
+ Intent.makeMainActivity(ComponentName(context, MainActivity::class.java))
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+ launchActivityForResult<MainActivity>(startActivityIntent)
+
+ onView(withText("Recent access")).check(matches(isDisplayed()))
+ onView(withText("Permissions and data")).check(matches(isDisplayed()))
+ }
+
+ @Test
+ fun homeSettingsIntent_onboardingNotDone_redirectToOnboarding() = runTest {
+ showOnboarding(context, true)
+ whenever(viewModel.getCurrentMigrationUiState()).then { MigrationState.COMPLETE_IDLE }
+ whenever(viewModel.migrationState).then {
+ MutableLiveData(WithData(MigrationState.COMPLETE_IDLE))
+ }
+
+ val startActivityIntent =
+ Intent.makeMainActivity(ComponentName(context, MainActivity::class.java))
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+ launchActivityForResult<MainActivity>(startActivityIntent)
+
+ onView(withText("Share data with your apps"))
+ .perform(scrollTo())
+ .check(matches(isDisplayed()))
+ }
+
+ @Test
+ fun homeSettingsIntent_migrationInProgress_redirectToMigrationScreen() = runTest {
+ showOnboarding(context, false)
+ whenever(viewModel.getCurrentMigrationUiState()).then { MigrationState.IN_PROGRESS }
+ whenever(viewModel.migrationState).then {
+ MutableLiveData(WithData(MigrationState.IN_PROGRESS))
+ }
+
+ val startActivityIntent =
+ Intent.makeMainActivity(ComponentName(context, MainActivity::class.java))
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+ launchActivityForResult<MainActivity>(startActivityIntent)
+
+ onView(withText("Integration in progress")).check(matches(isDisplayed()))
+ }
+
+ @After
+ fun tearDown() {
+ showOnboarding(context, false)
+ }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/NavigationTestUtils.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/NavigationTestUtils.kt
new file mode 100644
index 0000000..f357996
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utils/NavigationTestUtils.kt
@@ -0,0 +1,12 @@
+package com.android.healthconnect.controller.tests.utils
+
+import android.content.Context
+import com.android.healthconnect.controller.onboarding.OnboardingActivity
+
+fun showOnboarding(context: Context, show: Boolean) {
+ val sharedPreference =
+ context.getSharedPreferences(OnboardingActivity.USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+ val editor = sharedPreference.edit()
+ editor.putBoolean(OnboardingActivity.ONBOARDING_SHOWN_PREF_KEY, !show)
+ editor.apply()
+}