"""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