"""AI 套图规划的均衡覆盖回归测试。""" from __future__ import annotations import sys import unittest from pathlib import Path SERVER_DIR = Path(__file__).resolve().parents[1] if str(SERVER_DIR) not in sys.path: sys.path.insert(0, str(SERVER_DIR)) from services.planner import _balanced_items def item(kind: str, variant_name: str | None = None) -> dict: return { "kind": kind, "title": kind, "detail": "", "prompt_hint": "", "count": 1, "variant_name": variant_name, } class BalancedPlanTests(unittest.TestCase): def test_many_skus_do_not_crowd_out_core_image_types(self) -> None: variants = ["黑色", "白色", "蓝色", "粉色", "绿色"] plan = _balanced_items( [item("white_bg", variant) for variant in variants], variants, {"params": [{"key": "尺寸", "value": "30 × 20 × 10 cm"}]}, None, budget=15, ) self.assertLessEqual(sum(p["count"] for p in plan if p["kind"] == "white_bg"), 2) self.assertTrue(any(p["kind"] == "lifestyle" for p in plan)) self.assertTrue(any(p["kind"] == "material" for p in plan)) self.assertTrue(any(p["kind"] == "size_chart" for p in plan)) def test_does_not_add_size_chart_without_dimensions(self) -> None: plan = _balanced_items( [item("white_bg", "黑色")], ["黑色", "白色"], {"params": [{"key": "规格", "value": "标准款"}, {"key": "材质", "value": "涤纶"}]}, None, budget=15, ) self.assertFalse(any(p["kind"] == "size_chart" for p in plan)) self.assertTrue(any(p["kind"] == "lifestyle" for p in plan)) self.assertTrue(any(p["kind"] == "material" for p in plan)) def test_explicit_every_sku_requirement_is_preserved(self) -> None: variants = ["黑色", "白色", "蓝色"] plan = _balanced_items( [item("white_bg", variant) for variant in variants], variants, {}, "每个 SKU 都单独出一张白底图", budget=15, ) self.assertEqual(sum(p["count"] for p in plan if p["kind"] == "white_bg"), 3) if __name__ == "__main__": unittest.main()