Coverage for tests\drama\test_drama_search.py: 100%
116 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 random import choice
2from tests.conftest import get_json_val, DRAMA_JPN, DRAMA_ENG
3import json
4import pytest
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=コンフィデンスマンJP&limit=@&page=1",
19])
20def test_search_input_not_valid_integer(client_nc, query) -> None:
21 resp = client_nc.get(f"/search/dramas{query}")
22 resp_data = resp.json()
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"
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/dramas{query}")
40 resp_data = resp.json()
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"
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/dramas{query}")
56 resp_data = resp.json()
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"}
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/dramas{query}")
73 resp_data = resp.json()
75 assert resp.status_code == 200
76 assert get_json_val(resp_data, "$.query") == ""
77 assert get_json_val(resp_data, "$.heading") == ""
78 assert DRAMA_ENG in caplog.text
79 assert len(get_json_val(resp_data, "$.results.dramas")) == 0
82def test_search_without_results_page_1(client_nc, caplog) -> None:
83 query = '".*&^'
84 resp = client_nc.get(f"/search/dramas?q={query}")
85 resp_data = resp.json()
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 DRAMA_JPN in get_json_val(resp_data, "$.heading")
91 assert DRAMA_ENG in caplog.text
92 assert len(get_json_val(resp_data, "$.results.dramas")) == 0
95def test_search_without_results_page_2(client_nc, caplog) -> None:
96 query = "ちはやふる" # page 1 returns results, refer to 'test_search_with_results_multiple'
97 resp = client_nc.get(f"/search/dramas?q={query}&page=2")
98 resp_data = resp.json()
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 DRAMA_JPN in get_json_val(resp_data, "$.heading")
104 assert DRAMA_ENG in caplog.text
105 assert len(get_json_val(resp_data, "$.results.dramas")) == 0
108@pytest.mark.parametrize(
109 "test_data",
110 [
111 {
112 "title": "あなたの番です",
113 "rating": 4.0,
114 "mark_count": 30697,
115 "clip_count": 6178,
116 "series_id": 6055,
117 "season_id": 8586,
118 "link": "https://filmarks.com/dramas/6055/8586",
119 "release_date": "2019年04月14日",
120 "playback_time": "46分",
121 "country_of_origin": ["日本"],
122 "genre": ["ミステリー"],
123 "scriptwriter": ["福原充則"],
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/dramas?q={query}&limit=5")
131 resp_data = resp.json()
132 dramas = get_json_val(resp_data, "$.results.dramas")
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 DRAMA_JPN in get_json_val(resp_data, "$.heading")
138 assert DRAMA_ENG in caplog.text
139 assert len(dramas) == 5
141 fields = [
142 "title",
143 "series_id",
144 "season_id",
145 "link",
146 "release_date",
147 "playback_time",
148 "country_of_origin",
149 "genre",
150 "scriptwriter",
151 "cast",
152 ]
153 for field in fields:
154 assert get_json_val(dramas[0], f"$.{field}") == get_json_val(test_data, f"$.{field}")
156 assert get_json_val(dramas[0], "$.rating") == pytest.approx(get_json_val(test_data, "$.rating"), abs=0.5)
157 assert get_json_val(dramas[0], "$.mark_count") >= get_json_val(test_data, "$.mark_count")
158 assert get_json_val(dramas[0], "$.clip_count") >= get_json_val(test_data, "$.clip_count")
160 assert get_json_val(dramas[0], "$.poster") is not None
161 assert get_json_val(dramas[0], "$.executive_producer") is None
162 assert get_json_val(dramas[0], "$.director") is None
165@pytest.mark.parametrize(
166 "test_data",
167 [
168 {
169 "title": "ちはやふる-めぐり-",
170 "series_id": 16234,
171 "season_id": 21896,
172 "link": "https://filmarks.com/dramas/16234/21896",
173 "release_date": "2025年07月09日",
174 "playback_time": "50分",
175 "country_of_origin": ["日本"],
176 "director": ["藤田直哉", "本田大介"],
177 "cast": ["當真あみ", "上白石萌音"],
178 },
179 {
180 "title": "ちはやふる ー繋ぐー",
181 "series_id": 973,
182 "season_id": 2117,
183 "link": "https://filmarks.com/dramas/973/2117",
184 "release_date": "2018年02月20日",
185 "playback_time": "10分",
186 "country_of_origin": ["日本"],
187 "director": ["小泉徳宏"],
188 "cast": ["広瀬すず", "野村周平", "新田真剣佑"],
189 },
190 ],
191)
192def test_search_with_results_multiple(client_nc, test_data, caplog) -> None:
193 query = "ちはやふる"
194 resp = client_nc.get(f"/search/dramas?q={query}&page=1")
195 resp_data = resp.json()
196 drama = next(d for d in get_json_val(resp_data, "$.results.dramas") if get_json_val(d, "$.title") == get_json_val(test_data, "$.title"))
198 assert resp.status_code == 200
199 assert get_json_val(resp_data, "$.query") == query
200 assert get_json_val(resp_data, "$.heading").startswith(query)
201 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
202 assert DRAMA_ENG in caplog.text
204 fields = [
205 "title",
206 "series_id",
207 "season_id",
208 "link",
209 "release_date",
210 "playback_time",
211 "country_of_origin",
212 "director",
213 "cast",
214 ]
215 for field in fields:
216 assert get_json_val(drama, f"$.{field}") == get_json_val(test_data, f"$.{field}")
218 assert get_json_val(drama, "$.rating") is not None
219 assert get_json_val(drama, "$.mark_count") is not None
220 assert get_json_val(drama, "$.clip_count") is not None
221 assert get_json_val(drama, "$.poster") is not None
222 assert get_json_val(drama, "$.executive_producer") is None
223 assert get_json_val(drama, "$.scriptwriter") is None
226def test_search_with_results_random(client_nc, caplog) -> None:
227 with open(file="tests/drama/100_dramas.json", mode="r", encoding="utf-8") as f:
228 test_data = json.load(f)
229 drama = choice(test_data)
231 query = get_json_val(drama, "$.title")
232 series_id = get_json_val(drama, "$.series")
233 season_id = get_json_val(drama, "$.season")
235 resp = client_nc.get(f"/search/dramas?q={query}&limit=1")
236 resp_data = resp.json()
238 assert resp.status_code == 200
239 assert get_json_val(resp_data, "$.query") == query
240 assert get_json_val(resp_data, "$.heading").startswith(query)
241 assert DRAMA_JPN in get_json_val(resp_data, "$.heading")
242 assert DRAMA_ENG in caplog.text
244 assert get_json_val(resp_data, "$.results.dramas[0].title") == query
245 assert get_json_val(resp_data, "$.results.dramas[0].rating") is not None
246 assert get_json_val(resp_data, "$.results.dramas[0].mark_count") is not None
247 assert get_json_val(resp_data, "$.results.dramas[0].clip_count") is not None
248 assert get_json_val(resp_data, "$.results.dramas[0].series_id") == series_id
249 assert get_json_val(resp_data, "$.results.dramas[0].season_id") == season_id
250 assert get_json_val(resp_data, "$.results.dramas[0].link") is not None