Files
cmshoppe/tests/test_product_status.py
T

81 lines
3.3 KiB
Python
Raw Normal View History

import html
import re
import sys
import unittest
from pathlib import Path
from types import SimpleNamespace
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from app import product_status
REPO_ROOT = Path(__file__).resolve().parent.parent
def _sample_alert(filename):
source = (REPO_ROOT / "docs" / "html" / filename).read_text(encoding="utf-8")
title_match = re.search(r'class="eds-alert-title">\s*([^<]+)', source)
desc_match = re.search(r'class="eds-alert-desc"[^>]*>(.*?)</p>', source, re.DOTALL)
if title_match is None or desc_match is None:
raise AssertionError("商品状态样本缺少标题或说明")
description = re.sub(r"<[^>]+>", "", desc_match.group(1))
return {
"title": html.unescape(title_match.group(1)),
"description": html.unescape(description),
}
class ProductStatusTests(unittest.TestCase):
def test_real_warning_samples_are_classified(self):
reviewing = product_status.classify_alerts([_sample_alert("审核中商品提示.html")])
unlisted = product_status.classify_alerts([_sample_alert("未上架商品提示.html")])
self.assertEqual(product_status.STATUS_REVIEWING, reviewing["product_status"])
self.assertEqual(product_status.STATUS_UNLISTED, unlisted["product_status"])
def test_empty_unknown_and_multiple_alerts_follow_contract(self):
self.assertEqual(
product_status.STATUS_NORMAL,
product_status.classify_alerts([])["product_status"],
)
self.assertEqual(
product_status.STATUS_UNKNOWN,
product_status.classify_alerts([{"title": "其他警告", "description": "说明"}])["product_status"],
)
result = product_status.classify_alerts(
[
{"title": "其他警告", "description": "忽略"},
{"title": "您的商品未上架", "description": "已下架"},
{"title": "审核中", "description": "后续提示"},
]
)
self.assertEqual(product_status.STATUS_UNLISTED, result["product_status"])
self.assertIn("您的商品未上架", result["product_status_note"])
def test_invalid_values_are_unknown_and_partitioning_is_consistent(self):
tasks = [
SimpleNamespace(product_status="normal"),
SimpleNamespace(product_status="reviewing"),
SimpleNamespace(product_status=None),
SimpleNamespace(product_status="invalid"),
]
grouped = product_status.partition_tasks(tasks)
self.assertEqual("状态未知", product_status.status_label(None))
self.assertTrue(product_status.is_normal("normal"))
self.assertFalse(product_status.is_normal(None))
self.assertTrue(product_status.is_known_abnormal("unlisted"))
self.assertEqual(1, len(grouped["normal"]))
self.assertEqual(2, len(grouped["unknown"]))
def test_note_is_normalized_and_limited(self):
result = product_status.classify_alerts(
[{"title": " 审核中\n", "description": " " + "x" * 2200}]
)
self.assertEqual(product_status.STATUS_REVIEWING, result["product_status"])
self.assertLessEqual(len(result["product_status_note"]), 2000)
self.assertTrue(result["product_status_note"].startswith("标题:审核中;说明:"))