Coverage for tests\anime\test_anime_search.py: 100%

116 statements  

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

1from random import choice 

2from tests.conftest import get_json_val, ANIME_JPN, ANIME_ENG 

3import json 

4import pytest 

5 

6 

7@pytest.mark.parametrize("query", [ 

8 "?limit", 

9 "?limit=", 

10 "?limit=abc123", 

11 "?limit=1", 

12 "?page", 

13 "?page=", 

14 "?page=def456", 

15 "?page=2", 

16 "?q=ポケモンす&limit=a", 

17 "?q=デジモン&page=z", 

18 "?q=名探偵コナン&limit=@&page=1", 

19]) 

20def test_search_input_not_valid_integer(client_nc, query) -> None: 

21 resp = client_nc.get(f"/search/animes{query}") 

22 resp_data = resp.json() 

23 

24 assert resp.status_code == 422 

25 for err in get_json_val(resp_data, "$.detail"): 

26 assert get_json_val(err, "$.msg") == "Input should be a valid integer, unable to parse string as an integer" 

27 

28 

29@pytest.mark.parametrize("query", [ 

30 "?limit=-1", 

31 "?limit=0", 

32 "?page=-5", 

33 "?page=0", 

34 "?q=test1&limit=-1", 

35 "?q=test2&page=-2", 

36 "?q=test3&limit=1&page=0", 

37]) 

38def test_search_input_less_than_min_threshold(client_nc, query) -> None: 

39 resp = client_nc.get(f"/search/animes{query}") 

40 resp_data = resp.json() 

41 

42 assert resp.status_code == 422 

43 for err in get_json_val(resp_data, "$.detail"): 

44 assert get_json_val(err, "$.msg") == "Input should be greater than 0" 

45 

46 

47@pytest.mark.parametrize("query", [ 

48 "?limit=101", 

49 "?page=10001", 

50 "?q=test1&limit=101", 

51 "?q=test2&page=10001", 

52 "?q=test3&limit=101&page=3", 

53]) 

54def test_search_input_more_than_max_threshold(client_nc, query) -> None: 

55 resp = client_nc.get(f"/search/animes{query}") 

56 resp_data = resp.json() 

57 

58 assert resp.status_code == 422 

59 for err in get_json_val(resp_data, "$.detail"): 

60 assert get_json_val(err, "$.msg") in {"Input should be less than or equal to 100", "Input should be less than or equal to 10000"} 

61 

62 

63@pytest.mark.parametrize("query", [ 

64 "", 

65 "?", 

66 "?q", 

67 "?q&page=2", 

68 "?q=", 

69 "?q=&limit=1", 

70]) 

71def test_search_empty_query(client_nc, query, caplog) -> None: 

72 resp = client_nc.get(f"/search/animes{query}") 

73 resp_data = resp.json() 

74 

75 assert resp.status_code == 200 

76 assert get_json_val(resp_data, "$.query") == "" 

77 assert get_json_val(resp_data, "$.heading") == "" 

78 assert ANIME_ENG in caplog.text 

79 assert len(get_json_val(resp_data, "$.results.animes")) == 0 

80 

81 

82def test_search_without_results_page_1(client_nc, caplog) -> None: 

83 query = '".*&^' 

84 resp = client_nc.get(f"/search/animes?q={query}") 

85 resp_data = resp.json() 

86 

87 assert resp.status_code == 200 

88 assert get_json_val(resp_data, "$.query") == '".*' 

89 assert get_json_val(resp_data, "$.heading").startswith('".*') 

90 assert ANIME_JPN in get_json_val(resp_data, "$.heading") 

91 assert ANIME_ENG in caplog.text 

92 assert len(get_json_val(resp_data, "$.results.animes")) == 0 

93 

94 

95def test_search_without_results_page_2(client_nc, caplog) -> None: 

96 query = "俺物語!!" # page 1 returns results, refer to 'test_search_with_results_single' 

97 resp = client_nc.get(f"/search/animes?q={query}&page=2") 

98 resp_data = resp.json() 

99 

100 assert resp.status_code == 200 

101 assert get_json_val(resp_data, "$.query") == query 

102 assert get_json_val(resp_data, "$.heading").startswith(query) 

103 assert ANIME_JPN in get_json_val(resp_data, "$.heading") 

104 assert ANIME_ENG in caplog.text 

105 assert len(get_json_val(resp_data, "$.results.animes")) == 0 

106 

107 

108@pytest.mark.parametrize( 

109 "test_data", 

110 [ 

111 { 

112 "title": "俺物語!!", 

113 "rating": 3.9, 

114 "mark_count": 5418, 

115 "clip_count": 1051, 

116 "series_id": 603, 

117 "season_id": 1373, 

118 "link": "https://filmarks.com/animes/603/1373", 

119 "release_date": "2015年04月08日", 

120 "playback_time": "23分", 

121 "production_company": ["マッドハウス"], 

122 "director": ["浅香守生"], 

123 "series_composer": ["高橋ナツコ"], 

124 "cast": ["江口拓也", "潘めぐみ"], 

125 }, 

126 ], 

127) 

128def test_search_with_results_single(client_nc, test_data, caplog) -> None: 

129 query = "俺物語!!" 

130 resp = client_nc.get(f"/search/animes?q={query}&limit=1") 

131 resp_data = resp.json() 

132 animes = get_json_val(resp_data, "$.results.animes") 

133 

134 assert resp.status_code == 200 

135 assert get_json_val(resp_data, "$.query") == query 

136 assert get_json_val(resp_data, "$.heading").startswith(query) 

137 assert ANIME_JPN in get_json_val(resp_data, "$.heading") 

138 assert ANIME_ENG in caplog.text 

139 assert len(animes) == 1 

140 

141 fields = [ 

142 "title", 

143 "series_id", 

144 "season_id", 

145 "link", 

146 "release_date", 

147 "playback_time", 

148 "production_company", 

149 "director", 

150 "series_composer", 

151 "cast", 

152 ] 

153 for field in fields: 

154 assert get_json_val(animes[0], f"$.{field}") == get_json_val(test_data, f"$.{field}") 

155 

156 assert get_json_val(animes[0], "$.rating") == pytest.approx(get_json_val(test_data, "$.rating"), abs=0.5) 

157 assert get_json_val(animes[0], "$.mark_count") >= get_json_val(test_data, "$.mark_count") 

158 assert get_json_val(animes[0], "$.clip_count") >= get_json_val(test_data, "$.clip_count") 

159 

160 assert get_json_val(animes[0], "$.poster") is not None 

161 assert get_json_val(animes[0], "$.producer") is None 

162 assert get_json_val(animes[0], "$.executive_producer") is None 

163 

164 

165@pytest.mark.parametrize( 

166 "test_data", 

167 [ 

168 { 

169 "title": "のだめカンタービレ", 

170 "series_id": 1342, 

171 "season_id": 1783, 

172 "link": "https://filmarks.com/animes/1342/1783", 

173 "release_date": "2007年01月11日", 

174 "director": ["カサヰケンイチ"], 

175 "series_composer": ["金春智子"], 

176 "cast": ["川澄綾子", "関智一"], 

177 }, 

178 { 

179 "title": "のだめカンタービレ 巴里編", 

180 "series_id": 1342, 

181 "season_id": 1784, 

182 "link": "https://filmarks.com/animes/1342/1784", 

183 "release_date": "2008年10月09日", 

184 "director": ["今千秋"], 

185 "series_composer": ["榎戸洋司"], 

186 "cast": ["川澄綾子", "関智一"], 

187 }, 

188 { 

189 "title": "のだめカンタービレ フィナーレ", 

190 "series_id": 1342, 

191 "season_id": 1785, 

192 "link": "https://filmarks.com/animes/1342/1785", 

193 "release_date": "2010年01月14日", 

194 "director": ["今千秋"], 

195 "series_composer": ["中島かずき"], 

196 "cast": ["川澄綾子", "関智一"], 

197 }, 

198 ], 

199) 

200def test_search_with_results_multiple(client_nc, test_data, caplog) -> None: 

201 query = "のだめカンタービレ" 

202 resp = client_nc.get(f"/search/animes?q={query}&page=1") 

203 resp_data = resp.json() 

204 anime = next(a for a in get_json_val(resp_data, "$.results.animes") if get_json_val(a, "$.title") == get_json_val(test_data, "$.title")) 

205 

206 assert resp.status_code == 200 

207 assert get_json_val(resp_data, "$.query") == query 

208 assert get_json_val(resp_data, "$.heading").startswith(query) 

209 assert ANIME_JPN in get_json_val(resp_data, "$.heading") 

210 assert ANIME_ENG in caplog.text 

211 

212 fields = [ 

213 "title", 

214 "series_id", 

215 "season_id", 

216 "link", 

217 "release_date", 

218 "director", 

219 "series_composer", 

220 "cast", 

221 ] 

222 for field in fields: 

223 assert get_json_val(anime, f"$.{field}") == get_json_val(test_data, f"$.{field}") 

224 

225 assert get_json_val(anime, "$.rating") is not None 

226 assert get_json_val(anime, "$.mark_count") is not None 

227 assert get_json_val(anime, "$.clip_count") is not None 

228 assert get_json_val(anime, "$.poster") is not None 

229 assert get_json_val(anime, "$.producer") is None 

230 assert get_json_val(anime, "$.executive_producer") is None 

231 

232 

233def test_search_with_results_random(client_nc, caplog) -> None: 

234 with open(file="tests/anime/100_animes.json", mode="r", encoding="utf-8") as f: 

235 test_data = json.load(f) 

236 anime = choice(test_data) 

237 

238 query = get_json_val(anime, "$.title") 

239 series_id = get_json_val(anime, "$.series") 

240 season_id = get_json_val(anime, "$.season") 

241 

242 resp = client_nc.get(f"/search/animes?q={query}&limit=1") 

243 resp_data = resp.json() 

244 

245 assert resp.status_code == 200 

246 assert get_json_val(resp_data, "$.query") == query 

247 assert get_json_val(resp_data, "$.heading").startswith(query) 

248 assert ANIME_JPN in get_json_val(resp_data, "$.heading") 

249 assert ANIME_ENG in caplog.text 

250 

251 assert get_json_val(resp_data, "$.results.animes[0].title") == query 

252 assert get_json_val(resp_data, "$.results.animes[0].rating") is not None 

253 assert get_json_val(resp_data, "$.results.animes[0].mark_count") is not None 

254 assert get_json_val(resp_data, "$.results.animes[0].clip_count") is not None 

255 assert get_json_val(resp_data, "$.results.animes[0].series_id") == series_id 

256 assert get_json_val(resp_data, "$.results.animes[0].season_id") == season_id 

257 assert get_json_val(resp_data, "$.results.animes[0].link") is not None