1- from unittest .mock import ( # noqa: TID251
2- mock_open ,
3- patch ,
4- )
5-
1+ from unittest .mock import mock_open , patch
62import pytest
73import requests
84
95from web .pandas_web import Preprocessors
106
117
128class MockResponse :
9+ """Minimal mock for requests.Response with correct error behavior."""
1310 def __init__ (self , status_code : int , response : dict ) -> None :
1411 self .status_code = status_code
1512 self ._resp = response
1613
1714 def json (self ):
1815 return self ._resp
1916
20- @staticmethod
21- def raise_for_status () -> None :
22- return
17+ def raise_for_status (self ) -> None :
18+ """Raise an HTTPError for non-2xx responses (important behavior)."""
19+ if not (200 <= self .status_code < 300 ):
20+ raise requests .HTTPError (f"HTTP { self .status_code } " )
21+
22+ # Add context manager support
23+ def __enter__ (self ):
24+ return self
25+
26+ def __exit__ (self , exc_type , exc , tb ):
27+ return False
2328
2429
2530@pytest .fixture
@@ -31,51 +36,27 @@ def context() -> dict:
3136
3237
3338@pytest .fixture
34- def mock_response (monkeypatch , request ) -> None :
39+ def mock_response (monkeypatch , request ):
40+ """Safer fixture — ensures parametrize includes correct tuple."""
41+
3542 def mocked_resp (* args , ** kwargs ):
43+ if not hasattr (request , "param" ) or len (request .param ) != 2 :
44+ raise RuntimeError (
45+ "mock_response must be parametrized as (status_code, response_json)"
46+ )
3647 status_code , response = request .param
3748 return MockResponse (status_code , response )
3849
3950 monkeypatch .setattr (requests , "get" , mocked_resp )
4051
4152
4253_releases_list = [
43- {
44- "prerelease" : False ,
45- "published_at" : "2024-01-19T03:34:05Z" ,
46- "tag_name" : "v1.5.6" ,
47- "assets" : None ,
48- },
49- {
50- "prerelease" : False ,
51- "published_at" : "2023-11-10T19:07:37Z" ,
52- "tag_name" : "v2.1.3" ,
53- "assets" : None ,
54- },
55- {
56- "prerelease" : False ,
57- "published_at" : "2023-08-30T13:24:32Z" ,
58- "tag_name" : "v2.1.0" ,
59- "assets" : None ,
60- },
61- {
62- "prerelease" : False ,
63- "published_at" : "2023-04-30T13:24:32Z" ,
64- "tag_name" : "v2.0.0" ,
65- "assets" : None ,
66- },
67- {
68- "prerelease" : True ,
69- "published_at" : "2023-01-19T03:34:05Z" ,
70- "tag_name" : "v1.5.3xd" ,
71- "assets" : None ,
72- },
73- {
74- "prerelease" : False ,
75- "published_at" : "2027-01-19T03:34:05Z" ,
76- "tag_name" : "v10.0.1" ,
77- "assets" : None ,
78- },
54+ {"prerelease" : False , "published_at" : "2024-01-19T03:34:05Z" , "tag_name" : "v1.5.6" , "assets" : None },
55+ {"prerelease" : False , "published_at" : "2023-11-10T19:07:37Z" , "tag_name" : "v2.1.3" , "assets" : None },
56+ {"prerelease" : False , "published_at" : "2023-08-30T13:24:32Z" , "tag_name" : "v2.1.0" , "assets" : None },
57+ {"prerelease" : False , "published_at" : "2023-04-30T13:24:32Z" , "tag_name" : "v2.0.0" , "assets" : None },
58+ {"prerelease" : True , "published_at" : "2023-01-19T03:34:05Z" , "tag_name" : "v1.5.3xd" , "assets" : None },
59+ {"prerelease" : False , "published_at" : "2027-01-19T03:34:05Z" , "tag_name" : "v10.0.1" , "assets" : None },
7960]
8061
8162
0 commit comments