test_timeline.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from base import BaseTestCase, Timeline
  2. from parameterized import parameterized
  3. normal = [['jack'], ['elonmusk']]
  4. after = [['jack', '1681686036294803456'],
  5. ['elonmusk', '1681686036294803456']]
  6. no_more = [['mobile_test_8?cursor=DAABCgABF4YVAqN___kKAAICNn_4msIQAAgAAwAAAAIAAA']]
  7. empty = [['emptyuser'], ['mobile_test_10']]
  8. protected = [['mobile_test_7'], ['Empty_user']]
  9. photo_rail = [['mobile_test', ['Bo0nDsYIYAIjqVn', 'BoQbwJAIUAA0QCY', 'BoQbRQxIIAA3FWD', 'Bn8Qh8iIIAABXrG']]]
  10. class TweetTest(BaseTestCase):
  11. @parameterized.expand(normal)
  12. def test_timeline(self, username):
  13. self.open_nitter(username)
  14. self.assert_element_present(Timeline.older)
  15. self.assert_element_absent(Timeline.newest)
  16. self.assert_element_absent(Timeline.end)
  17. self.assert_element_absent(Timeline.none)
  18. @parameterized.expand(after)
  19. def test_after(self, username, cursor):
  20. self.open_nitter(f'{username}?cursor={cursor}')
  21. self.assert_element_present(Timeline.newest)
  22. self.assert_element_present(Timeline.older)
  23. self.assert_element_absent(Timeline.end)
  24. self.assert_element_absent(Timeline.none)
  25. @parameterized.expand(no_more)
  26. def test_no_more(self, username):
  27. self.open_nitter(username)
  28. self.assert_text('No more items', Timeline.end)
  29. self.assert_element_present(Timeline.newest)
  30. self.assert_element_absent(Timeline.older)
  31. @parameterized.expand(empty)
  32. def test_empty(self, username):
  33. self.open_nitter(username)
  34. self.assert_text('No items found', Timeline.none)
  35. self.assert_element_absent(Timeline.newest)
  36. self.assert_element_absent(Timeline.older)
  37. self.assert_element_absent(Timeline.end)
  38. @parameterized.expand(protected)
  39. def test_protected(self, username):
  40. self.open_nitter(username)
  41. self.assert_text('This account\'s tweets are protected.', Timeline.protected)
  42. self.assert_element_absent(Timeline.newest)
  43. self.assert_element_absent(Timeline.older)
  44. self.assert_element_absent(Timeline.end)
  45. def test_media_view_tabs(self):
  46. self.open_nitter('mobile_test/media')
  47. self.assert_element_present(Timeline.media_view_tabs)
  48. self.assert_text('Timeline', Timeline.media_view_timeline)
  49. self.assert_text('Grid', Timeline.media_view_grid)
  50. self.assert_text('Gallery', Timeline.media_view_gallery)
  51. self.assert_text('Timeline', Timeline.media_view_active)
  52. def test_media_view_grid_tab(self):
  53. self.open_nitter('mobile_test/media?view=grid')
  54. self.assert_element_present(Timeline.grid_view)
  55. self.assert_text('Grid', Timeline.media_view_active)
  56. def test_media_view_gallery_tab(self):
  57. self.open_nitter('mobile_test/media?view=gallery')
  58. self.assert_element_present(Timeline.gallery_view)
  59. self.assert_text('Gallery', Timeline.media_view_active)
  60. def test_media_view_tabs_not_on_posts(self):
  61. self.open_nitter('mobile_test')
  62. self.assert_element_absent(Timeline.media_view_tabs)
  63. #@parameterized.expand(photo_rail)
  64. #def test_photo_rail(self, username, images):
  65. #self.open_nitter(username)
  66. #self.assert_element_visible(Timeline.photo_rail)
  67. #for i, url in enumerate(images):
  68. #img = self.get_attribute(Timeline.photo_rail + f' a:nth-child({i + 1}) img', 'src')
  69. #self.assertIn(url, img)
  70. class ArticlesTabTest(BaseTestCase):
  71. def test_articles_tab_on_profile(self):
  72. self.open_nitter('satyanadella')
  73. self.assert_element_present('.tab .tab-item a[href="/satyanadella/articles"]')
  74. def test_articles_timeline(self):
  75. self.open_nitter('satyanadella/articles')
  76. self.assert_text('Articles', '.tab .tab-item.active a')
  77. self.assert_element_present('.timeline .article-card')
  78. self.assert_element_present('.timeline .article-card a[href^="/i/article/"]')
  79. def test_articles_card_cover_and_no_raw_link(self):
  80. self.open_nitter('jack/articles')
  81. self.assert_element_present('.timeline .article-card .card-image img')
  82. # the article link tweet text is redundant with the card and is stripped
  83. self.assert_element_absent('.timeline .tweet-content a[href*="x.com/i/article"]')
  84. def test_articles_empty(self):
  85. self.open_nitter('mobile_test/articles')
  86. self.assert_text('No items found', Timeline.none)
  87. def test_articles_multi_user_unsupported(self):
  88. self.open_nitter('jack,satyanadella')
  89. self.assert_element_absent('.tab .tab-item a[href$="/articles"]')
  90. self.open_nitter('jack,satyanadella/articles')
  91. self.assert_text('Page not found')