Skip to content

Commit 3f966d8

Browse files
committed
initial simple tests for AgentOps
1 parent 27cbc3a commit 3f966d8

3 files changed

Lines changed: 104 additions & 1 deletion

File tree

tests/sdk/conftest.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"snapshot": "snap_123",
2121
"blueprint": "bp_123",
2222
"object": "obj_123",
23+
"agent": "agent_123",
2324
}
2425

2526
# Test URL constants
@@ -86,6 +87,14 @@ class MockObjectView:
8687
name: str = "test-object"
8788

8889

90+
@dataclass
91+
class MockAgentView:
92+
"""Mock AgentView for testing."""
93+
94+
id: str = "agent_123"
95+
name: str = "test-agent"
96+
97+
8998
def create_mock_httpx_client(methods: dict[str, Any] | None = None) -> AsyncMock:
9099
"""
91100
Create a mock httpx.AsyncClient with proper context manager setup.
@@ -170,6 +179,12 @@ def object_view() -> MockObjectView:
170179
return MockObjectView()
171180

172181

182+
@pytest.fixture
183+
def agent_view() -> MockAgentView:
184+
"""Create a mock AgentView."""
185+
return MockAgentView()
186+
187+
173188
@pytest.fixture
174189
def mock_httpx_response() -> Mock:
175190
"""Create a mock httpx.Response."""

tests/sdk/test_agent.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"""Comprehensive tests for sync Agent class."""
2+
3+
from __future__ import annotations
4+
5+
from unittest.mock import Mock
6+
7+
from tests.sdk.conftest import MockAgentView
8+
from runloop_api_client.sdk import Agent
9+
10+
11+
class TestAgent:
12+
"""Tests for Agent class."""
13+
14+
def test_init(self, mock_client: Mock) -> None:
15+
"""Test Agent initialization."""
16+
agent = Agent(mock_client, "agent_123")
17+
assert agent.id == "agent_123"
18+
19+
def test_repr(self, mock_client: Mock) -> None:
20+
"""Test Agent string representation."""
21+
agent = Agent(mock_client, "agent_123")
22+
assert repr(agent) == "<Agent id='agent_123'>"
23+
24+
def test_get_info(self, mock_client: Mock, agent_view: MockAgentView) -> None:
25+
"""Test get_info method."""
26+
mock_client.agents.retrieve.return_value = agent_view
27+
28+
agent = Agent(mock_client, "agent_123")
29+
result = agent.get_info(
30+
extra_headers={"X-Custom": "value"},
31+
extra_query={"param": "value"},
32+
extra_body={"key": "value"},
33+
timeout=30.0,
34+
)
35+
36+
assert result == agent_view
37+
mock_client.agents.retrieve.assert_called_once_with(
38+
"agent_123",
39+
extra_headers={"X-Custom": "value"},
40+
extra_query={"param": "value"},
41+
extra_body={"key": "value"},
42+
timeout=30.0,
43+
)

tests/sdk/test_clients.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@
1313
MockObjectView,
1414
MockSnapshotView,
1515
MockBlueprintView,
16+
MockAgentView,
1617
create_mock_httpx_response,
1718
)
18-
from runloop_api_client.sdk import Devbox, Snapshot, Blueprint, StorageObject
19+
from runloop_api_client.sdk import Devbox, Snapshot, Blueprint, StorageObject, Agent
1920
from runloop_api_client.sdk.sync import (
2021
DevboxOps,
2122
RunloopSDK,
2223
SnapshotOps,
2324
BlueprintOps,
2425
StorageObjectOps,
26+
AgentOps,
2527
)
2628
from runloop_api_client.lib.polling import PollingConfig
2729

@@ -472,13 +474,56 @@ def test_upload_from_dir_with_string_path(
472474
mock_client.objects.complete.assert_called_once()
473475

474476

477+
class TestAgentClient:
478+
"""Tests for AgentClient class."""
479+
480+
def test_create(self, mock_client: Mock, agent_view: MockAgentView) -> None:
481+
"""Test create method."""
482+
mock_client.agents.create.return_value = agent_view
483+
484+
client = AgentOps(mock_client)
485+
agent = client.create(
486+
name="test-agent",
487+
metadata={"key": "value"},
488+
)
489+
490+
assert isinstance(agent, Agent)
491+
assert agent.id == "agent_123"
492+
mock_client.agents.create.assert_called_once()
493+
494+
def test_from_id(self, mock_client: Mock) -> None:
495+
"""Test from_id method."""
496+
client = AgentOps(mock_client)
497+
agent = client.from_id("agent_123")
498+
499+
assert isinstance(agent, Agent)
500+
assert agent.id == "agent_123"
501+
502+
def test_list(self, mock_client: Mock, agent_view: MockAgentView) -> None:
503+
"""Test list method."""
504+
page = SimpleNamespace(agents=[agent_view])
505+
mock_client.agents.list.return_value = page
506+
507+
client = AgentOps(mock_client)
508+
agents = client.list(
509+
limit=10,
510+
starting_after="agent_000",
511+
)
512+
513+
assert len(agents) == 1
514+
assert isinstance(agents[0], Agent)
515+
assert agents[0].id == "agent_123"
516+
mock_client.agents.list.assert_called_once()
517+
518+
475519
class TestRunloopSDK:
476520
"""Tests for RunloopSDK class."""
477521

478522
def test_init(self) -> None:
479523
"""Test RunloopSDK initialization."""
480524
sdk = RunloopSDK(bearer_token="test-token")
481525
assert sdk.api is not None
526+
assert isinstance(sdk.agent, AgentOps)
482527
assert isinstance(sdk.devbox, DevboxOps)
483528
assert isinstance(sdk.snapshot, SnapshotOps)
484529
assert isinstance(sdk.blueprint, BlueprintOps)

0 commit comments

Comments
 (0)