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
« 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
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}
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
48 resp = client_nc.get(f"{route}{query}")
49 resp_data = resp.json()
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"
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
84 resp = client_nc.get(f"{route}{query}")
85 resp_data = resp.json()
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"
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
118 resp = client_nc.get(f"{route}{query}")
119 resp_data = resp.json()
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"}
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
146 resp = client_nc.get(f"{route}")
147 resp_data = resp.json()
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"
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
174 resp = client_nc.get(f"{route}?limit=5")
175 resp_data = resp.json()
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
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())
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()
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
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())
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()
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
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())
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()
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
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())
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()
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
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()
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
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()
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
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()
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