import json import pytest from vigilar.config import VigilarConfig from vigilar.storage.queries import insert_pet, get_all_pets from vigilar.web.app import create_app @pytest.fixture def rules_app(test_db): cfg = VigilarConfig() app = create_app(cfg) app.config["TESTING"] = True app.config["DB_ENGINE"] = test_db insert_pet(test_db, name="Milo", species="dog") return app def _get_pet_id(rules_app): db = rules_app.config["DB_ENGINE"] return get_all_pets(db)[0]["id"] def test_create_rule(rules_app): pet_id = _get_pet_id(rules_app) with rules_app.test_client() as c: rv = c.post(f"/pets/{pet_id}/rules", json={ "name": "Outdoor timer", "conditions": [{"type": "in_zone_longer_than", "zone": "EXTERIOR", "minutes": 45}], "action": "push_notify", "action_message": "{pet_name} outside", "cooldown_minutes": 30}) assert rv.status_code == 200 assert rv.get_json()["ok"] is True def test_list_rules(rules_app): pet_id = _get_pet_id(rules_app) with rules_app.test_client() as c: c.post(f"/pets/{pet_id}/rules", json={"name": "Test", "conditions": [], "action": "log_event", "cooldown_minutes": 30}) rv = c.get(f"/pets/{pet_id}/rules") assert len(rv.get_json()["rules"]) == 1 def test_delete_rule(rules_app): pet_id = _get_pet_id(rules_app) with rules_app.test_client() as c: rv = c.post(f"/pets/{pet_id}/rules", json={"name": "Del", "conditions": [], "action": "log_event", "cooldown_minutes": 30}) rule_id = rv.get_json()["id"] rv = c.delete(f"/pets/{pet_id}/rules/{rule_id}") assert rv.status_code == 200 def test_invalid_action(rules_app): pet_id = _get_pet_id(rules_app) with rules_app.test_client() as c: rv = c.post(f"/pets/{pet_id}/rules", json={"name": "Bad", "conditions": [], "action": "invalid", "cooldown_minutes": 30}) assert rv.status_code == 400 def test_rule_templates(rules_app): with rules_app.test_client() as c: rv = c.get("/pets/api/rule-templates") assert rv.status_code == 200 assert len(rv.get_json()) >= 5