ai-rule-engine/tests/test_models.py
root e39829fc4e feat(ai-rule-engine): 完成 MVP 所有批次实现
批次1: 项目结构 + SQLite 存储层 + 数据模型
批次2: REST API (http.server)
批次3: LLM 编译器 (支持 OpenAI/Anthropic)
批次4: RestrictedPython 规则执行器
批次5: 规则匹配器 + LLM Callback 兜底
批次6: 冲突检测器

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 22:19:42 +08:00

80 lines
2.4 KiB
Python

"""Tests for data models."""
import pytest
from rule_engine.models import Rule, RuleExecution, CreateRuleRequest, EvaluateRequest, EvaluateResponse
def test_create_rule_request_valid():
"""验证创建规则的请求可以正确解析。"""
request = CreateRuleRequest(
name="test_rule",
description="测试规则",
condition_template="用户 {{user_id}} 年龄大于 {{age}}"
)
assert request.name == "test_rule"
assert request.description == "测试规则"
assert "{{user_id}}" in request.condition_template
def test_create_rule_request_minimal():
"""验证最小请求只需必填字段。"""
request = CreateRuleRequest(
name="minimal_rule",
condition_template="如果用户是会员则打折"
)
assert request.name == "minimal_rule"
assert request.priority == 0
def test_rule_model():
"""验证规则模型包含所有必要字段。"""
rule = Rule(
id="rule_001",
name="premium_discount",
description="高级会员8折",
condition_template="用户是高级会员",
code="def rule_001(facts):\n if facts.get('subscription') == 'premium':\n return {'action': 'discount', 'rate': 0.8}\n return None"
)
assert rule.id == "rule_001"
assert rule.priority == 0
assert "premium" in rule.code
def test_rule_to_dict():
"""验证规则可以序列化为字典。"""
rule = Rule(
id="rule_001",
name="test",
condition_template="test",
code="def r(f): pass"
)
d = rule.to_dict()
assert d["id"] == "rule_001"
assert d["name"] == "test"
def test_rule_execution_model():
"""验证规则执行记录模型。"""
execution = RuleExecution(
id="exec_001",
rule_id="rule_001",
facts={"user_id": "u123", "subscription": "premium"},
result={"action": "discount", "rate": 0.8},
matched=True
)
assert execution.matched is True
assert execution.rule_id == "rule_001"
def test_evaluate_request():
"""验证校验请求模型。"""
req = EvaluateRequest(facts={"user_id": "u123"})
assert req.rule_id is None
assert req.facts["user_id"] == "u123"
def test_evaluate_response():
"""验证校验响应模型。"""
resp = EvaluateResponse(matched=True, rule_id="rule_001", result={"action": "ok"})
assert resp.matched is True
assert resp.conflict_warning is None