def test_reaction(self) -> None: sender = self.example_user('othello') receiver = self.example_user('hamlet') recipient = Recipient.objects.get(type_id=receiver.id, type=Recipient.PERSONAL) sending_client = make_client(name="test suite") message = Message( sender=sender, recipient=recipient, content='hello **world**', date_sent=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), edit_history='[]', ) message.set_topic_name('whatever') message.save() reaction = Reaction.objects.create(message=message, user_profile=sender, emoji_name='simple_smile') row = MessageDict.get_raw_db_rows([message.id])[0] msg_dict = MessageDict.build_dict_from_raw_db_row(row) self.assertEqual(msg_dict['reactions'][0]['emoji_name'], reaction.emoji_name) self.assertEqual(msg_dict['reactions'][0]['user_id'], sender.id) self.assertEqual(msg_dict['reactions'][0]['user']['id'], sender.id) self.assertEqual(msg_dict['reactions'][0]['user']['email'], sender.email) self.assertEqual(msg_dict['reactions'][0]['user']['full_name'], sender.full_name)
def test_applying_markdown(self) -> None: sender = self.example_user('othello') receiver = self.example_user('hamlet') recipient = Recipient.objects.get(type_id=receiver.id, type=Recipient.PERSONAL) sending_client = make_client(name="test suite") message = Message( sender=sender, recipient=recipient, content='hello **world**', date_sent=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), edit_history='[]', ) message.set_topic_name('whatever') message.save() # An important part of this test is to get the message through this exact code path, # because there is an ugly hack we need to cover. So don't just say "row = message". row = MessageDict.get_raw_db_rows([message.id])[0] dct = MessageDict.build_dict_from_raw_db_row(row) expected_content = '<p>hello <strong>world</strong></p>' self.assertEqual(dct['rendered_content'], expected_content) message = Message.objects.get(id=message.id) self.assertEqual(message.rendered_content, expected_content) self.assertEqual(message.rendered_content_version, markdown_version)
def test_applying_markdown_invalid_format(self, convert_mock: Any) -> None: # pretend the converter returned an invalid message without raising an exception convert_mock.return_value = None sender = self.example_user('othello') receiver = self.example_user('hamlet') recipient = Recipient.objects.get(type_id=receiver.id, type=Recipient.PERSONAL) sending_client = make_client(name="test suite") message = Message( sender=sender, recipient=recipient, content='hello **world**', date_sent=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), edit_history='[]', ) message.set_topic_name('whatever') message.save() # An important part of this test is to get the message through this exact code path, # because there is an ugly hack we need to cover. So don't just say "row = message". row = MessageDict.get_raw_db_rows([message.id])[0] dct = MessageDict.build_dict_from_raw_db_row(row) error_content = '<p>[Zulip note: Sorry, we could not understand the formatting of your message]</p>' self.assertEqual(dct['rendered_content'], error_content)
def test_reaction(self) -> None: sender = self.example_user("othello") receiver = self.example_user("hamlet") recipient = Recipient.objects.get(type_id=receiver.id, type=Recipient.PERSONAL) sending_client = make_client(name="test suite") message = Message( sender=sender, recipient=recipient, content="hello **world**", date_sent=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), edit_history="[]", ) message.set_topic_name("whatever") message.save() reaction = Reaction.objects.create(message=message, user_profile=sender, emoji_name="simple_smile") row = MessageDict.get_raw_db_rows([message.id])[0] msg_dict = MessageDict.build_dict_from_raw_db_row(row) self.assertEqual(msg_dict["reactions"][0]["emoji_name"], reaction.emoji_name) self.assertEqual(msg_dict["reactions"][0]["user_id"], sender.id) self.assertEqual(msg_dict["reactions"][0]["user"]["id"], sender.id) self.assertEqual(msg_dict["reactions"][0]["user"]["email"], sender.email) self.assertEqual(msg_dict["reactions"][0]["user"]["full_name"], sender.full_name)
def test_bulk_message_fetching(self) -> None: sender = self.example_user('othello') receiver = self.example_user('hamlet') pm_recipient = Recipient.objects.get(type_id=receiver.id, type=Recipient.PERSONAL) stream_name = 'Çiğdem' stream = self.make_stream(stream_name) stream_recipient = Recipient.objects.get(type_id=stream.id, type=Recipient.STREAM) sending_client = make_client(name="test suite") ids = [] for i in range(300): for recipient in [pm_recipient, stream_recipient]: message = Message( sender=sender, recipient=recipient, content=f'whatever {i}', rendered_content='DOES NOT MATTER', rendered_content_version=markdown_version, date_sent=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), edit_history='[]', ) message.set_topic_name('whatever') message.save() ids.append(message.id) Reaction.objects.create(user_profile=sender, message=message, emoji_name='simple_smile') num_ids = len(ids) self.assertTrue(num_ids >= 600) flush_per_request_caches() t = time.time() with queries_captured() as queries: rows = list(MessageDict.get_raw_db_rows(ids)) objs = [ MessageDict.build_dict_from_raw_db_row(row) for row in rows ] MessageDict.post_process_dicts(objs, apply_markdown=False, client_gravatar=False) delay = time.time() - t # Make sure we don't take longer than 1.5ms per message to # extract messages. Note that we increased this from 1ms to # 1.5ms to handle tests running in parallel being a bit # slower. error_msg = f"Number of ids: {num_ids}. Time delay: {delay}" self.assertTrue(delay < 0.0015 * num_ids, error_msg) self.assert_length(queries, 7) self.assertEqual(len(rows), num_ids)
def test_bulk_message_fetching(self) -> None: sender = self.example_user("othello") receiver = self.example_user("hamlet") pm_recipient = Recipient.objects.get(type_id=receiver.id, type=Recipient.PERSONAL) stream_name = "Çiğdem" stream = self.make_stream(stream_name) stream_recipient = Recipient.objects.get(type_id=stream.id, type=Recipient.STREAM) sending_client = make_client(name="test suite") ids = [] for i in range(300): for recipient in [pm_recipient, stream_recipient]: message = Message( sender=sender, recipient=recipient, content=f"whatever {i}", rendered_content="DOES NOT MATTER", rendered_content_version=markdown_version, date_sent=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), edit_history="[]", ) message.set_topic_name("whatever") message.save() ids.append(message.id) Reaction.objects.create(user_profile=sender, message=message, emoji_name="simple_smile") num_ids = len(ids) self.assertTrue(num_ids >= 600) flush_per_request_caches() with queries_captured() as queries: rows = list(MessageDict.get_raw_db_rows(ids)) objs = [ MessageDict.build_dict_from_raw_db_row(row) for row in rows ] MessageDict.post_process_dicts(objs, apply_markdown=False, client_gravatar=False) self.assert_length(queries, 7) self.assert_length(rows, num_ids)
def test_get_raw_db_rows(self) -> None: cordelia = self.example_user("cordelia") hamlet = self.example_user("hamlet") stream_name = "Verona" message_id = self.send_stream_message( sender=cordelia, stream_name=stream_name, ) def get_raw_rows() -> List[Dict[str, Any]]: query = SubMessage.get_raw_db_rows([message_id]) rows = list(query) return rows rows = get_raw_rows() self.assertEqual(rows, []) sm1 = SubMessage.objects.create( msg_type="whatever", content="stuff1", message_id=message_id, sender=cordelia, ) sm2 = SubMessage.objects.create( msg_type="whatever", content="stuff2", message_id=message_id, sender=hamlet, ) expected_data = [ dict( id=sm1.id, message_id=message_id, sender_id=cordelia.id, msg_type="whatever", content="stuff1", ), dict( id=sm2.id, message_id=message_id, sender_id=hamlet.id, msg_type="whatever", content="stuff2", ), ] self.assertEqual(get_raw_rows(), expected_data) message = Message.objects.get(id=message_id) message_json = MessageDict.wide_dict(message) rows = message_json["submessages"] rows.sort(key=lambda r: r["id"]) self.assertEqual(rows, expected_data) msg_rows = MessageDict.get_raw_db_rows([message_id]) rows = msg_rows[0]["submessages"] rows.sort(key=lambda r: r["id"]) self.assertEqual(rows, expected_data)
def test_get_raw_db_rows(self) -> None: cordelia = self.example_user('cordelia') hamlet = self.example_user('hamlet') stream_name = 'Verona' message_id = self.send_stream_message( sender_email=cordelia.email, stream_name=stream_name, ) def get_raw_rows() -> List[Dict[str, Any]]: query = SubMessage.get_raw_db_rows([message_id]) rows = list(query) return rows rows = get_raw_rows() self.assertEqual(rows, []) sm1 = SubMessage.objects.create( msg_type='whatever', content='stuff1', message_id=message_id, sender=cordelia, ) sm2 = SubMessage.objects.create( msg_type='whatever', content='stuff2', message_id=message_id, sender=hamlet, ) expected_data = [ dict( id=sm1.id, message_id=message_id, sender_id=cordelia.id, msg_type='whatever', content='stuff1', ), dict( id=sm2.id, message_id=message_id, sender_id=hamlet.id, msg_type='whatever', content='stuff2', ), ] self.assertEqual(get_raw_rows(), expected_data) message = Message.objects.get(id=message_id) message_json = MessageDict.wide_dict(message) rows = message_json['submessages'] rows.sort(key=lambda r: r['id']) self.assertEqual(rows, expected_data) msg_rows = MessageDict.get_raw_db_rows([message_id]) rows = msg_rows[0]['submessages'] rows.sort(key=lambda r: r['id']) self.assertEqual(rows, expected_data)