Coverage for tests\drama\test_drama_api.py: 100%

50 statements  

« prev     ^ index     » next       coverage.py v7.10.1, created at 2025-10-19 21:13 +0800

1from pydantic import Field 

2from requests.exceptions import RequestException 

3from src.utility.models import ListParams, ReviewParams, SearchParams 

4from tests.conftest import get_json_val 

5import pytest 

6 

7 

8@pytest.mark.parametrize("path", [ 

9 "/dramas", 

10 "/dramas/1", 

11 "/dramas//1", 

12 "/dramas/1//reviews", 

13 "/dramas//1/reviews", 

14 "/list-drama", 

15 "/list-drama/vod", 

16 "/list-drama/year/2010s/2019", 

17 "/list-drama/year", 

18 "/list-drama/country", 

19 "/list-drama/genre", 

20 "/list-drama/tag", 

21 "/list-drama/person", 

22]) 

23def test_invalid_endpoint_base(client_nc, path) -> None: 

24 resp = client_nc.get(path) 

25 resp_data = resp.json() 

26 

27 assert resp.status_code == 404 

28 assert get_json_val(resp_data, "$.detail") == "Not Found" 

29 

30 

31@pytest.mark.parametrize("path", [ 

32 "/dramas/9999999999/9999999999", 

33 "/dramas/9999999999/9999999999/reviews", 

34 "/dramas/9999999999/9999999999/reviews/9999999999", 

35 "/list-drama/vod/invalid_vod", 

36 "/list-drama/year/999s", 

37 "/list-drama/year/999", 

38 "/list-drama/country/9999999999", 

39 "/list-drama/genre/9999999999", 

40 "/list-drama/tag/invalid_tag", 

41 "/list-drama/person/9999999999", 

42]) 

43def test_invalid_endpoint_filmarks(client_nc, path, caplog) -> None: 

44 resp = client_nc.get(path) 

45 resp_data = resp.json() 

46 

47 assert resp.status_code == 404 

48 assert get_json_val(resp_data, "$.detail") == "The requested resource could not be found." 

49 assert "Invalid Filmarks page requested" in caplog.text 

50 

51 

52@pytest.mark.parametrize("test_data", [ 

53 ( 

54 "/search/dramas?q=test500", 

55 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

56 "Failed to search dramas." 

57 ), 

58 ( 

59 "/dramas/500/500", 

60 "src.scrape.info.info_drama_scraper.InfoDramaScraper.scrape", 

61 "Failed to retrieve information for drama with series ID: 500 and season ID: 500." 

62 ), 

63 ( 

64 "/dramas/500/500/reviews", 

65 "src.scrape.info.info_drama_scraper.InfoDramaScraper.scrape", 

66 "Failed to retrieve reviews for drama with series ID: 500 and season ID: 500." 

67 ), 

68 ( 

69 "/dramas/500/500/reviews/500", 

70 "src.scrape.info.info_drama_scraper.InfoDramaScraper.scrape", 

71 "Failed to retrieve review for drama with series ID: 500, season ID: 500, and review ID: 500." 

72 ), 

73 ( 

74 "/list-drama/trend", 

75 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

76 "Failed to fetch trending dramas." 

77 ), 

78 ( 

79 "/list-drama/vod/500_vod", 

80 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

81 "Failed to fetch dramas from VOD service: 500_vod." 

82 ), 

83 ( 

84 "/list-drama/year/500s", 

85 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

86 "Failed to fetch dramas from year series: 500s." 

87 ), 

88 ( 

89 "/list-drama/year/500", 

90 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

91 "Failed to fetch dramas from year: 500." 

92 ), 

93 ( 

94 "/list-drama/country/500", 

95 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

96 "Failed to fetch dramas with country ID: 500." 

97 ), 

98 ( 

99 "/list-drama/genre/500", 

100 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

101 "Failed to fetch dramas with genre ID: 500." 

102 ), 

103 ( 

104 "/list-drama/tag/500_tag", 

105 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

106 "Failed to fetch dramas with tag: 500_tag." 

107 ), 

108 ( 

109 "/list-drama/person/500", 

110 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape", 

111 "Failed to fetch dramas with person ID: 500." 

112 ), 

113]) 

114def test_scrape_error_500_server_error(client_nc, mocker, test_data, caplog) -> None: 

115 mocker.patch( 

116 target=test_data[1], 

117 side_effect=Exception("Testing - 500 Internal Server Error"), 

118 ) 

119 

120 resp = client_nc.get(test_data[0]) 

121 resp_data = resp.json() 

122 

123 assert resp.status_code == 500 

124 assert get_json_val(resp_data, "$.detail") == "The server encountered an unexpected error." 

125 assert "Testing - 500 Internal Server Error" in caplog.text 

126 assert test_data[2] in caplog.text 

127 

128 

129@pytest.mark.parametrize("path", [ 

130 "/search/dramas?q=test503", 

131 "/dramas/503/503", 

132 "/dramas/503/503/reviews", 

133 "/dramas/503/503/reviews/503", 

134 "/list-drama/trend", 

135 "/list-drama/vod/503_vod", 

136 "/list-drama/year/503s", 

137 "/list-drama/year/503", 

138 "/list-drama/country/503", 

139 "/list-drama/genre/503", 

140 "/list-drama/tag/503_tag", 

141 "/list-drama/person/503", 

142]) 

143def test_scrape_error_503_service_unavailable_session(client_nc, mocker, path, caplog) -> None: 

144 mocker.patch( 

145 target="src.scrape.base_scraper.Session", 

146 side_effect=RequestException("Testing - 503 Service Unavailable"), 

147 ) 

148 

149 resp = client_nc.get(path) 

150 resp_data = resp.json() 

151 

152 assert resp.status_code == 503 

153 assert get_json_val(resp_data, "$.detail") == "The service is currently unavailable." 

154 assert "Request to Filmarks failed: 'Testing - 503 Service Unavailable'" in caplog.text 

155 

156 

157@pytest.mark.parametrize("path", [ 

158 "/dramas/6055/8586/reviews?page=9999999999999999999", 

159 "/list-drama/trend?page=999999999999999999", 

160 "/list-drama/vod/prime_video?page=999999999999999999", 

161 "/list-drama/year/2020s?page=999999999999999999", 

162 "/list-drama/year/2025?page=999999999999999999", 

163 "/list-drama/country/144?page=999999999999999999", 

164 "/list-drama/genre/9?page=999999999999999999", 

165 "/list-drama/tag/駄作?page=999999999999999999", 

166 "/list-drama/person/25499?page=999999999999999999", 

167]) 

168def test_scrape_error_503_service_unavailable_filmarks(client_nc, path, caplog) -> None: 

169 class CustomParams(): 

170 page: int = Field(1, gt=0) 

171 client_nc.app.dependency_overrides[SearchParams] = CustomParams 

172 client_nc.app.dependency_overrides[ReviewParams] = CustomParams 

173 client_nc.app.dependency_overrides[ListParams] = CustomParams 

174 

175 resp = client_nc.get(path) 

176 resp_data = resp.json() 

177 

178 assert resp.status_code == 503 

179 assert get_json_val(resp_data, "$.detail") == "The service is currently unavailable." 

180 assert "Filmarks is temporarily unavailable" in caplog.text 

181 

182 del client_nc.app.dependency_overrides[SearchParams] 

183 del client_nc.app.dependency_overrides[ReviewParams] 

184 del client_nc.app.dependency_overrides[ListParams] 

185