Coverage for tests\anime\test_anime_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, ANIME_JPN, ANIME_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=名探偵コナン&limit=@&page=1",
19])
20def test_search_input_not_valid_integer(client_nc, query) -> None:
21 resp = client_nc.get(f"/search/animes{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/animes{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/animes{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/animes{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 ANIME_ENG in caplog.text
79 assert len(get_json_val(resp_data, "$.results.animes")) == 0
82def test_search_without_results_page_1(client_nc, caplog) -> None:
83 query = '".*&^'
84 resp = client_nc.get(f"/search/animes?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 ANIME_JPN in get_json_val(resp_data, "$.heading")
91 assert ANIME_ENG in caplog.text
92 assert len(get_json_val(resp_data, "$.results.animes")) == 0
95def test_search_without_results_page_2(client_nc, caplog) -> None:
96 query = "俺物語!!" # page 1 returns results, refer to 'test_search_with_results_single'
97 resp = client_nc.get(f"/search/animes?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 ANIME_JPN in get_json_val(resp_data, "$.heading")
104 assert ANIME_ENG in caplog.text
105 assert len(get_json_val(resp_data, "$.results.animes")) == 0
108@pytest.mark.parametrize(
109 "test_data",
110 [
111 {
112 "title": "俺物語!!",
113 "rating": 3.9,
114 "mark_count": 5418,
115 "clip_count": 1051,
116 "series_id": 603,
117 "season_id": 1373,
118 "link": "https://filmarks.com/animes/603/1373",
119 "release_date": "2015年04月08日",
120 "playback_time": "23分",
121 "production_company": ["マッドハウス"],
122 "director": ["浅香守生"],
123 "series_composer": ["高橋ナツコ"],
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/animes?q={query}&limit=1")
131 resp_data = resp.json()
132 animes = get_json_val(resp_data, "$.results.animes")
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 ANIME_JPN in get_json_val(resp_data, "$.heading")
138 assert ANIME_ENG in caplog.text
139 assert len(animes) == 1
141 fields = [
142 "title",
143 "series_id",
144 "season_id",
145 "link",
146 "release_date",
147 "playback_time",
148 "production_company",
149 "director",
150 "series_composer",
151 "cast",
152 ]
153 for field in fields:
154 assert get_json_val(animes[0], f"$.{field}") == get_json_val(test_data, f"$.{field}")
156 assert get_json_val(animes[0], "$.rating") == pytest.approx(get_json_val(test_data, "$.rating"), abs=0.5)
157 assert get_json_val(animes[0], "$.mark_count") >= get_json_val(test_data, "$.mark_count")
158 assert get_json_val(animes[0], "$.clip_count") >= get_json_val(test_data, "$.clip_count")
160 assert get_json_val(animes[0], "$.poster") is not None
161 assert get_json_val(animes[0], "$.producer") is None
162 assert get_json_val(animes[0], "$.executive_producer") is None
165@pytest.mark.parametrize(
166 "test_data",
167 [
168 {
169 "title": "のだめカンタービレ",
170 "series_id": 1342,
171 "season_id": 1783,
172 "link": "https://filmarks.com/animes/1342/1783",
173 "release_date": "2007年01月11日",
174 "director": ["カサヰケンイチ"],
175 "series_composer": ["金春智子"],
176 "cast": ["川澄綾子", "関智一"],
177 },
178 {
179 "title": "のだめカンタービレ 巴里編",
180 "series_id": 1342,
181 "season_id": 1784,
182 "link": "https://filmarks.com/animes/1342/1784",
183 "release_date": "2008年10月09日",
184 "director": ["今千秋"],
185 "series_composer": ["榎戸洋司"],
186 "cast": ["川澄綾子", "関智一"],
187 },
188 {
189 "title": "のだめカンタービレ フィナーレ",
190 "series_id": 1342,
191 "season_id": 1785,
192 "link": "https://filmarks.com/animes/1342/1785",
193 "release_date": "2010年01月14日",
194 "director": ["今千秋"],
195 "series_composer": ["中島かずき"],
196 "cast": ["川澄綾子", "関智一"],
197 },
198 ],
199)
200def test_search_with_results_multiple(client_nc, test_data, caplog) -> None:
201 query = "のだめカンタービレ"
202 resp = client_nc.get(f"/search/animes?q={query}&page=1")
203 resp_data = resp.json()
204 anime = next(a for a in get_json_val(resp_data, "$.results.animes") if get_json_val(a, "$.title") == get_json_val(test_data, "$.title"))
206 assert resp.status_code == 200
207 assert get_json_val(resp_data, "$.query") == query
208 assert get_json_val(resp_data, "$.heading").startswith(query)
209 assert ANIME_JPN in get_json_val(resp_data, "$.heading")
210 assert ANIME_ENG in caplog.text
212 fields = [
213 "title",
214 "series_id",
215 "season_id",
216 "link",
217 "release_date",
218 "director",
219 "series_composer",
220 "cast",
221 ]
222 for field in fields:
223 assert get_json_val(anime, f"$.{field}") == get_json_val(test_data, f"$.{field}")
225 assert get_json_val(anime, "$.rating") is not None
226 assert get_json_val(anime, "$.mark_count") is not None
227 assert get_json_val(anime, "$.clip_count") is not None
228 assert get_json_val(anime, "$.poster") is not None
229 assert get_json_val(anime, "$.producer") is None
230 assert get_json_val(anime, "$.executive_producer") is None
233def test_search_with_results_random(client_nc, caplog) -> None:
234 with open(file="tests/anime/100_animes.json", mode="r", encoding="utf-8") as f:
235 test_data = json.load(f)
236 anime = choice(test_data)
238 query = get_json_val(anime, "$.title")
239 series_id = get_json_val(anime, "$.series")
240 season_id = get_json_val(anime, "$.season")
242 resp = client_nc.get(f"/search/animes?q={query}&limit=1")
243 resp_data = resp.json()
245 assert resp.status_code == 200
246 assert get_json_val(resp_data, "$.query") == query
247 assert get_json_val(resp_data, "$.heading").startswith(query)
248 assert ANIME_JPN in get_json_val(resp_data, "$.heading")
249 assert ANIME_ENG in caplog.text
251 assert get_json_val(resp_data, "$.results.animes[0].title") == query
252 assert get_json_val(resp_data, "$.results.animes[0].rating") is not None
253 assert get_json_val(resp_data, "$.results.animes[0].mark_count") is not None
254 assert get_json_val(resp_data, "$.results.animes[0].clip_count") is not None
255 assert get_json_val(resp_data, "$.results.animes[0].series_id") == series_id
256 assert get_json_val(resp_data, "$.results.animes[0].season_id") == season_id
257 assert get_json_val(resp_data, "$.results.animes[0].link") is not None