@@ -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+
120213class TestAsyncClientConfigRetrieval :
121214 """Test config retrieval scenarios."""
122215
0 commit comments