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

1from tests.conftest import get_json_val, MOVIE_JPN, MOVIE_ENG 

2import json 

3import pytest 

4 

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} 

21 

22 

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 

60 

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

62 resp_data = resp.json() 

63 

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" 

67 

68 

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 

102 

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

104 resp_data = resp.json() 

105 

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" 

109 

110 

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 

142 

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

144 resp_data = resp.json() 

145 

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

149 

150 

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 

176 

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

178 resp_data = resp.json() 

179 

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" 

183 

184 

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 

210 

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

212 resp_data = resp.json() 

213 

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 

224 

225 

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

229 

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

233 

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 

244 

245 

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

253 

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 

264 

265 

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

269 

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

273 

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 

284 

285 

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

289 

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

293 

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 

304 

305 

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) 

309 

310 for country in test_data: 

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

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

313 

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

315 resp_data = resp.json() 

316 

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 

327 

328 

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

336 

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 

347 

348 

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

356 

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 

367 

368 

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

376 

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 

387 

388 

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

396 

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 

407 

408 

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

416 

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