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

245 statements  

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

1from tests.conftest import get_json_val, ANIME_JPN, ANIME_ENG 

2import pytest 

3 

4list_routes = { 

5 "trend": "/list-anime/trend", 

6 "vod": "/list-anime/vod/{vod_name}", 

7 "year_series": "/list-anime/year/{year_series}s", 

8 "year_specific": "/list-anime/year/{year}", 

9 "year_season": "/list-anime/year/{year}/{season_id}", 

10 "company": "/list-anime/company/{company_id}", 

11 "tag": "/list-anime/tag/{tag}", 

12 "person": "/list-anime/person/{person_id}", 

13} 

14 

15 

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

17 "?limit", 

18 "?limit=", 

19 "?limit=xyz123", 

20 "?limit=10", 

21 "?page", 

22 "?page=", 

23 "?page=987abc", 

24 "?page=5", 

25 "?limit=1&page=#", 

26 "?limit=@&page=1", 

27]) 

28def test_list_query_params_not_valid_integer(client_nc, query) -> None: 

29 for type, route in list_routes.items(): 

30 match type: 

31 case "vod": 

32 route = route.format(vod_name="prime_video") 

33 case "year_series": 

34 route = route.format(year_series="2020") 

35 case "year_specific": 

36 route = route.format(year="2019") 

37 case "year_season": 

38 route = route.format(year="2019", season_id="1") 

39 case "company": 

40 route = route.format(company_id="41") 

41 case "tag": 

42 route = route.format(tag="神作") 

43 case "person": 

44 route = route.format(person_id="274563") 

45 case _: 

46 pass 

47 

48 resp = client_nc.get(f"{route}{query}") 

49 resp_data = resp.json() 

50 

51 assert resp.status_code == 422 

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

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

54 

55 

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

57 "?limit=-1", 

58 "?limit=0", 

59 "?page=-5", 

60 "?page=0", 

61 "?limit=-3&page=3", 

62 "?limit=1&page=0", 

63]) 

64def test_list_query_params_less_than_min_threshold(client_nc, query) -> None: 

65 for type, route in list_routes.items(): 

66 match type: 

67 case "vod": 

68 route = route.format(vod_name="prime_video") 

69 case "year_series": 

70 route = route.format(year_series="2020") 

71 case "year_specific": 

72 route = route.format(year="2019") 

73 case "year_season": 

74 route = route.format(year="2019", season_id="1") 

75 case "company": 

76 route = route.format(company_id="41") 

77 case "tag": 

78 route = route.format(tag="神作") 

79 case "person": 

80 route = route.format(person_id="274563") 

81 case _: 

82 pass 

83 

84 resp = client_nc.get(f"{route}{query}") 

85 resp_data = resp.json() 

86 

87 assert resp.status_code == 422 

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

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

90 

91 

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

93 "?limit=101", 

94 "?page=10001", 

95 "?limit=101&page=3", 

96 "?limit=100&page=10001", 

97]) 

98def test_list_query_params_more_than_max_threshold(client_nc, query) -> None: 

99 for type, route in list_routes.items(): 

100 match type: 

101 case "vod": 

102 route = route.format(vod_name="prime_video") 

103 case "year_series": 

104 route = route.format(year_series="2020") 

105 case "year_specific": 

106 route = route.format(year="2019") 

107 case "year_season": 

108 route = route.format(year="2019", season_id="1") 

109 case "company": 

110 route = route.format(company_id="41") 

111 case "tag": 

112 route = route.format(tag="神作") 

113 case "person": 

114 route = route.format(person_id="274563") 

115 case _: 

116 pass 

117 

118 resp = client_nc.get(f"{route}{query}") 

119 resp_data = resp.json() 

120 

121 assert resp.status_code == 422 

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

123 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"} 

124 

125 

126@pytest.mark.parametrize("var", [ 

127 "1", 

128 "abc123", 

129]) 

130def test_list_path_vars_not_valid_integer(client_nc, var) -> None: 

131 for type, route in list_routes.items(): 

132 match type: 

133 case "year_series": 

134 route = route.format(year_series=var) 

135 case "year_specific": 

136 route = route.format(year=var) 

137 case "year_season": 

138 route = route.format(year="2019", season_id=var) 

139 case "company": 

140 route = route.format(company_id=var) 

141 case "person": 

142 route = route.format(person_id=var) 

143 case _: 

144 continue 

145 

146 resp = client_nc.get(f"{route}") 

147 resp_data = resp.json() 

148 

149 assert resp.status_code == 422 

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

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

152 

153 

154def test_list_minimum_fields_present(client_nc, caplog) -> None: 

155 for type, route in list_routes.items(): 

156 match type: 

157 case "vod": 

158 route = route.format(vod_name="prime_video") 

159 case "year_series": 

160 route = route.format(year_series="2020") 

161 case "year_specific": 

162 route = route.format(year="2019") 

163 case "year_season": 

164 route = route.format(year="2019", season_id="1") 

165 case "company": 

166 route = route.format(company_id="41") 

167 case "tag": 

168 route = route.format(tag="神作") 

169 case "person": 

170 route = route.format(person_id="274563") 

171 case _: 

172 pass 

173 

174 resp = client_nc.get(f"{route}?limit=5") 

175 resp_data = resp.json() 

176 

177 assert resp.status_code == 200 

178 for anime in get_json_val(resp_data, "$.results.animes"): 

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

180 assert ANIME_ENG in caplog.text 

181 assert get_json_val(anime, "$.title") is not None 

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

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

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

185 assert get_json_val(anime, "$.series_id") is not None 

186 assert get_json_val(anime, "$.season_id") is not None 

187 assert get_json_val(anime, "$.link") is not None 

188 

189 

190def test_list_vod_all_minimum_fields_present(client_nc, caplog) -> None: 

191 with open(file="tests/anime/anime_vod_name.txt", mode="r", encoding="utf-8") as f: 

192 test_data = (tuple(line.strip().split(",")) for line in f.readlines()) 

193 

194 for vod_name, vod_title in test_data: 

195 resp = client_nc.get(f"{list_routes["vod"].format(vod_name=vod_name)}?limit=1") 

196 resp_data = resp.json() 

197 

198 assert resp.status_code == 200 

199 assert get_json_val(resp_data, "$.heading").startswith(vod_title) 

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

201 assert ANIME_ENG in caplog.text 

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

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

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

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

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

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

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

209 

210 

211def test_list_year_series_all_minimum_fields_present(client_nc, caplog) -> None: 

212 with open(file="tests/anime/anime_year_series.txt", mode="r", encoding="utf-8") as f: 

213 test_data = (line.strip() for line in f.readlines()) 

214 

215 for year in test_data: 

216 resp = client_nc.get(f"{list_routes["year_series"].format(year_series=year)}?limit=1") 

217 resp_data = resp.json() 

218 

219 assert resp.status_code == 200 

220 assert get_json_val(resp_data, "$.heading").startswith(f"{year}年代") 

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

222 assert ANIME_ENG in caplog.text 

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

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

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

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

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

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

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

230 

231 

232def test_list_year_specific_all_minimum_fields_present(client_nc, caplog) -> None: 

233 with open(file="tests/anime/anime_year_specific.txt", mode="r", encoding="utf-8") as f: 

234 test_data = (line.strip() for line in f.readlines()) 

235 

236 for year in test_data: 

237 resp = client_nc.get(f"{list_routes["year_specific"].format(year=year)}?limit=1") 

238 resp_data = resp.json() 

239 

240 assert resp.status_code == 200 

241 assert get_json_val(resp_data, "$.heading").startswith(f"{year}") 

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

243 assert ANIME_ENG in caplog.text 

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

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

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

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

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

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

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

251 

252 

253def test_list_year_season_all_minimum_fields_present(client_nc, caplog) -> None: 

254 with open(file="tests/anime/anime_year_season.txt", mode="r", encoding="utf-8") as f: 

255 test_data = (tuple(line.strip().split(",")) for line in f.readlines()) 

256 

257 for year, season_id in test_data: 

258 resp = client_nc.get(f"{list_routes["year_season"].format(year=year, season_id=season_id)}?limit=1") 

259 resp_data = resp.json() 

260 

261 assert resp.status_code == 200 

262 assert get_json_val(resp_data, "$.heading").startswith(f"{year}") 

263 assert "冬" if season_id == "1" else "春" if season_id == "4" else "夏" if season_id == "7" else "秋" in get_json_val(resp_data, "$.heading") 

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

265 assert ANIME_ENG in caplog.text 

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

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

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

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

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

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

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

273 

274 

275@pytest.mark.parametrize("company", [ 

276 ("1", "J.C.STAFF"), 

277 ("3", "京都アニメーション"), 

278 ("41", "東映アニメーション") 

279]) 

280def test_list_company_all_minimum_fields_present(client_nc, company, caplog) -> None: 

281 resp = client_nc.get(f"{list_routes["company"].format(company_id=company[0])}?limit=1") 

282 resp_data = resp.json() 

283 

284 assert resp.status_code == 200 

285 assert get_json_val(resp_data, "$.heading").startswith(f"{company[1]}") 

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

287 assert ANIME_ENG in caplog.text 

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

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

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

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

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

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

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

295 

296 

297@pytest.mark.parametrize("tag", [ 

298 "駄作", 

299 "神作", 

300 "平成ヒット", 

301 "令和ヒット", 

302 "漫画原作", 

303]) 

304def test_list_tag_all_minimum_fields_present(client_nc, tag, caplog) -> None: 

305 resp = client_nc.get(f"{list_routes["tag"].format(tag=tag)}?limit=1") 

306 resp_data = resp.json() 

307 

308 assert resp.status_code == 200 

309 assert get_json_val(resp_data, "$.heading").startswith(f"#{tag}") 

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

311 assert ANIME_ENG in caplog.text 

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

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

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

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

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

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

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

319 

320 

321@pytest.mark.parametrize("person", [ 

322 ("25499", "満島ひかり"), 

323 ("240371", "鬼頭明里"), 

324 ("274563", "前田愛") 

325]) 

326def test_list_person_all_minimum_fields_present(client_nc, person, caplog) -> None: 

327 resp = client_nc.get(f"{list_routes["person"].format(person_id=person[0])}?limit=1") 

328 resp_data = resp.json() 

329 

330 assert resp.status_code == 200 

331 assert get_json_val(resp_data, "$.heading").startswith(f"{person[1]}") 

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

333 assert ANIME_ENG in caplog.text 

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

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

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

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

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

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

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