Coverage for tests\movie\test_movie_list.py: 100%
311 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, MOVIE_JPN, MOVIE_ENG
2import json
3import pytest
5list_routes = {
6 "now": "/list-movie/now",
7 "coming-soon": "/list-movie/coming-soon",
8 "opening-this-week": "/list-movie/opening-this-week",
9 "trend": "/list-movie/trend",
10 "vod": "/list-movie/vod/{vod_name}",
11 "award": "/list-movie/award/{award_id}",
12 "year_series": "/list-movie/year/{year_series}s",
13 "year_specific": "/list-movie/year/{year}",
14 "country": "/list-movie/country/{country_id}",
15 "genre": "/list-movie/genre/{genre_id}",
16 "distributor": "/list-movie/distributor/{distributor_id}",
17 "series": "/list-movie/series/{series_id}",
18 "tag": "/list-movie/tag/{tag}",
19 "person": "/list-movie/person/{person_id}",
20}
23@pytest.mark.parametrize("query", [
24 "?limit",
25 "?limit=",
26 "?limit=xyz123",
27 "?limit=10",
28 "?page",
29 "?page=",
30 "?page=987abc",
31 "?page=5",
32 "?limit=1&page=#",
33 "?limit=@&page=1",
34])
35def test_list_query_params_not_valid_integer(client_nc, query) -> None:
36 for type, route in list_routes.items():
37 match type:
38 case "vod":
39 route = route.format(vod_name="prime_video")
40 case "award":
41 route = route.format(award_id="19")
42 case "year_series":
43 route = route.format(year_series="2010")
44 case "year_specific":
45 route = route.format(year="2001")
46 case "country":
47 route = route.format(country_id="5")
48 case "genre":
49 route = route.format(genre_id="903")
50 case "distributor":
51 route = route.format(distributor_id="503")
52 case "series":
53 route = route.format(series_id="1")
54 case "tag":
55 route = route.format(tag="洋画")
56 case "person":
57 route = route.format(person_id="93709")
58 case _:
59 pass
61 resp = client_nc.get(f"{route}{query}")
62 resp_data = resp.json()
64 assert resp.status_code == 422
65 for err in get_json_val(resp_data, "$.detail"):
66 assert get_json_val(err, "$.msg") == "Input should be a valid integer, unable to parse string as an integer"
69@pytest.mark.parametrize("query", [
70 "?limit=-1",
71 "?limit=0",
72 "?page=-5",
73 "?page=0",
74 "?limit=-3&page=3",
75 "?limit=1&page=0",
76])
77def test_list_query_params_less_than_min_threshold(client_nc, query) -> None:
78 for type, route in list_routes.items():
79 match type:
80 case "vod":
81 route = route.format(vod_name="prime_video")
82 case "award":
83 route = route.format(award_id="19")
84 case "year_series":
85 route = route.format(year_series="2010")
86 case "year_specific":
87 route = route.format(year="2001")
88 case "country":
89 route = route.format(country_id="5")
90 case "genre":
91 route = route.format(genre_id="903")
92 case "distributor":
93 route = route.format(distributor_id="503")
94 case "series":
95 route = route.format(series_id="1")
96 case "tag":
97 route = route.format(tag="洋画")
98 case "person":
99 route = route.format(person_id="93709")
100 case _:
101 pass
103 resp = client_nc.get(f"{route}{query}")
104 resp_data = resp.json()
106 assert resp.status_code == 422
107 for err in get_json_val(resp_data, "$.detail"):
108 assert get_json_val(err, "$.msg") == "Input should be greater than 0"
111@pytest.mark.parametrize("query", [
112 "?limit=101",
113 "?page=10001",
114 "?limit=101&page=3",
115 "?limit=100&page=10001",
116])
117def test_list_query_params_more_than_max_threshold(client_nc, query) -> None:
118 for type, route in list_routes.items():
119 match type:
120 case "vod":
121 route = route.format(vod_name="prime_video")
122 case "award":
123 route = route.format(award_id="19")
124 case "year_series":
125 route = route.format(year_series="2010")
126 case "year_specific":
127 route = route.format(year="2001")
128 case "country":
129 route = route.format(country_id="5")
130 case "genre":
131 route = route.format(genre_id="903")
132 case "distributor":
133 route = route.format(distributor_id="503")
134 case "series":
135 route = route.format(series_id="1")
136 case "tag":
137 route = route.format(tag="洋画")
138 case "person":
139 route = route.format(person_id="93709")
140 case _:
141 pass
143 resp = client_nc.get(f"{route}{query}")
144 resp_data = resp.json()
146 assert resp.status_code == 422
147 for err in get_json_val(resp_data, "$.detail"):
148 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"}
151@pytest.mark.parametrize("var", [
152 "1",
153 "abc123",
154])
155def test_list_path_vars_not_valid_integer(client_nc, var) -> None:
156 for type, route in list_routes.items():
157 match type:
158 case "award":
159 route = route.format(award_id=var)
160 case "year_series":
161 route = route.format(year_series=var)
162 case "year_specific":
163 route = route.format(year=var)
164 case "country":
165 route = route.format(country_id=var)
166 case "genre":
167 route = route.format(genre_id=var)
168 case "distributor":
169 route = route.format(distributor_id=var)
170 case "series":
171 route = route.format(series_id=var)
172 case "person":
173 route = route.format(person_id=var)
174 case _:
175 continue
177 resp = client_nc.get(f"{route}")
178 resp_data = resp.json()
180 assert resp.status_code == 422
181 for err in get_json_val(resp_data, "$.detail"):
182 assert get_json_val(err, "$.msg") == "Input should be a valid integer, unable to parse string as an integer"
185def test_list_minimum_fields_present(client_nc, caplog) -> None:
186 for type, route in list_routes.items():
187 match type:
188 case "vod":
189 route = route.format(vod_name="prime_video")
190 case "award":
191 route = route.format(award_id="19")
192 case "year_series":
193 route = route.format(year_series="2010")
194 case "year_specific":
195 route = route.format(year="2001")
196 case "country":
197 route = route.format(country_id="5")
198 case "genre":
199 route = route.format(genre_id="903")
200 case "distributor":
201 route = route.format(distributor_id="503")
202 case "series":
203 route = route.format(series_id="1")
204 case "tag":
205 route = route.format(tag="洋画")
206 case "person":
207 route = route.format(person_id="93709")
208 case _:
209 pass
211 resp = client_nc.get(f"{route}?limit=5")
212 resp_data = resp.json()
214 assert resp.status_code == 200
215 for movie in get_json_val(resp_data, "$.results.movies"):
216 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
217 assert MOVIE_ENG in caplog.text
218 assert get_json_val(movie, "$.title") is not None
219 assert get_json_val(movie, "$.rating") is not None
220 assert get_json_val(movie, "$.mark_count") is not None
221 assert get_json_val(movie, "$.clip_count") is not None
222 assert get_json_val(movie, "$.movie_id") is not None
223 assert get_json_val(movie, "$.link") is not None
226def test_list_vod_all_minimum_fields_present(client_nc, caplog) -> None:
227 with open(file="tests/movie/movie_vod_name.txt", mode="r", encoding="utf-8") as f:
228 test_data = (tuple(line.strip().split(",")) for line in f.readlines())
230 for vod_name, vod_title in test_data:
231 resp = client_nc.get(f"{list_routes["vod"].format(vod_name=vod_name)}?limit=1")
232 resp_data = resp.json()
234 assert resp.status_code == 200
235 assert get_json_val(resp_data, "$.heading").startswith(vod_title)
236 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
237 assert MOVIE_ENG in caplog.text
238 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
239 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
240 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
241 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
242 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
243 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
246@pytest.mark.parametrize("award", [
247 ("1","アカデミー賞"),
248 ("19","日本アカデミー賞")
249])
250def test_list_award_all_minimum_fields_present(client_nc, award, caplog) -> None:
251 resp = client_nc.get(f"{list_routes["award"].format(award_id=award[0])}?limit=1")
252 resp_data = resp.json()
254 assert resp.status_code == 200
255 assert get_json_val(resp_data, "$.heading").startswith(award[1])
256 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
257 assert MOVIE_ENG in caplog.text
258 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
259 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
260 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
261 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
262 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
263 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
266def test_list_year_series_all_minimum_fields_present(client_nc, caplog) -> None:
267 with open(file="tests/movie/movie_year_series.txt", mode="r", encoding="utf-8") as f:
268 test_data = (line.strip() for line in f.readlines())
270 for year in test_data:
271 resp = client_nc.get(f"{list_routes["year_series"].format(year_series=year)}?limit=1")
272 resp_data = resp.json()
274 assert resp.status_code == 200
275 assert get_json_val(resp_data, "$.heading").startswith(f"{year}年代")
276 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
277 assert MOVIE_ENG in caplog.text
278 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
279 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
280 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
281 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
282 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
283 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
286def test_list_year_specific_all_minimum_fields_present(client_nc, caplog) -> None:
287 with open(file="tests/movie/movie_year_specific.txt", mode="r", encoding="utf-8") as f:
288 test_data = (line.strip() for line in f.readlines())
290 for year in test_data:
291 resp = client_nc.get(f"{list_routes["year_specific"].format(year=year)}?limit=1")
292 resp_data = resp.json()
294 assert resp.status_code == 200
295 assert get_json_val(resp_data, "$.heading").startswith(f"{year}年")
296 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
297 assert MOVIE_ENG in caplog.text
298 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
299 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
300 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
301 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
302 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
303 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
306def test_list_country_all_minimum_fields_present(client_nc, caplog) -> None:
307 with open(file="tests/movie/movie_country_id.json", mode="r", encoding="utf-8") as f:
308 test_data = json.load(f)
310 for country in test_data:
311 country_name = get_json_val(country, "$.jp")
312 country_id = get_json_val(country, "$.id")
314 resp = client_nc.get(f"{list_routes["country"].format(country_id=country_id)}?limit=1")
315 resp_data = resp.json()
317 assert resp.status_code == 200
318 assert get_json_val(resp_data, "$.heading").startswith(country_name)
319 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
320 assert MOVIE_ENG in caplog.text
321 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
322 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
323 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
324 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
325 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
326 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
329@pytest.mark.parametrize("genre", [
330 ("17", "ホラー"),
331 ("903", "スリラー")
332])
333def test_list_genre_all_minimum_fields_present(client_nc, genre, caplog) -> None:
334 resp = client_nc.get(f"{list_routes["genre"].format(genre_id=genre[0])}?limit=1")
335 resp_data = resp.json()
337 assert resp.status_code == 200
338 assert get_json_val(resp_data, "$.heading").startswith(f"{genre[1]}")
339 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
340 assert MOVIE_ENG in caplog.text
341 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
342 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
343 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
344 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
345 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
346 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
349@pytest.mark.parametrize("distributor", [
350 ("502", "東宝"),
351 ("503", "ワーナー・ブラザース")
352])
353def test_list_distributor_all_minimum_fields_present(client_nc, distributor, caplog) -> None:
354 resp = client_nc.get(f"{list_routes["distributor"].format(distributor_id=distributor[0])}?limit=1")
355 resp_data = resp.json()
357 assert resp.status_code == 200
358 assert get_json_val(resp_data, "$.heading").startswith(f"{distributor[1]}")
359 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
360 assert MOVIE_ENG in caplog.text
361 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
362 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
363 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
364 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
365 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
366 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
369@pytest.mark.parametrize("series", [
370 ("1", "ハリー・ポッター"),
371 ("76", "ちはやふる")
372])
373def test_list_series_all_minimum_fields_present(client_nc, series, caplog) -> None:
374 resp = client_nc.get(f"{list_routes["series"].format(series_id=series[0])}?limit=1")
375 resp_data = resp.json()
377 assert resp.status_code == 200
378 assert get_json_val(resp_data, "$.heading").startswith(f"{series[1]}")
379 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
380 assert MOVIE_ENG in caplog.text
381 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
382 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
383 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
384 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
385 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
386 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
389@pytest.mark.parametrize("tag", [
390 "洋画",
391 "邦画",
392])
393def test_list_tag_all_minimum_fields_present(client_nc, tag, caplog) -> None:
394 resp = client_nc.get(f"{list_routes["tag"].format(tag=tag)}?limit=1")
395 resp_data = resp.json()
397 assert resp.status_code == 200
398 assert get_json_val(resp_data, "$.heading").startswith(f"#{tag}")
399 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
400 assert MOVIE_ENG in caplog.text
401 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
402 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
403 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
404 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
405 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
406 assert get_json_val(resp_data, "$.results.movies[0].link") is not None
409@pytest.mark.parametrize("person", [
410 ("25185", "二宮和也"),
411 ("169314", "アン・ハサウェイ")
412])
413def test_list_person_all_minimum_fields_present(client_nc, person, caplog) -> None:
414 resp = client_nc.get(f"{list_routes["person"].format(person_id=person[0])}?limit=1")
415 resp_data = resp.json()
417 assert resp.status_code == 200
418 assert get_json_val(resp_data, "$.heading").startswith(f"{person[1]}")
419 assert MOVIE_JPN in get_json_val(resp_data, "$.heading")
420 assert MOVIE_ENG in caplog.text
421 assert get_json_val(resp_data, "$.results.movies[0].title") is not None
422 assert get_json_val(resp_data, "$.results.movies[0].rating") is not None
423 assert get_json_val(resp_data, "$.results.movies[0].mark_count") is not None
424 assert get_json_val(resp_data, "$.results.movies[0].clip_count") is not None
425 assert get_json_val(resp_data, "$.results.movies[0].movie_id") is not None
426 assert get_json_val(resp_data, "$.results.movies[0].link") is not None