Skip to content

Commit ff207ca

Browse files
committed
fix(fcm): Support datetime.timedelta in V2 vibrate_timings_millis validation
1 parent 322c1d5 commit ff207ca

2 files changed

Lines changed: 26 additions & 5 deletions

File tree

firebase_admin/_messaging_encoder.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,23 @@ def check_number_list(cls, label, value):
225225
raise ValueError(f'{label} must not contain non-number values.')
226226
return value
227227

228+
@classmethod
229+
def check_vibrate_timings(cls, label, value):
230+
"""Checks if the given value is a list comprised of numbers or datetime.timedelta
231+
instances.
232+
"""
233+
if value is None or value == []:
234+
return None
235+
if not isinstance(value, list):
236+
raise ValueError(f'{label} must be a list of numbers or datetime.timedelta instances.')
237+
non_valid = [
238+
k for k in value
239+
if not isinstance(k, (numbers.Number, datetime.timedelta))
240+
]
241+
if non_valid:
242+
raise ValueError(f'{label} must not contain non-number or non-timedelta values.')
243+
return value
244+
228245
@classmethod
229246
def check_analytics_label(cls, label, value):
230247
"""Checks if the given value is a valid analytics label."""
@@ -573,7 +590,7 @@ def encode_android_notification_v2(cls, notification):
573590
'notification_priority': _Validators.check_string(
574591
'AndroidNotificationV2.notification_priority', notification.notification_priority,
575592
non_empty=True),
576-
'vibrate_timings': _Validators.check_number_list(
593+
'vibrate_timings': _Validators.check_vibrate_timings(
577594
'AndroidNotificationV2.vibrate_timings_millis',
578595
notification.vibrate_timings_millis),
579596
'default_vibrate_timings': notification.default_vibrate_timings,

tests/test_messaging.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ def test_android_v2_remote_notification(self):
615615
default_sound=True,
616616
default_vibrate_timings=True,
617617
default_light_settings=True,
618-
vibrate_timings_millis=[500, 1000],
618+
vibrate_timings_millis=[500, datetime.timedelta(seconds=1)],
619619
visibility='private',
620620
notification_count=5,
621621
light_settings=messaging.LightSettings('#ff0000', 500, 1000),
@@ -793,18 +793,22 @@ def test_invalid_title_loc_args(self):
793793
@pytest.mark.parametrize('data', NON_LIST_ARGS)
794794
def test_invalid_vibrate_timings_millis(self, data):
795795
notification = messaging.AndroidNotificationV2(vibrate_timings_millis=data)
796-
if isinstance(data, list) and not [x for x in data if not isinstance(x, numbers.Number)]:
796+
is_valid_list = (
797+
isinstance(data, list)
798+
and not [x for x in data if not isinstance(x, (numbers.Number, datetime.timedelta))]
799+
)
800+
if is_valid_list:
797801
return
798802
excinfo = self._check_notification(notification)
799803
if isinstance(data, list):
800804
expected = (
801805
'AndroidNotificationV2.vibrate_timings_millis must not contain '
802-
'non-number values.'
806+
'non-number or non-timedelta values.'
803807
)
804808
else:
805809
expected = (
806810
'AndroidNotificationV2.vibrate_timings_millis must be a list of '
807-
'numbers.'
811+
'numbers or datetime.timedelta instances.'
808812
)
809813
assert str(excinfo.value) == expected
810814

0 commit comments

Comments
 (0)