fix(client): stop unsafe T-106 confirmation path

This commit is contained in:
QiuSW
2026-08-06 10:44:00 +08:00
parent b0b71d5a29
commit e93e2e8202
5 changed files with 46 additions and 45 deletions
@@ -1,4 +1,4 @@
"""采集 T-106 人工准备的确认页四态证据;不执行页面操作。"""
"""采集 T-106 人工准备的提交前来源态证据;不执行页面操作。"""
from __future__ import annotations
@@ -23,17 +23,14 @@ from cmbuyer_client.pdd.order_confirm_spike import (
def parse_arguments(argv: list[str] | None = None) -> argparse.Namespace:
parser = argparse.ArgumentParser(description="采集 T-106 人工准备的确认页四态本机证据。")
parser = argparse.ArgumentParser(description="采集 T-106 人工准备的提交前来源态本机证据。")
parser.add_argument("--serial", required=True, help="ADB device serial;禁止自动选择。")
parser.add_argument("--goods-id", required=True, help="T-106 已批准的目标商品标识。")
parser.add_argument(
"--state",
required=True,
choices=DECLARED_STATES,
help=(
"人工声明状态:Gate2 后导航来源、确认页 Gate3、最终控件可见、"
"人工一次返回后的安全页。"
),
help="仅允许已取证的 Gate2 后提交前来源态;未证实的后续状态全部禁用。",
)
parser.add_argument("--output-dir", required=True, type=Path, help="全新本机证据目录;不得覆盖。")
parser.add_argument("--timeout", type=float, default=10.0, help="ADB 与只读设备 RPC 超时(秒)。")
@@ -97,13 +94,13 @@ def main(argv: list[str] | None = None) -> int:
)
except (DeviceConnectionError, OrderConfirmEvidenceError):
# 第三方异常可能带设备、页面正文或本机目录,命令行只输出固定摘要。
print("确认页四态只读取证失败:已停止,未发布本机证据目录。", file=sys.stderr)
print("T-106 只读取证失败:已停止,未发布本机证据目录。", file=sys.stderr)
return 1
except OSError:
print("确认页四态只读取证失败:无法发布本机证据目录。", file=sys.stderr)
print("T-106 只读取证失败:无法发布本机证据目录。", file=sys.stderr)
return 1
print("确认页四态只读取证完成。")
print("T-106 提交前来源态只读取证完成。")
print("人工复核:请在指定目录检查截图、XML、应用摘要和 manifest。")
return 0
@@ -1,4 +1,4 @@
"""T-106 确认页四态的纯只读取证;页面对应性只由人工确认。"""
"""T-106 提交前来源态的纯只读取证;页面对应性只由人工确认。"""
from __future__ import annotations
@@ -36,16 +36,11 @@ EXPECTED_GOODS_ID = "937122477375"
EXPECTED_DEVICE_MODEL = "PKG110"
EXPECTED_ANDROID_VERSION = "16"
EXPECTED_SCREEN_SIZE = (1080, 2376)
DECLARED_STATES = (
"gate2-navigation-source",
"confirm-gate3",
"submit-control-visible",
"returned-safe-page",
)
DECLARED_STATES = ("gate2-navigation-source",)
class OrderConfirmEvidenceError(RuntimeError):
"""T-106 四态证据未形成完整原子产物。"""
"""T-106 只读证据未形成完整原子产物。"""
class OrderConfirmEvidenceTimeoutError(OrderConfirmEvidenceError):
@@ -213,13 +208,13 @@ class OrderConfirmEvidenceCapturer:
raise
except (AdbTimeout, HTTPTimeoutError, TimeoutError) as error:
_clean_staging(staging)
raise OrderConfirmEvidenceTimeoutError("确认页四态只读取证超时,未发布证据。") from error
raise OrderConfirmEvidenceTimeoutError("T-106 只读取证超时,未发布证据。") from error
except (OSError, UnidentifiedImageError, ValueError) as error:
_clean_staging(staging)
raise OrderConfirmEvidenceError("确认页四态证据无法原子发布,未发布证据。") from error
raise OrderConfirmEvidenceError("T-106 证据无法原子发布,未发布证据。") from error
except Exception as error:
_clean_staging(staging)
raise OrderConfirmEvidenceError("确认页四态只读取证未完成,未发布证据。") from error
raise OrderConfirmEvidenceError("T-106 只读取证未完成,未发布证据。") from error
return OrderConfirmEvidenceResult(
output_directory=target,
+9 -3
View File
@@ -1,4 +1,4 @@
"""T-106 确认页四态纯只读取证的离线测试。"""
"""T-106 提交前来源态纯只读取证的离线测试。"""
from __future__ import annotations
@@ -229,8 +229,8 @@ class OrderConfirmEvidenceTests(unittest.TestCase):
timeout_seconds=2,
)
def test_all_four_human_states_publish_only_raw_read_evidence(self) -> None:
self.assertEqual(len(DECLARED_STATES), 4)
def test_only_approved_human_state_publishes_raw_read_evidence(self) -> None:
self.assertEqual(DECLARED_STATES, ("gate2-navigation-source",))
for state in DECLARED_STATES:
with self.subTest(state=state), TemporaryDirectory() as temporary:
adb = FakeAdbClient()
@@ -276,6 +276,9 @@ class OrderConfirmEvidenceTests(unittest.TestCase):
("", EXPECTED_GOODS_ID, DECLARED_STATES[0]),
(f" {SERIAL}", EXPECTED_GOODS_ID, DECLARED_STATES[0]),
(SERIAL, "958756616606", DECLARED_STATES[0]),
(SERIAL, EXPECTED_GOODS_ID, "confirm-gate3"),
(SERIAL, EXPECTED_GOODS_ID, "submit-control-visible"),
(SERIAL, EXPECTED_GOODS_ID, "returned-safe-page"),
(SERIAL, EXPECTED_GOODS_ID, "unknown"),
)
for serial, goods_id, state in scenarios:
@@ -465,6 +468,9 @@ class OrderConfirmCliAndStaticBoundaryTests(unittest.TestCase):
_namespace(serial=""),
_namespace(serial=f" {SERIAL}"),
_namespace(goods_id="958756616606"),
_namespace(state="confirm-gate3"),
_namespace(state="submit-control-visible"),
_namespace(state="returned-safe-page"),
_namespace(state="unknown"),
_namespace(output_dir=Path("")),
_namespace(timeout=0),