Skip to content

Commit 72bc74b

Browse files
Add shared session route composition helper
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 61bfc4d commit 72bc74b

5 files changed

Lines changed: 52 additions & 20 deletions

File tree

hyperbrowser/client/managers/async_manager/session.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from ..session_upload_utils import open_upload_files_from_input
1717
from ..session_operation_metadata import SESSION_OPERATION_METADATA
1818
from ..session_route_constants import (
19+
build_session_route,
1920
SESSION_DOWNLOADS_URL_ROUTE_SUFFIX,
2021
SESSION_EVENT_LOGS_ROUTE_SUFFIX,
2122
SESSION_EXTEND_ROUTE_SUFFIX,
@@ -65,7 +66,10 @@ async def list(
6566
)
6667
return await get_session_model_async(
6768
client=self._client,
68-
route_path=f"{self._ROUTE_PREFIX}/{session_id}{SESSION_EVENT_LOGS_ROUTE_SUFFIX}",
69+
route_path=build_session_route(
70+
session_id,
71+
SESSION_EVENT_LOGS_ROUTE_SUFFIX,
72+
),
6973
params=query_params,
7074
model=SessionEventLogListResponse,
7175
operation_name=self._OPERATION_METADATA.event_logs_operation_name,
@@ -107,7 +111,7 @@ async def get(
107111
)
108112
return await get_session_model_async(
109113
client=self._client,
110-
route_path=f"{self._ROUTE_PREFIX}/{id}",
114+
route_path=build_session_route(id),
111115
params=query_params,
112116
model=SessionDetail,
113117
operation_name=self._OPERATION_METADATA.detail_operation_name,
@@ -116,7 +120,7 @@ async def get(
116120
async def stop(self, id: str) -> BasicResponse:
117121
return await put_session_model_async(
118122
client=self._client,
119-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_STOP_ROUTE_SUFFIX}",
123+
route_path=build_session_route(id, SESSION_STOP_ROUTE_SUFFIX),
120124
model=BasicResponse,
121125
operation_name=self._OPERATION_METADATA.stop_operation_name,
122126
)
@@ -140,13 +144,13 @@ async def list(
140144
async def get_recording(self, id: str) -> List[SessionRecording]:
141145
return await get_session_recordings_async(
142146
client=self._client,
143-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_RECORDING_ROUTE_SUFFIX}",
147+
route_path=build_session_route(id, SESSION_RECORDING_ROUTE_SUFFIX),
144148
)
145149

146150
async def get_recording_url(self, id: str) -> GetSessionRecordingUrlResponse:
147151
return await get_session_model_async(
148152
client=self._client,
149-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_RECORDING_URL_ROUTE_SUFFIX}",
153+
route_path=build_session_route(id, SESSION_RECORDING_URL_ROUTE_SUFFIX),
150154
model=GetSessionRecordingUrlResponse,
151155
operation_name=self._OPERATION_METADATA.recording_url_operation_name,
152156
)
@@ -156,15 +160,18 @@ async def get_video_recording_url(
156160
) -> GetSessionVideoRecordingUrlResponse:
157161
return await get_session_model_async(
158162
client=self._client,
159-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_VIDEO_RECORDING_URL_ROUTE_SUFFIX}",
163+
route_path=build_session_route(
164+
id,
165+
SESSION_VIDEO_RECORDING_URL_ROUTE_SUFFIX,
166+
),
160167
model=GetSessionVideoRecordingUrlResponse,
161168
operation_name=self._OPERATION_METADATA.video_recording_url_operation_name,
162169
)
163170

164171
async def get_downloads_url(self, id: str) -> GetSessionDownloadsUrlResponse:
165172
return await get_session_model_async(
166173
client=self._client,
167-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_DOWNLOADS_URL_ROUTE_SUFFIX}",
174+
route_path=build_session_route(id, SESSION_DOWNLOADS_URL_ROUTE_SUFFIX),
168175
model=GetSessionDownloadsUrlResponse,
169176
operation_name=self._OPERATION_METADATA.downloads_url_operation_name,
170177
)
@@ -175,7 +182,7 @@ async def upload_file(
175182
with open_upload_files_from_input(file_input) as files:
176183
return await post_session_model_async(
177184
client=self._client,
178-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_UPLOADS_ROUTE_SUFFIX}",
185+
route_path=build_session_route(id, SESSION_UPLOADS_ROUTE_SUFFIX),
179186
files=files,
180187
model=UploadFileResponse,
181188
operation_name=self._OPERATION_METADATA.upload_file_operation_name,
@@ -184,7 +191,7 @@ async def upload_file(
184191
async def extend_session(self, id: str, duration_minutes: int) -> BasicResponse:
185192
return await put_session_model_async(
186193
client=self._client,
187-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_EXTEND_ROUTE_SUFFIX}",
194+
route_path=build_session_route(id, SESSION_EXTEND_ROUTE_SUFFIX),
188195
data={"durationMinutes": duration_minutes},
189196
model=BasicResponse,
190197
operation_name=self._OPERATION_METADATA.extend_operation_name,
@@ -220,7 +227,7 @@ async def update_profile_params(
220227

221228
return await put_session_model_async(
222229
client=self._client,
223-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_UPDATE_ROUTE_SUFFIX}",
230+
route_path=build_session_route(id, SESSION_UPDATE_ROUTE_SUFFIX),
224231
data={
225232
"type": "profile",
226233
"params": serialized_params,

hyperbrowser/client/managers/session_route_constants.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,10 @@
1010
SESSION_UPLOADS_ROUTE_SUFFIX = "/uploads"
1111
SESSION_EXTEND_ROUTE_SUFFIX = "/extend-session"
1212
SESSION_UPDATE_ROUTE_SUFFIX = "/update"
13+
14+
15+
def build_session_route(
16+
session_id: str,
17+
route_suffix: str = "",
18+
) -> str:
19+
return f"{SESSION_ROUTE_PREFIX}/{session_id}{route_suffix}"

hyperbrowser/client/managers/sync_manager/session.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from ..session_upload_utils import open_upload_files_from_input
1717
from ..session_operation_metadata import SESSION_OPERATION_METADATA
1818
from ..session_route_constants import (
19+
build_session_route,
1920
SESSION_DOWNLOADS_URL_ROUTE_SUFFIX,
2021
SESSION_EVENT_LOGS_ROUTE_SUFFIX,
2122
SESSION_EXTEND_ROUTE_SUFFIX,
@@ -65,7 +66,10 @@ def list(
6566
)
6667
return get_session_model(
6768
client=self._client,
68-
route_path=f"{self._ROUTE_PREFIX}/{session_id}{SESSION_EVENT_LOGS_ROUTE_SUFFIX}",
69+
route_path=build_session_route(
70+
session_id,
71+
SESSION_EVENT_LOGS_ROUTE_SUFFIX,
72+
),
6973
params=query_params,
7074
model=SessionEventLogListResponse,
7175
operation_name=self._OPERATION_METADATA.event_logs_operation_name,
@@ -103,7 +107,7 @@ def get(self, id: str, params: Optional[SessionGetParams] = None) -> SessionDeta
103107
)
104108
return get_session_model(
105109
client=self._client,
106-
route_path=f"{self._ROUTE_PREFIX}/{id}",
110+
route_path=build_session_route(id),
107111
params=query_params,
108112
model=SessionDetail,
109113
operation_name=self._OPERATION_METADATA.detail_operation_name,
@@ -112,7 +116,7 @@ def get(self, id: str, params: Optional[SessionGetParams] = None) -> SessionDeta
112116
def stop(self, id: str) -> BasicResponse:
113117
return put_session_model(
114118
client=self._client,
115-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_STOP_ROUTE_SUFFIX}",
119+
route_path=build_session_route(id, SESSION_STOP_ROUTE_SUFFIX),
116120
model=BasicResponse,
117121
operation_name=self._OPERATION_METADATA.stop_operation_name,
118122
)
@@ -134,29 +138,32 @@ def list(self, params: Optional[SessionListParams] = None) -> SessionListRespons
134138
def get_recording(self, id: str) -> List[SessionRecording]:
135139
return get_session_recordings(
136140
client=self._client,
137-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_RECORDING_ROUTE_SUFFIX}",
141+
route_path=build_session_route(id, SESSION_RECORDING_ROUTE_SUFFIX),
138142
)
139143

140144
def get_recording_url(self, id: str) -> GetSessionRecordingUrlResponse:
141145
return get_session_model(
142146
client=self._client,
143-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_RECORDING_URL_ROUTE_SUFFIX}",
147+
route_path=build_session_route(id, SESSION_RECORDING_URL_ROUTE_SUFFIX),
144148
model=GetSessionRecordingUrlResponse,
145149
operation_name=self._OPERATION_METADATA.recording_url_operation_name,
146150
)
147151

148152
def get_video_recording_url(self, id: str) -> GetSessionVideoRecordingUrlResponse:
149153
return get_session_model(
150154
client=self._client,
151-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_VIDEO_RECORDING_URL_ROUTE_SUFFIX}",
155+
route_path=build_session_route(
156+
id,
157+
SESSION_VIDEO_RECORDING_URL_ROUTE_SUFFIX,
158+
),
152159
model=GetSessionVideoRecordingUrlResponse,
153160
operation_name=self._OPERATION_METADATA.video_recording_url_operation_name,
154161
)
155162

156163
def get_downloads_url(self, id: str) -> GetSessionDownloadsUrlResponse:
157164
return get_session_model(
158165
client=self._client,
159-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_DOWNLOADS_URL_ROUTE_SUFFIX}",
166+
route_path=build_session_route(id, SESSION_DOWNLOADS_URL_ROUTE_SUFFIX),
160167
model=GetSessionDownloadsUrlResponse,
161168
operation_name=self._OPERATION_METADATA.downloads_url_operation_name,
162169
)
@@ -167,7 +174,7 @@ def upload_file(
167174
with open_upload_files_from_input(file_input) as files:
168175
return post_session_model(
169176
client=self._client,
170-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_UPLOADS_ROUTE_SUFFIX}",
177+
route_path=build_session_route(id, SESSION_UPLOADS_ROUTE_SUFFIX),
171178
files=files,
172179
model=UploadFileResponse,
173180
operation_name=self._OPERATION_METADATA.upload_file_operation_name,
@@ -176,7 +183,7 @@ def upload_file(
176183
def extend_session(self, id: str, duration_minutes: int) -> BasicResponse:
177184
return put_session_model(
178185
client=self._client,
179-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_EXTEND_ROUTE_SUFFIX}",
186+
route_path=build_session_route(id, SESSION_EXTEND_ROUTE_SUFFIX),
180187
data={"durationMinutes": duration_minutes},
181188
model=BasicResponse,
182189
operation_name=self._OPERATION_METADATA.extend_operation_name,
@@ -212,7 +219,7 @@ def update_profile_params(
212219

213220
return put_session_model(
214221
client=self._client,
215-
route_path=f"{self._ROUTE_PREFIX}/{id}{SESSION_UPDATE_ROUTE_SUFFIX}",
222+
route_path=build_session_route(id, SESSION_UPDATE_ROUTE_SUFFIX),
216223
data={
217224
"type": "profile",
218225
"params": serialized_params,

tests/test_session_route_constants.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from hyperbrowser.client.managers.session_route_constants import (
2+
build_session_route,
23
SESSION_DOWNLOADS_URL_ROUTE_SUFFIX,
34
SESSION_EVENT_LOGS_ROUTE_SUFFIX,
45
SESSION_EXTEND_ROUTE_SUFFIX,
@@ -25,3 +26,11 @@ def test_session_route_constants_match_expected_api_paths():
2526
assert SESSION_UPLOADS_ROUTE_SUFFIX == "/uploads"
2627
assert SESSION_EXTEND_ROUTE_SUFFIX == "/extend-session"
2728
assert SESSION_UPDATE_ROUTE_SUFFIX == "/update"
29+
30+
31+
def test_build_session_route_composes_session_path_with_suffix():
32+
assert build_session_route("sess_123") == "/session/sess_123"
33+
assert (
34+
build_session_route("sess_123", SESSION_STOP_ROUTE_SUFFIX)
35+
== "/session/sess_123/stop"
36+
)

tests/test_session_route_constants_usage.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ def test_session_managers_use_shared_route_constants():
1515
for module_path in MODULES:
1616
module_text = Path(module_path).read_text(encoding="utf-8")
1717
assert "session_route_constants import" in module_text
18+
assert "build_session_route" in module_text
1819
assert "_ROUTE_PREFIX = " in module_text
1920
assert "_LIST_ROUTE_PATH = " in module_text
2021
assert '"/session"' not in module_text
2122
assert '"/sessions"' not in module_text
2223
assert '_build_url("/session' not in module_text
2324
assert '_build_url(f"/session' not in module_text
25+
assert 'f"{self._ROUTE_PREFIX}/' not in module_text

0 commit comments

Comments
 (0)