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()