vigilar/tests/unit/test_pet_rules.py

42 lines
2.1 KiB
Python

import time
from vigilar.pets.rules import PetState, evaluate_condition, evaluate_rule
def test_detected_in_zone_true():
state = PetState(pet_id="milo", current_zone="EXTERIOR")
assert evaluate_condition({"type": "detected_in_zone", "zone": "EXTERIOR"}, state, time.time()) is True
def test_detected_in_zone_false():
state = PetState(pet_id="milo", current_zone="INTERIOR")
assert evaluate_condition({"type": "detected_in_zone", "zone": "EXTERIOR"}, state, time.time()) is False
def test_not_seen_in_zone_true():
now = time.time()
state = PetState(pet_id="milo", current_zone="INTERIOR", last_seen_time=now - 3600)
assert evaluate_condition({"type": "not_seen_in_zone", "zone": "EXTERIOR", "minutes": 30}, state, now) is True
def test_not_seen_anywhere():
now = time.time()
state = PetState(pet_id="milo", last_seen_time=now - 30000)
assert evaluate_condition({"type": "not_seen_anywhere", "minutes": 480}, state, now) is True
def test_detected_without_person():
assert evaluate_condition({"type": "detected_without_person"}, PetState(pet_id="snek", person_present=False), time.time()) is True
assert evaluate_condition({"type": "detected_without_person"}, PetState(pet_id="snek", person_present=True), time.time()) is False
def test_in_zone_longer_than():
now = time.time()
state = PetState(pet_id="milo", current_zone="EXTERIOR", zone_entry_time=now - 3000)
assert evaluate_condition({"type": "in_zone_longer_than", "zone": "EXTERIOR", "minutes": 45}, state, now) is True
def test_evaluate_rule_and_logic():
now = time.time()
state = PetState(pet_id="milo", current_zone="EXTERIOR", zone_entry_time=now - 3600, person_present=False)
rule = {"conditions": [{"type": "detected_in_zone", "zone": "EXTERIOR"}, {"type": "detected_without_person"}]}
assert evaluate_rule(rule, state, now) is True
def test_evaluate_rule_one_fails():
now = time.time()
state = PetState(pet_id="milo", current_zone="INTERIOR", person_present=False)
rule = {"conditions": [{"type": "detected_in_zone", "zone": "EXTERIOR"}, {"type": "detected_without_person"}]}
assert evaluate_rule(rule, state, now) is False