Skip to content

Commit 7859841

Browse files
test: add exception and agents resource test coverage
- 15 tests for all exception classes (defaults, messages, inheritance, hierarchy) - 3 tests for agents resource (register, me, status) - Total test count: 12 → 34 (183% increase)
1 parent ebfd621 commit 7859841

2 files changed

Lines changed: 175 additions & 0 deletions

File tree

tests/test_agents.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
"""Tests for agents resource."""
2+
3+
from unittest.mock import Mock, patch
4+
5+
from agentgram import AgentGram
6+
7+
8+
class TestAgentsResource:
9+
"""Test agents resource methods."""
10+
11+
@patch("agentgram.http.httpx.Client")
12+
def test_register(self, mock_client):
13+
"""Test agent registration."""
14+
mock_response = Mock()
15+
mock_response.is_success = True
16+
mock_response.json.return_value = {
17+
"id": "agent-123",
18+
"name": "TestBot",
19+
"karma": 0,
20+
"created_at": "2026-01-01T00:00:00Z",
21+
"updated_at": "2026-01-01T00:00:00Z",
22+
}
23+
mock_client.return_value.request.return_value = mock_response
24+
25+
client = AgentGram(api_key="ag_test")
26+
agent = client.agents.register(name="TestBot", public_key="abc123")
27+
28+
assert agent.id == "agent-123"
29+
assert agent.name == "TestBot"
30+
client.close()
31+
32+
@patch("agentgram.http.httpx.Client")
33+
def test_me(self, mock_client):
34+
"""Test getting current agent profile."""
35+
mock_response = Mock()
36+
mock_response.is_success = True
37+
mock_response.json.return_value = {
38+
"id": "agent-456",
39+
"name": "MyAgent",
40+
"karma": 100,
41+
"created_at": "2026-01-01T00:00:00Z",
42+
"updated_at": "2026-01-01T00:00:00Z",
43+
}
44+
mock_client.return_value.request.return_value = mock_response
45+
46+
client = AgentGram(api_key="ag_test")
47+
me = client.agents.me()
48+
49+
assert me.id == "agent-456"
50+
assert me.name == "MyAgent"
51+
assert me.karma == 100
52+
client.close()
53+
54+
@patch("agentgram.http.httpx.Client")
55+
def test_status(self, mock_client):
56+
"""Test getting agent status."""
57+
mock_response = Mock()
58+
mock_response.is_success = True
59+
mock_response.json.return_value = {
60+
"online": True,
61+
"post_count": 42,
62+
"comment_count": 10,
63+
}
64+
mock_client.return_value.request.return_value = mock_response
65+
66+
client = AgentGram(api_key="ag_test")
67+
status = client.agents.status()
68+
69+
assert status.online is True
70+
assert status.post_count == 42
71+
assert status.comment_count == 10
72+
client.close()

tests/test_exceptions.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
"""Tests for AgentGram exception classes."""
2+
3+
import pytest
4+
5+
from agentgram.exceptions import (
6+
AgentGramError,
7+
AuthenticationError,
8+
RateLimitError,
9+
NotFoundError,
10+
ValidationError,
11+
ServerError,
12+
)
13+
14+
15+
class TestAgentGramError:
16+
"""Test base error class."""
17+
18+
def test_message(self):
19+
error = AgentGramError("something went wrong")
20+
assert str(error) == "something went wrong"
21+
assert error.message == "something went wrong"
22+
23+
def test_status_code_default(self):
24+
error = AgentGramError("test")
25+
assert error.status_code is None
26+
27+
def test_status_code_custom(self):
28+
error = AgentGramError("test", status_code=418)
29+
assert error.status_code == 418
30+
31+
def test_is_exception(self):
32+
error = AgentGramError("test")
33+
assert isinstance(error, Exception)
34+
35+
36+
class TestAuthenticationError:
37+
def test_defaults(self):
38+
error = AuthenticationError()
39+
assert error.status_code == 401
40+
assert "Invalid or missing API key" in str(error)
41+
42+
def test_custom_message(self):
43+
error = AuthenticationError("Token expired")
44+
assert str(error) == "Token expired"
45+
assert error.status_code == 401
46+
47+
def test_inheritance(self):
48+
error = AuthenticationError()
49+
assert isinstance(error, AgentGramError)
50+
51+
52+
class TestRateLimitError:
53+
def test_defaults(self):
54+
error = RateLimitError()
55+
assert error.status_code == 429
56+
assert "Rate limit" in str(error)
57+
58+
def test_inheritance(self):
59+
assert isinstance(RateLimitError(), AgentGramError)
60+
61+
62+
class TestNotFoundError:
63+
def test_defaults(self):
64+
error = NotFoundError()
65+
assert error.status_code == 404
66+
assert "not found" in str(error).lower()
67+
68+
def test_inheritance(self):
69+
assert isinstance(NotFoundError(), AgentGramError)
70+
71+
72+
class TestValidationError:
73+
def test_defaults(self):
74+
error = ValidationError()
75+
assert error.status_code == 400
76+
77+
def test_inheritance(self):
78+
assert isinstance(ValidationError(), AgentGramError)
79+
80+
81+
class TestServerError:
82+
def test_defaults(self):
83+
error = ServerError()
84+
assert error.status_code == 500
85+
86+
def test_inheritance(self):
87+
assert isinstance(ServerError(), AgentGramError)
88+
89+
90+
class TestErrorHierarchy:
91+
"""Test that all errors can be caught with base class."""
92+
93+
def test_catch_all_with_base(self):
94+
errors = [
95+
AuthenticationError(),
96+
RateLimitError(),
97+
NotFoundError(),
98+
ValidationError(),
99+
ServerError(),
100+
]
101+
for error in errors:
102+
with pytest.raises(AgentGramError):
103+
raise error

0 commit comments

Comments
 (0)