From 287c4ed2bbdeef91bd0c0f9e952c3340c846bdb9 Mon Sep 17 00:00:00 2001 From: akshatdalton Date: Wed, 9 Sep 2020 05:38:17 +0000 Subject: [PATCH] markdown: Fix Youtube and Vimeo preview overriding markdown link titles bug. Initially markdown titles were overridden by Youtube and Vimeo preview titles. But now it will check if any markdown title is present to replace Youtube or Vimeo preview titles, if preview of linked websites is enabled. Fixes #16100 --- zerver/lib/markdown/__init__.py | 10 ++++++++-- zerver/tests/test_link_embed.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/zerver/lib/markdown/__init__.py b/zerver/lib/markdown/__init__.py index ad642916c7..cef6c885cf 100644 --- a/zerver/lib/markdown/__init__.py +++ b/zerver/lib/markdown/__init__.py @@ -1234,13 +1234,19 @@ class InlineInterestingLinkProcessor(markdown.treeprocessors.Treeprocessor): if youtube is not None: title = self.youtube_title(extracted_data) if title is not None: - found_url.family.child.text = title + if url == text: + found_url.family.child.text = title + else: + found_url.family.child.text = text continue self.add_embed(root, url, extracted_data) if self.vimeo_id(url): title = self.vimeo_title(extracted_data) if title: - found_url.family.child.text = title + if url == text: + found_url.family.child.text = title + else: + found_url.family.child.text = text class Timestamp(markdown.inlinepatterns.Pattern): def handleMatch(self, match: Match[str]) -> Optional[Element]: diff --git a/zerver/tests/test_link_embed.py b/zerver/tests/test_link_embed.py index e2ba1d777c..31d731fb2e 100644 --- a/zerver/tests/test_link_embed.py +++ b/zerver/tests/test_link_embed.py @@ -741,3 +741,34 @@ class PreviewTestCase(ZulipTestCase): msg.refresh_from_db() expected_content = '

YouTube - Clearer Code at Scale - Static Types at Zulip and Dropbox

\n
' self.assertEqual(expected_content, msg.rendered_content) + + @override_settings(INLINE_URL_EMBED_PREVIEW=True) + def test_custom_title_replaces_youtube_url_title(self) -> None: + url = '[Youtube link](https://www.youtube.com/watch?v=eSJTXC7Ixgg)' + with mock_queue_publish('zerver.lib.actions.queue_json_publish'): + msg_id = self.send_personal_message( + self.example_user('hamlet'), + self.example_user('cordelia'), + content=url, + ) + msg = Message.objects.select_related("sender").get(id=msg_id) + event = { + 'message_id': msg_id, + 'urls': [url], + 'message_realm_id': msg.sender.realm_id, + 'message_content': url} + + mocked_data = {'title': 'Clearer Code at Scale - Static Types at Zulip and Dropbox'} + mocked_response = mock.Mock(side_effect=self.create_mock_response(url)) + with self.settings(TEST_SUITE=False, CACHES=TEST_CACHES): + with mock.patch('requests.get', mocked_response), self.assertLogs(level='INFO') as info_logs: + with mock.patch('zerver.lib.markdown.link_preview.link_embed_data_from_cache', + lambda *args, **kwargs: mocked_data): + FetchLinksEmbedData().consume(event) + self.assertTrue( + 'INFO:root:Time spent on get_link_embed_data for [Youtube link](https://www.youtube.com/watch?v=eSJTXC7Ixgg):' in info_logs.output[0] + ) + + msg.refresh_from_db() + expected_content = '

Youtube link

\n
' + self.assertEqual(expected_content, msg.rendered_content)