8000 Reading FCM error code from details section (#146) · akshatz/firebase-admin-python@9239585 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9239585

Browse files
authored
Reading FCM error code from details section (firebase#146)
* Reading FCM error code from details section * Early terminating the loop
1 parent 1af54ed commit 9239585

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

firebase_admin/messaging.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -816,10 +816,17 @@ def _handle_fcm_error(self, error):
816816
except ValueError:
817817
pass
818818

819-
error_details = data.get('error', {})
820-
code = _MessagingService.FCM_ERROR_CODES.get(
821-
error_details.get('status'), _MessagingService.UNKNOWN_ERROR)
822-
msg = error_details.get('message')
819+
error_dict = data.get('error', {})
820+
server_code = None
821+
for detail in error_dict.get('details', []):
822+
if detail.get('@type') == 'type.googleapis.com/google.firebase.fcm.v1.FcmErrorCode':
823+
server_code = detail.get('errorCode')
824+
break
825+
if not server_code:
826+
server_code = error_dict.get('status')
827+
code = _MessagingService.FCM_ERROR_CODES.get(server_code, _MessagingService.UNKNOWN_ERROR)
828+
829+
msg = error_dict.get('message')
823830
if not msg:
824831
msg = 'Unexpected HTTP response with status: {0}; body: {1}'.format(
825832
error.response.status_code, error.response.content.decode())

tests/test_messaging.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,32 @@ def test_send_canonical_error_code(self, status):
914914
body = {'message': messaging._MessagingService.JSON_ENCODER.default(msg)}
915915
assert json.loads(recorder[0].body.decode()) == body
916916

917+
@pytest.mark.parametrize('status', HTTP_ERRORS)
918+
def test_send_fcm_error_code(self, status):
919+
payload = json.dumps({
920+
'error': {
921+
'status': 'INVALID_ARGUMENT',
922+
'message': 'test error',
923+
'details': [
924+
{
925+
'@type': 'type.googleapis.com/google.firebase.fcm.v1.FcmErrorCode',
926+
'errorCode': 'UNREGISTERED',
927+
},
928+
],
929+
}
930+
})
931+
_, recorder = self._instrument_messaging_service(status=status, payload=payload)
932+
msg = messaging.Message(topic='foo')
933+
with pytest.raises(messaging.ApiCallError) as excinfo:
934+
messaging.send(msg)
935+
assert str(excinfo.value) == 'test error'
936+
assert str(excinfo.value.code) == 'registration-token-not-registered'
937+
assert len(recorder) == 1
938+
assert recorder[0].method == 'POST'
939+
assert recorder[0].url == self._get_url('explicit-project-id')
940+
body = {'message': messaging._MessagingService.JSON_ENCODER.default(msg)}
941+
assert json.loads(recorder[0].body.decode()) == body
942+
917943

918944
class TestTopicManagement(object):
919945

0 commit comments

Comments
 (0)
0