Merge patrol delete changes into master

This commit is contained in:
koko
2026-04-30 21:40:35 +08:00
parent 6ea3a960e7
commit 3616d64735
2 changed files with 309 additions and 127 deletions

View File

@@ -105,7 +105,7 @@ def test_patrol_delete_task_post_result_retries_business_failure(monkeypatch):
assert len(calls) == 3
def test_normalize_country_sections_omits_status_fields_for_complete_draft_rows():
def test_normalize_country_sections_keeps_only_status_and_quantity_for_complete_draft_rows():
rows = PatrolDeleteTask._normalize_country_sections_for_result(
[
{
@@ -132,7 +132,7 @@ def test_normalize_country_sections_omits_status_fields_for_complete_draft_rows(
{
"country": "意大利",
"rows": [
{"quantity": "12", "deleteQuantity": "3"},
{"status": "商品信息草稿", "quantity": "12"},
{"status": "缺少的信息", "quantity": "1", "deleteQuantity": "1", "processStatus": "已完成"},
],
}
@@ -143,15 +143,15 @@ def test_replace_complete_draft_rows_uses_quick_view_rows():
country_section = {
"country": "西班牙",
"rows": [
{"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"},
{"status": "全部", "quantity": "6230", "deleteQuantity": "无需删除", "processStatus": "无可删商品"},
{"status": "商品信息草稿", "quantity": "", "deleteQuantity": "0", "processStatus": ""},
],
}
complete_draft_section = {
"country": "西班牙",
"rows": [
{"type": "completeDraft", "quantity": "1", "deleteQuantity": "1"},
{"type": "completeDraft", "quantity": "0", "deleteQuantity": "0"},
{"type": "completeDraft", "status": "未提交的草稿", "quantity": "1"},
{"type": "completeDraft", "status": "已提交:提供缺少的信息", "quantity": "0"},
],
}
@@ -160,18 +160,18 @@ def test_replace_complete_draft_rows_uses_quick_view_rows():
assert merged == {
"country": "西班牙",
"rows": [
{"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"},
{"type": "completeDraft", "quantity": "1", "deleteQuantity": "1"},
{"type": "completeDraft", "quantity": "0", "deleteQuantity": "0"},
{"status": "全部", "quantity": "6230", "deleteQuantity": "无需删除", "processStatus": "无可删商品"},
{"type": "completeDraft", "status": "未提交的草稿", "quantity": "1"},
{"type": "completeDraft", "status": "已提交:提供缺少的信息", "quantity": "0"},
],
}
assert PatrolDeleteTask._normalize_country_sections_for_result([merged]) == [
{
"country": "西班牙",
"rows": [
{"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"},
{"quantity": "1", "deleteQuantity": "1"},
{"quantity": "0", "deleteQuantity": "0"},
{"status": "全部", "quantity": "6230", "deleteQuantity": "无需删除", "processStatus": "无可删商品"},
{"status": "未提交的草稿", "quantity": "1"},
{"status": "已提交:提供缺少的信息", "quantity": "0"},
],
}
]
@@ -356,15 +356,15 @@ def test_delete_all_listings_from_non_whitelisted_statuses_deletes_each_row_in_s
]
state = {"index": 0, "selected": [], "deleted": 0}
def fake_read_listing_status_rows_for_delete(shop_name, country):
def fake_read_listing_status_rows_for_delete(shop_name, country, **kwargs):
current = status_rows[min(state["index"], len(status_rows) - 1)]
state["index"] += 1
return current
def fake_select_listing_status(status):
def fake_select_listing_status(status, **kwargs):
state["selected"].append(status)
def fake_delete_selected_filtered_inventory_rows(status):
def fake_delete_selected_filtered_inventory_rows(status, **kwargs):
state["deleted"] += 2
return {
"deletedCount": 2,
@@ -656,10 +656,62 @@ def test_is_delete_success_message_accepts_both_copy_variants():
assert InventoryManage._is_delete_success_message("所做更改需要 15 分钟才会显示在商品详情页面上。 1 个商品已删除。")
def test_is_delete_success_message_accepts_deleted_count_without_delay_notice():
assert InventoryManage._is_delete_success_message("1 个商品已删除。")
assert InventoryManage._is_delete_success_message("已删除 2 个商品。")
assert not InventoryManage._is_delete_success_message("0 个商品已删除。")
def test_is_delete_success_message_accepts_deleted_without_exact_count():
assert InventoryManage._is_delete_success_message("一个或多个商品已删除。")
assert InventoryManage._is_delete_success_message("一个或多个商品已经删除")
assert InventoryManage._extract_delete_success_count("一个或多个商品已删除。") == 0
def test_extract_delete_success_count_accepts_success_message():
assert InventoryManage._extract_delete_success_count("所做更改需要 15 分钟才会显示在商品详情页面上。 3 个商品已删除。") == 3
def test_short_error_simplifies_delete_success_message_timeout():
message = (
"状态[详情页面已删除]删除后未读取到成功提示: "
"['所做更改需要 15 分钟才会显示在商品详情页面上。 一个或多个商品已删除', "
"'莆田市城厢区从奇偶贸易...']"
)
assert PatrolDeleteTask._short_error(message) == "删除后未读取到成功提示"
def test_short_error_simplifies_common_patrol_delete_failures():
examples = {
"检测到任务 12 的暂停请求,停止处理": "任务已中断",
"用户取消任务": "任务已中断",
"与页面的连接已断开: target frame detached": "浏览器连接中断",
"切换国家 德国 失败: element not found": "切换国家失败",
"未找到可用商品状态下拉框: {'ok': False, 'text': '...'}": "未找到商品状态下拉框",
"商品状态下拉框已打开但未读取到选项: {'ok': True}": "未读取到商品状态下拉选项",
"未找到商品状态选项[详情页面已删除]: {'rows': ['...']}": "未找到商品状态选项",
"状态[详情页面已删除]全选商品失败: {'ok': False, 'reason': '...'}": "全选商品失败",
"状态[详情页面已删除]点击批量删除失败: {'menuOpened': False, 'html': '...'}": "点击批量删除失败",
"状态[详情页面已删除]未出现删除确认弹窗": "未出现删除确认弹窗",
"当前页面对象不支持执行 JavaScript无法探测 Shadow DOM": "当前页面无法执行 JavaScript",
}
for message, expected in examples.items():
assert PatrolDeleteTask._short_error(message) == expected
def test_build_country_section_result_uses_simplified_delete_timeout_failure_reason():
section = PatrolDeleteTask._build_country_section_result(
country_name="英国",
status_rows=[{"status": "详情页面已删除", "quantity": "1"}],
delete_counts={},
default_process_status=f"处理失败: {PatrolDeleteTask._short_error('状态[详情页面已删除]删除后未读取到成功提示: []')}",
)
assert section["rows"][0]["processStatus"] == "处理失败: 删除后未读取到成功提示"
def test_build_country_section_result_sets_zero_delete_quantity_when_no_deletable_products():
section = PatrolDeleteTask._build_country_section_result(
country_name="德国",
@@ -670,7 +722,7 @@ def test_build_country_section_result_sets_zero_delete_quantity_when_no_deletabl
assert section == {
"country": "德国",
"rows": [{"status": "全部", "quantity": "12", "deleteQuantity": "0", "processStatus": "无可删商品"}],
"rows": [{"status": "全部", "quantity": "12", "deleteQuantity": "无需删除", "processStatus": "无可删商品"}],
}
@@ -684,10 +736,36 @@ def test_build_country_section_result_sets_zero_delete_quantity_for_empty_no_del
assert section == {
"country": "德国",
"rows": [{"status": "全部", "quantity": "", "deleteQuantity": "0", "processStatus": "无可删商品"}],
"rows": [{"status": "全部", "quantity": "", "deleteQuantity": "无需删除", "processStatus": "无可删商品"}],
}
def test_build_country_section_result_marks_all_whitelisted_statuses_as_no_delete_needed():
whitelist_statuses = [
"全部",
"定价问题",
"需要批准",
"在搜索结果中禁止显示",
"配送问题",
"缺少报价",
"已停售",
"不可售",
"在售",
]
section = PatrolDeleteTask._build_country_section_result(
country_name="爱尔兰",
status_rows=[{"status": status, "quantity": "1"} for status in whitelist_statuses]
+ [{"status": "缺少的信息", "quantity": "2"}],
delete_counts={"缺少的信息": 2},
)
rows_by_status = {row["status"]: row for row in section["rows"]}
for status in whitelist_statuses:
assert rows_by_status[status]["deleteQuantity"] == "无需删除"
assert rows_by_status["缺少的信息"]["deleteQuantity"] == "2"
def test_parse_label_quantity_text_accepts_complete_draft_sample():
assert InventoryManage._parse_label_quantity_text("未提交的草稿 (0)") == ("未提交的草稿", 0)