feat: alerts (M8), notifications config page, and app icon (0.4.0)
release / release (push) Successful in 14s
release / release (push) Successful in 14s
- feat(alerts): desktop notifications (notify-send) for overheat (GPU/CPU past a configurable threshold), GPU-lost, and a new-version-available alert (once per version). Edge-triggered with cooldown so it doesn't spam (core/alerts.py) - feat(gui): Notifications page to configure alerts (enable, GPU/CPU thresholds, Send test); changes apply live and persist via config.save_config/update_config - feat(gui): ship a RigDoctor icon; the GUI self-registers the icon + .desktop on launch and sets the Wayland app-id, so the dock shows it after an update + relaunch (no installer re-run); installer/uninstaller updated to manage the icon - config: alerts_enabled, gpu_temp_alert, cpu_temp_alert; flat-TOML writer - tests for the alert monitor and config round-trip Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
"""Tests for the M8 alert monitor (edge-triggered; notify mocked)."""
|
||||
|
||||
import unittest
|
||||
from unittest import mock
|
||||
|
||||
from rigdoctor.core import alerts
|
||||
from rigdoctor.core.sample import Reading, Sample
|
||||
|
||||
|
||||
def _gpu(temp):
|
||||
return Sample(readings=[Reading("gpu", "temp", temp, "°C")])
|
||||
|
||||
|
||||
class AlertTests(unittest.TestCase):
|
||||
@mock.patch.object(alerts, "notify")
|
||||
def test_edge_triggered_no_repeat(self, m):
|
||||
mon = alerts.AlertMonitor(gpu_temp=90.0, cooldown=0.0)
|
||||
mon.check(_gpu(95)) # fires
|
||||
mon.check(_gpu(96)) # still hot — no repeat while active
|
||||
self.assertEqual(m.call_count, 1)
|
||||
mon.check(_gpu(50)) # clears
|
||||
mon.check(_gpu(95)) # hot again — fires
|
||||
self.assertEqual(m.call_count, 2)
|
||||
|
||||
@mock.patch.object(alerts, "notify")
|
||||
def test_no_alert_below_threshold(self, m):
|
||||
alerts.AlertMonitor(gpu_temp=90.0).check(_gpu(70))
|
||||
m.assert_not_called()
|
||||
|
||||
@mock.patch.object(alerts, "notify")
|
||||
def test_gpu_lost(self, m):
|
||||
mon = alerts.AlertMonitor()
|
||||
mon.check(Sample(readings=[Reading("gpu", "status", None, "", "query-timeout")]))
|
||||
m.assert_called_once()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user