feat(S5): pet rule CRUD routes with validation and templates
This commit is contained in:
55
tests/unit/test_pet_rules_api.py
Normal file
55
tests/unit/test_pet_rules_api.py
Normal file
@@ -0,0 +1,55 @@
|
||||
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
|
||||
Reference in New Issue
Block a user