From 34148b5d8af9b75166fdf47ecb8621ca2f3c9581 Mon Sep 17 00:00:00 2001 From: koko Date: Fri, 1 May 2026 22:46:11 +0800 Subject: [PATCH] Merge patrol delete tests and remove pycache artifacts --- app/amazon/__pycache__/approve.cpython-39.pyc | Bin 32800 -> 0 bytes .../__pycache__/asin_status.cpython-39.pyc | Bin 18497 -> 0 bytes .../__pycache__/del_brand.cpython-39.pyc | Bin 18616 -> 0 bytes .../__pycache__/match_action.cpython-39.pyc | Bin 19336 -> 0 bytes .../__pycache__/price_match.cpython-39.pyc | Bin 35279 -> 0 bytes app/tests/test_amazon_base.py | 26 ++ app/tests/test_patrol_delete.py | 301 ++++++++++++------ 7 files changed, 233 insertions(+), 94 deletions(-) delete mode 100644 app/amazon/__pycache__/approve.cpython-39.pyc delete mode 100644 app/amazon/__pycache__/asin_status.cpython-39.pyc delete mode 100644 app/amazon/__pycache__/del_brand.cpython-39.pyc delete mode 100644 app/amazon/__pycache__/match_action.cpython-39.pyc delete mode 100644 app/amazon/__pycache__/price_match.cpython-39.pyc diff --git a/app/amazon/__pycache__/approve.cpython-39.pyc b/app/amazon/__pycache__/approve.cpython-39.pyc deleted file mode 100644 index 84f4d46d52e464065f3b2b2fbfcb42e6db0aa3c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32800 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 av1!%$S{gR##-qy8A!jkv8I0B1?)?A1%(jyN diff --git a/app/amazon/__pycache__/asin_status.cpython-39.pyc b/app/amazon/__pycache__/asin_status.cpython-39.pyc deleted file mode 100644 index 370790b31f7c6ff64df89cccc5de39661d4d4fd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18497 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 diff --git a/app/amazon/__pycache__/del_brand.cpython-39.pyc b/app/amazon/__pycache__/del_brand.cpython-39.pyc deleted file mode 100644 index 6eeeac4b54e9a412c486263c358a29487bad5b8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18616 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 M*kZiBLcsz59|;41#sB~S diff --git a/app/amazon/__pycache__/match_action.cpython-39.pyc b/app/amazon/__pycache__/match_action.cpython-39.pyc deleted file mode 100644 index 726e545d4dc38092ac22bd18c71f0b66339409f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19336 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

FM|o2@*zPKJ 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 diff --git a/app/tests/test_amazon_base.py b/app/tests/test_amazon_base.py index 9c2a754..01d4ece 100644 --- a/app/tests/test_amazon_base.py +++ b/app/tests/test_amazon_base.py @@ -185,6 +185,32 @@ def test_wait_until_client_ready_polls_until_available(monkeypatch): assert sleeps == [base.CLIENT_READY_INTERVAL, base.CLIENT_READY_INTERVAL] +def test_ziniao_webdriver_tail_redacts_password(monkeypatch, tmp_path): + appdata = tmp_path / "AppData" / "Roaming" + log_dir = appdata / "ziniaobrowser" / "instances" / "userdata1" / "logs" / "client" + log_dir.mkdir(parents=True) + log_file = log_dir / "webdriver.20260501.log" + log_file.write_text( + '[error] {"action":"updateCore","username":"u","password":"secret"}\n', + encoding="utf-8", + ) + messages = [] + + monkeypatch.setenv("APPDATA", str(appdata)) + monkeypatch.setattr(base.time, "strftime", lambda fmt: "20260501") + sink_id = base.logger.add(messages.append, level="ERROR", format="{message}") + + try: + base.ZiniaoDriver({})._log_ziniao_webdriver_tail() + finally: + base.logger.remove(sink_id) + + output = "\n".join(messages) + assert "webdriver.20260501.log" in output + assert '"password":"***"' in output + assert "secret" not in output + + def test_close_store_success_uses_current_store(monkeypatch): payloads = [] diff --git a/app/tests/test_patrol_delete.py b/app/tests/test_patrol_delete.py index 0647762..6c1fe55 100644 --- a/app/tests/test_patrol_delete.py +++ b/app/tests/test_patrol_delete.py @@ -105,7 +105,7 @@ def test_patrol_delete_task_post_result_retries_business_failure(monkeypatch): assert len(calls) == 3 -def test_normalize_country_sections_keeps_only_status_and_quantity_for_complete_draft_rows(): +def test_normalize_country_sections_omits_status_fields_for_complete_draft_rows(): rows = PatrolDeleteTask._normalize_country_sections_for_result( [ { @@ -132,7 +132,7 @@ def test_normalize_country_sections_keeps_only_status_and_quantity_for_complete_ { "country": "意大利", "rows": [ - {"status": "商品信息草稿", "quantity": "12"}, + {"quantity": "12", "deleteQuantity": "3"}, {"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": "无需删除", "processStatus": "无可删商品"}, + {"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"}, {"status": "商品信息草稿", "quantity": "", "deleteQuantity": "0", "processStatus": ""}, ], } complete_draft_section = { "country": "西班牙", "rows": [ - {"type": "completeDraft", "status": "未提交的草稿", "quantity": "1"}, - {"type": "completeDraft", "status": "已提交:提供缺少的信息", "quantity": "0"}, + {"type": "completeDraft", "quantity": "1", "deleteQuantity": "1"}, + {"type": "completeDraft", "quantity": "0", "deleteQuantity": "0"}, ], } @@ -160,18 +160,18 @@ def test_replace_complete_draft_rows_uses_quick_view_rows(): assert merged == { "country": "西班牙", "rows": [ - {"status": "全部", "quantity": "6230", "deleteQuantity": "无需删除", "processStatus": "无可删商品"}, - {"type": "completeDraft", "status": "未提交的草稿", "quantity": "1"}, - {"type": "completeDraft", "status": "已提交:提供缺少的信息", "quantity": "0"}, + {"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"}, + {"type": "completeDraft", "quantity": "1", "deleteQuantity": "1"}, + {"type": "completeDraft", "quantity": "0", "deleteQuantity": "0"}, ], } assert PatrolDeleteTask._normalize_country_sections_for_result([merged]) == [ { "country": "西班牙", "rows": [ - {"status": "全部", "quantity": "6230", "deleteQuantity": "无需删除", "processStatus": "无可删商品"}, - {"status": "未提交的草稿", "quantity": "1"}, - {"status": "已提交:提供缺少的信息", "quantity": "0"}, + {"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"}, + {"quantity": "1", "deleteQuantity": "1"}, + {"quantity": "0", "deleteQuantity": "0"}, ], } ] @@ -194,7 +194,7 @@ def test_patrol_delete_task_process_task_aggregates_country_results(monkeypatch) def fake_open_shop(self, **kwargs): return Driver() - def fake_process_country(self, driver, task_id, shop_name, country_name): + def fake_process_country(self, driver, task_id, shop_name, country_name, delete_conditions=None): if country_name == "德国": return { "success": True, @@ -308,6 +308,90 @@ def test_patrol_delete_task_process_task_skips_missing_required_data(monkeypatch assert calls == [] +def test_patrol_delete_task_process_task_passes_delete_conditions(monkeypatch): + from config import runing_shop, runing_task + + runing_task.clear() + runing_shop.clear() + seen_conditions = [] + + class Driver: + def close_store(self): + return None + + def fake_open_shop(self, **kwargs): + return Driver() + + def fake_process_country(self, driver, task_id, shop_name, country_name, delete_conditions=None): + seen_conditions.append(delete_conditions) + return { + "success": True, + "countrySection": { + "country": country_name, + "rows": [{"status": "全部", "quantity": "", "deleteQuantity": "0", "processStatus": "无可删商品"}], + }, + "cartRatio": {"country": country_name, "ratio": ""}, + "deletedCount": 0, + "reopenRequired": False, + } + + monkeypatch.setattr(PatrolDeleteTask, "open_shop", fake_open_shop) + monkeypatch.setattr(PatrolDeleteTask, "process_country", fake_process_country) + monkeypatch.setattr(PatrolDeleteTask, "post_result", lambda self, **kwargs: None) + + PatrolDeleteTask().process_task( + { + "type": "patrol-delete-run", + "data": { + "taskId": 7, + "items": [{"shopName": "郭亚芳", "companyName": "rongchuang123"}], + "country_sections": [{"country": "德国", "rows": [{"status": "全部"}]}], + "delete_conditions": [{"id": 1, "conditionText": "商品信息草稿、补全草稿"}], + }, + } + ) + + assert seen_conditions == [["商品信息草稿", "补全草稿"]] + + +def test_delete_complete_draft_country_section_reports_delete_quantity(monkeypatch): + class Driver: + def delete_complete_drafts_from_non_whitelisted_tags(self, shop_name, country_name, **kwargs): + return { + "draftRows": [ + {"tag": "未提交的草稿", "quantity": 0}, + {"tag": "已提交:提供缺少的信息", "quantity": 2}, + ], + "deleteCounts": {"未提交的草稿": 3}, + "totalDeleted": 3, + } + + result = PatrolDeleteTask()._delete_complete_draft_country_section_safe( + Driver(), + "郭亚芳", + "德国", + ["未提交的草稿"], + ) + + assert result["deletedCount"] == 3 + assert result["countrySection"] == { + "country": "德国", + "rows": [ + {"type": "completeDraft", "status": "未提交的草稿", "quantity": "0", "deleteQuantity": "3"}, + {"type": "completeDraft", "status": "已提交:提供缺少的信息", "quantity": "2", "deleteQuantity": "0"}, + ], + } + assert PatrolDeleteTask._normalize_country_sections_for_result([result["countrySection"]]) == [ + { + "country": "德国", + "rows": [ + {"quantity": "0", "deleteQuantity": "3"}, + {"quantity": "2", "deleteQuantity": "0"}, + ], + } + ] + + def test_patrol_delete_task_reports_shop_error(monkeypatch): from config import runing_shop, runing_task @@ -377,7 +461,11 @@ def test_delete_all_listings_from_non_whitelisted_statuses_deletes_each_row_in_s monkeypatch.setattr(driver, "_delete_selected_filtered_inventory_rows", fake_delete_selected_filtered_inventory_rows) monkeypatch.setattr(driver, "_wait_inventory_loader", lambda timeout=5: None) - result = driver.delete_all_listings_from_non_whitelisted_statuses("郭亚芳", "德国") + result = driver.delete_all_listings_from_non_whitelisted_statuses( + "郭亚芳", + "德国", + delete_conditions=["商品信息草稿"], + ) assert state["selected"] == ["商品信息草稿"] assert state["deleted"] == 2 @@ -388,6 +476,66 @@ def test_delete_all_listings_from_non_whitelisted_statuses_deletes_each_row_in_s assert [item["target"]["sku"] for item in result["results"]] == ["bulk-selected"] +def test_delete_all_listings_from_non_whitelisted_statuses_respects_allowed_statuses(monkeypatch): + driver = InventoryManage({}) + state = {"selected": [], "deleted": 0} + + def fake_read_listing_status_rows_for_delete(shop_name, country, **kwargs): + return [ + {"status": "商品信息草稿", "quantity": "2", "deleteQuantity": "", "processStatus": ""}, + {"status": "缺少的信息", "quantity": "3", "deleteQuantity": "", "processStatus": ""}, + {"status": "全部", "quantity": "9", "deleteQuantity": "", "processStatus": ""}, + ] + + def fake_select_listing_status(status, **kwargs): + state["selected"].append(status) + + def fake_delete_selected_filtered_inventory_rows(status, **kwargs): + state["deleted"] += 1 + return { + "deletedCount": 1, + "target": {"sku": status, "rawText": status}, + "successMessage": f"{status} 删除成功", + } + + monkeypatch.setattr(driver, "_read_listing_status_rows_for_delete", fake_read_listing_status_rows_for_delete) + monkeypatch.setattr(driver, "select_listing_status", fake_select_listing_status) + monkeypatch.setattr(driver, "_delete_selected_filtered_inventory_rows", fake_delete_selected_filtered_inventory_rows) + monkeypatch.setattr(driver, "_wait_inventory_loader", lambda timeout=5: None) + + result = driver.delete_all_listings_from_non_whitelisted_statuses( + "郭亚芳", + "德国", + allowed_statuses=["缺少的信息"], + ) + + assert state["selected"] == ["缺少的信息"] + assert state["deleted"] == 3 + assert result["deleteCounts"] == {"缺少的信息": 3} + + +def test_delete_all_listings_from_non_whitelisted_statuses_empty_allowed_statuses_deletes_nothing(monkeypatch): + driver = InventoryManage({}) + state = {"selected": []} + + monkeypatch.setattr( + driver, + "_read_listing_status_rows_for_delete", + lambda shop_name, country, **kwargs: [{"status": "商品信息草稿", "quantity": "2"}], + ) + monkeypatch.setattr(driver, "select_listing_status", lambda status, **kwargs: state["selected"].append(status)) + + result = driver.delete_all_listings_from_non_whitelisted_statuses( + "郭亚芳", + "德国", + allowed_statuses=[], + ) + + assert state["selected"] == [] + assert result["deleteCandidates"] == [] + assert result["totalDeleted"] == 0 + + def test_select_listing_status_uses_dropdown_option_not_visible_status(monkeypatch): driver = InventoryManage({}) calls = [] @@ -606,7 +754,7 @@ def test_build_deletable_status_rows_keeps_non_whitelisted_statuses(): {"status": "全部", "quantity": "9"}, ] - assert InventoryManage._build_deletable_status_rows(rows) == [ + assert InventoryManage._build_deletable_status_rows(rows, ["库存状态删除"]) == [ {"status": "商品信息草稿", "canonicalStatus": "商品信息草稿", "quantity": 2}, {"status": "自定义异常状态", "canonicalStatus": "自定义异常状态", "quantity": 5}, ] @@ -621,7 +769,7 @@ def test_build_deletable_status_rows_skips_group_labels_without_quantity(): {"status": "全部", "quantity": ""}, ] - assert InventoryManage._build_deletable_status_rows(rows) == [ + assert InventoryManage._build_deletable_status_rows(rows, ["库存状态删除"]) == [ {"status": "缺少的信息", "canonicalStatus": "缺少的信息", "quantity": 1}, ] @@ -644,74 +792,65 @@ def test_build_deletable_status_rows_keeps_legacy_non_whitelist_statuses_deletab {"status": "订单页面已删除", "quantity": "3"}, ] - assert InventoryManage._build_deletable_status_rows(rows) == [ + assert InventoryManage._build_deletable_status_rows(rows, ["库存状态删除"]) == [ {"status": "详情页面已删除", "canonicalStatus": "详情页面已删除", "quantity": 1}, {"status": "缺少的信息", "canonicalStatus": "缺少的信息", "quantity": 2}, {"status": "订单页面已删除", "canonicalStatus": "详情页面已删除", "quantity": 3}, ] +def test_build_deletable_status_rows_filters_by_delete_conditions(): + rows = [ + {"status": "商品信息草稿", "quantity": "2"}, + {"status": "缺少的信息", "quantity": "5"}, + {"status": "全部", "quantity": "9"}, + ] + + assert InventoryManage._build_deletable_status_rows(rows, ["商品信息草稿"]) == [ + {"status": "商品信息草稿", "canonicalStatus": "商品信息草稿", "quantity": 2}, + ] + assert InventoryManage._build_deletable_status_rows(rows, []) == [] + + +def test_build_deletable_complete_draft_tag_rows_respects_complete_draft_condition(): + rows = [ + {"tag": "未提交的草稿", "quantity": 1}, + {"tag": "已提交:提供缺少的信息", "quantity": 2}, + ] + + assert InventoryManage._build_deletable_complete_draft_tag_rows(rows, ["已提交:提供缺少的信息"]) == [ + {"tag": "已提交:提供缺少的信息", "canonicalTag": "已提交:提供缺少的信息", "quantity": 2}, + ] + assert InventoryManage._build_deletable_complete_draft_tag_rows(rows, ["补全草稿"]) == [ + {"tag": "未提交的草稿", "canonicalTag": "未提交的草稿", "quantity": 1}, + {"tag": "已提交:提供缺少的信息", "canonicalTag": "已提交:提供缺少的信息", "quantity": 2}, + ] + assert InventoryManage._build_deletable_complete_draft_tag_rows(rows, []) == [] + + +def test_parse_delete_condition_texts_accepts_frontend_payload_shapes(): + assert PatrolDeleteTask._parse_delete_condition_texts( + [ + {"id": 1, "conditionText": "商品信息草稿、缺少的信息"}, + {"id": 2, "condition_text": "补全草稿"}, + "详情页面已删除", + ] + ) == ["商品信息草稿", "缺少的信息", "补全草稿", "详情页面已删除"] + + +def test_resolve_delete_condition_texts_defaults_to_empty_list_when_missing(): + assert PatrolDeleteTask._resolve_delete_condition_texts({}) == [] + + def test_is_delete_success_message_accepts_both_copy_variants(): assert InventoryManage._is_delete_success_message("1 个商品已经删除。所作更改需要15分钟才会显示在商品详情页面上") 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="德国", @@ -740,32 +879,6 @@ def test_build_country_section_result_sets_zero_delete_quantity_for_empty_no_del } -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)