ai-rule-engine/tests/test_store.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

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