Compare commits

..

No commits in common. "f7271e0a5b9f6d409904665c303aedcd38333b32" and "cbfefd6df56e97dc99f4fbf8c4ab251f974baedf" have entirely different histories.

4 changed files with 38 additions and 37 deletions

View File

@ -119,7 +119,6 @@ class FrigateApp:
self.ptz_metrics: dict[str, PTZMetrics] = {}
self.processes: dict[str, int] = {}
self.embeddings: Optional[EmbeddingsContext] = None
self.profile_manager: Optional[ProfileManager] = None
self.config = config
def ensure_dirs(self) -> None:
@ -352,7 +351,9 @@ class FrigateApp:
)
def init_profile_manager(self) -> None:
self.profile_manager = ProfileManager(self.config, self.inter_config_updater)
self.profile_manager = ProfileManager(
self.config, self.inter_config_updater
)
self.dispatcher.profile_manager = self.profile_manager
persisted = ProfileManager.load_persisted_profile()

View File

@ -16,7 +16,6 @@ from frigate.config.camera.updater import (
CameraConfigUpdateTopic,
)
from frigate.config.config import RuntimeFilterConfig, RuntimeMotionConfig
from frigate.config.profile_manager import ProfileManager
from frigate.const import (
CLEAR_ONGOING_REVIEW_SEGMENTS,
EXPIRE_AUDIO_ACTIVITY,
@ -94,7 +93,7 @@ class Dispatcher:
"notifications": self._on_global_notification_command,
"profile": self._on_profile_command,
}
self.profile_manager: Optional[ProfileManager] = None
self.profile_manager = None
for comm in self.comms:
comm.subscribe(self._receive)
@ -570,9 +569,7 @@ class Dispatcher:
logger.error("Profile manager not initialized")
return
profile_name = (
payload.strip() if payload.strip() not in ("", "none", "None") else None
)
profile_name = payload.strip() if payload.strip() not in ("", "none", "None") else None
err = self.profile_manager.activate_profile(profile_name)
if err:
logger.error("Failed to activate profile: %s", err)

View File

@ -2,29 +2,16 @@ import sys
import unittest
from unittest.mock import MagicMock, patch
# Mock complex imports before importing maintainer, saving originals so we can
# restore them after import and avoid polluting sys.modules for other tests.
_MOCKED_MODULES = [
"frigate.comms.inter_process",
"frigate.comms.detections_updater",
"frigate.comms.recordings_updater",
"frigate.config.camera.updater",
]
_originals = {name: sys.modules.get(name) for name in _MOCKED_MODULES}
for name in _MOCKED_MODULES:
sys.modules[name] = MagicMock()
# Mock complex imports before importing maintainer
sys.modules["frigate.comms.inter_process"] = MagicMock()
sys.modules["frigate.comms.detections_updater"] = MagicMock()
sys.modules["frigate.comms.recordings_updater"] = MagicMock()
sys.modules["frigate.config.camera.updater"] = MagicMock()
# Now import the class under test
from frigate.config import FrigateConfig # noqa: E402
from frigate.record.maintainer import RecordingMaintainer # noqa: E402
# Restore original modules (or remove mock if there was no original)
for name, orig in _originals.items():
if orig is None:
sys.modules.pop(name, None)
else:
sys.modules[name] = orig
class TestMaintainer(unittest.IsolatedAsyncioTestCase):
async def test_move_files_survives_bad_filename(self):

View File

@ -48,7 +48,9 @@ class TestCameraProfileConfig(unittest.TestCase):
def test_partial_review(self):
"""Profile with nested review.alerts.labels."""
profile = CameraProfileConfig(review={"alerts": {"labels": ["person", "car"]}})
profile = CameraProfileConfig(
review={"alerts": {"labels": ["person", "car"]}}
)
assert profile.review is not None
assert profile.review.alerts.labels == ["person", "car"]
@ -114,7 +116,9 @@ class TestCameraProfileConfig(unittest.TestCase):
from pydantic import ValidationError
with self.assertRaises(ValidationError):
CameraProfileConfig(review={"alerts": {"labels": "not_a_list"}})
CameraProfileConfig(
review={"alerts": {"labels": "not_a_list"}}
)
def test_invalid_profile_in_camera_config(self):
"""Invalid profile section in full config is caught at parse time."""
@ -406,14 +410,14 @@ class TestProfileManager(unittest.TestCase):
self.manager.activate_profile("disarmed")
# Back camera has no "disarmed" profile, should be unchanged
assert (
self.config.cameras["back"].notifications.enabled == back_base_notifications
)
assert self.config.cameras["back"].notifications.enabled == back_base_notifications
@patch.object(ProfileManager, "_persist_active_profile")
def test_activate_profile_disables_camera(self, mock_persist):
"""Profile with enabled=false disables the camera."""
self.config.profiles["away"] = ProfileDefinitionConfig(friendly_name="Away")
self.config.profiles["away"] = ProfileDefinitionConfig(
friendly_name="Away"
)
self.config.cameras["front"].profiles["away"] = CameraProfileConfig(
enabled=False
)
@ -427,7 +431,9 @@ class TestProfileManager(unittest.TestCase):
@patch.object(ProfileManager, "_persist_active_profile")
def test_deactivate_restores_enabled(self, mock_persist):
"""Deactivating a profile restores the camera's base enabled state."""
self.config.profiles["away"] = ProfileDefinitionConfig(friendly_name="Away")
self.config.profiles["away"] = ProfileDefinitionConfig(
friendly_name="Away"
)
self.config.cameras["front"].profiles["away"] = CameraProfileConfig(
enabled=False
)
@ -444,7 +450,9 @@ class TestProfileManager(unittest.TestCase):
"""Profile with zones adds/overrides zones on camera."""
from frigate.config.camera.zone import ZoneConfig
self.config.profiles["away"] = ProfileDefinitionConfig(friendly_name="Away")
self.config.profiles["away"] = ProfileDefinitionConfig(
friendly_name="Away"
)
self.config.cameras["front"].profiles["away"] = CameraProfileConfig(
zones={
"driveway": ZoneConfig(
@ -466,7 +474,9 @@ class TestProfileManager(unittest.TestCase):
"""Deactivating a profile restores base zones."""
from frigate.config.camera.zone import ZoneConfig
self.config.profiles["away"] = ProfileDefinitionConfig(friendly_name="Away")
self.config.profiles["away"] = ProfileDefinitionConfig(
friendly_name="Away"
)
self.config.cameras["front"].profiles["away"] = CameraProfileConfig(
zones={
"driveway": ZoneConfig(
@ -492,7 +502,9 @@ class TestProfileManager(unittest.TestCase):
)
from frigate.config.camera.zone import ZoneConfig
self.config.profiles["away"] = ProfileDefinitionConfig(friendly_name="Away")
self.config.profiles["away"] = ProfileDefinitionConfig(
friendly_name="Away"
)
self.config.cameras["front"].profiles["away"] = CameraProfileConfig(
zones={
"driveway": ZoneConfig(
@ -522,7 +534,9 @@ class TestProfileManager(unittest.TestCase):
CameraConfigUpdateTopic,
)
self.config.profiles["away"] = ProfileDefinitionConfig(friendly_name="Away")
self.config.profiles["away"] = ProfileDefinitionConfig(
friendly_name="Away"
)
self.config.cameras["front"].profiles["away"] = CameraProfileConfig(
enabled=False
)
@ -584,7 +598,9 @@ class TestProfilePersistence(unittest.TestCase):
try:
with patch.object(type(PERSISTENCE_FILE), "exists", return_value=True):
with patch.object(type(PERSISTENCE_FILE), "read_text", return_value=""):
with patch.object(
type(PERSISTENCE_FILE), "read_text", return_value=""
):
result = ProfileManager.load_persisted_profile()
assert result is None
finally: