feat(android): add device readiness checks

This commit is contained in:
QiuSW
2026-07-25 18:41:16 +08:00
parent 04fa4a0994
commit d013ac8c84
19 changed files with 884 additions and 28 deletions
@@ -0,0 +1,85 @@
package com.roubao.autopilot.readiness
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
class ReadinessModelsTest {
@Test
fun `risk control takes precedence over verification and login`() {
val result = LoginBlockerDetector.detect(
listOf("手机号登录", "请输入验证码", "账号存在风险,请完成安全验证")
)
assertEquals(LoginBlocker.RISK_CONTROL, result)
}
@Test
fun `verification is distinct from login`() {
val result = LoginBlockerDetector.detect(listOf("登录后继续", "获取验证码"))
assertEquals(LoginBlocker.VERIFICATION_REQUIRED, result)
}
@Test
fun `normal page has no detected blocker`() {
val result = LoginBlockerDetector.detect(listOf("百亿补贴", "搜索商品"))
assertEquals(LoginBlocker.NONE, result)
}
@Test
fun `probe requires installed app and connected accessibility`() {
val blocked = snapshot(
pinduoduoInstalled = false,
accessibilityEnabled = false,
accessibilityConnected = false
)
assertFalse(blocked.canStartProbe)
assertEquals(
listOf(
ReadinessBlocker.PINDUODUO_NOT_INSTALLED,
ReadinessBlocker.ACCESSIBILITY_DISABLED
),
blocked.blockers
)
val ready = snapshot(
pinduoduoInstalled = true,
accessibilityEnabled = true,
accessibilityConnected = true
)
assertTrue(ready.canStartProbe)
}
@Test
fun `detected login blocker prevents probe start`() {
val snapshot = snapshot(
pinduoduoInstalled = true,
accessibilityEnabled = true,
accessibilityConnected = true
).copy(loginBlocker = LoginBlocker.LOGIN_REQUIRED)
assertFalse(snapshot.canStartProbe)
assertEquals(listOf(ReadinessBlocker.LOGIN_REQUIRED), snapshot.blockers)
}
private fun snapshot(
pinduoduoInstalled: Boolean,
accessibilityEnabled: Boolean,
accessibilityConnected: Boolean
) = DeviceReadinessSnapshot(
manufacturer = "test",
model = "device",
androidVersion = "16",
androidApi = 36,
buyerApp = InstalledAppVersion(true, "1.4.2", 7),
pinduoduo = InstalledAppVersion(pinduoduoInstalled, "8.17.0", 81700),
accessibilityEnabled = accessibilityEnabled,
accessibilityConnected = accessibilityConnected,
foregroundPackage = null,
loginBlocker = LoginBlocker.UNKNOWN,
pinduoduoObservedAtMillis = null
)
}