diff --git a/tests/unit/test_constants.py b/tests/unit/test_constants.py new file mode 100644 index 0000000..fb84193 --- /dev/null +++ b/tests/unit/test_constants.py @@ -0,0 +1,51 @@ +"""Tests for new pet/wildlife constants.""" + +from vigilar.constants import ( + CameraLocation, + EventType, + ThreatLevel, + Topics, +) + + +class TestThreatLevel: + def test_values(self): + assert ThreatLevel.PREDATOR == "PREDATOR" + assert ThreatLevel.NUISANCE == "NUISANCE" + assert ThreatLevel.PASSIVE == "PASSIVE" + + def test_is_strenum(self): + assert isinstance(ThreatLevel.PREDATOR, str) + + +class TestCameraLocation: + def test_values(self): + assert CameraLocation.EXTERIOR == "EXTERIOR" + assert CameraLocation.INTERIOR == "INTERIOR" + assert CameraLocation.TRANSITION == "TRANSITION" + + def test_is_strenum(self): + assert isinstance(CameraLocation.EXTERIOR, str) + + +class TestNewEventTypes: + def test_pet_events_exist(self): + assert EventType.PET_DETECTED == "PET_DETECTED" + assert EventType.PET_ESCAPE == "PET_ESCAPE" + assert EventType.UNKNOWN_ANIMAL == "UNKNOWN_ANIMAL" + + def test_wildlife_events_exist(self): + assert EventType.WILDLIFE_PREDATOR == "WILDLIFE_PREDATOR" + assert EventType.WILDLIFE_NUISANCE == "WILDLIFE_NUISANCE" + assert EventType.WILDLIFE_PASSIVE == "WILDLIFE_PASSIVE" + + +class TestPetTopics: + def test_pet_detected_topic(self): + assert Topics.camera_pet_detected("front") == "vigilar/camera/front/pet/detected" + + def test_wildlife_detected_topic(self): + assert Topics.camera_wildlife_detected("front") == "vigilar/camera/front/wildlife/detected" + + def test_pet_location_topic(self): + assert Topics.pet_location("angel") == "vigilar/pets/angel/location" diff --git a/vigilar/constants.py b/vigilar/constants.py index 57f20f1..e17cd6d 100644 --- a/vigilar/constants.py +++ b/vigilar/constants.py @@ -40,6 +40,12 @@ class EventType(StrEnum): VEHICLE_DETECTED = "VEHICLE_DETECTED" KNOWN_VEHICLE_ARRIVED = "KNOWN_VEHICLE_ARRIVED" UNKNOWN_VEHICLE_DETECTED = "UNKNOWN_VEHICLE_DETECTED" + PET_DETECTED = "PET_DETECTED" + PET_ESCAPE = "PET_ESCAPE" + UNKNOWN_ANIMAL = "UNKNOWN_ANIMAL" + WILDLIFE_PREDATOR = "WILDLIFE_PREDATOR" + WILDLIFE_NUISANCE = "WILDLIFE_NUISANCE" + WILDLIFE_PASSIVE = "WILDLIFE_PASSIVE" # --- Sensor Types --- @@ -68,6 +74,8 @@ class RecordingTrigger(StrEnum): MANUAL = "MANUAL" PERSON = "PERSON" VEHICLE = "VEHICLE" + PET = "PET" + WILDLIFE = "WILDLIFE" # --- Alert Channels --- @@ -103,6 +111,22 @@ class HouseholdState(StrEnum): ALL_HOME = "ALL_HOME" +# --- Threat Levels (Wildlife) --- + +class ThreatLevel(StrEnum): + PREDATOR = "PREDATOR" + NUISANCE = "NUISANCE" + PASSIVE = "PASSIVE" + + +# --- Camera Location --- + +class CameraLocation(StrEnum): + EXTERIOR = "EXTERIOR" + INTERIOR = "INTERIOR" + TRANSITION = "TRANSITION" + + # --- MQTT Topics --- class Topics: @@ -148,6 +172,19 @@ class Topics: PRESENCE_STATUS = "vigilar/presence/status" + # Pet + @staticmethod + def camera_pet_detected(camera_id: str) -> str: + return f"vigilar/camera/{camera_id}/pet/detected" + + @staticmethod + def camera_wildlife_detected(camera_id: str) -> str: + return f"vigilar/camera/{camera_id}/wildlife/detected" + + @staticmethod + def pet_location(pet_name: str) -> str: + return f"vigilar/pets/{pet_name}/location" + # System SYSTEM_ARM_STATE = "vigilar/system/arm_state" SYSTEM_ALERT = "vigilar/system/alert"