@@ -44,13 +44,25 @@ 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 (
63+ return_value = (prompt_event , prompt_result )
64+ )
65+ mock_manager .unregister_prompt_wait = MagicMock ()
5466 mock_manager_class .return_value = mock_manager
5567
5668 mock_track = MagicMock ()
@@ -76,13 +88,24 @@ async def test_realtime_client_creation_with_mock():
7688
7789@pytest .mark .asyncio
7890async def test_realtime_set_prompt_with_mock ():
79- """Test set_prompt with mocked WebRTC"""
91+ """Test set_prompt with mocked WebRTC and prompt_ack"""
92+ import asyncio
93+
8094 client = DecartClient (api_key = "test-key" )
8195
8296 with patch ("decart.realtime.client.WebRTCManager" ) as mock_manager_class :
8397 mock_manager = AsyncMock ()
8498 mock_manager .connect = AsyncMock (return_value = True )
8599 mock_manager .send_message = AsyncMock ()
100+
101+ prompt_event = asyncio .Event ()
102+ prompt_result = {"success" : True , "error" : None }
103+
104+ def register_prompt_wait (prompt ):
105+ return prompt_event , prompt_result
106+
107+ mock_manager .register_prompt_wait = MagicMock (side_effect = register_prompt_wait )
108+ mock_manager .unregister_prompt_wait = MagicMock ()
86109 mock_manager_class .return_value = mock_manager
87110
88111 mock_track = MagicMock ()
@@ -99,12 +122,19 @@ async def test_realtime_set_prompt_with_mock():
99122 ),
100123 )
101124
125+ async def set_event ():
126+ await asyncio .sleep (0.01 )
127+ prompt_event .set ()
128+
129+ asyncio .create_task (set_event ())
102130 await realtime_client .set_prompt ("New prompt" )
103131
104- mock_manager .send_message .assert_called_once ()
132+ mock_manager .send_message .assert_called ()
105133 call_args = mock_manager .send_message .call_args [0 ][0 ]
106134 assert call_args .type == "prompt"
107135 assert call_args .prompt == "New prompt"
136+ assert call_args .enhance_prompt is True
137+ mock_manager .unregister_prompt_wait .assert_called_with ("New prompt" )
108138
109139
110140@pytest .mark .asyncio
@@ -152,3 +182,99 @@ def on_error(error):
152182 realtime_client ._emit_error (test_error )
153183 assert len (errors ) == 1
154184 assert errors [0 ].message == "Test error"
185+
186+
187+ @pytest .mark .asyncio
188+ async def test_realtime_set_prompt_timeout ():
189+ """Test set_prompt raises on timeout"""
190+ import asyncio
191+
192+ client = DecartClient (api_key = "test-key" )
193+
194+ with patch ("decart.realtime.client.WebRTCManager" ) as mock_manager_class :
195+ mock_manager = AsyncMock ()
196+ mock_manager .connect = AsyncMock (return_value = True )
197+ mock_manager .send_message = AsyncMock ()
198+
199+ prompt_event = asyncio .Event ()
200+ prompt_result = {"success" : False , "error" : None }
201+
202+ def register_prompt_wait (prompt ):
203+ return prompt_event , prompt_result
204+
205+ mock_manager .register_prompt_wait = MagicMock (side_effect = register_prompt_wait )
206+ mock_manager .unregister_prompt_wait = MagicMock ()
207+ mock_manager_class .return_value = mock_manager
208+
209+ mock_track = MagicMock ()
210+
211+ from decart .realtime .types import RealtimeConnectOptions
212+
213+ realtime_client = await RealtimeClient .connect (
214+ base_url = client .base_url ,
215+ api_key = client .api_key ,
216+ local_track = mock_track ,
217+ options = RealtimeConnectOptions (
218+ model = models .realtime ("mirage" ),
219+ on_remote_stream = lambda t : None ,
220+ ),
221+ )
222+
223+ from decart .errors import DecartSDKError
224+
225+ with pytest .raises (DecartSDKError ) as exc_info :
226+ await realtime_client .set_prompt ("New prompt" , max_timeout = 0.01 )
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