Coverage for tests\drama\test_drama_api.py: 100%
50 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 pydantic import Field
2from requests.exceptions import RequestException
3from src.utility.models import ListParams, ReviewParams, SearchParams
4from tests.conftest import get_json_val
5import pytest
8@pytest.mark.parametrize("path", [
9 "/dramas",
10 "/dramas/1",
11 "/dramas//1",
12 "/dramas/1//reviews",
13 "/dramas//1/reviews",
14 "/list-drama",
15 "/list-drama/vod",
16 "/list-drama/year/2010s/2019",
17 "/list-drama/year",
18 "/list-drama/country",
19 "/list-drama/genre",
20 "/list-drama/tag",
21 "/list-drama/person",
22])
23def test_invalid_endpoint_base(client_nc, path) -> None:
24 resp = client_nc.get(path)
25 resp_data = resp.json()
27 assert resp.status_code == 404
28 assert get_json_val(resp_data, "$.detail") == "Not Found"
31@pytest.mark.parametrize("path", [
32 "/dramas/9999999999/9999999999",
33 "/dramas/9999999999/9999999999/reviews",
34 "/dramas/9999999999/9999999999/reviews/9999999999",
35 "/list-drama/vod/invalid_vod",
36 "/list-drama/year/999s",
37 "/list-drama/year/999",
38 "/list-drama/country/9999999999",
39 "/list-drama/genre/9999999999",
40 "/list-drama/tag/invalid_tag",
41 "/list-drama/person/9999999999",
42])
43def test_invalid_endpoint_filmarks(client_nc, path, caplog) -> None:
44 resp = client_nc.get(path)
45 resp_data = resp.json()
47 assert resp.status_code == 404
48 assert get_json_val(resp_data, "$.detail") == "The requested resource could not be found."
49 assert "Invalid Filmarks page requested" in caplog.text
52@pytest.mark.parametrize("test_data", [
53 (
54 "/search/dramas?q=test500",
55 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
56 "Failed to search dramas."
57 ),
58 (
59 "/dramas/500/500",
60 "src.scrape.info.info_drama_scraper.InfoDramaScraper.scrape",
61 "Failed to retrieve information for drama with series ID: 500 and season ID: 500."
62 ),
63 (
64 "/dramas/500/500/reviews",
65 "src.scrape.info.info_drama_scraper.InfoDramaScraper.scrape",
66 "Failed to retrieve reviews for drama with series ID: 500 and season ID: 500."
67 ),
68 (
69 "/dramas/500/500/reviews/500",
70 "src.scrape.info.info_drama_scraper.InfoDramaScraper.scrape",
71 "Failed to retrieve review for drama with series ID: 500, season ID: 500, and review ID: 500."
72 ),
73 (
74 "/list-drama/trend",
75 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
76 "Failed to fetch trending dramas."
77 ),
78 (
79 "/list-drama/vod/500_vod",
80 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
81 "Failed to fetch dramas from VOD service: 500_vod."
82 ),
83 (
84 "/list-drama/year/500s",
85 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
86 "Failed to fetch dramas from year series: 500s."
87 ),
88 (
89 "/list-drama/year/500",
90 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
91 "Failed to fetch dramas from year: 500."
92 ),
93 (
94 "/list-drama/country/500",
95 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
96 "Failed to fetch dramas with country ID: 500."
97 ),
98 (
99 "/list-drama/genre/500",
100 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
101 "Failed to fetch dramas with genre ID: 500."
102 ),
103 (
104 "/list-drama/tag/500_tag",
105 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
106 "Failed to fetch dramas with tag: 500_tag."
107 ),
108 (
109 "/list-drama/person/500",
110 "src.scrape.search.search_drama_scraper.SearchDramaScraper.scrape",
111 "Failed to fetch dramas with person ID: 500."
112 ),
113])
114def test_scrape_error_500_server_error(client_nc, mocker, test_data, caplog) -> None:
115 mocker.patch(
116 target=test_data[1],
117 side_effect=Exception("Testing - 500 Internal Server Error"),
118 )
120 resp = client_nc.get(test_data[0])
121 resp_data = resp.json()
123 assert resp.status_code == 500
124 assert get_json_val(resp_data, "$.detail") == "The server encountered an unexpected error."
125 assert "Testing - 500 Internal Server Error" in caplog.text
126 assert test_data[2] in caplog.text
129@pytest.mark.parametrize("path", [
130 "/search/dramas?q=test503",
131 "/dramas/503/503",
132 "/dramas/503/503/reviews",
133 "/dramas/503/503/reviews/503",
134 "/list-drama/trend",
135 "/list-drama/vod/503_vod",
136 "/list-drama/year/503s",
137 "/list-drama/year/503",
138 "/list-drama/country/503",
139 "/list-drama/genre/503",
140 "/list-drama/tag/503_tag",
141 "/list-drama/person/503",
142])
143def test_scrape_error_503_service_unavailable_session(client_nc, mocker, path, caplog) -> None:
144 mocker.patch(
145 target="src.scrape.base_scraper.Session",
146 side_effect=RequestException("Testing - 503 Service Unavailable"),
147 )
149 resp = client_nc.get(path)
150 resp_data = resp.json()
152 assert resp.status_code == 503
153 assert get_json_val(resp_data, "$.detail") == "The service is currently unavailable."
154 assert "Request to Filmarks failed: 'Testing - 503 Service Unavailable'" in caplog.text
157@pytest.mark.parametrize("path", [
158 "/dramas/6055/8586/reviews?page=9999999999999999999",
159 "/list-drama/trend?page=999999999999999999",
160 "/list-drama/vod/prime_video?page=999999999999999999",
161 "/list-drama/year/2020s?page=999999999999999999",
162 "/list-drama/year/2025?page=999999999999999999",
163 "/list-drama/country/144?page=999999999999999999",
164 "/list-drama/genre/9?page=999999999999999999",
165 "/list-drama/tag/駄作?page=999999999999999999",
166 "/list-drama/person/25499?page=999999999999999999",
167])
168def test_scrape_error_503_service_unavailable_filmarks(client_nc, path, caplog) -> None:
169 class CustomParams():
170 page: int = Field(1, gt=0)
171 client_nc.app.dependency_overrides[SearchParams] = CustomParams
172 client_nc.app.dependency_overrides[ReviewParams] = CustomParams
173 client_nc.app.dependency_overrides[ListParams] = CustomParams
175 resp = client_nc.get(path)
176 resp_data = resp.json()
178 assert resp.status_code == 503
179 assert get_json_val(resp_data, "$.detail") == "The service is currently unavailable."
180 assert "Filmarks is temporarily unavailable" in caplog.text
182 del client_nc.app.dependency_overrides[SearchParams]
183 del client_nc.app.dependency_overrides[ReviewParams]
184 del client_nc.app.dependency_overrides[ListParams]