Skip to content

Commit b201e83

Browse files
committed
patch the network updat
1 parent 1c1f8c0 commit b201e83

5 files changed

Lines changed: 88 additions & 3 deletions

File tree

hyperbrowser/client/managers/async_manager/sandbox.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,11 @@ async def update_network(
635635
payload = await self._request(
636636
"PUT",
637637
f"/sandbox/{sandbox_id}/network",
638-
data=policy.model_dump(exclude_none=True, by_alias=True),
638+
data=policy.model_dump(
639+
exclude_none=True,
640+
exclude_unset=True,
641+
by_alias=True,
642+
),
639643
)
640644
return SandboxNetworkUpdateResult(**payload)
641645

hyperbrowser/client/managers/sync_manager/sandbox.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,11 @@ def update_network(
624624
payload = self._request(
625625
"PUT",
626626
f"/sandbox/{sandbox_id}/network",
627-
data=policy.model_dump(exclude_none=True, by_alias=True),
627+
data=policy.model_dump(
628+
exclude_none=True,
629+
exclude_unset=True,
630+
by_alias=True,
631+
),
628632
)
629633
return SandboxNetworkUpdateResult(**payload)
630634

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "hyperbrowser"
3-
version = "0.93.0"
3+
version = "0.93.1"
44
description = "Python SDK for hyperbrowser"
55
authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
66
license = "MIT"

tests/test_create_sandbox_params.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,28 @@ def test_sandbox_network_policy_serializes_update_payload():
9595
}
9696

9797

98+
def test_sandbox_network_policy_defaults_unset_lists_for_response_models():
99+
policy = SandboxNetworkPolicy(allow_internet_access=True)
100+
101+
assert policy.model_dump(by_alias=True, exclude_none=True) == {
102+
"allowInternetAccess": True,
103+
"allowOut": [],
104+
"denyOut": [],
105+
}
106+
107+
108+
def test_sandbox_network_policy_can_omit_unset_lists_for_patch_payload():
109+
policy = SandboxNetworkPolicy(allow_internet_access=True)
110+
111+
assert policy.model_dump(
112+
by_alias=True,
113+
exclude_none=True,
114+
exclude_unset=True,
115+
) == {
116+
"allowInternetAccess": True,
117+
}
118+
119+
98120
def test_sandbox_image_build_params_serialize_expected_wire_keys():
99121
create_params = CreateSandboxImageBuildParams(
100122
image_name="custom_node",

tests/test_sandbox_wire_contract.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,12 @@ def test_sandbox_request_models_serialize_expected_wire_keys():
699699
"allowOut": [],
700700
"denyOut": [],
701701
}
702+
assert SandboxNetworkPolicy(allow_internet_access=True).model_dump(
703+
by_alias=True, exclude_none=True
704+
) == {"allowInternetAccess": True, "allowOut": [], "denyOut": []}
705+
assert SandboxNetworkPolicy(allow_internet_access=True).model_dump(
706+
by_alias=True, exclude_none=True, exclude_unset=True
707+
) == {"allowInternetAccess": True}
702708

703709
assert SandboxImageListParams(
704710
page=2,
@@ -1074,6 +1080,30 @@ def test_sync_sandbox_control_manager_uses_expected_wire_keys():
10741080
assert unexpose_call["url"].endswith("/sandbox/sbx_123/unexpose")
10751081

10761082

1083+
def test_sync_sandbox_update_network_omits_only_unset_lists():
1084+
client = FakeSyncClient()
1085+
manager = SandboxManager(client)
1086+
sandbox = manager.attach(SandboxDetail(**SANDBOX_DETAIL_PAYLOAD))
1087+
1088+
sandbox.update_network(SandboxNetworkPolicy(allow_internet_access=True))
1089+
sandbox.update_network(
1090+
SandboxNetworkPolicy(
1091+
allow_internet_access=True,
1092+
allow_out=[],
1093+
deny_out=[],
1094+
)
1095+
)
1096+
1097+
preserve_call = client.transport.client.calls[0]
1098+
clear_call = client.transport.client.calls[1]
1099+
assert preserve_call["json"] == {"allowInternetAccess": True}
1100+
assert clear_call["json"] == {
1101+
"allowInternetAccess": True,
1102+
"allowOut": [],
1103+
"denyOut": [],
1104+
}
1105+
1106+
10771107
def test_snapshot_summary_allows_missing_compatibility_tag():
10781108
snapshot = SandboxSnapshotSummary(**SNAPSHOT_PAYLOAD_WITHOUT_COMPATIBILITY_TAG)
10791109

@@ -1528,6 +1558,31 @@ async def test_async_sandbox_control_manager_uses_expected_wire_keys():
15281558
assert unexpose_call["json"] == {"port": 3000}
15291559

15301560

1561+
@pytest.mark.anyio
1562+
async def test_async_sandbox_update_network_omits_only_unset_lists():
1563+
client = FakeAsyncClient()
1564+
manager = AsyncSandboxManager(client)
1565+
sandbox = manager.attach(SandboxDetail(**SANDBOX_DETAIL_PAYLOAD))
1566+
1567+
await sandbox.update_network(SandboxNetworkPolicy(allow_internet_access=True))
1568+
await sandbox.update_network(
1569+
SandboxNetworkPolicy(
1570+
allow_internet_access=True,
1571+
allow_out=[],
1572+
deny_out=[],
1573+
)
1574+
)
1575+
1576+
preserve_call = client.transport.client.calls[0]
1577+
clear_call = client.transport.client.calls[1]
1578+
assert preserve_call["json"] == {"allowInternetAccess": True}
1579+
assert clear_call["json"] == {
1580+
"allowInternetAccess": True,
1581+
"allowOut": [],
1582+
"denyOut": [],
1583+
}
1584+
1585+
15311586
@pytest.mark.anyio
15321587
async def test_async_sandbox_runtime_apis_use_expected_wire_keys():
15331588
transport = AsyncRecordingTransport()

0 commit comments

Comments
 (0)