conftest.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import pytest
  2. from datetime import datetime
  3. from click.testing import CliRunner
  4. from bs4 import BeautifulSoup
  5. from twhatter.api import ApiUser
  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 tweet_limit():
  17. return 10
  18. # Fixtures for extraction of specific tweets of several kinds, whose author
  19. # and id are known in advance
  20. class TweetInfo(NamedTuple):
  21. """Class to hold information about a tweet that is already known"""
  22. id: int
  23. screen_name: str
  24. user_id: int
  25. permalink: str
  26. timestamp: datetime = None
  27. text: str = None
  28. comments_nb: int = None
  29. retweets_nb: int = None
  30. likes_nb: int = None
  31. hashtag_list: List[str] = None
  32. mention_list: List[int] = None
  33. retweeter: str = None
  34. retweet_id: int = None
  35. reacted_id: int = None
  36. reacted_user_id: int = None
  37. link_to: str = None
  38. @pytest.fixture(scope="session")
  39. def tweet_collection():
  40. return {
  41. 'plain': TweetInfo(
  42. id=1077838164813848576,
  43. screen_name="the_english_way",
  44. user_id=943804775942033408,
  45. timestamp=datetime.utcfromtimestamp(1545811618),
  46. permalink="/the_english_way/status/1077838164813848576",
  47. 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/
  48. ........... je suis pas sûr de savoir ce que ça veut dire, mais en tout cas c'était mon objectif de la matinée """
  49. ),
  50. 'reaction_tweet': TweetInfo(
  51. id=1078281840945963008,
  52. screen_name="the_english_way",
  53. user_id=943804775942033408,
  54. timestamp=datetime.utcfromtimestamp(1545917399),
  55. permalink="/the_english_way/status/1078281840945963008",
  56. reacted_id=1078277316193726464,
  57. reacted_user_id=19976004
  58. ),
  59. 'with_link': TweetInfo(
  60. id=1077505613079429120,
  61. screen_name="the_english_way",
  62. user_id=943804775942033408,
  63. timestamp=datetime.utcfromtimestamp(1545732331),
  64. permalink="/the_english_way/status/1077505613079429120",
  65. link_to="https://t.co/el5VJucLRz"
  66. ),
  67. 'retweet': TweetInfo(
  68. id=1055037291108974592,
  69. screen_name="Senficon",
  70. user_id=14861745,
  71. retweeter="the_english_way",
  72. retweet_id=1055098556300828672,
  73. timestamp=datetime.utcfromtimestamp(1540375466),
  74. permalink="/Senficon/status/1055037291108974592",
  75. ),
  76. 'hashtags': TweetInfo(
  77. id=1039969574555471873,
  78. screen_name="BurgerQuizOff",
  79. user_id=949604705772228608,
  80. retweeter="the_english_way",
  81. permalink="/BurgerQuizOff/status/1039969574555471873",
  82. hashtag_list=["Nuggets", "BurgerQuiz", "PrivacyMonCul"]
  83. ),
  84. 'mentions': TweetInfo(
  85. id=1077838164813848576,
  86. screen_name="the_english_way",
  87. user_id=943804775942033408,
  88. timestamp=datetime.utcfromtimestamp(1545811618),
  89. permalink="/the_english_way/status/1077838164813848576",
  90. mention_list=[1138959692]
  91. ),
  92. 'stats': TweetInfo(
  93. id=1039969574555471873,
  94. screen_name="BurgerQuizOff",
  95. user_id=949604705772228608,
  96. permalink="/BurgerQuizOff/status/1039969574555471873",
  97. retweeter="the_english_way",
  98. comments_nb=12,
  99. retweets_nb=176,
  100. likes_nb=556
  101. ),
  102. }
  103. @pytest.fixture(scope="session")
  104. def raw_html_user_initial_page_factory():
  105. def _raw_html_user_initial_page(user):
  106. a = ApiUser(user)
  107. response = a.get_initial()
  108. return BeautifulSoup(response.text, "lxml")
  109. return _raw_html_user_initial_page
  110. @pytest.fixture(scope="session")
  111. def raw_html_user_initial_page(raw_html_user_initial_page_factory, user):
  112. return raw_html_user_initial_page_factory(user)
  113. @pytest.fixture(scope="session")
  114. def raw_tweet_factory(raw_html_user_initial_page_factory):
  115. def _raw_tweet_factory(tweet_info):
  116. user_page = tweet_info.retweeter or tweet_info.screen_name
  117. soup = raw_html_user_initial_page_factory(user_page)
  118. return soup.find(id="stream-item-tweet-{}".format(tweet_info.id))
  119. return _raw_tweet_factory
  120. @pytest.fixture(scope="session")
  121. def tweet_test_data_factory(raw_tweet_factory, tweet_collection):
  122. def _tweet_test_data_factory(tweet_type):
  123. tweet_info = tweet_collection[tweet_type]
  124. raw_tweet = raw_tweet_factory(tweet_info)
  125. return tweet_factory(raw_tweet), tweet_info
  126. return _tweet_test_data_factory