push: Add new formatting for stream message push and add tests.

This should make the push notifications for messages to streams with
the new stream push notifications setting enabled make sense.
This commit is contained in:
Sarah
2017-09-09 15:47:36 -07:00
committed by Tim Abbott
parent c3a8138f74
commit 97571a203d
3 changed files with 156 additions and 14 deletions

View File

@@ -329,12 +329,15 @@ def get_alert_from_message(message):
Determine what alert string to display based on the missed messages.
"""
sender_str = message.sender.full_name
if message.recipient.type == Recipient.HUDDLE:
if message.recipient.type == Recipient.HUDDLE and message.triggers['received_pm']:
return "New private group message from %s" % (sender_str,)
elif message.recipient.type == Recipient.PERSONAL:
elif message.recipient.type == Recipient.PERSONAL and message.triggers['received_pm']:
return "New private message from %s" % (sender_str,)
elif message.recipient.type == Recipient.STREAM:
elif message.recipient.type == Recipient.STREAM and message.triggers['mentioned']:
return "New mention from %s" % (sender_str,)
elif (message.recipient.type == Recipient.STREAM and
(message.triggers['stream_push_notify'] and message.stream_name)):
return "New stream message from %s in %s" % (sender_str, message.stream_name,)
else:
return "New Zulip mentions and private messages from %s" % (sender_str,)
@@ -396,11 +399,20 @@ def handle_push_notification(user_profile_id, missed_message):
umessage = UserMessage.objects.get(user_profile=user_profile,
message__id=missed_message['message_id'])
message = umessage.message
triggers = missed_message.get('triggers')
message.triggers = {
'received_pm': triggers.get('received_pm', False),
'mentioned': triggers.get('mentioned', False),
'stream_push_notify': triggers.get('stream_push_notify', False),
}
message.stream_name = missed_message.get('stream_name', None)
if umessage.flags.read:
return
logging.info("Sending push notification to user %s" % (user_profile_id))
apns_payload = get_apns_payload(message)
gcm_payload = get_gcm_payload(user_profile, message)
logging.info("Sending push notification to user %s" % (user_profile_id,))
if uses_notification_bouncer():
try:

View File

@@ -337,7 +337,14 @@ class HandlePushNotificationTest(PushNotificationTest):
message=message
)
missed_message = {'message_id': message.id}
missed_message = {
'message_id': message.id,
'triggers': {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
},
}
with self.settings(PUSH_NOTIFICATION_BOUNCER_URL=''), \
mock.patch('zerver.lib.push_notifications.requests.request',
side_effect=self.bounce_request), \
@@ -388,8 +395,15 @@ class HandlePushNotificationTest(PushNotificationTest):
# type: (Any, Any, Any) -> None
apn.handle_push_notification(event['user_profile_id'], event)
missed_message = {'user_profile_id': self.user_profile.id,
'message_id': message.id}
missed_message = {
'user_profile_id': self.user_profile.id,
'message_id': message.id,
'triggers': {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
},
}
with self.settings(PUSH_NOTIFICATION_BOUNCER_URL=''), \
mock.patch('zerver.lib.push_notifications.requests.request',
side_effect=self.bounce_request), \
@@ -433,7 +447,14 @@ class HandlePushNotificationTest(PushNotificationTest):
message=message
)
missed_message = {'message_id': message.id}
missed_message = {
'message_id': message.id,
'triggers': {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
},
}
apn.handle_push_notification(user_profile.id, missed_message)
def test_send_notifications_to_bouncer(self):
@@ -445,7 +466,14 @@ class HandlePushNotificationTest(PushNotificationTest):
message=message
)
missed_message = {'message_id': message.id}
missed_message = {
'message_id': message.id,
'triggers': {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
},
}
with self.settings(PUSH_NOTIFICATION_BOUNCER_URL=True), \
mock.patch('zerver.lib.push_notifications.get_apns_payload',
return_value={'apns': True}), \
@@ -481,7 +509,14 @@ class HandlePushNotificationTest(PushNotificationTest):
PushDeviceToken.objects.filter(user=self.user_profile,
kind=PushDeviceToken.APNS))
missed_message = {'message_id': message.id}
missed_message = {
'message_id': message.id,
'triggers': {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
},
}
with mock.patch('zerver.lib.push_notifications.get_apns_payload',
return_value={'apns': True}), \
mock.patch('zerver.lib.push_notifications.get_gcm_payload',
@@ -547,14 +582,60 @@ class TestAPNs(PushNotificationTest):
self.user_profile.id, device.token)
class TestGetAlertFromMessage(PushNotificationTest):
def test_get_alert_from_message(self):
def test_get_alert_from_private_group_message(self):
# type: () -> None
alert = apn.get_alert_from_message(self.get_message(Recipient.HUDDLE))
message = self.get_message(Recipient.HUDDLE)
message.triggers = {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
}
alert = apn.get_alert_from_message(message)
self.assertEqual(alert, "New private group message from King Hamlet")
alert = apn.get_alert_from_message(self.get_message(Recipient.PERSONAL))
def test_get_alert_from_private_message(self):
# type: () -> None
message = self.get_message(Recipient.PERSONAL)
message.triggers = {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
}
alert = apn.get_alert_from_message(message)
self.assertEqual(alert, "New private message from King Hamlet")
alert = apn.get_alert_from_message(self.get_message(Recipient.STREAM))
def test_get_alert_from_mention(self):
# type: () -> None
message = self.get_message(Recipient.STREAM)
message.triggers = {
'received_pm': False,
'mentioned': True,
'stream_push_notify': False,
}
alert = apn.get_alert_from_message(message)
self.assertEqual(alert, "New mention from King Hamlet")
def test_get_alert_from_stream_message(self):
# type: () -> None
message = self.get_message(Recipient.STREAM)
message.triggers = {
'received_pm': False,
'mentioned': False,
'stream_push_notify': True,
}
message.stream_name = 'Denmark'
alert = apn.get_alert_from_message(message)
self.assertEqual(alert, "New stream message from King Hamlet in Denmark")
def test_get_alert_from_other_message(self):
# type: () -> None
message = self.get_message(0)
message.triggers = {
'received_pm': False,
'mentioned': False,
'stream_push_notify': False,
}
alert = apn.get_alert_from_message(message)
alert = apn.get_alert_from_message(self.get_message(0))
self.assertEqual(alert,
"New Zulip mentions and private messages from King "
@@ -564,6 +645,11 @@ class TestGetAPNsPayload(PushNotificationTest):
def test_get_apns_payload(self):
# type: () -> None
message = self.get_message(Recipient.HUDDLE)
message.triggers = {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
}
payload = apn.get_apns_payload(message)
expected = {
'alert': "New private group message from King Hamlet",
@@ -583,6 +669,11 @@ class TestGetGCMPayload(PushNotificationTest):
message = self.get_message(Recipient.STREAM, stream.id)
message.content = 'a' * 210
message.save()
message.triggers = {
'received_pm': False,
'mentioned': True,
'stream_push_notify': False,
}
user_profile = self.example_user('hamlet')
payload = apn.get_gcm_payload(user_profile, message)
@@ -606,6 +697,11 @@ class TestGetGCMPayload(PushNotificationTest):
def test_get_gcm_payload_personal(self):
# type: () -> None
message = self.get_message(Recipient.PERSONAL, 1)
message.triggers = {
'received_pm': True,
'mentioned': False,
'stream_push_notify': False,
}
user_profile = self.example_user('hamlet')
payload = apn.get_gcm_payload(user_profile, message)
expected = {
@@ -623,6 +719,34 @@ class TestGetGCMPayload(PushNotificationTest):
}
self.assertDictEqual(payload, expected)
def test_get_gcm_payload_stream_notifications(self):
# type: () -> None
message = self.get_message(Recipient.STREAM, 1)
message.triggers = {
'received_pm': False,
'mentioned': False,
'stream_push_notify': True,
}
message.stream_name = 'Denmark'
user_profile = self.example_user('hamlet')
payload = apn.get_gcm_payload(user_profile, message)
expected = {
"user": user_profile.email,
"event": "message",
"alert": "New stream message from King Hamlet in Denmark",
"zulip_message_id": message.id,
"time": apn.datetime_to_timestamp(message.pub_date),
"content": message.content,
"content_truncated": False,
"sender_email": self.example_email("hamlet"),
"sender_full_name": "King Hamlet",
"sender_avatar_url": apn.absolute_avatar_url(message.sender),
"recipient_type": "stream",
"topic": "Test Message",
"stream": "Denmark"
}
self.assertDictEqual(payload, expected)
class TestSendNotificationsToBouncer(ZulipTestCase):
@mock.patch('zerver.lib.push_notifications.send_to_push_bouncer')
def test_send_notifications_to_bouncer(self, mock_send):

View File

@@ -698,6 +698,12 @@ def process_message_event(event_template, users):
if (idle or always_push_notify):
notice = build_offline_notification(user_profile_id, message_id)
notice['triggers'] = {
'received_pm': received_pm,
'mentioned': mentioned,
'stream_push_notify': stream_push_notify,
}
notice['stream_name'] = event_template.get('stream_name')
queue_json_publish("missedmessage_mobile_notifications", notice, lambda notice: None)
notified = dict(push_notified=True) # type: Dict[str, bool]
# Don't send missed message emails if always_push_notify or stream_push_notify is True