Skip to content

Commit f371bf0

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 a558001 commit f371bf0

1 file changed

Lines changed: 163 additions & 0 deletions

File tree

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

0 commit comments

Comments
 (0)