Files
security-alert-center/backend/tests/test_mobile_notify.py
T
PapaTramp 3f671b9899 fix: FCM data-only push so Seaca controls sound (0.9.6)
Send title and body in the data payload instead of notification block so
onMessageReceived always runs and the app can honour silent mode in background.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-11 10:03:28 +10:00

77 lines
3.0 KiB
Python

"""FCM push must not break event ingest."""
from unittest.mock import MagicMock, patch
import pytest
from app.services.mobile_notify import MobileNotConfiguredError, _send_fcm_data
def test_send_fcm_data_swallows_token_errors_by_default():
with patch(
"app.services.mobile_notify._fcm_access_token",
side_effect=MobileNotConfiguredError("FCM: install requests"),
):
with patch("app.services.mobile_notify.get_effective_fcm_config") as mock_cfg:
mock_cfg.return_value.enabled = True
mock_cfg.return_value.project_id = "proj"
mock_cfg.return_value.service_account_path = "/etc/fcm.json"
mock_cfg.return_value.configured = True
mock_cfg.return_value.active = True
_send_fcm_data(["token"], {"kind": "test"}, title="t", body="b")
def test_send_fcm_data_raises_token_errors_when_required():
with patch(
"app.services.mobile_notify._fcm_access_token",
side_effect=MobileNotConfiguredError("FCM: install requests"),
):
with patch("app.services.mobile_notify.get_effective_fcm_config") as mock_cfg:
mock_cfg.return_value.enabled = True
mock_cfg.return_value.project_id = "proj"
mock_cfg.return_value.service_account_path = "/etc/fcm.json"
mock_cfg.return_value.configured = True
mock_cfg.return_value.active = True
with pytest.raises(MobileNotConfiguredError):
_send_fcm_data(
["token"],
{"kind": "test"},
title="t",
body="b",
require_success=True,
)
def test_send_fcm_data_payload_is_data_only():
posted: list[dict] = []
def capture_post(_url, *, headers, json):
posted.append(json)
response = MagicMock()
response.raise_for_status.return_value = None
return response
with patch("app.services.mobile_notify._fcm_access_token", return_value="token"):
with patch("app.services.mobile_notify.get_effective_fcm_config") as mock_cfg:
mock_cfg.return_value.enabled = True
mock_cfg.return_value.project_id = "proj"
mock_cfg.return_value.service_account_path = "/etc/fcm.json"
mock_cfg.return_value.configured = True
mock_cfg.return_value.active = True
with patch("httpx.Client") as mock_client:
mock_client.return_value.__enter__.return_value.post = capture_post
_send_fcm_data(
["device-token"],
{"kind": "event", "id": "42", "severity": "high"},
title="Alert",
body="Summary text",
)
assert len(posted) == 1
message = posted[0]["message"]
assert "notification" not in message
assert message["data"]["title"] == "Alert"
assert message["data"]["body"] == "Summary text"
assert message["data"]["kind"] == "event"
assert message["data"]["id"] == "42"