Skip to content

Commit 5b92efa

Browse files
committed
test: add LinkedEventsApiClient timeout tests
Add tests for the configurable timeout feature: - Test timeout value is read from config - Test default timeout (60s) when not configured - Test all HTTP methods pass timeout to requests Refs: PT-1992
1 parent 25f4096 commit 5b92efa

1 file changed

Lines changed: 161 additions & 0 deletions

File tree

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
from unittest.mock import Mock, patch
2+
3+
from graphene_linked_events.rest_client import LinkedEventsApiClient
4+
5+
6+
class TestLinkedEventsApiClientTimeout:
7+
"""Tests for LinkedEventsApiClient timeout configuration."""
8+
9+
def get_base_config(self, timeout=None):
10+
"""Return a base config dict, optionally with timeout."""
11+
config = {
12+
"ROOT": "https://api.example.com/v1/",
13+
"API_KEY": "test-api-key",
14+
"DATA_SOURCE": "test-source",
15+
}
16+
if timeout is not None:
17+
config["TIMEOUT"] = timeout
18+
return config
19+
20+
def test_timeout_from_config(self):
21+
"""Client should use timeout value from config."""
22+
config = self.get_base_config(timeout=90)
23+
client = LinkedEventsApiClient(config)
24+
assert client.timeout == 90
25+
26+
def test_timeout_default_when_not_in_config(self):
27+
"""Client should use default timeout (60s) when not in config."""
28+
config = self.get_base_config()
29+
client = LinkedEventsApiClient(config)
30+
assert client.timeout == 60
31+
32+
def test_timeout_zero_is_allowed(self):
33+
"""Client should accept zero timeout from config."""
34+
config = self.get_base_config(timeout=0)
35+
client = LinkedEventsApiClient(config)
36+
assert client.timeout == 0
37+
38+
@patch("graphene_linked_events.rest_client.requests.request")
39+
def test_retrieve_uses_configured_timeout(self, mock_request):
40+
"""Retrieve method should pass configured timeout to requests."""
41+
mock_request.return_value = Mock(status_code=200)
42+
config = self.get_base_config(timeout=45)
43+
client = LinkedEventsApiClient(config)
44+
45+
client.retrieve("event", "123")
46+
47+
mock_request.assert_called_once()
48+
assert mock_request.call_args.kwargs["timeout"] == 45
49+
50+
@patch("graphene_linked_events.rest_client.requests.request")
51+
def test_list_uses_configured_timeout(self, mock_request):
52+
"""List method should pass configured timeout to requests."""
53+
mock_request.return_value = Mock(status_code=200)
54+
config = self.get_base_config(timeout=45)
55+
client = LinkedEventsApiClient(config)
56+
57+
client.list("event")
58+
59+
mock_request.assert_called_once()
60+
assert mock_request.call_args.kwargs["timeout"] == 45
61+
62+
@patch("graphene_linked_events.rest_client.requests.request")
63+
def test_create_uses_configured_timeout(self, mock_request):
64+
"""Create method should pass configured timeout to requests."""
65+
mock_request.return_value = Mock(status_code=201)
66+
config = self.get_base_config(timeout=45)
67+
client = LinkedEventsApiClient(config)
68+
69+
client.create("event", '{"name": "Test"}')
70+
71+
mock_request.assert_called_once()
72+
assert mock_request.call_args.kwargs["timeout"] == 45
73+
74+
@patch("graphene_linked_events.rest_client.requests.request")
75+
def test_update_uses_configured_timeout(self, mock_request):
76+
"""Update method should pass configured timeout to requests."""
77+
mock_request.return_value = Mock(status_code=200)
78+
config = self.get_base_config(timeout=45)
79+
client = LinkedEventsApiClient(config)
80+
81+
client.update("event", "123", '{"name": "Updated"}')
82+
83+
mock_request.assert_called_once()
84+
assert mock_request.call_args.kwargs["timeout"] == 45
85+
86+
@patch("graphene_linked_events.rest_client.requests.request")
87+
def test_delete_uses_configured_timeout(self, mock_request):
88+
"""Delete method should pass configured timeout to requests."""
89+
mock_request.return_value = Mock(status_code=204)
90+
config = self.get_base_config(timeout=45)
91+
client = LinkedEventsApiClient(config)
92+
93+
client.delete("event", "123")
94+
95+
mock_request.assert_called_once()
96+
assert mock_request.call_args.kwargs["timeout"] == 45
97+
98+
@patch("graphene_linked_events.rest_client.requests.request")
99+
def test_search_uses_configured_timeout(self, mock_request):
100+
"""Search method should pass configured timeout to requests."""
101+
mock_request.return_value = Mock(status_code=200)
102+
config = self.get_base_config(timeout=45)
103+
client = LinkedEventsApiClient(config)
104+
105+
# Mock get_actions to return a valid search action
106+
# (search is a special action that doesn't use resource param)
107+
with patch.object(
108+
client,
109+
"get_actions",
110+
return_value={"search": {"method": "GET", "url": client.root + "search/"}},
111+
):
112+
client.search({"q": "test"})
113+
114+
mock_request.assert_called_once()
115+
assert mock_request.call_args.kwargs["timeout"] == 45
116+
117+
@patch("graphene_linked_events.rest_client.requests.request")
118+
def test_upload_uses_configured_timeout(self, mock_request):
119+
"""Upload method should pass configured timeout to requests."""
120+
mock_request.return_value = Mock(status_code=201)
121+
config = self.get_base_config(timeout=45)
122+
client = LinkedEventsApiClient(config)
123+
124+
client.upload("image", {"name": "test"}, {"file": b"data"})
125+
126+
mock_request.assert_called_once()
127+
assert mock_request.call_args.kwargs["timeout"] == 45
128+
129+
130+
class TestLinkedEventsApiClientConfig:
131+
"""Tests for LinkedEventsApiClient configuration."""
132+
133+
def test_client_stores_root_url(self):
134+
"""Client should store root URL from config."""
135+
config = {
136+
"ROOT": "https://api.example.com/v1/",
137+
"API_KEY": "test-key",
138+
"DATA_SOURCE": "test-source",
139+
}
140+
client = LinkedEventsApiClient(config)
141+
assert client.root == "https://api.example.com/v1/"
142+
143+
def test_client_stores_api_key(self):
144+
"""Client should store API key from config."""
145+
config = {
146+
"ROOT": "https://api.example.com/v1/",
147+
"API_KEY": "my-secret-key",
148+
"DATA_SOURCE": "test-source",
149+
}
150+
client = LinkedEventsApiClient(config)
151+
assert client.api_key == "my-secret-key"
152+
153+
def test_client_stores_data_source(self):
154+
"""Client should store data source from config."""
155+
config = {
156+
"ROOT": "https://api.example.com/v1/",
157+
"API_KEY": "test-key",
158+
"DATA_SOURCE": "palvelutarjotin",
159+
}
160+
client = LinkedEventsApiClient(config)
161+
assert client.data_source == "palvelutarjotin"

0 commit comments

Comments
 (0)