"""Ops-Alerts: Dedup-Art muss zum gespeicherten Event-kind passen.""" import unittest from unittest.mock import MagicMock, patch from grotti.daily_report import push_ops_alerts class OpsAlertDedupeTests(unittest.TestCase): def test_bedarf_records_matching_kind(self): conn = MagicMock() cfg = {"alerts": {"queue": True}} shortfall = [{ "material_type": "PETG-CF", "color": "#161616", "shortfall_g": 15, }] with patch("grotti.daily_report.jetzt_mod.overdue_orders", return_value=[]), \ patch("grotti.daily_report.jetzt_mod.overdue_maintenance", return_value=[]), \ patch("grotti.daily_report.bedarf_mod.compute", return_value={"shortfall": shortfall}), \ patch("grotti.daily_report.store.list_printers", return_value=[]), \ patch("grotti.daily_report.store.recent_event_kind", return_value=False) as recent, \ patch("grotti.daily_report.notify.record") as record: push_ops_alerts(conn, cfg, printers=[]) recent.assert_called_with( conn, "bedarf:PETG-CF:#161616", "bedarf", within_s=21600, ) record.assert_called_once() args = record.call_args self.assertEqual(args.args[4], "bedarf") self.assertIn("15 g fehlen", args.args[5]) def test_bedarf_skips_when_recent(self): conn = MagicMock() cfg = {"alerts": {"queue": True}} shortfall = [{"material_type": "PLA", "color": "", "shortfall_g": 10}] with patch("grotti.daily_report.jetzt_mod.overdue_orders", return_value=[]), \ patch("grotti.daily_report.jetzt_mod.overdue_maintenance", return_value=[]), \ patch("grotti.daily_report.bedarf_mod.compute", return_value={"shortfall": shortfall}), \ patch("grotti.daily_report.store.list_printers", return_value=[]), \ patch("grotti.daily_report.store.recent_event_kind", return_value=True), \ patch("grotti.daily_report.notify.record") as record: push_ops_alerts(conn, cfg, printers=[]) record.assert_not_called() if __name__ == "__main__": unittest.main()