Skip to content

Commit 9460e18

Browse files
Reuse raw helpers for model get and delete parsing wrappers
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 3afb7d3 commit 9460e18

File tree

2 files changed

+228
-12
lines changed

2 files changed

+228
-12
lines changed

hyperbrowser/client/managers/model_request_utils.py

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,13 @@ def get_model_request(
5656
model: Type[T],
5757
operation_name: str,
5858
) -> T:
59-
response = client.transport.get(
60-
client._build_url(route_path),
59+
response_data = get_model_response_data(
60+
client=client,
61+
route_path=route_path,
6162
params=params,
6263
)
6364
return parse_response_model(
64-
response.data,
65+
response_data,
6566
model=model,
6667
operation_name=operation_name,
6768
)
@@ -95,16 +96,28 @@ def delete_model_request(
9596
model: Type[T],
9697
operation_name: str,
9798
) -> T:
98-
response = client.transport.delete(
99-
client._build_url(route_path),
99+
response_data = delete_model_response_data(
100+
client=client,
101+
route_path=route_path,
100102
)
101103
return parse_response_model(
102-
response.data,
104+
response_data,
103105
model=model,
104106
operation_name=operation_name,
105107
)
106108

107109

110+
def delete_model_response_data(
111+
*,
112+
client: Any,
113+
route_path: str,
114+
) -> Any:
115+
response = client.transport.delete(
116+
client._build_url(route_path),
117+
)
118+
return response.data
119+
120+
108121
def put_model_request(
109122
*,
110123
client: Any,
@@ -189,12 +202,13 @@ async def get_model_request_async(
189202
model: Type[T],
190203
operation_name: str,
191204
) -> T:
192-
response = await client.transport.get(
193-
client._build_url(route_path),
205+
response_data = await get_model_response_data_async(
206+
client=client,
207+
route_path=route_path,
194208
params=params,
195209
)
196210
return parse_response_model(
197-
response.data,
211+
response_data,
198212
model=model,
199213
operation_name=operation_name,
200214
)
@@ -228,16 +242,28 @@ async def delete_model_request_async(
228242
model: Type[T],
229243
operation_name: str,
230244
) -> T:
231-
response = await client.transport.delete(
232-
client._build_url(route_path),
245+
response_data = await delete_model_response_data_async(
246+
client=client,
247+
route_path=route_path,
233248
)
234249
return parse_response_model(
235-
response.data,
250+
response_data,
236251
model=model,
237252
operation_name=operation_name,
238253
)
239254

240255

256+
async def delete_model_response_data_async(
257+
*,
258+
client: Any,
259+
route_path: str,
260+
) -> Any:
261+
response = await client.transport.delete(
262+
client._build_url(route_path),
263+
)
264+
return response.data
265+
266+
241267
async def put_model_request_async(
242268
*,
243269
client: Any,

tests/test_model_request_utils.py

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,40 @@ def _fake_parse_response_model(data, **kwargs):
158158
assert captured["parse_kwargs"]["operation_name"] == "read resource"
159159

160160

161+
def test_get_model_request_delegates_to_raw_data_helper():
162+
captured = {}
163+
164+
def _fake_get_model_response_data(**kwargs):
165+
captured["kwargs"] = kwargs
166+
return {"id": "resource-2"}
167+
168+
def _fake_parse_response_model(data, **kwargs):
169+
captured["parse_data"] = data
170+
captured["parse_kwargs"] = kwargs
171+
return {"parsed": True}
172+
173+
original_get = model_request_utils.get_model_response_data
174+
original_parse = model_request_utils.parse_response_model
175+
model_request_utils.get_model_response_data = _fake_get_model_response_data
176+
model_request_utils.parse_response_model = _fake_parse_response_model
177+
try:
178+
result = model_request_utils.get_model_request(
179+
client=object(),
180+
route_path="/resource/2",
181+
params={"page": 1},
182+
model=object,
183+
operation_name="read resource",
184+
)
185+
finally:
186+
model_request_utils.get_model_response_data = original_get
187+
model_request_utils.parse_response_model = original_parse
188+
189+
assert result == {"parsed": True}
190+
assert captured["kwargs"]["route_path"] == "/resource/2"
191+
assert captured["kwargs"]["params"] == {"page": 1}
192+
assert captured["parse_data"] == {"id": "resource-2"}
193+
194+
161195
def test_get_model_response_data_gets_payload_without_parsing():
162196
captured = {}
163197

@@ -188,6 +222,30 @@ def _build_url(path: str) -> str:
188222
assert captured["follow_redirects"] is True
189223

190224

225+
def test_delete_model_response_data_deletes_resource_and_returns_raw_data():
226+
captured = {}
227+
228+
class _SyncTransport:
229+
def delete(self, url):
230+
captured["url"] = url
231+
return SimpleNamespace(data={"success": True})
232+
233+
class _Client:
234+
transport = _SyncTransport()
235+
236+
@staticmethod
237+
def _build_url(path: str) -> str:
238+
return f"https://api.example.test{path}"
239+
240+
result = model_request_utils.delete_model_response_data(
241+
client=_Client(),
242+
route_path="/resource/3",
243+
)
244+
245+
assert result == {"success": True}
246+
assert captured["url"] == "https://api.example.test/resource/3"
247+
248+
191249
def test_delete_model_request_deletes_resource_and_parses_response():
192250
captured = {}
193251

@@ -226,6 +284,38 @@ def _fake_parse_response_model(data, **kwargs):
226284
assert captured["parse_kwargs"]["operation_name"] == "delete resource"
227285

228286

287+
def test_delete_model_request_delegates_to_raw_data_helper():
288+
captured = {}
289+
290+
def _fake_delete_model_response_data(**kwargs):
291+
captured["kwargs"] = kwargs
292+
return {"success": True}
293+
294+
def _fake_parse_response_model(data, **kwargs):
295+
captured["parse_data"] = data
296+
captured["parse_kwargs"] = kwargs
297+
return {"parsed": True}
298+
299+
original_delete = model_request_utils.delete_model_response_data
300+
original_parse = model_request_utils.parse_response_model
301+
model_request_utils.delete_model_response_data = _fake_delete_model_response_data
302+
model_request_utils.parse_response_model = _fake_parse_response_model
303+
try:
304+
result = model_request_utils.delete_model_request(
305+
client=object(),
306+
route_path="/resource/3",
307+
model=object,
308+
operation_name="delete resource",
309+
)
310+
finally:
311+
model_request_utils.delete_model_response_data = original_delete
312+
model_request_utils.parse_response_model = original_parse
313+
314+
assert result == {"parsed": True}
315+
assert captured["kwargs"]["route_path"] == "/resource/3"
316+
assert captured["parse_data"] == {"success": True}
317+
318+
229319
def test_put_model_response_data_forwards_payload_and_returns_raw_data():
230320
captured = {}
231321

@@ -415,6 +505,44 @@ def _fake_parse_response_model(data, **kwargs):
415505
assert captured["parse_kwargs"]["operation_name"] == "read resource"
416506

417507

508+
def test_get_model_request_async_delegates_to_raw_data_helper():
509+
captured = {}
510+
511+
async def _fake_get_model_response_data_async(**kwargs):
512+
captured["kwargs"] = kwargs
513+
return {"id": "resource-5"}
514+
515+
def _fake_parse_response_model(data, **kwargs):
516+
captured["parse_data"] = data
517+
captured["parse_kwargs"] = kwargs
518+
return {"parsed": True}
519+
520+
original_get = model_request_utils.get_model_response_data_async
521+
original_parse = model_request_utils.parse_response_model
522+
model_request_utils.get_model_response_data_async = (
523+
_fake_get_model_response_data_async
524+
)
525+
model_request_utils.parse_response_model = _fake_parse_response_model
526+
try:
527+
result = asyncio.run(
528+
model_request_utils.get_model_request_async(
529+
client=object(),
530+
route_path="/resource/5",
531+
params={"page": 2},
532+
model=object,
533+
operation_name="read resource",
534+
)
535+
)
536+
finally:
537+
model_request_utils.get_model_response_data_async = original_get
538+
model_request_utils.parse_response_model = original_parse
539+
540+
assert result == {"parsed": True}
541+
assert captured["kwargs"]["route_path"] == "/resource/5"
542+
assert captured["kwargs"]["params"] == {"page": 2}
543+
assert captured["parse_data"] == {"id": "resource-5"}
544+
545+
418546
def test_get_model_response_data_async_gets_payload_without_parsing():
419547
captured = {}
420548

@@ -447,6 +575,32 @@ def _build_url(path: str) -> str:
447575
assert captured["follow_redirects"] is True
448576

449577

578+
def test_delete_model_response_data_async_deletes_resource_and_returns_raw_data():
579+
captured = {}
580+
581+
class _AsyncTransport:
582+
async def delete(self, url):
583+
captured["url"] = url
584+
return SimpleNamespace(data={"success": True})
585+
586+
class _Client:
587+
transport = _AsyncTransport()
588+
589+
@staticmethod
590+
def _build_url(path: str) -> str:
591+
return f"https://api.example.test{path}"
592+
593+
result = asyncio.run(
594+
model_request_utils.delete_model_response_data_async(
595+
client=_Client(),
596+
route_path="/resource/6",
597+
)
598+
)
599+
600+
assert result == {"success": True}
601+
assert captured["url"] == "https://api.example.test/resource/6"
602+
603+
450604
def test_delete_model_request_async_deletes_resource_and_parses_response():
451605
captured = {}
452606

@@ -487,6 +641,42 @@ def _fake_parse_response_model(data, **kwargs):
487641
assert captured["parse_kwargs"]["operation_name"] == "delete resource"
488642

489643

644+
def test_delete_model_request_async_delegates_to_raw_data_helper():
645+
captured = {}
646+
647+
async def _fake_delete_model_response_data_async(**kwargs):
648+
captured["kwargs"] = kwargs
649+
return {"success": True}
650+
651+
def _fake_parse_response_model(data, **kwargs):
652+
captured["parse_data"] = data
653+
captured["parse_kwargs"] = kwargs
654+
return {"parsed": True}
655+
656+
original_delete = model_request_utils.delete_model_response_data_async
657+
original_parse = model_request_utils.parse_response_model
658+
model_request_utils.delete_model_response_data_async = (
659+
_fake_delete_model_response_data_async
660+
)
661+
model_request_utils.parse_response_model = _fake_parse_response_model
662+
try:
663+
result = asyncio.run(
664+
model_request_utils.delete_model_request_async(
665+
client=object(),
666+
route_path="/resource/6",
667+
model=object,
668+
operation_name="delete resource",
669+
)
670+
)
671+
finally:
672+
model_request_utils.delete_model_response_data_async = original_delete
673+
model_request_utils.parse_response_model = original_parse
674+
675+
assert result == {"parsed": True}
676+
assert captured["kwargs"]["route_path"] == "/resource/6"
677+
assert captured["parse_data"] == {"success": True}
678+
679+
490680
def test_put_model_response_data_async_forwards_payload_and_returns_raw_data():
491681
captured = {}
492682

0 commit comments

Comments
 (0)