Files

99 lines
3.5 KiB
Python

"""冒烟测试:build_plan 结构 + aura 引擎直接渲染。
用法:
python tests/smoke_build_plan.py # 仅构建 plan 并打印结构
python tests/smoke_build_plan.py --render # 追加真实渲染 + 保真验证
"""
import json
import sys
import tempfile
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from src.agent.perception import GenerateConfig # noqa: E402
from src.agent.planning import build_plan # noqa: E402
SAMPLE_ZH = """# 本月完成情况
完成模块A开发,进度符合计划
修复线上3个缺陷,系统可用性提升至99.9%
新增用户反馈收集通道
# 下月计划
启动模块B概要设计
组织跨部门代码评审
开展性能压测与容量评估
补充核心链路自动化测试用例
# 风险与求助
人力存在缺口,希望增援1名后端
第三方接口联调依赖对方排期
"""
SAMPLE_JA = """# 今月の進捗
モジュールAの開発完了、予定どおり
本番障害3件を修正し、可用性99.9%を達成
# 来月の計画
モジュールBの概要設計を開始
性能テストを実施する
"""
def make_cfg(lang="zh"):
return GenerateConfig(
title="七月项目周报" if lang == "zh" else "7月度プロジェクト報告",
user_id=1, content=SAMPLE_ZH if lang == "zh" else SAMPLE_JA,
scene="report", language=lang, canvas="ppt169",
image_strategy="off",
color_scheme="blue", page_min=6, page_max=10,
)
def show(plan):
print(f"design={plan['design']} slides={len(plan['slides'])}")
for i, s in enumerate(plan["slides"], 1):
n = len(s.get("content") or [])
print(f" {i:02d}. [{s['type']:9s}] {s.get('title','')[:30]} bullets={n}")
def main():
failures = []
for lang in ("zh", "ja"):
r = build_plan(make_cfg(lang))
plan = r.plan
print(f"\n===== {lang} ===== warnings={r.warnings}")
show(plan)
types = [s["type"] for s in plan["slides"]]
if types[0] != "cover" or types[-1] != "end":
failures.append(f"{lang}: 首尾页面类型错误")
if not (6 <= len(plan["slides"]) <= 10) and lang == "zh":
failures.append(f"{lang}: 页数 {len(plan['slides'])} 超出目标区间")
if lang == "ja" and plan["design"] != "report-jp":
failures.append("ja 未映射到 report-jp")
if lang == "zh" and plan["design"] != "corp-blue":
failures.append("zh/blue 未映射到 corp-blue")
if "--render" in sys.argv:
from config import COMPANY_TEMPLATE
from src.engine_bridge import render_plan, verify_output
tmp = Path(tempfile.mkdtemp(prefix="aura_smoke_"))
for lang in ("zh", "ja"):
r = build_plan(make_cfg(lang))
p = tmp / f"plan_{lang}.json"
p.write_text(json.dumps(r.plan, ensure_ascii=False, indent=2),
encoding="utf-8")
out = tmp / f"smoke_{lang}.pptx"
tpl = COMPANY_TEMPLATE if (lang == "ja" and COMPANY_TEMPLATE.exists()) else None
render_plan(p, out, template=tpl)
ok, detail = verify_output(out, p)
print(f"\n[render {lang}] -> {out}")
print(f"[verify {lang}] passed={ok}\n{detail}")
if not ok:
failures.append(f"{lang}: 渲染保真验证未通过")
print("\n" + ("ALL SMOKE PASSED" if not failures else "FAILURES: " + "; ".join(failures)))
sys.exit(1 if failures else 0)
if __name__ == "__main__":
main()