vigilar/tests/unit/test_pet_rules_api.py

56 lines
2.1 KiB
Python

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