56 lines
2.1 KiB
Python
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
|