
    Ki0                        d Z ddlmZ ddlmZ ddlmZ ddlmZ dede	edef   z  d	e
edf   d
z  dee	ef   d
z  de	d
z  defdZde	edef   z  d	e
edf   d
z  dee	ef   d
z  de	d
z  de	f
dZd
d
d
ddede	edef   z  d	e
edf   d
z  dee	ef   d
z  de	d
z  dd
fdZd
d
d
ddede	edef   z  d	e
edf   d
z  dee	ef   d
z  de	d
z  dd
fdZ	 ddede	edef   z  d
z  dedd
fdZdedd
fdZy
)a  Testing utilities for making assertions about scheduled tasks.

Example usage:
    from docket import Docket, testing

    docket = Docket("redis://localhost:6379/0")

    # Schedule a task
    await docket.add(my_task)("arg1", kwarg1="value1")

    # Assert it's scheduled
    await testing.assert_task_scheduled(docket, my_task, args=("arg1",))

    # After completion
    await worker.run_until_finished()
    await testing.assert_no_tasks(docket)
    )Callable)Any)Docket)	Execution	executionfunction.argsNkwargskeyreturnc                     t        |t              r|n|j                  }| j                  |k7  ry|| j                  |k7  ry|| j
                  |k7  ry|:|j                         D ]'  \  }}|| j                  vs| j                  |   |k7  s' y y)z1Check if an execution matches the given criteria.FT)
isinstancestr__name__function_namer   r	   itemsr
   )r   r   r	   r
   r   r   kvs           Z/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/docket/testing.py_matches_criteriar      s     !+8S 9Hx?P?PM-/ 9==C/ INNd2 LLN 	DAq	(((I,<,<Q,?1,D	     c                    g }t        | t              r| n| j                  }|j                  d|        ||j                  d|       ||j                  d|       ||j                  d|       dj	                  |      S )z#Format criteria for error messages.z	function=zkey=zargs=zkwargs=z, )r   r   r   appendjoin)r   r	   r
   r   partsr   s         r   _format_criteriar   8   s     E *8S 9Hx?P?PM	LL9]O,-
tC7^$uTH%&wvj)*99Ur   )r	   r
   r   docketc                  K   | j                          d{   }t        |j                        }|D ]  }t        |||||      s y t	        ||||      }t        |t              r|n|j                  }	|st        d|	 d      |D 
cg c]9  }
d|
j                   d|
j                  d|
j                  d|
j                  d	; }}
d	j                  |      }t        d|	 d
| d|       7 c c}
w w)au  Assert that a task matching the criteria is scheduled.

    Args:
        docket: The Docket instance to check
        function: The task function or function name (string)
        args: Optional tuple of positional arguments to match
        kwargs: Optional dict of keyword arguments to match (subset matching)
        key: Optional task key to match

    Raises:
        AssertionError: If no matching task is found

    Example:
        await assert_task_scheduled(docket, my_task)
        await assert_task_scheduled(docket, my_task, args=("foo",))
        await assert_task_scheduled(docket, "my_task", key="task-123")
    NTask z( not found: no tasks scheduled on docket  - (args=	, kwargs=, key=)
z not found with z

Scheduled tasks:
)snapshotlistfuturer   r   r   r   r   AssertionErrorr   r	   r
   r   r   )r   r   r	   r
   r   r&   	all_tasksr   criteriar   efound_tasks	found_strs                r   assert_task_scheduledr/   N   s    2 __&&H X__%I 	Y$D
  $<H *8S 9Hx?P?PMM?"JK
 	
  qvaffZyF155)STUK  		+&I

.xj 9&K	) 3 '&s(   C5C.-C5AC5	>C0(C50C5c                X  K   | j                          d{   }t        |j                        }|D ]r  }t        |||||      st	        |t
              r|n|j                  }t        d| d|j                   d|j                  d|j                  d|j                  d       y7 w)a6  Assert that no task matching the criteria is scheduled.

    Args:
        docket: The Docket instance to check
        function: The task function or function name (string)
        args: Optional tuple of positional arguments to match
        kwargs: Optional dict of keyword arguments to match (subset matching)
        key: Optional task key to match

    Raises:
        AssertionError: If a matching task is found

    Example:
        await assert_task_not_scheduled(docket, my_task)
        await assert_task_not_scheduled(docket, my_task, args=("foo",))
    Nr   z* found but should not be scheduled
Found: r!   r"   r#   r$   )r&   r'   r(   r   r   r   r   r)   r   r	   r
   r   )	r   r   r	   r
   r   r&   r*   r   r   s	            r   assert_task_not_scheduledr1      s     0 __&&H X__%I 	Y$D(28S(AHxGXGXM  '#112&8J K#**-VIMM3DAG  's   B*B(-B*A$B*countc                ,  K   | j                          d{   }t        |j                        }|t        |      }d}n7t	        |t
              r|n|j                  t        fd|D              }d }||k7  rt        d| d| d|       y7 zw)a  Assert the number of scheduled tasks matches the expected count.

    Args:
        docket: The Docket instance to check
        function: Optional task function or name to count (if None, counts all tasks)
        count: Expected number of tasks

    Raises:
        AssertionError: If the count doesn't match

    Example:
        await assert_task_count(docket, count=5)  # All tasks
        await assert_task_count(docket, my_task, count=2)  # Specific function
    Nz	all tasksc              3   B   K   | ]  }|j                   k(  sd   yw)   N)r   ).0r,   r   s     r   	<genexpr>z$assert_task_count.<locals>.<genexpr>   s     T1??m3S1Ts   z
tasks for z	Expected  z, found )	r&   r'   r(   lenr   r   r   sumr)   )r   r   r2   r&   r*   actual_countfunction_descr   s          @r   assert_task_countr=      s     ( __&&H X__%I9~#$.x$=8CTCTTiTT$]O4uyqx~VWW  's   BBA;Bc                 V  K   | j                          d{   }t        |j                        }|ro|D cg c]9  }d|j                   d|j                  d|j
                  d|j                  d	; }}dj                  |      }t        dt        |       d	|       y7 c c}w w)
zAssert that no tasks are scheduled on the docket.

    Args:
        docket: The Docket instance to check

    Raises:
        AssertionError: If any tasks are scheduled

    Example:
        await assert_no_tasks(docket)
    Nr    r!   r"   r#   r$   r%   zExpected no tasks, found z task(s) scheduled:
)
r&   r'   r(   r   r	   r
   r   r   r)   r9   )r   r&   r*   r,   r-   r.   s         r   assert_no_tasksr?      s      __&&H X__%I 
 1??#6!&&9QXXLquuiWXY
 
 IIk*	'I'77LYKX
 	
  '
s    B)B"B)>B$4/B)$B))N)__doc__collections.abcr   typingr   docket.docketr   docket.executionr   r   tupledictboolr   r   r/   r1   intr=   r?    r   r   <module>rJ      s$  $ %    &HS#X&& S/D
  cNT!	
 
t 
<HS#X&&
S/D
  cNT! 
t	
 	4 $($(55HS#X&&5 S/D
 	5
 cNT!5 
t5 
5x $($($$HS#X&&$ S/D
 	$
 cNT!$ 
t$ 
$R 15"X"XHS#X&&-"X 	"X
 
"XJ
& 
T 
r   