From a39e17abbebf515f7dabde6c9fa13ea485310798 Mon Sep 17 00:00:00 2001 From: Zed Date: Sat, 8 Aug 2026 23:09:39 +0700 Subject: [PATCH] Add embed test suite --- tests/test_embed.py | 204 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 tests/test_embed.py diff --git a/tests/test_embed.py b/tests/test_embed.py new file mode 100644 index 0000000..c15d247 --- /dev/null +++ b/tests/test_embed.py @@ -0,0 +1,204 @@ +import requests +from base import BaseTestCase, Media +from parameterized import parameterized + + +class Embed: + container = '.tweet-embed' + footer = '.embed-footer' + tweet_content = '.tweet-content' + tweet_header = '.tweet-header' + fullname = '.fullname' + username = '.username' + avatar = '.avatar' + stats = '.tweet-stats' + quote = '.quote' + error_panel = '.error-panel' + + +class TweetEmbedTest(BaseTestCase): + """Test tweet embed rendering.""" + tweet = 'elonmusk/status/1141367104702038016' + + def test_embed_container_visible(self): + self.open_nitter(self.tweet + '/embed') + self.assert_element_visible(Embed.container) + + def test_embed_has_footer(self): + self.open_nitter(self.tweet + '/embed') + self.assert_element_visible(Embed.footer) + self.assert_text_visible('Read more on', Embed.footer) + + def test_embed_has_tweet_content(self): + self.open_nitter(self.tweet + '/embed') + self.assert_element_visible(Embed.tweet_content) + + def test_embed_has_avatar(self): + self.open_nitter(self.tweet + '/embed') + self.assert_element_visible(Embed.avatar) + + def test_embed_has_username(self): + self.open_nitter(self.tweet + '/embed') + self.assert_element_visible(Embed.username) + + def test_embed_has_stats(self): + self.open_nitter(self.tweet + '/embed') + self.assert_element_visible(Embed.stats) + + def test_embed_footer_links_to_tweet(self): + self.open_nitter(self.tweet + '/embed') + href = self.get_attribute(Embed.footer, 'href') + self.assertIn('/elonmusk/status/1141367104702038016', href) + + +class TweetEmbedMediaTest(BaseTestCase): + """Test embed rendering with various media types.""" + + def test_embed_with_image(self): + self.open_nitter('mobile_test/status/519364660823207936/embed') + self.assert_element_visible(Embed.container) + self.scroll_to(Media.container) + self.assert_element_visible(Media.image) + + def test_embed_with_gif(self): + self.open_nitter('elonmusk/status/1141367104702038016/embed') + self.assert_element_visible(Embed.container) + self.scroll_to(Media.container) + self.assert_element_visible(Media.gif) + + def test_embed_with_video(self): + self.open_nitter('d0m96/status/1078373829917974528/embed') + self.assert_element_visible(Embed.container) + self.scroll_to(Media.container) + self.assert_element_visible(Media.video) + + def test_embed_with_gallery(self): + self.open_nitter('mobile_test/status/451108446603980803/embed') + self.assert_element_visible(Embed.container) + self.scroll_to(Media.container) + self.assert_element_visible(Media.row) + + +class TweetEmbedQuoteTest(BaseTestCase): + """Test embed rendering with quoted tweets.""" + + def test_embed_with_quote_shows_quote(self): + self.open_nitter('elonmusk/status/1138827760107790336/embed') + self.assert_element_visible(Embed.container) + self.assert_element_visible(Embed.quote) + + def test_embed_quote_has_content(self): + self.open_nitter('elonmusk/status/1138827760107790336/embed') + quote = self.find_element(Embed.quote) + self.assertIsNotNone(quote.text) + + +class EmbedErrorTest(BaseTestCase): + """Test embed error handling.""" + + def test_nonexistent_tweet_shows_error(self): + self.open_nitter('nobody/status/1/embed') + self.assert_element_visible('.tweet-embed.error-embed') + self.assert_text_visible('not found', Embed.error_panel) + + def test_protected_account_embed_shows_error(self): + self.open_nitter('mobile_test_7/status/1/embed') + self.assert_element_visible('.tweet-embed.error-embed') + + def test_invalid_tweet_id_shows_error(self): + self.open_nitter('jack/status/notanumber/embed') + self.assert_element_visible('.tweet-embed.error-embed') + + +class OEmbedApiTest(BaseTestCase): + """Test oEmbed API endpoint.""" + base_url = 'http://localhost:8080' + tweet_url = 'https://twitter.com/elonmusk/status/1141367104702038016' + + def test_oembed_returns_json(self): + resp = requests.get(f'{self.base_url}/api/oembed?url={self.tweet_url}') + self.assertEqual(resp.status_code, 200) + self.assertEqual(resp.headers['Content-Type'], 'application/json') + + def test_oembed_has_required_fields(self): + resp = requests.get(f'{self.base_url}/api/oembed?url={self.tweet_url}') + data = resp.json() + self.assertEqual(data['type'], 'rich') + self.assertEqual(data['version'], '1.0') + self.assertIn('html', data) + self.assertIn('author_name', data) + self.assertIn('provider_name', data) + + def test_oembed_html_contains_iframe(self): + resp = requests.get(f'{self.base_url}/api/oembed?url={self.tweet_url}') + data = resp.json() + self.assertIn('