test_tweet.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. from base import BaseTestCase, Tweet, get_timeline_tweet
  2. from parameterized import parameterized
  3. # image = tweet + 'div.attachments.media-body > div > div > a > div > img'
  4. # self.assert_true(self.get_image_url(image).split('/')[0] == 'http')
  5. timeline = [
  6. [1, 'Test account', 'mobile_test', '10 Aug 2016', '763483571793174528',
  7. '.'],
  8. [3, 'Test account', 'mobile_test', '3 Mar 2016', '705522133443571712',
  9. 'LIVE on #Periscope pscp.tv/w/aadiTzF6dkVOTXZSbX…'],
  10. [6, 'mobile test 2', 'mobile_test_2', '1 Oct 2014', '517449200045277184',
  11. 'Testing. One two three four. Test.']
  12. ]
  13. status = [
  14. [20, 'jack 🌍🌏🌎', 'jack', '21 Mar 2006', 'just setting up my twttr'],
  15. [134849778302464000, 'The Twoffice', 'TheTwoffice', '10 Nov 2011', 'test'],
  16. [105685475985080322, 'The Twoffice', 'TheTwoffice', '22 Aug 2011', 'regular tweet'],
  17. [572593440719912960, 'Test account', 'mobile_test', '2 Mar 2015', 'testing test']
  18. ]
  19. invalid = [
  20. ['mobile_test/status/120938109238'],
  21. ['TheTwoffice/status/8931928312']
  22. ]
  23. multiline = [
  24. [1102965189392113665, 'piIIowhugs',
  25. """
  26. summoning circle, hope this works
  27. 🕯
  28. 🕯 🕯
  29. 🕯 🕯
  30. 🕯 serotonin 🕯
  31. 🕯 🕯
  32. 🕯 🕯
  33. 🕯"""],
  34. [400897186990284800, 'mobile_test_3',
  35. """
  36. KEEP
  37. CALM
  38. AND
  39. CLICHÉ
  40. ON"""]
  41. ]
  42. link = [
  43. ['nim_lang/status/1110499584852353024', [
  44. 'nim-lang.org/araq/ownedrefs.…',
  45. 'news.ycombinator.com/item?id…',
  46. 'old.reddit.com/r/programming…'
  47. ]],
  48. ['nim_lang/status/1125887775151140864', [
  49. 'en.wikipedia.org/wiki/Nim_(p…'
  50. ]],
  51. ['hiankun_taioan/status/1086916335215341570', [
  52. '(hackernoon.com/interview-wit…)'
  53. ]],
  54. ['archillinks/status/1146302618223951873', [
  55. 'flickr.com/photos/87101284@N…',
  56. 'hisafoto.tumblr.com/post/176…'
  57. ]],
  58. ['archillinks/status/1146292551936335873', [
  59. 'flickr.com/photos/michaelrye…',
  60. 'furtho.tumblr.com/post/16618…'
  61. ]]
  62. ]
  63. username = [
  64. ['Bountysource/status/1094803522053320705', ['nim_lang']],
  65. ['leereilly/status/1058464250098704385', ['godotengine', 'unity3d', 'nim_lang']]
  66. ]
  67. emoji = [
  68. ['Tesla/status/1134850442511257600', '🌈❤️🧡💛💚💙💜']
  69. ]
  70. retweet = [
  71. [7, 'mobile_test_2', 'mobile test 2', 'Test account', '@mobile_test', '1234'],
  72. [3, 'mobile_test_8', 'mobile test 8', 'jack 🌍🌏🌎', '@jack', 'twttr']
  73. ]
  74. reply = [
  75. ['mobile_test?max_position=471336696307392513', '@mobile_test', '@mobile_test'],
  76. ['mobile_test_2?max_position=375101899214561280', '@mobile_test_2', '@mobile_test']
  77. ]
  78. class TweetTest(BaseTestCase):
  79. @parameterized.expand(timeline)
  80. def test_timeline(self, index, fullname, username, date, tid, text):
  81. self.open_nitter(username)
  82. tweet = get_timeline_tweet(index)
  83. self.assert_exact_text(fullname, tweet.fullname)
  84. self.assert_exact_text('@' + username, tweet.username)
  85. self.assert_exact_text(date, tweet.date)
  86. self.assert_text(text, tweet.text)
  87. permalink = self.find_element(tweet.date + ' a')
  88. self.assertIn(tid, permalink.get_attribute('href'))
  89. @parameterized.expand(status)
  90. def test_status(self, tid, fullname, username, date, text):
  91. tweet = Tweet()
  92. self.open_nitter(f'{username}/status/{tid}')
  93. self.assert_exact_text(fullname, tweet.fullname)
  94. self.assert_exact_text('@' + username, tweet.username)
  95. self.assert_exact_text(date, tweet.date)
  96. self.assert_text(text, tweet.text)
  97. @parameterized.expand(multiline)
  98. def test_multiline_formatting(self, tid, username, text):
  99. self.open_nitter(f'{username}/status/{tid}')
  100. self.assert_text(text.strip('\n'), '.main-tweet')
  101. @parameterized.expand(emoji)
  102. def test_emoji(self, tweet, text):
  103. self.open_nitter(tweet)
  104. self.assert_text(text, '.main-tweet')
  105. @parameterized.expand(link)
  106. def test_link(self, tweet, links):
  107. self.open_nitter(tweet)
  108. for link in links:
  109. self.assert_text(link, '.main-tweet')
  110. @parameterized.expand(username)
  111. def test_username(self, tweet, usernames):
  112. self.open_nitter(tweet)
  113. for un in usernames:
  114. link = self.find_link_text(f'@{un}')
  115. self.assertIn(f'/{un}', link.get_property('href'))
  116. @parameterized.expand(retweet)
  117. def test_retweet(self, index, url, retweet_by, fullname, username, text):
  118. self.open_nitter(url)
  119. tweet = get_timeline_tweet(index)
  120. self.assert_text(f'{retweet_by} retweeted', tweet.retweet)
  121. self.assert_text(text, tweet.text)
  122. self.assert_exact_text(fullname, tweet.fullname)
  123. self.assert_exact_text(username, tweet.username)
  124. @parameterized.expand(invalid)
  125. def test_invalid_id(self, tweet):
  126. self.open_nitter(tweet)
  127. self.assert_text('Tweet not found', '.error-panel')
  128. @parameterized.expand(reply)
  129. def test_reply(self, tweet, username, reply):
  130. self.open_nitter(tweet)
  131. tweet = get_timeline_tweet(2)
  132. self.assert_text(username, tweet.username)
  133. self.assert_text('Replying to ' + reply, tweet.reply)