fix: 识别失效商品链接返回首页 (#111)
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
"""uiautomator2 采购演练 Adapter 测试;不连接真实手机。"""
|
||||
|
||||
from pathlib import Path
|
||||
import unittest
|
||||
|
||||
from src.pdd_device_service import PddDeviceService
|
||||
@@ -9,6 +10,18 @@ from src.pdd_u2_purchase_adapter import U2PddLivePurchaseAdapter
|
||||
|
||||
|
||||
GOODS_URL = "https://mobile.yangkeduo.com/goods.html?goods_id=753136429979"
|
||||
FIXTURES = Path(__file__).parent / "fixtures"
|
||||
|
||||
|
||||
class FakeClock:
|
||||
def __init__(self) -> None:
|
||||
self.now = 0.0
|
||||
|
||||
def monotonic(self) -> float:
|
||||
return self.now
|
||||
|
||||
def sleep(self, seconds: float) -> None:
|
||||
self.now += seconds
|
||||
|
||||
|
||||
def home_xml() -> str:
|
||||
@@ -60,6 +73,7 @@ class FakeDevice:
|
||||
self.clicks = []
|
||||
self.opened_urls = []
|
||||
self.app_wait_calls = 0
|
||||
self.has_opened = False
|
||||
|
||||
def app_current(self):
|
||||
return {"package": "com.xunmeng.pinduoduo"}
|
||||
@@ -73,8 +87,11 @@ class FakeDevice:
|
||||
|
||||
def open_url(self, url):
|
||||
self.opened_urls.append(url)
|
||||
self.has_opened = True
|
||||
|
||||
def dump_hierarchy(self):
|
||||
if not self.has_opened:
|
||||
return '<hierarchy><node package="com.xunmeng.pinduoduo" /></hierarchy>'
|
||||
if self.mode == "special":
|
||||
return self.special_xml
|
||||
return home_xml() if self.mode == "home" else panel_xml(self.quantity)
|
||||
@@ -108,6 +125,13 @@ class ColdStartDevice(FakeDevice):
|
||||
self.app_started = True
|
||||
|
||||
|
||||
class StaleGoodsDevice(FakeDevice):
|
||||
"""深链打开前后都停留在同一个旧商品页。"""
|
||||
|
||||
def dump_hierarchy(self):
|
||||
return home_xml()
|
||||
|
||||
|
||||
class U2PddPurchaseAdapterTest(unittest.TestCase):
|
||||
def _adapter(self, device, calls):
|
||||
def select_color_fn(_device, _xml, target, **_kwargs):
|
||||
@@ -207,6 +231,44 @@ class U2PddPurchaseAdapterTest(unittest.TestCase):
|
||||
|
||||
self.assertEqual(raised.exception.code, "PDD_PAGE_CAPTCHA")
|
||||
self.assertEqual(device.clicks, [])
|
||||
|
||||
def test_stable_home_reopens_once_then_stops_before_click(self):
|
||||
device = FakeDevice(
|
||||
(FIXTURES / "pdd_home_page.xml").read_text(encoding="utf-8")
|
||||
)
|
||||
clock = FakeClock()
|
||||
adapter = U2PddPurchaseAdapter(
|
||||
"USB-001",
|
||||
device_service=PddDeviceService(connector=lambda _serial: device),
|
||||
sleeper=clock.sleep,
|
||||
monotonic=clock.monotonic,
|
||||
page_timeout=10.0,
|
||||
)
|
||||
|
||||
with self.assertRaises(PddPurchaseError) as raised:
|
||||
adapter.open_goods(GOODS_URL)
|
||||
|
||||
self.assertEqual("PDD_GOODS_UNAVAILABLE", raised.exception.code)
|
||||
self.assertFalse(raised.exception.retryable)
|
||||
self.assertEqual(2, len(device.opened_urls))
|
||||
self.assertEqual([], device.clicks)
|
||||
|
||||
def test_stale_goods_page_is_not_accepted_as_target(self):
|
||||
device = StaleGoodsDevice()
|
||||
clock = FakeClock()
|
||||
adapter = U2PddPurchaseAdapter(
|
||||
"USB-001",
|
||||
device_service=PddDeviceService(connector=lambda _serial: device),
|
||||
sleeper=clock.sleep,
|
||||
monotonic=clock.monotonic,
|
||||
page_timeout=1.0,
|
||||
)
|
||||
|
||||
with self.assertRaises(PddPurchaseError) as raised:
|
||||
adapter.open_goods(GOODS_URL)
|
||||
|
||||
self.assertEqual("PDD_GOODS_IDENTITY_UNCONFIRMED", raised.exception.code)
|
||||
self.assertEqual([], device.clicks)
|
||||
adapter.close()
|
||||
|
||||
def test_invalid_non_pdd_url_is_rejected_before_connect(self):
|
||||
|
||||
Reference in New Issue
Block a user