conftest.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import pytest
  2. from datetime import datetime
  3. from click.testing import CliRunner
  4. from bs4 import BeautifulSoup
  5. from twhatter.client import ClientTimeline
  6. from twhatter.parser import tweet_factory
  7. from typing import NamedTuple, List
  8. @pytest.fixture
  9. def cli_runner():
  10. """Runner for Click"""
  11. return CliRunner()
  12. @pytest.fixture(scope="session")
  13. def user():
  14. return "the_english_way"
  15. @pytest.fixture(scope="session")
  16. def user_prolific():
  17. return "realDonaldTrump"
  18. @pytest.fixture(scope="session")
  19. def tweet_limit():
  20. return 10
  21. # Fixtures for extraction of specific tweets of several kinds, whose author
  22. # and id are known in advance
  23. class TweetInfo(NamedTuple):
  24. """Class to hold information about a tweet that is already known"""
  25. id: int
  26. screen_name: str
  27. user_id: int
  28. permalink: str
  29. timestamp: datetime = None
  30. text: str = None
  31. comments_nb: int = None
  32. retweets_nb: int = None
  33. likes_nb: int = None
  34. hashtag_list: List[str] = None
  35. mention_list: List[int] = None
  36. retweeter: str = None
  37. retweet_id: int = None
  38. reacted_id: int = None
  39. reacted_user_id: int = None
  40. link_to: str = None
  41. @pytest.fixture(scope="session")
  42. def tweet_collection():
  43. return {
  44. 'plain': TweetInfo(
  45. id=1077838164813848576,
  46. screen_name="the_english_way",
  47. user_id=943804775942033408,
  48. timestamp=datetime.utcfromtimestamp(1545811618),
  49. permalink="/the_english_way/status/1077838164813848576",
  50. text="""Ca y est j'ai un pipeline Concourse avec un job qui builde une image @Docker qui affiche un "Hello World" dans un autre job \o/
  51. ........... je suis pas sûr de savoir ce que ça veut dire, mais en tout cas c'était mon objectif de la matinée """
  52. ),
  53. 'reaction_tweet': TweetInfo(
  54. id=1078281840945963008,
  55. screen_name="the_english_way",
  56. user_id=943804775942033408,
  57. timestamp=datetime.utcfromtimestamp(1545917399),
  58. permalink="/the_english_way/status/1078281840945963008",
  59. reacted_id=1078277316193726464,
  60. reacted_user_id=19976004
  61. ),
  62. 'with_link': TweetInfo(
  63. id=1077505613079429120,
  64. screen_name="the_english_way",
  65. user_id=943804775942033408,
  66. timestamp=datetime.utcfromtimestamp(1545732331),
  67. permalink="/the_english_way/status/1077505613079429120",
  68. link_to="https://t.co/el5VJucLRz"
  69. ),
  70. 'retweet': TweetInfo(
  71. id=1055037291108974592,
  72. screen_name="Senficon",
  73. user_id=14861745,
  74. retweeter="the_english_way",
  75. retweet_id=1055098556300828672,
  76. timestamp=datetime.utcfromtimestamp(1540375466),
  77. permalink="/Senficon/status/1055037291108974592",
  78. ),
  79. 'hashtags': TweetInfo(
  80. id=1039969574555471873,
  81. screen_name="BurgerQuizOff",
  82. user_id=949604705772228608,
  83. retweeter="the_english_way",
  84. permalink="/BurgerQuizOff/status/1039969574555471873",
  85. hashtag_list=["Nuggets", "BurgerQuiz", "PrivacyMonCul"]
  86. ),
  87. 'mentions': TweetInfo(
  88. id=1077838164813848576,
  89. screen_name="the_english_way",
  90. user_id=943804775942033408,
  91. timestamp=datetime.utcfromtimestamp(1545811618),
  92. permalink="/the_english_way/status/1077838164813848576",
  93. mention_list=[1138959692]
  94. ),
  95. 'stats': TweetInfo(
  96. id=1039969574555471873,
  97. screen_name="BurgerQuizOff",
  98. user_id=949604705772228608,
  99. permalink="/BurgerQuizOff/status/1039969574555471873",
  100. retweeter="the_english_way",
  101. comments_nb=12,
  102. retweets_nb=176,
  103. likes_nb=556
  104. ),
  105. }
  106. @pytest.fixture(scope="session")
  107. def raw_html_user_initial_page_factory():
  108. def _raw_html_user_initial_page(user):
  109. a = ClientTimeline(user)
  110. response = a.get_initial()
  111. return BeautifulSoup(response.text, "lxml")
  112. return _raw_html_user_initial_page
  113. @pytest.fixture(scope="session")
  114. def raw_html_user_initial_page(raw_html_user_initial_page_factory, user):
  115. return raw_html_user_initial_page_factory(user)
  116. @pytest.fixture(scope="session")
  117. def raw_tweet_factory(raw_html_user_initial_page_factory):
  118. def _raw_tweet_factory(tweet_info):
  119. user_page = tweet_info.retweeter or tweet_info.screen_name
  120. soup = raw_html_user_initial_page_factory(user_page)
  121. return soup.find(id="stream-item-tweet-{}".format(tweet_info.id))
  122. return _raw_tweet_factory
  123. @pytest.fixture(scope="session")
  124. def tweet_test_data_factory(raw_tweet_factory, tweet_collection):
  125. def _tweet_test_data_factory(tweet_type):
  126. tweet_info = tweet_collection[tweet_type]
  127. raw_tweet = raw_tweet_factory(tweet_info)
  128. return tweet_factory(raw_tweet), tweet_info
  129. return _tweet_test_data_factory
  130. class UserInfo(NamedTuple):
  131. """Class to hold information about an user that is already known"""
  132. id: int
  133. screen_name: str
  134. join_date: datetime
  135. tweets_nb: int
  136. following_nb: int
  137. followers_nb: int
  138. likes_nb: int
  139. @pytest.fixture(scope="session")
  140. def user_collection():
  141. return {
  142. 'Marlene_beadles': UserInfo(
  143. id=295177446,
  144. screen_name="Marlene Hansen",
  145. join_date=datetime(2011, 5, 8, 0, 0),
  146. tweets_nb=25,
  147. following_nb=344,
  148. followers_nb=81,
  149. likes_nb=4
  150. ),
  151. }