Skip to content

Commit 2c783e8

Browse files
committed
chore: add tests
1 parent de5006e commit 2c783e8

3 files changed

Lines changed: 184 additions & 5 deletions

File tree

docs/source/index.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ with Replane(
3232
Or without context manager:
3333

3434
```python
35-
# Credentials in constructor
36-
replane = Replane(base_url="...", sdk_key="...")
37-
replane.connect()
38-
39-
# Or in connect()
4035
replane = Replane()
4136
replane.connect(base_url="...", sdk_key="...")
4237

tests/test_async_client.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,99 @@ async def test_connect_without_wait(self, mock_server: MockSSEServer):
117117
await client.close()
118118

119119

120+
class TestAsyncClientCredentials:
121+
"""Test sdk_key and base_url can be provided in constructor or connect()."""
122+
123+
async def test_credentials_in_constructor(self, mock_server: MockSSEServer):
124+
"""Credentials provided in constructor work normally."""
125+
mock_server.send_init([create_config("feature", True)])
126+
127+
client = AsyncReplane(
128+
base_url=mock_server.url,
129+
sdk_key="rp_test_key",
130+
)
131+
try:
132+
await client.connect()
133+
assert client.configs["feature"] is True
134+
finally:
135+
await client.close()
136+
137+
async def test_credentials_in_connect(self, mock_server: MockSSEServer):
138+
"""Credentials can be provided in connect() instead of constructor."""
139+
mock_server.send_init([create_config("feature", True)])
140+
141+
client = AsyncReplane()
142+
try:
143+
await client.connect(
144+
base_url=mock_server.url,
145+
sdk_key="rp_test_key",
146+
)
147+
assert client.configs["feature"] is True
148+
finally:
149+
await client.close()
150+
151+
async def test_connect_credentials_override_constructor(
152+
self, mock_server: MockSSEServer
153+
):
154+
"""Credentials in connect() override those in constructor."""
155+
mock_server.send_init([create_config("feature", True)])
156+
157+
# Provide wrong URL in constructor, correct one in connect()
158+
client = AsyncReplane(
159+
base_url="http://wrong-url.invalid",
160+
sdk_key="rp_wrong_key",
161+
)
162+
try:
163+
await client.connect(
164+
base_url=mock_server.url,
165+
sdk_key="rp_test_key",
166+
)
167+
assert client.configs["feature"] is True
168+
finally:
169+
await client.close()
170+
171+
async def test_partial_credentials_in_constructor_and_connect(
172+
self, mock_server: MockSSEServer
173+
):
174+
"""base_url in constructor, sdk_key in connect() works."""
175+
mock_server.send_init([create_config("feature", True)])
176+
177+
client = AsyncReplane(base_url=mock_server.url)
178+
try:
179+
await client.connect(sdk_key="rp_test_key")
180+
assert client.configs["feature"] is True
181+
finally:
182+
await client.close()
183+
184+
async def test_missing_base_url_raises_valueerror(self):
185+
"""Missing base_url raises ValueError."""
186+
client = AsyncReplane(sdk_key="rp_test_key")
187+
188+
with pytest.raises(ValueError) as exc_info:
189+
await client.connect()
190+
191+
assert "base_url is required" in str(exc_info.value)
192+
193+
async def test_missing_sdk_key_raises_valueerror(self):
194+
"""Missing sdk_key raises ValueError."""
195+
client = AsyncReplane(base_url="http://example.com")
196+
197+
with pytest.raises(ValueError) as exc_info:
198+
await client.connect()
199+
200+
assert "sdk_key is required" in str(exc_info.value)
201+
202+
async def test_missing_both_credentials_raises_valueerror(self):
203+
"""Missing both credentials raises ValueError."""
204+
client = AsyncReplane()
205+
206+
with pytest.raises(ValueError) as exc_info:
207+
await client.connect()
208+
209+
# Should fail on first missing credential
210+
assert "is required" in str(exc_info.value)
211+
212+
120213
class TestAsyncClientConfigRetrieval:
121214
"""Test config retrieval scenarios."""
122215

tests/test_sync_client.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,97 @@ def test_connect_without_wait(self, mock_server: MockSSEServer):
117117
client.close()
118118

119119

120+
class TestSyncClientCredentials:
121+
"""Test sdk_key and base_url can be provided in constructor or connect()."""
122+
123+
def test_credentials_in_constructor(self, mock_server: MockSSEServer):
124+
"""Credentials provided in constructor work normally."""
125+
mock_server.send_init([create_config("feature", True)])
126+
127+
client = Replane(
128+
base_url=mock_server.url,
129+
sdk_key="rp_test_key",
130+
)
131+
try:
132+
client.connect()
133+
assert client.configs["feature"] is True
134+
finally:
135+
client.close()
136+
137+
def test_credentials_in_connect(self, mock_server: MockSSEServer):
138+
"""Credentials can be provided in connect() instead of constructor."""
139+
mock_server.send_init([create_config("feature", True)])
140+
141+
client = Replane()
142+
try:
143+
client.connect(
144+
base_url=mock_server.url,
145+
sdk_key="rp_test_key",
146+
)
147+
assert client.configs["feature"] is True
148+
finally:
149+
client.close()
150+
151+
def test_connect_credentials_override_constructor(self, mock_server: MockSSEServer):
152+
"""Credentials in connect() override those in constructor."""
153+
mock_server.send_init([create_config("feature", True)])
154+
155+
# Provide wrong URL in constructor, correct one in connect()
156+
client = Replane(
157+
base_url="http://wrong-url.invalid",
158+
sdk_key="rp_wrong_key",
159+
)
160+
try:
161+
client.connect(
162+
base_url=mock_server.url,
163+
sdk_key="rp_test_key",
164+
)
165+
assert client.configs["feature"] is True
166+
finally:
167+
client.close()
168+
169+
def test_partial_credentials_in_constructor_and_connect(
170+
self, mock_server: MockSSEServer
171+
):
172+
"""base_url in constructor, sdk_key in connect() works."""
173+
mock_server.send_init([create_config("feature", True)])
174+
175+
client = Replane(base_url=mock_server.url)
176+
try:
177+
client.connect(sdk_key="rp_test_key")
178+
assert client.configs["feature"] is True
179+
finally:
180+
client.close()
181+
182+
def test_missing_base_url_raises_valueerror(self):
183+
"""Missing base_url raises ValueError."""
184+
client = Replane(sdk_key="rp_test_key")
185+
186+
with pytest.raises(ValueError) as exc_info:
187+
client.connect()
188+
189+
assert "base_url is required" in str(exc_info.value)
190+
191+
def test_missing_sdk_key_raises_valueerror(self):
192+
"""Missing sdk_key raises ValueError."""
193+
client = Replane(base_url="http://example.com")
194+
195+
with pytest.raises(ValueError) as exc_info:
196+
client.connect()
197+
198+
assert "sdk_key is required" in str(exc_info.value)
199+
200+
def test_missing_both_credentials_raises_valueerror(self):
201+
"""Missing both credentials raises ValueError."""
202+
client = Replane()
203+
204+
with pytest.raises(ValueError) as exc_info:
205+
client.connect()
206+
207+
# Should fail on first missing credential
208+
assert "is required" in str(exc_info.value)
209+
210+
120211
class TestSyncClientConfigRetrieval:
121212
"""Test config retrieval scenarios."""
122213

0 commit comments

Comments
 (0)