3f671b9899
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>
77 lines
3.0 KiB
Python
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"
|