1616
1717import asyncio
1818import time
19+ from typing import cast
1920from unittest .mock import AsyncMock , MagicMock , patch
2021
2122import pytest
2223from fastapi import HTTPException
2324
2425from api_utils .queue_worker import QueueManager , queue_worker
26+ from api_utils .context_types import QueueItem
2527
2628# ==================== Test Classes ====================
2729
@@ -137,20 +139,24 @@ async def test_check_queue_disconnects_marks_disconnected_requests(
137139 assert queue_manager .request_queue is not None
138140
139141 # Create two items: one disconnected, one connected
140- item1 = {
142+ item1 = cast ( QueueItem , {
141143 "req_id" : "req1" ,
142144 "http_request" : MagicMock (),
143145 "cancelled" : False ,
144146 "result_future" : asyncio .Future (),
145- }
147+ "request_data" : None ,
148+ "enqueue_time" : 0.0 ,
149+ })
146150 item1 ["http_request" ].is_disconnected = AsyncMock (return_value = True )
147151
148- item2 = {
152+ item2 = cast ( QueueItem , {
149153 "req_id" : "req2" ,
150154 "http_request" : MagicMock (),
151155 "cancelled" : False ,
152156 "result_future" : asyncio .Future (),
153- }
157+ "request_data" : None ,
158+ "enqueue_time" : 0.0 ,
159+ })
154160 item2 ["http_request" ].is_disconnected = AsyncMock (return_value = False )
155161
156162 # Add to queue
@@ -180,12 +186,14 @@ async def test_check_queue_disconnects_handles_exceptions(
180186 assert queue_manager .request_queue is not None
181187 queue_manager .logger = MagicMock ()
182188
183- item = {
189+ item = cast ( QueueItem , {
184190 "req_id" : "req1" ,
185191 "http_request" : MagicMock (),
186192 "cancelled" : False ,
187193 "result_future" : asyncio .Future (),
188- }
194+ "request_data" : None ,
195+ "enqueue_time" : 0.0 ,
196+ })
189197 item ["http_request" ].is_disconnected = AsyncMock (
190198 side_effect = Exception ("Connection check failed" )
191199 )
@@ -213,13 +221,14 @@ async def test_process_request_skips_cancelled_requests(
213221 # Mock task_done since we're not using queue.get()
214222 queue_manager .request_queue .task_done = MagicMock ()
215223
216- req_item = {
224+ req_item = cast ( QueueItem , {
217225 "req_id" : "req1" ,
218226 "request_data" : MagicMock (),
219227 "http_request" : MagicMock (),
220228 "result_future" : asyncio .Future (),
221229 "cancelled" : True , # Already cancelled
222- }
230+ "enqueue_time" : 0.0 ,
231+ })
223232
224233 await queue_manager .process_request (req_item )
225234
@@ -240,13 +249,14 @@ async def test_process_request_detects_early_disconnect(
240249 queue_manager .request_queue .task_done = MagicMock () # Mock task_done
241250 queue_manager .processing_lock = real_locks_mock_browser .processing_lock
242251
243- req_item = {
252+ req_item = cast ( QueueItem , {
244253 "req_id" : "req1" ,
245254 "request_data" : MagicMock (),
246255 "http_request" : MagicMock (),
247256 "result_future" : asyncio .Future (),
248257 "cancelled" : False ,
249- }
258+ "enqueue_time" : 0.0 ,
259+ })
250260
251261 # Mock client as disconnected
252262 with patch (
@@ -273,13 +283,14 @@ async def test_process_request_fails_when_lock_missing(
273283 queue_manager .request_queue .task_done = MagicMock () # Mock task_done
274284 queue_manager .processing_lock = None # Not initialized
275285
276- req_item = {
286+ req_item = cast ( QueueItem , {
277287 "req_id" : "req1" ,
278288 "request_data" : MagicMock (),
279289 "http_request" : MagicMock (),
280290 "result_future" : asyncio .Future (),
281291 "cancelled" : False ,
282- }
292+ "enqueue_time" : 0.0 ,
293+ })
283294
284295 with patch (
285296 "api_utils.request_processor._check_client_connection" ,
@@ -305,13 +316,14 @@ async def test_process_request_successful_flow(self, real_locks_mock_browser):
305316 queue_manager .processing_lock = real_locks_mock_browser .processing_lock
306317 queue_manager .logger = MagicMock ()
307318
308- req_item = {
319+ req_item = cast ( QueueItem , {
309320 "req_id" : "req1" ,
310321 "request_data" : MagicMock (),
311322 "http_request" : MagicMock (),
312323 "result_future" : asyncio .Future (),
313324 "cancelled" : False ,
314- }
325+ "enqueue_time" : 0.0 ,
326+ })
315327 req_item ["request_data" ].stream = False
316328
317329 with (
@@ -348,13 +360,14 @@ async def test_tier1_recovery_page_refresh(self, real_locks_mock_browser):
348360 queue_manager .processing_lock = real_locks_mock_browser .processing_lock
349361 queue_manager .logger = MagicMock ()
350362
351- req_item = {
363+ req_item = cast ( QueueItem , {
352364 "req_id" : "req1" ,
353365 "request_data" : MagicMock (),
354366 "http_request" : MagicMock (),
355367 "result_future" : asyncio .Future (),
356368 "cancelled" : False ,
357- }
369+ "enqueue_time" : 0.0 ,
370+ })
358371
359372 with (
360373 patch (
@@ -392,13 +405,14 @@ async def test_tier2_recovery_profile_switch(self, real_locks_mock_browser):
392405 queue_manager .processing_lock = real_locks_mock_browser .processing_lock
393406 queue_manager .logger = MagicMock ()
394407
395- req_item = {
408+ req_item = cast ( QueueItem , {
396409 "req_id" : "req1" ,
397410 "request_data" : MagicMock (),
398411 "http_request" : MagicMock (),
399412 "result_future" : asyncio .Future (),
400413 "cancelled" : False ,
401- }
414+ "enqueue_time" : 0.0 ,
415+ })
402416
403417 with (
404418 patch (
@@ -445,13 +459,14 @@ async def test_quota_error_immediate_profile_switch(self, real_locks_mock_browse
445459 queue_manager .processing_lock = real_locks_mock_browser .processing_lock
446460 queue_manager .logger = MagicMock ()
447461
448- req_item = {
462+ req_item = cast ( QueueItem , {
449463 "req_id" : "req1" ,
450464 "request_data" : MagicMock (),
451465 "http_request" : MagicMock (),
452466 "result_future" : asyncio .Future (),
453467 "cancelled" : False ,
454- }
468+ "enqueue_time" : 0.0 ,
469+ })
455470
456471 with (
457472 patch (
@@ -493,13 +508,14 @@ async def test_recovery_exhausted_raises_exception(self, real_locks_mock_browser
493508 queue_manager .processing_lock = real_locks_mock_browser .processing_lock
494509 queue_manager .logger = MagicMock ()
495510
496- req_item = {
511+ req_item = cast ( QueueItem , {
497512 "req_id" : "req1" ,
498513 "request_data" : MagicMock (),
499514 "http_request" : MagicMock (),
500515 "result_future" : asyncio .Future (),
501516 "cancelled" : False ,
502- }
517+ "enqueue_time" : 0.0 ,
518+ })
503519
504520 with (
505521 patch (
@@ -969,7 +985,14 @@ async def test_get_next_request_success(self, real_locks_mock_browser):
969985 queue_manager .request_queue = real_locks_mock_browser .request_queue
970986 assert queue_manager .request_queue is not None
971987
972- item = {"req_id" : "req1" , "request_data" : MagicMock ()}
988+ item = cast (QueueItem , {
989+ "req_id" : "req1" ,
990+ "request_data" : MagicMock (),
991+ "http_request" : MagicMock (),
992+ "cancelled" : False ,
993+ "result_future" : asyncio .Future (),
994+ "enqueue_time" : 0.0 ,
995+ })
973996 await queue_manager .request_queue .put (item )
974997
975998 result = await queue_manager .get_next_request ()
0 commit comments