import json import unittest from unittest import mock import packed_backup_notification as notification def successful_result(): return { "status": "succeeded", "kubernetes_context": "example-only", "run_id": "run-1", "backup_name": "20260804/120000.meta", "pack_jobs": 4, "export_jobs": 4, "watermark_jobs": 1, "verified_complete_markers": 3, "unverified_complete_marker_clusters": 1, "mysql_updated_clusters": 3, "mysql_update_failed_clusters": 1, "pack_duration_seconds": 123, "export_duration_seconds": 497, "watermark_duration_seconds": 24, } class NotificationTests(unittest.TestCase): def test_public_interface_only_exposes_send(self): self.assertEqual(notification.__all__, ("send_notification",)) def test_success_notification_uses_compact_card_with_muted_keys(self): result = successful_result() self.assertEqual( notification._notification_text(result), "Packed backup CSV export succeeded.\n" "context: example-only\n" "run: run-1\n" "backup: 20260804/120000.meta\n" "jobs: pack=4 export=4 watermark=1\n" "watermark: verified=3 unverified=1 " "mysql_updated=3 mysql_update_failed=1\n" "duration: pack=0:02:03 export=0:08:17 watermark=0:00:24", ) payload = notification._notification_payload(result) self.assertEqual(payload["msg_type"], "interactive") self.assertNotIn("header", payload["card"]) self.assertEqual( payload["card"]["elements"], [ { "tag": "div", "text": { "tag": "lark_md", "content": notification._notification_markdown(result), }, } ], ) markdown = notification._notification_markdown(result) self.assertIn( "context: **example-only**", markdown, ) self.assertIn( "**succeeded**", markdown, ) self.assertIn( "unverified=" "**1**", markdown, ) def test_failure_notification_escapes_dynamic_markdown(self): result = { "status": "failed", "kubernetes_context": "context_*", "run_id": "run-1", "backup_name": "20260804/120000.meta", "stage": "watermark_reconcile", "verified_complete_markers": 2, "mysql_updated_clusters": 1, "error": "bad **message**\nnext", } markdown = notification._notification_markdown(result) self.assertNotIn("", markdown) self.assertNotIn("**message**", markdown) self.assertIn( "**failed**", markdown, ) self.assertIn( "bad <at id=all> **message** next", markdown, ) def test_send_notification_posts_the_private_payload(self): response = mock.MagicMock() response.__enter__.return_value = response response.read.return_value = b'{"code":0,"msg":"success"}' with mock.patch.object( notification, "urlopen", return_value=response, ) as open_url: error = notification.send_notification( "https://open.larksuite.com/open-apis/bot/v2/hook/test", successful_result(), ) self.assertIsNone(error) request = open_url.call_args.args[0] self.assertEqual( json.loads(request.data.decode("utf-8")), notification._notification_payload(successful_result()), ) self.assertEqual(open_url.call_args.kwargs, {"timeout": 30}) if __name__ == "__main__": unittest.main()