import pytest from mqtt_home.rule_registry import list_rules, get_rule, create_rule, update_rule, delete_rule from mqtt_home.schemas import RuleCreate, RuleUpdate @pytest.mark.asyncio async def test_create_rule(db_session): rule = await create_rule(db_session, RuleCreate( name="Test Rule", topic_pattern="home/+/state", device_type="switch", command_template="home/{device_id}/set", state_value_path="state", )) assert rule.id is not None assert rule.name == "Test Rule" assert rule.topic_pattern == "home/+/state" assert rule.is_enabled is True @pytest.mark.asyncio async def test_list_rules(db_session): await create_rule(db_session, RuleCreate(name="Rule 1", topic_pattern="a/+")) await create_rule(db_session, RuleCreate(name="Rule 2", topic_pattern="b/+")) rules = await list_rules(db_session) assert len(rules) == 2 @pytest.mark.asyncio async def test_get_rule(db_session): created = await create_rule(db_session, RuleCreate(name="Test", topic_pattern="x/+")) rule = await get_rule(db_session, created.id) assert rule is not None assert rule.name == "Test" @pytest.mark.asyncio async def test_get_rule_not_found(db_session): rule = await get_rule(db_session, 99999) assert rule is None @pytest.mark.asyncio async def test_update_rule(db_session): created = await create_rule(db_session, RuleCreate(name="Original", topic_pattern="x/+")) updated = await update_rule(db_session, created.id, RuleUpdate(name="Updated")) assert updated.name == "Updated" assert updated.topic_pattern == "x/+" # unchanged @pytest.mark.asyncio async def test_update_rule_not_found(db_session): result = await update_rule(db_session, 99999, RuleUpdate(name="X")) assert result is None @pytest.mark.asyncio async def test_delete_rule(db_session): created = await create_rule(db_session, RuleCreate(name="To Delete", topic_pattern="x/+")) assert await delete_rule(db_session, created.id) is True assert await get_rule(db_session, created.id) is None @pytest.mark.asyncio async def test_delete_rule_not_found(db_session): assert await delete_rule(db_session, 99999) is False