Merge "Add tests for Education" into main

This commit is contained in:
Treehugger Robot
2023-10-17 08:36:01 +00:00
committed by Android (Google) Code Review
3 changed files with 279 additions and 34 deletions

View File

@@ -0,0 +1,255 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.fingerprint2.enrollment.viewmodel
import android.content.Context
import android.content.res.Configuration
import android.view.accessibility.AccessibilityManager
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.test.core.app.ApplicationProvider
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NextStepViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.setMain
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoJUnitRunner
/** consistent with [ScreenSizeFoldProvider.INNER_SCREEN_SMALLEST_SCREEN_WIDTH_THRESHOLD_DP] */
private const val INNER_SCREEN_SMALLEST_SCREEN_WIDTH_THRESHOLD_DP = 600
@RunWith(MockitoJUnitRunner::class)
class FingerprintEnrollFindSensorViewModelV2Test {
@JvmField @Rule var rule = MockitoJUnit.rule()
@get:Rule val instantTaskRule = InstantTaskExecutorRule()
private var backgroundDispatcher = StandardTestDispatcher()
private var testScope = TestScope(backgroundDispatcher)
private lateinit var fakeFingerprintManagerInteractor: FakeFingerprintManagerInteractor
private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
private lateinit var enrollViewModel: FingerprintEnrollViewModel
private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
private lateinit var accessibilityViewModel: AccessibilityViewModel
private lateinit var foldStateViewModel: FoldStateViewModel
private lateinit var orientationStateViewModel: OrientationStateViewModel
private lateinit var underTest: FingerprintEnrollFindSensorViewModel
private val context: Context = ApplicationProvider.getApplicationContext()
private val accessibilityManager: AccessibilityManager =
context.getSystemService(AccessibilityManager::class.java)!!
@Before
fun setup() {
backgroundDispatcher = StandardTestDispatcher()
testScope = TestScope(backgroundDispatcher)
Dispatchers.setMain(backgroundDispatcher)
fakeFingerprintManagerInteractor = FakeFingerprintManagerInteractor()
gatekeeperViewModel =
FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
null,
fakeFingerprintManagerInteractor
)
.create(FingerprintGatekeeperViewModel::class.java)
navigationViewModel =
FingerprintEnrollNavigationViewModel.FingerprintEnrollNavigationViewModelFactory(
backgroundDispatcher,
fakeFingerprintManagerInteractor,
gatekeeperViewModel,
canSkipConfirm = true,
)
.create(FingerprintEnrollNavigationViewModel::class.java)
enrollViewModel =
FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
fakeFingerprintManagerInteractor,
backgroundDispatcher
)
.create(FingerprintEnrollViewModel::class.java)
accessibilityViewModel =
AccessibilityViewModel.AccessibilityViewModelFactory(accessibilityManager)
.create(AccessibilityViewModel::class.java)
foldStateViewModel =
FoldStateViewModel.FoldStateViewModelFactory(context).create(FoldStateViewModel::class.java)
orientationStateViewModel =
OrientationStateViewModel.OrientationViewModelFactory(context)
.create(OrientationStateViewModel::class.java)
underTest =
FingerprintEnrollFindSensorViewModel.FingerprintEnrollFindSensorViewModelFactory(
navigationViewModel,
enrollViewModel,
gatekeeperViewModel,
accessibilityViewModel,
foldStateViewModel,
orientationStateViewModel
)
.create(FingerprintEnrollFindSensorViewModel::class.java)
// Navigate to Education page
navigationViewModel.nextStep()
}
@After
fun tearDown() {
Dispatchers.resetMain()
}
// TODO(b/305094585): test enroll() logic
@Test
fun currentStepIsEducation() =
testScope.runTest {
var step: NextStepViewModel? = null
val job = launch {
navigationViewModel.navigationViewModel.collectLatest { step = it.currStep }
}
advanceUntilIdle()
assertThat(step).isEqualTo(Education)
job.cancel()
}
@Test
fun udfpsLottieInfo() =
testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor(
0 /* sensorId */,
SensorStrength.STRONG,
5,
FingerprintSensorType.UDFPS_OPTICAL
)
var udfpsLottieInfo: Boolean? = null
val job = launch { underTest.udfpsLottieInfo.collect { udfpsLottieInfo = it } }
advanceUntilIdle()
assertThat(udfpsLottieInfo).isNotNull()
job.cancel()
}
@Test
fun sfpsLottieInfoWhenFolded() =
testScope.runTest {
var isFolded = false
var rotation: Int = -1
val job = launch {
underTest.sfpsLottieInfo.collect {
isFolded = it.first
rotation = it.second
}
}
val config = createConfiguration(isFolded = true)
foldStateViewModel.onConfigurationChange(config)
advanceUntilIdle()
assertThat(isFolded).isTrue()
assertThat(rotation).isEqualTo(context.display!!.rotation)
job.cancel()
}
@Test
fun sfpsLottieInfoWhenUnFolded() =
testScope.runTest {
var isFolded = false
var rotation: Int = -1
val job = launch {
underTest.sfpsLottieInfo.collect {
isFolded = it.first
rotation = it.second
}
}
val config = createConfiguration(isFolded = false)
foldStateViewModel.onConfigurationChange(config)
advanceUntilIdle()
assertThat(isFolded).isFalse()
assertThat(rotation).isEqualTo(context.display!!.rotation)
job.cancel()
}
@Test
fun rfpsAnimation() =
testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor(0 /* sensorId */, SensorStrength.STRONG, 5, FingerprintSensorType.REAR)
var showRfpsAnimation: Boolean? = null
val job = launch { underTest.showRfpsAnimation.collect { showRfpsAnimation = it } }
advanceUntilIdle()
assertThat(showRfpsAnimation).isTrue()
job.cancel()
}
@Test
fun showPrimaryButton_ifUdfps() =
testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor(
0 /* sensorId */,
SensorStrength.STRONG,
5,
FingerprintSensorType.UDFPS_OPTICAL
)
var showPrimaryButton: Boolean? = null
val job = launch { underTest.showPrimaryButton.collect { showPrimaryButton = it } }
advanceUntilIdle()
assertThat(showPrimaryButton).isTrue()
job.cancel()
}
@Test
fun doesNotShowPrimaryButton_ifNonUdfps() =
testScope.runTest {
var showPrimaryButton: Boolean? = null
val job = launch { underTest.showPrimaryButton.collect { showPrimaryButton = it } }
advanceUntilIdle()
assertThat(showPrimaryButton).isNull()
job.cancel()
}
private fun createConfiguration(isFolded: Boolean): Configuration {
val config = Configuration()
config.smallestScreenWidthDp =
if (isFolded) INNER_SCREEN_SMALLEST_SCREEN_WIDTH_THRESHOLD_DP - 1
else INNER_SCREEN_SMALLEST_SCREEN_WIDTH_THRESHOLD_DP + 1
return config
}
}