Coverage for tests\drama\test_drama_list.py: 100%
251 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, DRAMA_JPN, DRAMA_ENG
2import json
3import pytest
5list_routes = {
6 "trend": "/list-drama/trend",
7 "vod": "/list-drama/vod/{vod_name}",
8 "year_series": "/list-drama/year/{year_series}s",
9 "year_specific": "/list-drama/year/{year}",
10 "country": "/list-drama/country/{country_id}",
11 "genre": "/list-drama/genre/{genre_id}",
12 "tag": "/list-drama/tag/{tag}",
13 "person": "/list-drama/person/{person_id}",
14}
17@pytest.mark.parametrize("query", [
18 "?limit",
19 "?limit=",
20 "?limit=xyz123",
21 "?limit=10",
22 "?page",
23 "?page=",
24 "?page=987abc",
25 "?page=5",
26 "?limit=1&page=#",
27 "?limit=@&page=1",
28])
29def test_list_query_params_not_valid_integer(client_nc, query) -> None:
30 for type, route in list_routes.items():
31 match type:
32 case "vod":
33 route = route.format(vod_name="prime_video")
34 case "year_series":
35 route = route.format(year_series="2020")
36 case "year_specific":
37 route = route.format(year="2019")
38 case "country":
39 route = route.format(country_id="144")
40 case "genre":
41 route = route.format(genre_id="7")
42 case "tag":
43 route = route.format(tag="神作")
44 case "person":
45 route = route.format(person_id="25499")
46 case _:
47 pass
49 resp = client_nc.get(f"{route}{query}")
50 resp_data = resp.json()
52 assert resp.status_code == 422
53 for err in get_json_val(resp_data, "$.detail"):
54 assert get_json_val(err, "$.msg") == "Input should be a valid integer, unable to parse string as an integer"
57@pytest.mark.parametrize("query", [
58 "?limit=-1",
59 "?limit=0",
60 "?page=-5",
61 "?page=0",
62 "?limit=-3&page=3",
63 "?limit=1&page=0",
64])
65def test_list_query_params_less_than_min_threshold(client_nc, query) -> None:
66 for type, route in list_routes.items():
67 match type:
68 case "vod":
69 route = route.format(vod_name="prime_video")
70 case "year_series":
71 route = route.format(year_series="2020")
72 case "year_specific":
73 route = route.format(year="2019")
74 case "country":
75 route = route.format(country_id="144")
76 case "genre":
77 route = route.format(genre_id="7")
78 case "tag":
79 route = route.format(tag="神作")
80 case "person":
81 route = route.format(person_id="25499")
82 case _:
83 pass
85 resp = client_nc.get(f"{route}{query}")
86 resp_data = resp.json()
88 assert resp.status_code == 422
89 for err in get_json_val(resp_data, "$.detail"):
90 assert get_json_val(err, "$.msg") == "Input should be greater than 0"
93@pytest.mark.parametrize("query", [
94 "?limit=101",
95 "?page=10001",
96 "?limit=101&page=3",
97 "?limit=100&page=10001",
98])
99def test_list_query_params_more_than_max_threshold(client_nc, query) -> None:
100 for type, route in list_routes.items():
101 match type:
102 case "vod":
103 route = route.format(vod_name="prime_video")
104 case "year_series":
105 route = route.format(year_series="2020")
106 case "year_specific":
107 route = route.format(year="2019")
108 case "country":
109 route = route.format(country_id="144")
110 case "genre":
111 route = route.format(genre_id="7")
112 case "tag":
113 route = route.format(tag="神作")
114 case "person":
115 route = route.format(person_id="25499")
116 case _:
117 pass
119 resp = client_nc.get(f"{route}{query}")
120 resp_data = resp.json()
122 assert resp.status_code == 422
123 for err in get_json_val(resp_data, "$.detail"):
124 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"}
127@pytest.mark.parametrize("var", [
128 "1",
129 "abc123",
130])
131def test_list_path_vars_not_valid_integer(client_nc, var) -> None:
132 for type, route in list_routes.items():
133 match type:
134 case "year_series":
135 route = route.format(year_series=var)
136 case "year_specific":
137 route = route.format(year=var)
138 case "country":
139 route = route.format(country_id=var)
140 case "genre":
141 route = route.format(genre_id=var)
142 case "person":
143 route = route.format(person_id=var)
144 case _:
145 continue
147 resp = client_nc.get(f"{route}")
148 resp_data = resp.json()
150 assert resp.status_code == 422
151 for err in get_json_val(resp_data, "$.detail"):
152 assert get_json_val(err, "$.msg") == "Input should be a valid integer, unable to parse string as an integer"
155def test_list_minimum_fields_present(client_nc, caplog) -> None:
156 for type, route in list_routes.items():
157 match type:
158 case "vod":
159 route = route.format(vod_name="prime_video")
160 case "year_series":
161 route = route.format(year_series="2020")
162 case "year_specific":
163 route = route.format(year="2019")
164 case "country":
165 route = route.format(country_id="144")
166 case "genre":
167 route = route.format(genre_id="7")
168 case "tag":
169 route = route.format(tag="神作")
170 case "person":
171 route = route.format(person_id="25499")
172 case _:
173 pass
175 resp = client_nc.get(f"{route}?limit=5")
176 resp_data = resp.json()
178 assert resp.status_code == 200
179 for drama in get_json_val(resp_data, "$.results.dramas"):
180 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
181 assert DRAMA_ENG in caplog.text
182 assert get_json_val(drama, "$.title") is not None
183 assert get_json_val(drama, "$.rating") is not None
184 assert get_json_val(drama, "$.mark_count") is not None
185 assert get_json_val(drama, "$.clip_count") is not None
186 assert get_json_val(drama, "$.series_id") is not None
187 assert get_json_val(drama, "$.season_id") is not None
188 assert get_json_val(drama, "$.link") is not None
191def test_list_vod_all_minimum_fields_present(client_nc, caplog) -> None:
192 with open(file="tests/drama/drama_vod_name.txt", mode="r", encoding="utf-8") as f:
193 test_data = (tuple(line.strip().split(",")) for line in f.readlines())
195 for vod_name, vod_title in test_data:
196 resp = client_nc.get(f"{list_routes["vod"].format(vod_name=vod_name)}?limit=1")
197 resp_data = resp.json()
199 assert resp.status_code == 200
200 assert get_json_val(resp_data, "$.heading").startswith(vod_title)
201 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
202 assert DRAMA_ENG in caplog.text
203 assert get_json_val(resp_data, "$.results.dramas[0].title") is not None
204 assert get_json_val(resp_data, "$.results.dramas[0].rating") is not None
205 assert get_json_val(resp_data, "$.results.dramas[0].mark_count") is not None
206 assert get_json_val(resp_data, "$.results.dramas[0].clip_count") is not None
207 assert get_json_val(resp_data, "$.results.dramas[0].series_id") is not None
208 assert get_json_val(resp_data, "$.results.dramas[0].season_id") is not None
209 assert get_json_val(resp_data, "$.results.dramas[0].link") is not None
212def test_list_year_series_all_minimum_fields_present(client_nc, caplog) -> None:
213 with open(file="tests/drama/drama_year_series.txt", mode="r", encoding="utf-8") as f:
214 test_data = (line.strip() for line in f.readlines())
216 for year in test_data:
217 resp = client_nc.get(f"{list_routes["year_series"].format(year_series=year)}?limit=1")
218 resp_data = resp.json()
220 assert resp.status_code == 200
221 assert get_json_val(resp_data, "$.heading").startswith(f"{year}年代")
222 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
223 assert DRAMA_ENG in caplog.text
224 assert get_json_val(resp_data, "$.results.dramas[0].title") is not None
225 assert get_json_val(resp_data, "$.results.dramas[0].rating") is not None
226 assert get_json_val(resp_data, "$.results.dramas[0].mark_count") is not None
227 assert get_json_val(resp_data, "$.results.dramas[0].clip_count") is not None
228 assert get_json_val(resp_data, "$.results.dramas[0].series_id") is not None
229 assert get_json_val(resp_data, "$.results.dramas[0].season_id") is not None
230 assert get_json_val(resp_data, "$.results.dramas[0].link") is not None
233def test_list_year_specific_all_minimum_fields_present(client_nc, caplog) -> None:
234 with open(file="tests/drama/drama_year_specific.txt", mode="r", encoding="utf-8") as f:
235 test_data = (line.strip() for line in f.readlines())
237 for year in test_data:
238 resp = client_nc.get(f"{list_routes["year_specific"].format(year=year)}?limit=1")
239 resp_data = resp.json()
241 assert resp.status_code == 200
242 assert get_json_val(resp_data, "$.heading").startswith(f"{year}年")
243 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
244 assert DRAMA_ENG in caplog.text
245 assert get_json_val(resp_data, "$.results.dramas[0].title") is not None
246 assert get_json_val(resp_data, "$.results.dramas[0].rating") is not None
247 assert get_json_val(resp_data, "$.results.dramas[0].mark_count") is not None
248 assert get_json_val(resp_data, "$.results.dramas[0].clip_count") is not None
249 assert get_json_val(resp_data, "$.results.dramas[0].series_id") is not None
250 assert get_json_val(resp_data, "$.results.dramas[0].season_id") is not None
251 assert get_json_val(resp_data, "$.results.dramas[0].link") is not None
254def test_list_country_all_minimum_fields_present(client_nc, caplog) -> None:
255 with open(file="tests/drama/drama_country_id.json", mode="r", encoding="utf-8") as f:
256 test_data = json.load(f)
258 for country in test_data:
259 country_name = get_json_val(country, "$.jp")
260 country_id = get_json_val(country, "$.id")
262 resp = client_nc.get(f"{list_routes["country"].format(country_id=country_id)}?limit=1")
263 resp_data = resp.json()
265 assert resp.status_code == 200
266 assert get_json_val(resp_data, "$.heading").startswith(country_name)
267 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
268 assert DRAMA_ENG in caplog.text
269 assert get_json_val(resp_data, "$.results.dramas[0].title") is not None
270 assert get_json_val(resp_data, "$.results.dramas[0].rating") is not None
271 assert get_json_val(resp_data, "$.results.dramas[0].mark_count") is not None
272 assert get_json_val(resp_data, "$.results.dramas[0].clip_count") is not None
273 assert get_json_val(resp_data, "$.results.dramas[0].series_id") is not None
274 assert get_json_val(resp_data, "$.results.dramas[0].season_id") is not None
275 assert get_json_val(resp_data, "$.results.dramas[0].link") is not None
278def test_list_genre_all_minimum_fields_present(client_nc, caplog) -> None:
279 with open(file="tests/drama/drama_genre_id.json", mode="r", encoding="utf-8") as f:
280 test_data = json.load(f)
282 for genre in test_data:
283 genre_name = get_json_val(genre, "$.jp")
284 genre_id = get_json_val(genre, "$.id")
286 resp = client_nc.get(f"{list_routes["genre"].format(genre_id=genre_id)}?limit=1")
287 resp_data = resp.json()
289 assert resp.status_code == 200
290 assert get_json_val(resp_data, "$.heading").startswith(genre_name)
291 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
292 assert DRAMA_ENG in caplog.text
293 assert get_json_val(resp_data, "$.results.dramas[0].title") is not None
294 assert get_json_val(resp_data, "$.results.dramas[0].rating") is not None
295 assert get_json_val(resp_data, "$.results.dramas[0].mark_count") is not None
296 assert get_json_val(resp_data, "$.results.dramas[0].clip_count") is not None
297 assert get_json_val(resp_data, "$.results.dramas[0].series_id") is not None
298 assert get_json_val(resp_data, "$.results.dramas[0].season_id") is not None
299 assert get_json_val(resp_data, "$.results.dramas[0].link") is not None
302@pytest.mark.parametrize("tag", [
303 "駄作",
304 "神作",
305 "平成ヒット",
306 "令和ヒット",
307 "漫画原作",
308 "1話30分以内",
309])
310def test_list_tag_all_minimum_fields_present(client_nc, tag, caplog) -> None:
311 resp = client_nc.get(f"{list_routes["tag"].format(tag=tag)}?limit=1")
312 resp_data = resp.json()
314 assert resp.status_code == 200
315 assert get_json_val(resp_data, "$.heading").startswith(f"#{tag}")
316 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
317 assert DRAMA_ENG in caplog.text
318 assert get_json_val(resp_data, "$.results.dramas[0].title") is not None
319 assert get_json_val(resp_data, "$.results.dramas[0].rating") is not None
320 assert get_json_val(resp_data, "$.results.dramas[0].mark_count") is not None
321 assert get_json_val(resp_data, "$.results.dramas[0].clip_count") is not None
322 assert get_json_val(resp_data, "$.results.dramas[0].series_id") is not None
323 assert get_json_val(resp_data, "$.results.dramas[0].season_id") is not None
324 assert get_json_val(resp_data, "$.results.dramas[0].link") is not None
327@pytest.mark.parametrize("person", [
328 ("25499", "満島ひかり"),
329 ("79213", "山﨑賢人"),
330 ("125964", "戸田恵梨香")
331])
332def test_list_person_all_minimum_fields_present(client_nc, person, caplog) -> None:
333 resp = client_nc.get(f"{list_routes["person"].format(person_id=person[0])}?limit=1")
334 resp_data = resp.json()
336 assert resp.status_code == 200
337 assert get_json_val(resp_data, "$.heading").startswith(f"{person[1]}")
338 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
339 assert DRAMA_ENG in caplog.text
340 assert get_json_val(resp_data, "$.results.dramas[0].title") is not None
341 assert get_json_val(resp_data, "$.results.dramas[0].rating") is not None
342 assert get_json_val(resp_data, "$.results.dramas[0].mark_count") is not None
343 assert get_json_val(resp_data, "$.results.dramas[0].clip_count") is not None
344 assert get_json_val(resp_data, "$.results.dramas[0].series_id") is not None
345 assert get_json_val(resp_data, "$.results.dramas[0].season_id") is not None
346 assert get_json_val(resp_data, "$.results.dramas[0].link") is not None