fix: 兼容多微信选择器核单返回 (#261)
This commit is contained in:
@@ -119,10 +119,26 @@ def xml_package_page(package: str, text: str = "") -> str:
|
||||
)
|
||||
|
||||
|
||||
def xml_android_wechat_chooser() -> str:
|
||||
return (
|
||||
'<hierarchy>'
|
||||
'<node package="android" text="选择要使用的应用" />'
|
||||
'<node package="android" text="微信" />'
|
||||
'<node package="android" text="微信分身" />'
|
||||
'</hierarchy>'
|
||||
)
|
||||
|
||||
|
||||
class TransitionDevice(DetailDevice):
|
||||
def __init__(self, pages, current_package="com.tencent.mm"):
|
||||
def __init__(
|
||||
self,
|
||||
pages,
|
||||
current_package="com.tencent.mm",
|
||||
current_activity="",
|
||||
):
|
||||
super().__init__(pages)
|
||||
self.current_package = current_package
|
||||
self.current_activity = current_activity
|
||||
self.dump_calls = 0
|
||||
self.back_calls = 0
|
||||
|
||||
@@ -133,7 +149,10 @@ class TransitionDevice(DetailDevice):
|
||||
|
||||
def app_current(self):
|
||||
self.app_current_calls += 1
|
||||
return {"package": self.current_package}
|
||||
return {
|
||||
"package": self.current_package,
|
||||
"activity": self.current_activity,
|
||||
}
|
||||
|
||||
def press(self, key):
|
||||
if key == "back":
|
||||
@@ -304,6 +323,105 @@ class PddU2PurchaseReconcileAdapterTest(unittest.TestCase):
|
||||
self.assertEqual(device.app_current_calls, 0)
|
||||
self.assertLess(clock.now, 30)
|
||||
|
||||
def test_android_wechat_chooser_is_closed_once_before_reading_detail(self):
|
||||
device = TransitionDevice(
|
||||
[
|
||||
xml_android_wechat_chooser(),
|
||||
xml_package_page("com.xunmeng.pinduoduo", "页面加载中"),
|
||||
xml_detail("待付款"),
|
||||
],
|
||||
current_package="android",
|
||||
current_activity="com.android.internal.app.ChooserActivity",
|
||||
)
|
||||
clock = FakeClock()
|
||||
adapter = U2PddPurchaseReconcileAdapter(
|
||||
"serial",
|
||||
device_service=FakeDeviceService(device),
|
||||
settle_seconds=1,
|
||||
transition_timeout_seconds=30,
|
||||
monotonic=clock.monotonic,
|
||||
sleep=clock.sleep,
|
||||
)
|
||||
|
||||
adapter._open_unpaid_orders(device)
|
||||
|
||||
self.assertEqual(device.back_calls, 1)
|
||||
self.assertEqual(device.app_start_calls, 0)
|
||||
self.assertEqual(device.app_current_calls, 1)
|
||||
|
||||
def test_android_wechat_chooser_stops_when_one_back_does_not_close_it(self):
|
||||
device = TransitionDevice(
|
||||
[xml_android_wechat_chooser(), xml_android_wechat_chooser()],
|
||||
current_package="android",
|
||||
current_activity="com.android.internal.app.ResolverActivity",
|
||||
)
|
||||
clock = FakeClock()
|
||||
adapter = U2PddPurchaseReconcileAdapter(
|
||||
"serial",
|
||||
device_service=FakeDeviceService(device),
|
||||
settle_seconds=1,
|
||||
transition_timeout_seconds=30,
|
||||
monotonic=clock.monotonic,
|
||||
sleep=clock.sleep,
|
||||
)
|
||||
|
||||
with self.assertRaises(PddPurchaseReconcileError) as captured:
|
||||
adapter._open_unpaid_orders(device)
|
||||
|
||||
self.assertEqual(
|
||||
captured.exception.code, "RECONCILE_ANDROID_CHOOSER_STUCK"
|
||||
)
|
||||
self.assertEqual(device.back_calls, 1)
|
||||
self.assertEqual(device.app_start_calls, 0)
|
||||
|
||||
def test_android_wechat_chooser_with_unknown_activity_stops_safely(self):
|
||||
device = TransitionDevice(
|
||||
[xml_android_wechat_chooser()],
|
||||
current_package="android",
|
||||
current_activity="com.example.UnknownSystemActivity",
|
||||
)
|
||||
clock = FakeClock()
|
||||
adapter = U2PddPurchaseReconcileAdapter(
|
||||
"serial",
|
||||
device_service=FakeDeviceService(device),
|
||||
settle_seconds=1,
|
||||
transition_timeout_seconds=30,
|
||||
monotonic=clock.monotonic,
|
||||
sleep=clock.sleep,
|
||||
)
|
||||
|
||||
with self.assertRaises(PddPurchaseReconcileError) as captured:
|
||||
adapter._open_unpaid_orders(device)
|
||||
|
||||
self.assertEqual(
|
||||
captured.exception.code,
|
||||
"RECONCILE_ANDROID_CHOOSER_UNRECOGNIZED",
|
||||
)
|
||||
self.assertEqual(device.back_calls, 0)
|
||||
self.assertEqual(device.app_start_calls, 0)
|
||||
|
||||
def test_unknown_android_page_is_not_treated_as_wechat_chooser(self):
|
||||
unknown_system_page = xml_package_page("android", "系统设置")
|
||||
device = TransitionDevice(
|
||||
[unknown_system_page, xml_detail("待付款")],
|
||||
current_package="android",
|
||||
current_activity="com.android.settings.Settings",
|
||||
)
|
||||
clock = FakeClock()
|
||||
adapter = U2PddPurchaseReconcileAdapter(
|
||||
"serial",
|
||||
device_service=FakeDeviceService(device),
|
||||
settle_seconds=1,
|
||||
transition_timeout_seconds=30,
|
||||
monotonic=clock.monotonic,
|
||||
sleep=clock.sleep,
|
||||
)
|
||||
|
||||
adapter._open_unpaid_orders(device)
|
||||
|
||||
self.assertEqual(device.back_calls, 0)
|
||||
self.assertEqual(device.app_start_calls, 1)
|
||||
|
||||
def test_payment_back_is_pressed_at_most_once_while_page_changes(self):
|
||||
payment_page = xml_package_page(
|
||||
"com.xunmeng.pinduoduo", "立即支付"
|
||||
|
||||
Reference in New Issue
Block a user