Skip to content

Commit 35a1ef2

Browse files
committed
cp dines
1 parent b8a86bf commit 35a1ef2

File tree

9 files changed

+387
-13
lines changed

9 files changed

+387
-13
lines changed

src/runloop_api_client/sdk/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
SnapshotOps,
1515
BenchmarkOps,
1616
BlueprintOps,
17-
NetworkPolicyOps,
1817
GatewayConfigOps,
18+
NetworkPolicyOps,
1919
StorageObjectOps,
2020
)
2121
from .agent import Agent
@@ -29,8 +29,8 @@
2929
AsyncSnapshotOps,
3030
AsyncBenchmarkOps,
3131
AsyncBlueprintOps,
32-
AsyncNetworkPolicyOps,
3332
AsyncGatewayConfigOps,
33+
AsyncNetworkPolicyOps,
3434
AsyncStorageObjectOps,
3535
)
3636
from .devbox import Devbox, NamedShell
@@ -47,8 +47,8 @@
4747
from .benchmark_run import BenchmarkRun
4848
from .async_scenario import AsyncScenario
4949
from .async_snapshot import AsyncSnapshot
50-
from .network_policy import NetworkPolicy
5150
from .gateway_config import GatewayConfig
51+
from .network_policy import NetworkPolicy
5252
from .storage_object import StorageObject
5353
from .async_benchmark import AsyncBenchmark
5454
from .async_blueprint import AsyncBlueprint
@@ -57,8 +57,8 @@
5757
from .scenario_builder import ScenarioBuilder
5858
from .async_scenario_run import AsyncScenarioRun
5959
from .async_benchmark_run import AsyncBenchmarkRun
60-
from .async_network_policy import AsyncNetworkPolicy
6160
from .async_gateway_config import AsyncGatewayConfig
61+
from .async_network_policy import AsyncNetworkPolicy
6262
from .async_storage_object import AsyncStorageObject
6363
from .async_execution_result import AsyncExecutionResult
6464
from .async_scenario_builder import AsyncScenarioBuilder

src/runloop_api_client/sdk/_types.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@
1919
BenchmarkUpdateParams,
2020
BlueprintCreateParams,
2121
DevboxUploadFileParams,
22-
NetworkPolicyListParams,
2322
GatewayConfigListParams,
23+
NetworkPolicyListParams,
2424
DevboxCreateTunnelParams,
2525
DevboxDownloadFileParams,
2626
DevboxEnableTunnelParams,
2727
DevboxRemoveTunnelParams,
2828
DevboxSnapshotDiskParams,
29-
NetworkPolicyCreateParams,
30-
NetworkPolicyUpdateParams,
3129
GatewayConfigCreateParams,
3230
GatewayConfigUpdateParams,
31+
NetworkPolicyCreateParams,
32+
NetworkPolicyUpdateParams,
3333
DevboxReadFileContentsParams,
3434
DevboxWriteFileContentsParams,
3535
BenchmarkRunListScenarioRunsParams,

src/runloop_api_client/sdk/async_.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
SDKBenchmarkCreateParams,
2727
SDKBlueprintCreateParams,
2828
SDKDiskSnapshotListParams,
29-
SDKNetworkPolicyListParams,
3029
SDKGatewayConfigListParams,
31-
SDKNetworkPolicyCreateParams,
30+
SDKNetworkPolicyListParams,
3231
SDKGatewayConfigCreateParams,
32+
SDKNetworkPolicyCreateParams,
3333
SDKDevboxCreateFromImageParams,
3434
)
3535
from .._types import Timeout, NotGiven, not_given
@@ -43,8 +43,8 @@
4343
from .async_benchmark import AsyncBenchmark
4444
from .async_blueprint import AsyncBlueprint
4545
from ..lib.context_loader import TarFilter, build_directory_tar
46-
from .async_network_policy import AsyncNetworkPolicy
4746
from .async_gateway_config import AsyncGatewayConfig
47+
from .async_network_policy import AsyncNetworkPolicy
4848
from .async_storage_object import AsyncStorageObject
4949
from .async_scenario_builder import AsyncScenarioBuilder
5050
from ..types.object_create_params import ContentType

src/runloop_api_client/sdk/sync.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
SDKBenchmarkCreateParams,
2727
SDKBlueprintCreateParams,
2828
SDKDiskSnapshotListParams,
29-
SDKNetworkPolicyListParams,
3029
SDKGatewayConfigListParams,
31-
SDKNetworkPolicyCreateParams,
30+
SDKNetworkPolicyListParams,
3231
SDKGatewayConfigCreateParams,
32+
SDKNetworkPolicyCreateParams,
3333
SDKDevboxCreateFromImageParams,
3434
)
3535
from .devbox import Devbox
@@ -41,8 +41,8 @@
4141
from .snapshot import Snapshot
4242
from .benchmark import Benchmark
4343
from .blueprint import Blueprint
44-
from .network_policy import NetworkPolicy
4544
from .gateway_config import GatewayConfig
45+
from .network_policy import NetworkPolicy
4646
from .storage_object import StorageObject
4747
from .scenario_builder import ScenarioBuilder
4848
from ..lib.context_loader import TarFilter, build_directory_tar

tests/sdk/conftest.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"benchmark": "bmd_123",
2929
"benchmark_run": "bmr_123",
3030
"network_policy": "np_123",
31+
"gateway_config": "gwc_123",
3132
}
3233

3334
# Test URL constants
@@ -179,6 +180,26 @@ class MockNetworkPolicyView:
179180
egress: MockEgress = field(default_factory=MockEgress)
180181

181182

183+
@dataclass
184+
class MockAuthMechanism:
185+
"""Mock AuthMechanism for testing."""
186+
187+
type: str = "bearer"
188+
key: str | None = None
189+
190+
191+
@dataclass
192+
class MockGatewayConfigView:
193+
"""Mock GatewayConfigView for testing."""
194+
195+
id: str = TEST_IDS["gateway_config"]
196+
name: str = "test-gateway-config"
197+
endpoint: str = "https://api.example.com"
198+
description: str | None = "Test gateway config description"
199+
create_time_ms: int = 1234567890000
200+
auth_mechanism: MockAuthMechanism = field(default_factory=MockAuthMechanism)
201+
202+
182203
class AsyncIterableMock:
183204
"""A simple async iterable mock for testing paginated responses."""
184205

@@ -316,6 +337,12 @@ def network_policy_view() -> MockNetworkPolicyView:
316337
return MockNetworkPolicyView()
317338

318339

340+
@pytest.fixture
341+
def gateway_config_view() -> MockGatewayConfigView:
342+
"""Create a mock GatewayConfigView."""
343+
return MockGatewayConfigView()
344+
345+
319346
@pytest.fixture
320347
def mock_httpx_response() -> Mock:
321348
"""Create a mock httpx.Response."""
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
"""Comprehensive tests for async GatewayConfig class."""
2+
3+
from __future__ import annotations
4+
5+
from unittest.mock import AsyncMock
6+
7+
import pytest
8+
9+
from tests.sdk.conftest import MockGatewayConfigView
10+
from runloop_api_client.sdk import AsyncGatewayConfig
11+
12+
13+
class TestAsyncGatewayConfig:
14+
"""Tests for AsyncGatewayConfig class."""
15+
16+
def test_init(self, mock_async_client: AsyncMock) -> None:
17+
"""Test AsyncGatewayConfig initialization."""
18+
gateway_config = AsyncGatewayConfig(mock_async_client, "gwc_123")
19+
assert gateway_config.id == "gwc_123"
20+
21+
def test_repr(self, mock_async_client: AsyncMock) -> None:
22+
"""Test AsyncGatewayConfig string representation."""
23+
gateway_config = AsyncGatewayConfig(mock_async_client, "gwc_123")
24+
assert repr(gateway_config) == "<AsyncGatewayConfig id='gwc_123'>"
25+
26+
@pytest.mark.asyncio
27+
async def test_get_info(self, mock_async_client: AsyncMock, gateway_config_view: MockGatewayConfigView) -> None:
28+
"""Test get_info method."""
29+
mock_async_client.gateway_configs.retrieve = AsyncMock(return_value=gateway_config_view)
30+
31+
gateway_config = AsyncGatewayConfig(mock_async_client, "gwc_123")
32+
result = await gateway_config.get_info(
33+
extra_headers={"X-Custom": "value"},
34+
extra_query={"param": "value"},
35+
extra_body={"key": "value"},
36+
timeout=30.0,
37+
)
38+
39+
assert result == gateway_config_view
40+
mock_async_client.gateway_configs.retrieve.assert_awaited_once()
41+
42+
@pytest.mark.asyncio
43+
async def test_update(self, mock_async_client: AsyncMock, gateway_config_view: MockGatewayConfigView) -> None:
44+
"""Test update method."""
45+
mock_async_client.gateway_configs.update = AsyncMock(return_value=gateway_config_view)
46+
47+
gateway_config = AsyncGatewayConfig(mock_async_client, "gwc_123")
48+
result = await gateway_config.update(
49+
name="updated-gateway",
50+
description="Updated description",
51+
endpoint="https://api.updated.com",
52+
auth_mechanism={"type": "header", "key": "x-api-key"},
53+
extra_headers={"X-Custom": "value"},
54+
timeout=30.0,
55+
)
56+
57+
assert result == gateway_config_view
58+
mock_async_client.gateway_configs.update.assert_awaited_once()
59+
60+
@pytest.mark.asyncio
61+
async def test_update_partial(
62+
self, mock_async_client: AsyncMock, gateway_config_view: MockGatewayConfigView
63+
) -> None:
64+
"""Test update method with partial fields."""
65+
mock_async_client.gateway_configs.update = AsyncMock(return_value=gateway_config_view)
66+
67+
gateway_config = AsyncGatewayConfig(mock_async_client, "gwc_123")
68+
result = await gateway_config.update(
69+
name="renamed-gateway",
70+
)
71+
72+
assert result == gateway_config_view
73+
mock_async_client.gateway_configs.update.assert_awaited_once()
74+
75+
@pytest.mark.asyncio
76+
async def test_delete(self, mock_async_client: AsyncMock, gateway_config_view: MockGatewayConfigView) -> None:
77+
"""Test delete method."""
78+
mock_async_client.gateway_configs.delete = AsyncMock(return_value=gateway_config_view)
79+
80+
gateway_config = AsyncGatewayConfig(mock_async_client, "gwc_123")
81+
result = await gateway_config.delete(
82+
extra_headers={"X-Custom": "value"},
83+
extra_query={"param": "value"},
84+
extra_body={"key": "value"},
85+
timeout=30.0,
86+
)
87+
88+
assert result == gateway_config_view
89+
mock_async_client.gateway_configs.delete.assert_awaited_once()

tests/sdk/test_async_ops.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
MockSnapshotView,
2020
MockBenchmarkView,
2121
MockBlueprintView,
22+
MockGatewayConfigView,
2223
MockNetworkPolicyView,
2324
create_mock_httpx_response,
2425
)
@@ -38,8 +39,10 @@
3839
AsyncSnapshotOps,
3940
AsyncBenchmarkOps,
4041
AsyncBlueprintOps,
42+
AsyncGatewayConfig,
4143
AsyncNetworkPolicy,
4244
AsyncStorageObject,
45+
AsyncGatewayConfigOps,
4346
AsyncNetworkPolicyOps,
4447
AsyncStorageObjectOps,
4548
)
@@ -1313,6 +1316,81 @@ async def test_list_multiple(self, mock_async_client: AsyncMock) -> None:
13131316
mock_async_client.network_policies.list.assert_awaited_once()
13141317

13151318

1319+
class TestAsyncGatewayConfigOps:
1320+
"""Tests for AsyncGatewayConfigOps class."""
1321+
1322+
@pytest.mark.asyncio
1323+
async def test_create(self, mock_async_client: AsyncMock, gateway_config_view: MockGatewayConfigView) -> None:
1324+
"""Test create method."""
1325+
mock_async_client.gateway_configs.create = AsyncMock(return_value=gateway_config_view)
1326+
1327+
ops = AsyncGatewayConfigOps(mock_async_client)
1328+
gateway_config = await ops.create(
1329+
name="test-gateway-config",
1330+
endpoint="https://api.example.com",
1331+
auth_mechanism={"type": "bearer"},
1332+
)
1333+
1334+
assert isinstance(gateway_config, AsyncGatewayConfig)
1335+
assert gateway_config.id == "gwc_123"
1336+
mock_async_client.gateway_configs.create.assert_awaited_once()
1337+
1338+
def test_from_id(self, mock_async_client: AsyncMock) -> None:
1339+
"""Test from_id method."""
1340+
ops = AsyncGatewayConfigOps(mock_async_client)
1341+
gateway_config = ops.from_id("gwc_123")
1342+
1343+
assert isinstance(gateway_config, AsyncGatewayConfig)
1344+
assert gateway_config.id == "gwc_123"
1345+
1346+
@pytest.mark.asyncio
1347+
async def test_list_empty(self, mock_async_client: AsyncMock) -> None:
1348+
"""Test list method with empty results."""
1349+
page = SimpleNamespace(gateway_configs=[])
1350+
mock_async_client.gateway_configs.list = AsyncMock(return_value=page)
1351+
1352+
ops = AsyncGatewayConfigOps(mock_async_client)
1353+
gateway_configs = await ops.list(limit=10)
1354+
1355+
assert len(gateway_configs) == 0
1356+
mock_async_client.gateway_configs.list.assert_awaited_once()
1357+
1358+
@pytest.mark.asyncio
1359+
async def test_list_single(self, mock_async_client: AsyncMock, gateway_config_view: MockGatewayConfigView) -> None:
1360+
"""Test list method with single result."""
1361+
page = SimpleNamespace(gateway_configs=[gateway_config_view])
1362+
mock_async_client.gateway_configs.list = AsyncMock(return_value=page)
1363+
1364+
ops = AsyncGatewayConfigOps(mock_async_client)
1365+
gateway_configs = await ops.list(
1366+
limit=10,
1367+
starting_after="gwc_000",
1368+
)
1369+
1370+
assert len(gateway_configs) == 1
1371+
assert isinstance(gateway_configs[0], AsyncGatewayConfig)
1372+
assert gateway_configs[0].id == "gwc_123"
1373+
mock_async_client.gateway_configs.list.assert_awaited_once()
1374+
1375+
@pytest.mark.asyncio
1376+
async def test_list_multiple(self, mock_async_client: AsyncMock) -> None:
1377+
"""Test list method with multiple results."""
1378+
gateway_config_view1 = MockGatewayConfigView(id="gwc_001", name="gateway-1")
1379+
gateway_config_view2 = MockGatewayConfigView(id="gwc_002", name="gateway-2")
1380+
page = SimpleNamespace(gateway_configs=[gateway_config_view1, gateway_config_view2])
1381+
mock_async_client.gateway_configs.list = AsyncMock(return_value=page)
1382+
1383+
ops = AsyncGatewayConfigOps(mock_async_client)
1384+
gateway_configs = await ops.list(limit=10)
1385+
1386+
assert len(gateway_configs) == 2
1387+
assert isinstance(gateway_configs[0], AsyncGatewayConfig)
1388+
assert isinstance(gateway_configs[1], AsyncGatewayConfig)
1389+
assert gateway_configs[0].id == "gwc_001"
1390+
assert gateway_configs[1].id == "gwc_002"
1391+
mock_async_client.gateway_configs.list.assert_awaited_once()
1392+
1393+
13161394
class TestAsyncRunloopSDK:
13171395
"""Tests for AsyncRunloopSDK class."""
13181396

@@ -1323,6 +1401,7 @@ def test_init(self) -> None:
13231401
assert isinstance(runloop.agent, AsyncAgentOps)
13241402
assert isinstance(runloop.benchmark, AsyncBenchmarkOps)
13251403
assert isinstance(runloop.devbox, AsyncDevboxOps)
1404+
assert isinstance(runloop.gateway_config, AsyncGatewayConfigOps)
13261405
assert isinstance(runloop.network_policy, AsyncNetworkPolicyOps)
13271406
assert isinstance(runloop.scorer, AsyncScorerOps)
13281407
assert isinstance(runloop.snapshot, AsyncSnapshotOps)

0 commit comments

Comments
 (0)