def test_maybe_enqueue_notifications(self) -> None: # We've already tested the "when to send notifications" logic as part of the # notification_data module. # This test is for verifying whether `maybe_enqueue_notifications` returns the # `already_notified` data correctly. params = self.get_maybe_enqueue_notifications_parameters( message_id=1, user_id=1, acting_user_id=2) with mock_queue_publish("zerver.tornado.event_queue.queue_json_publish" ) as mock_queue_json_publish: notified = maybe_enqueue_notifications(**params) mock_queue_json_publish.assert_not_called() with mock_queue_publish("zerver.tornado.event_queue.queue_json_publish" ) as mock_queue_json_publish: params["private_message"] = True notified = maybe_enqueue_notifications(**params) self.assertTrue(mock_queue_json_publish.call_count, 2) queues_pushed = [ entry[0][0] for entry in mock_queue_json_publish.call_args_list ] self.assertIn("missedmessage_mobile_notifications", queues_pushed) self.assertIn("missedmessage_emails", queues_pushed) self.assertTrue(notified["email_notified"]) self.assertTrue(notified["push_notified"])
def test_maybe_enqueue_notifications(self) -> None: # We've already tested the "when to send notifications" logic as part of the # notification_data module. # This test is for verifying whether `maybe_enqueue_notifications` returns the # `already_notified` data correctly. params = self.get_maybe_enqueue_notifications_parameters( message_id=1, user_id=1, acting_user_id=2 ) with mock_queue_publish( "zerver.tornado.event_queue.queue_json_publish" ) as mock_queue_json_publish: notified = maybe_enqueue_notifications(**params) mock_queue_json_publish.assert_not_called() with mock_queue_publish( "zerver.tornado.event_queue.queue_json_publish" ) as mock_queue_json_publish: params["user_notifications_data"] = self.create_user_notifications_data_object( user_id=1, pm_push_notify=True, pm_email_notify=True ) notified = maybe_enqueue_notifications(**params) self.assertTrue(mock_queue_json_publish.call_count, 2) queues_pushed = [entry[0][0] for entry in mock_queue_json_publish.call_args_list] self.assertIn("missedmessage_mobile_notifications", queues_pushed) self.assertIn("missedmessage_emails", queues_pushed) self.assertTrue(notified["email_notified"]) self.assertTrue(notified["push_notified"]) with mock_queue_publish( "zerver.tornado.event_queue.queue_json_publish" ) as mock_queue_json_publish: params = self.get_maybe_enqueue_notifications_parameters( message_id=1, acting_user_id=2, user_id=3, mention_push_notify=True, mention_email_notify=True, mentioned_user_group_id=33, ) notified = maybe_enqueue_notifications(**params) self.assertTrue(mock_queue_json_publish.call_count, 2) push_notice = mock_queue_json_publish.call_args_list[0][0][1] self.assertEqual(push_notice["mentioned_user_group_id"], 33) email_notice = mock_queue_json_publish.call_args_list[1][0][1] self.assertEqual(email_notice["mentioned_user_group_id"], 33)
def check_will_notify(self, **kwargs: Any) -> Tuple[str, str]: hamlet = self.example_user("hamlet") kwargs["user_profile_id"] = hamlet.id kwargs["message_id"] = 32 # Fill up the parameters which weren't sent with defaults. kwargs = self.get_maybe_enqueue_notifications_parameters(**kwargs) email_notice = None mobile_notice = None with mock_queue_publish("zerver.tornado.event_queue.queue_json_publish" ) as mock_queue_json_publish: notified = maybe_enqueue_notifications(**kwargs) for entry in mock_queue_json_publish.call_args_list: args = entry[0] if args[0] == "missedmessage_mobile_notifications": mobile_notice = args[1] if args[0] == "missedmessage_emails": email_notice = args[1] # Now verify the return value matches the queue actions if email_notice: self.assertTrue(notified["email_notified"]) else: self.assertFalse(notified.get("email_notified", False)) if mobile_notice: self.assertTrue(notified["push_notified"]) else: self.assertFalse(notified.get("push_notified", False)) return email_notice, mobile_notice
def check_will_notify(self, *args: Any, **kwargs: Any) -> Tuple[str, str]: email_notice = None mobile_notice = None with mock.patch("zerver.tornado.event_queue.queue_json_publish") as mock_queue_publish: notified = maybe_enqueue_notifications(*args, **kwargs) for entry in mock_queue_publish.call_args_list: args = entry[0] if args[0] == "missedmessage_mobile_notifications": mobile_notice = args[1] if args[0] == "missedmessage_emails": email_notice = args[1] # Now verify the return value matches the queue actions if email_notice: self.assertTrue(notified['email_notified']) else: self.assertFalse(notified.get('email_notified', False)) if mobile_notice: self.assertTrue(notified['push_notified']) else: self.assertFalse(notified.get('push_notified', False)) return email_notice, mobile_notice
def check_will_notify(self, *args: Any, **kwargs: Any) -> Tuple[str, str]: email_notice = None mobile_notice = None with mock.patch("zerver.tornado.event_queue.queue_json_publish") as mock_queue_publish: notified = maybe_enqueue_notifications(*args, **kwargs) for entry in mock_queue_publish.call_args_list: args = entry[0] if args[0] == "missedmessage_mobile_notifications": mobile_notice = args[1] if args[0] == "missedmessage_emails": email_notice = args[1] # Now verify the return value matches the queue actions if email_notice: self.assertTrue(notified['email_notified']) else: self.assertFalse(notified.get('email_notified', False)) if mobile_notice: self.assertTrue(notified['push_notified']) else: self.assertFalse(notified.get('push_notified', False)) return email_notice, mobile_notice
def _get_queued_data_for_message_update( self, message_id: int, content: str, expect_short_circuit: bool = False ) -> Dict[str, Any]: """ This function updates a message with a post to /json/messages/(message_id). By using mocks, we are able to capture two pieces of data: enqueue_kwargs: These are the arguments passed in to maybe_enqueue_notifications. queue_messages: These are the messages that maybe_enqueue_notifications actually puts on the queue. Using this helper allows you to construct a test that goes pretty deep into the missed-messages codepath, without actually queuing the final messages. """ url = "/json/messages/" + str(message_id) request = dict( message_id=message_id, content=content, ) with mock.patch("zerver.tornado.event_queue.maybe_enqueue_notifications") as m: result = self.client_patch(url, request) cordelia = self.example_user("cordelia") cordelia_calls = [ call_args for call_args in m.call_args_list if call_args[1]["user_notifications_data"].user_id == cordelia.id ] if expect_short_circuit: self.assert_length(cordelia_calls, 0) return {} # Normally we expect maybe_enqueue_notifications to be # called for Cordelia, so continue on. self.assert_length(cordelia_calls, 1) enqueue_kwargs = cordelia_calls[0][1] queue_messages = [] def fake_publish(queue_name: str, event: Union[Mapping[str, Any], str], *args: Any) -> None: queue_messages.append( dict( queue_name=queue_name, event=event, ) ) with mock_queue_publish( "zerver.tornado.event_queue.queue_json_publish", side_effect=fake_publish ) as m: maybe_enqueue_notifications(**enqueue_kwargs) self.assert_json_success(result) return dict( enqueue_kwargs=enqueue_kwargs, queue_messages=queue_messages, )
def _get_queued_data_for_message_update(self, message_id: int, content: Text, expect_short_circuit: bool=False) -> Dict[str, Any]: ''' This function updates a message with a post to /json/messages/(message_id). By using mocks, we are able to capture two pieces of data: enqueue_kwargs: These are the arguments passed in to maybe_enqueue_notifications. queue_messages: These are the messages that maybe_enqueue_notifications actually puts on the queue. Using this helper allows you to construct a test that goes pretty deep into the missed-messages codepath, without actually queuing the final messages. ''' url = '/json/messages/' + str(message_id) request = dict( message_id=message_id, content=content, ) with mock.patch('zerver.tornado.event_queue.maybe_enqueue_notifications') as m: result = self.client_patch(url, request) cordelia = self.example_user('cordelia') cordelia_calls = [ call_args for call_args in m.call_args_list if call_args[1]['user_profile_id'] == cordelia.id ] if expect_short_circuit: self.assertEqual(len(cordelia_calls), 0) return {} # Normally we expect maybe_enqueue_notifications to be # called for Cordelia, so continue on. self.assertEqual(len(cordelia_calls), 1) enqueue_kwargs = cordelia_calls[0][1] queue_messages = [] def fake_publish(queue_name: str, event: Union[Mapping[str, Any], str], *args: Any) -> None: queue_messages.append(dict( queue_name=queue_name, event=event, )) with mock.patch('zerver.tornado.event_queue.queue_json_publish') as m: m.side_effect = fake_publish maybe_enqueue_notifications(**enqueue_kwargs) self.assert_json_success(result) return dict( enqueue_kwargs=enqueue_kwargs, queue_messages=queue_messages )
def _get_queued_data_for_message_update(self, message_id, content, expect_short_circuit=False): # type: (int, Text, bool) -> Dict[str, Any] ''' This function updates a message with a post to /json/messages/(message_id). By using mocks, we are able to capture two pieces of data: enqueue_kwargs: These are the arguments passed in to maybe_enqueue_notifications. queue_messages: These are the messages that maybe_enqueue_notifications actually puts on the queue. Using this helper allows you to construct a test that goes pretty deep into the missed-messages codepath, without actually queuing the final messages. ''' url = '/json/messages/' + str(message_id) request = dict( message_id=message_id, content=content, ) with mock.patch( 'zerver.tornado.event_queue.maybe_enqueue_notifications') as m: result = self.client_patch(url, request) cordelia = self.example_user('cordelia') cordelia_calls = [ call_args for call_args in m.call_args_list if call_args[1]['user_profile_id'] == cordelia.id ] if expect_short_circuit: self.assertEqual(len(cordelia_calls), 0) return {} # Normally we expect maybe_enqueue_notifications to be # called for Cordelia, so continue on. self.assertEqual(len(cordelia_calls), 1) enqueue_kwargs = cordelia_calls[0][1] queue_messages = [] def fake_publish(queue_name, event, *args): # type: (str, Union[Mapping[str, Any], str], *Any) -> None queue_messages.append(dict( queue_name=queue_name, event=event, )) with mock.patch('zerver.tornado.event_queue.queue_json_publish') as m: m.side_effect = fake_publish maybe_enqueue_notifications(**enqueue_kwargs) self.assert_json_success(result) return dict(enqueue_kwargs=enqueue_kwargs, queue_messages=queue_messages)