批次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>
80 lines
2.4 KiB
Python
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
|