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

1from random import choice 

2from tests.conftest import get_json_val, DRAMA_JPN, DRAMA_ENG 

3import json 

4import pytest 

5 

6 

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() 

23 

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" 

27 

28 

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() 

41 

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" 

45 

46 

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() 

57 

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"} 

61 

62 

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() 

74 

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 

80 

81 

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() 

86 

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 

93 

94 

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() 

99 

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 

106 

107 

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") 

133 

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 

140 

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}") 

155 

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") 

159 

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 

163 

164 

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")) 

197 

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 

203 

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}") 

217 

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 

224 

225 

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) 

230 

231 query = get_json_val(drama, "$.title") 

232 series_id = get_json_val(drama, "$.series") 

233 season_id = get_json_val(drama, "$.season") 

234 

235 resp = client_nc.get(f"/search/dramas?q={query}&limit=1") 

236 resp_data = resp.json() 

237 

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 

243 

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