批次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>
108 lines
2.8 KiB
Python
108 lines
2.8 KiB
Python
"""Tests for SQLite store."""
|
|
import pytest
|
|
import os
|
|
import tempfile
|
|
from rule_engine.store import RuleStore
|
|
|
|
|
|
@pytest.fixture
|
|
def temp_db():
|
|
"""创建临时数据库。"""
|
|
fd, path = tempfile.mkstemp(suffix=".db")
|
|
os.close(fd)
|
|
yield path
|
|
os.unlink(path)
|
|
|
|
|
|
@pytest.fixture
|
|
def store(temp_db):
|
|
"""创建规则存储实例。"""
|
|
return RuleStore(temp_db)
|
|
|
|
|
|
def test_init_creates_tables(store):
|
|
"""验证初始化时创建表。"""
|
|
# 表已创建,无异常即通过
|
|
assert store.db_path is not None
|
|
|
|
|
|
def test_create_rule(store):
|
|
"""验证创建规则。"""
|
|
rule = store.create_rule(
|
|
name="test_rule",
|
|
condition_template="用户是会员",
|
|
code="def rule(facts): return {'action': 'ok'}"
|
|
)
|
|
assert rule.id is not None
|
|
assert rule.name == "test_rule"
|
|
assert rule.version == 1
|
|
|
|
|
|
def test_get_rule(store):
|
|
"""验证获取规则。"""
|
|
created = store.create_rule(
|
|
name="get_test",
|
|
condition_template="测试获取",
|
|
code="def rule(facts): return None"
|
|
)
|
|
fetched = store.get_rule(created.id)
|
|
assert fetched is not None
|
|
assert fetched.id == created.id
|
|
assert fetched.name == "get_test"
|
|
|
|
|
|
def test_get_rule_not_found(store):
|
|
"""验证获取不存在的规则返回None。"""
|
|
result = store.get_rule("nonexistent")
|
|
assert result is None
|
|
|
|
|
|
def test_list_rules(store):
|
|
"""验证列出所有规则。"""
|
|
store.create_rule(name="r1", condition_template="c1", code="def r(f): pass")
|
|
store.create_rule(name="r2", condition_template="c2", code="def r(f): pass")
|
|
rules = store.list_rules()
|
|
assert len(rules) >= 2
|
|
|
|
|
|
def test_delete_rule(store):
|
|
"""验证删除规则。"""
|
|
created = store.create_rule(
|
|
name="delete_test",
|
|
condition_template="删除测试",
|
|
code="def rule(facts): return None"
|
|
)
|
|
result = store.delete_rule(created.id)
|
|
assert result is True
|
|
assert store.get_rule(created.id) is None
|
|
|
|
|
|
def test_update_rule_code(store):
|
|
"""验证更新规则代码。"""
|
|
created = store.create_rule(
|
|
name="update_test",
|
|
condition_template="更新测试",
|
|
code="def rule(facts): return None"
|
|
)
|
|
updated = store.update_rule_code(created.id, "def rule(f): return {'updated': True}")
|
|
assert updated is not None
|
|
assert "updated" in updated.code
|
|
assert updated.version == 2
|
|
|
|
|
|
def test_record_execution(store):
|
|
"""验证记录执行历史。"""
|
|
rule = store.create_rule(
|
|
name="exec_test",
|
|
condition_template="执行测试",
|
|
code="def rule(facts): return None"
|
|
)
|
|
execution = store.record_execution(
|
|
rule_id=rule.id,
|
|
facts={"test": "data"},
|
|
result={"action": "ok"},
|
|
matched=True
|
|
)
|
|
assert execution.id is not None
|
|
assert execution.rule_id == rule.id
|