@@ -44,13 +44,23 @@ def test_realtime_models_available():
4444@pytest .mark .asyncio
4545async def test_realtime_client_creation_with_mock ():
4646 """Test client creation with mocked WebRTC"""
47+ import asyncio
48+
4749 client = DecartClient (api_key = "test-key" )
4850
4951 with patch ("decart.realtime.client.WebRTCManager" ) as mock_manager_class :
5052 mock_manager = AsyncMock ()
5153 mock_manager .connect = AsyncMock (return_value = True )
5254 mock_manager .is_connected = MagicMock (return_value = True )
5355 mock_manager .get_connection_state = MagicMock (return_value = "connected" )
56+ mock_manager .send_message = AsyncMock ()
57+
58+ prompt_event = asyncio .Event ()
59+ prompt_result = {"success" : True , "error" : None }
60+ prompt_event .set ()
61+
62+ mock_manager .register_prompt_wait = MagicMock (return_value = (prompt_event , prompt_result ))
63+ mock_manager .unregister_prompt_wait = MagicMock ()
5464 mock_manager_class .return_value = mock_manager
5565
5666 mock_track = MagicMock ()
@@ -76,13 +86,24 @@ async def test_realtime_client_creation_with_mock():
7686
7787@pytest .mark .asyncio
7888async def test_realtime_set_prompt_with_mock ():
79- """Test set_prompt with mocked WebRTC"""
89+ """Test set_prompt with mocked WebRTC and prompt_ack"""
90+ import asyncio
91+
8092 client = DecartClient (api_key = "test-key" )
8193
8294 with patch ("decart.realtime.client.WebRTCManager" ) as mock_manager_class :
8395 mock_manager = AsyncMock ()
8496 mock_manager .connect = AsyncMock (return_value = True )
8597 mock_manager .send_message = AsyncMock ()
98+
99+ prompt_event = asyncio .Event ()
100+ prompt_result = {"success" : True , "error" : None }
101+
102+ def register_prompt_wait (prompt ):
103+ return prompt_event , prompt_result
104+
105+ mock_manager .register_prompt_wait = MagicMock (side_effect = register_prompt_wait )
106+ mock_manager .unregister_prompt_wait = MagicMock ()
86107 mock_manager_class .return_value = mock_manager
87108
88109 mock_track = MagicMock ()
@@ -99,12 +120,19 @@ async def test_realtime_set_prompt_with_mock():
99120 ),
100121 )
101122
123+ async def set_event ():
124+ await asyncio .sleep (0.01 )
125+ prompt_event .set ()
126+
127+ asyncio .create_task (set_event ())
102128 await realtime_client .set_prompt ("New prompt" )
103129
104- mock_manager .send_message .assert_called_once ()
130+ mock_manager .send_message .assert_called ()
105131 call_args = mock_manager .send_message .call_args [0 ][0 ]
106132 assert call_args .type == "prompt"
107133 assert call_args .prompt == "New prompt"
134+ assert call_args .enhance_prompt is True
135+ mock_manager .unregister_prompt_wait .assert_called_with ("New prompt" )
108136
109137
110138@pytest .mark .asyncio
@@ -152,3 +180,101 @@ def on_error(error):
152180 realtime_client ._emit_error (test_error )
153181 assert len (errors ) == 1
154182 assert errors [0 ].message == "Test error"
183+
184+
185+ @pytest .mark .asyncio
186+ async def test_realtime_set_prompt_timeout ():
187+ """Test set_prompt raises on timeout"""
188+ import asyncio
189+
190+ client = DecartClient (api_key = "test-key" )
191+
192+ with patch ("decart.realtime.client.WebRTCManager" ) as mock_manager_class :
193+ mock_manager = AsyncMock ()
194+ mock_manager .connect = AsyncMock (return_value = True )
195+ mock_manager .send_message = AsyncMock ()
196+
197+ prompt_event = asyncio .Event ()
198+ prompt_result = {"success" : False , "error" : None }
199+
200+ def register_prompt_wait (prompt ):
201+ return prompt_event , prompt_result
202+
203+ mock_manager .register_prompt_wait = MagicMock (side_effect = register_prompt_wait )
204+ mock_manager .unregister_prompt_wait = MagicMock ()
205+ mock_manager_class .return_value = mock_manager
206+
207+ mock_track = MagicMock ()
208+
209+ from decart .realtime .types import RealtimeConnectOptions
210+
211+ realtime_client = await RealtimeClient .connect (
212+ base_url = client .base_url ,
213+ api_key = client .api_key ,
214+ local_track = mock_track ,
215+ options = RealtimeConnectOptions (
216+ model = models .realtime ("mirage" ),
217+ on_remote_stream = lambda t : None ,
218+ ),
219+ )
220+
221+ from decart .errors import DecartSDKError
222+
223+ # Mock asyncio.wait_for to immediately raise TimeoutError
224+ with patch ("asyncio.wait_for" , side_effect = asyncio .TimeoutError ):
225+ with pytest .raises (DecartSDKError ) as exc_info :
226+ await realtime_client .set_prompt ("New prompt" )
227+
228+ assert "timed out" in str (exc_info .value )
229+ mock_manager .unregister_prompt_wait .assert_called_with ("New prompt" )
230+
231+
232+ @pytest .mark .asyncio
233+ async def test_realtime_set_prompt_server_error ():
234+ """Test set_prompt raises on server error"""
235+ import asyncio
236+
237+ client = DecartClient (api_key = "test-key" )
238+
239+ with patch ("decart.realtime.client.WebRTCManager" ) as mock_manager_class :
240+ mock_manager = AsyncMock ()
241+ mock_manager .connect = AsyncMock (return_value = True )
242+ mock_manager .send_message = AsyncMock ()
243+
244+ prompt_event = asyncio .Event ()
245+ prompt_result = {"success" : False , "error" : "Server rejected prompt" }
246+
247+ def register_prompt_wait (prompt ):
248+ return prompt_event , prompt_result
249+
250+ mock_manager .register_prompt_wait = MagicMock (side_effect = register_prompt_wait )
251+ mock_manager .unregister_prompt_wait = MagicMock ()
252+ mock_manager_class .return_value = mock_manager
253+
254+ mock_track = MagicMock ()
255+
256+ from decart .realtime .types import RealtimeConnectOptions
257+
258+ realtime_client = await RealtimeClient .connect (
259+ base_url = client .base_url ,
260+ api_key = client .api_key ,
261+ local_track = mock_track ,
262+ options = RealtimeConnectOptions (
263+ model = models .realtime ("mirage" ),
264+ on_remote_stream = lambda t : None ,
265+ ),
266+ )
267+
268+ async def set_event ():
269+ await asyncio .sleep (0.01 )
270+ prompt_event .set ()
271+
272+ asyncio .create_task (set_event ())
273+
274+ from decart .errors import DecartSDKError
275+
276+ with pytest .raises (DecartSDKError ) as exc_info :
277+ await realtime_client .set_prompt ("New prompt" )
278+
279+ assert "Server rejected prompt" in str (exc_info .value )
280+ mock_manager .unregister_prompt_wait .assert_called_with ("New prompt" )
0 commit comments