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

1from tests.conftest import get_json_val, DRAMA_JPN, DRAMA_ENG 

2import json 

3import pytest 

4 

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} 

15 

16 

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 

48 

49 resp = client_nc.get(f"{route}{query}") 

50 resp_data = resp.json() 

51 

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" 

55 

56 

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 

84 

85 resp = client_nc.get(f"{route}{query}") 

86 resp_data = resp.json() 

87 

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" 

91 

92 

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 

118 

119 resp = client_nc.get(f"{route}{query}") 

120 resp_data = resp.json() 

121 

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

125 

126 

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 

146 

147 resp = client_nc.get(f"{route}") 

148 resp_data = resp.json() 

149 

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" 

153 

154 

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 

174 

175 resp = client_nc.get(f"{route}?limit=5") 

176 resp_data = resp.json() 

177 

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 

189 

190 

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

194 

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

198 

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 

210 

211 

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

215 

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

219 

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 

231 

232 

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

236 

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

240 

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 

252 

253 

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) 

257 

258 for country in test_data: 

259 country_name = get_json_val(country, "$.jp") 

260 country_id = get_json_val(country, "$.id") 

261 

262 resp = client_nc.get(f"{list_routes["country"].format(country_id=country_id)}?limit=1") 

263 resp_data = resp.json() 

264 

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 

276 

277 

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) 

281 

282 for genre in test_data: 

283 genre_name = get_json_val(genre, "$.jp") 

284 genre_id = get_json_val(genre, "$.id") 

285 

286 resp = client_nc.get(f"{list_routes["genre"].format(genre_id=genre_id)}?limit=1") 

287 resp_data = resp.json() 

288 

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 

300 

301 

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

313 

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 

325 

326 

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

335 

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