test_top_series.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import os
  2. import pytest
  3. import requests
  4. from requests.models import Response
  5. import json
  6. from pyopenagi.tools.imdb.top_series import TopSeries
  7. from dotenv import load_dotenv, find_dotenv
  8. @pytest.fixture(scope="module")
  9. def test_rapid_api_key():
  10. load_dotenv(find_dotenv())
  11. if "RAPID_API_KEY" not in os.environ or not os.environ["RAPID_API_KEY"]:
  12. with pytest.raises(ValueError):
  13. TopSeries()
  14. pytest.skip("RAPID api key is not set.")
  15. else:
  16. return True
  17. class ImdbTopSeriesMock:
  18. @staticmethod
  19. def json():
  20. mock_items = []
  21. mock_title = "Mock Title"
  22. mock_description = "Mock Description."
  23. mock_image = "https://m.media-amazon.com/images/Mock/Standard.Image.jpg"
  24. mock_big_image = "https://m.media-amazon.com/images/Mock/Big.Image.jpg"
  25. mock_genre = ["Drama", "Fantasy"]
  26. mock_thumbnail = "https://m.media-amazon.com/images/Mock/Thumb.Image.jpg"
  27. mock_rating = 9.2
  28. mock_year = "2011-2019"
  29. mock_imdbid = "tt0000000"
  30. mock_imdb_link = "https://www.imdb.com/title/tt0000000"
  31. for i in range(100):
  32. mock_items.append(
  33. {
  34. "rank": i + 1,
  35. "title": mock_title,
  36. "description": mock_description,
  37. "image": mock_image,
  38. "big_image": mock_big_image,
  39. "genre": mock_genre,
  40. "thumbnail": mock_thumbnail,
  41. "rating": mock_rating,
  42. "id": f"top{i+1}",
  43. "year": mock_year,
  44. "imdbid": mock_imdbid,
  45. "mock_imdb_link": mock_imdb_link,
  46. }
  47. )
  48. mock_response = Response()
  49. mock_response.status_code = 200
  50. mock_response._content = str.encode(json.dumps(mock_items))
  51. return mock_response.json()
  52. @pytest.fixture(autouse=True)
  53. def mock_response(monkeypatch):
  54. def mock_get(*args, **kwargs):
  55. return ImdbTopSeriesMock()
  56. monkeypatch.setattr(requests, "get", mock_get)
  57. @pytest.mark.usefixtures("test_rapid_api_key")
  58. @pytest.mark.parametrize(
  59. "valid_start, valid_end",
  60. [
  61. [1, 100],
  62. [60, 61],
  63. [60, 62],
  64. ],
  65. )
  66. def test_top_series_api_valid_input_outputs_valid_delimiter_count(
  67. valid_start, valid_end
  68. ):
  69. load_dotenv(find_dotenv())
  70. top_series_api = TopSeries()
  71. params = {"start": valid_start, "end": valid_end}
  72. result = top_series_api.run(params=params)
  73. assert isinstance(result, str)
  74. assert result.count(";") == max(0, int(valid_end) - int(valid_start))
  75. @pytest.mark.usefixtures("test_rapid_api_key")
  76. def test_top_series_api_reverse_range_returns_blank():
  77. load_dotenv(find_dotenv())
  78. top_series_api = TopSeries()
  79. params = {"start": 100, "end": 0}
  80. result = top_series_api.run(params=params)
  81. assert result == "Top 100-0 series ranked by IMDB are: "
  82. @pytest.mark.parametrize(
  83. "invalid_start, valid_end",
  84. [
  85. ["0", 100],
  86. [0.5, 100],
  87. [[], 100],
  88. [{}, 100]
  89. ]
  90. )
  91. @pytest.mark.usefixtures("test_rapid_api_key")
  92. def test_top_series_api_invalid_start_type_raises_typeerror(invalid_start, valid_end):
  93. load_dotenv(find_dotenv())
  94. top_series_api = TopSeries()
  95. params = {"start": invalid_start, "end": valid_end}
  96. with pytest.raises(TypeError):
  97. top_series_api.run(params=params)
  98. @pytest.mark.parametrize(
  99. "invalid_start, valid_end",
  100. [
  101. [1, "0"],
  102. [1, 0.5],
  103. [1, []],
  104. [1, {}]
  105. ]
  106. )
  107. @pytest.mark.usefixtures("test_rapid_api_key")
  108. def test_top_series_api_invalid_end_type_raises_typeerror(invalid_start, valid_end):
  109. load_dotenv(find_dotenv())
  110. top_series_api = TopSeries()
  111. params = {"start": invalid_start, "end": valid_end}
  112. with pytest.raises(TypeError):
  113. top_series_api.run(params=params)
  114. @pytest.mark.usefixtures("test_rapid_api_key")
  115. def test_top_series_api_invalid_start_count_raises_indexerror():
  116. load_dotenv(find_dotenv())
  117. top_series_api = TopSeries()
  118. invalid_start = {"start": 101, "end": 102}
  119. with pytest.raises(IndexError):
  120. top_series_api.run(params=invalid_start)
  121. @pytest.mark.usefixtures("test_rapid_api_key")
  122. def test_top_series_api_invalid_end_count_raises_indexerror():
  123. load_dotenv(find_dotenv())
  124. top_series_api = TopSeries()
  125. invalid_end = {"start": 1, "end": 101}
  126. with pytest.raises(IndexError):
  127. top_series_api.run(params=invalid_end)