
    Ji                         d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZmZmZ e G d d             Z G d d	      Zy
)    )Counter)	dataclass)AnyOptional)ContextWorkflow)Event	EventType
StartEventc                   J    e Zd ZU dZee   ed<   eee	f   ed<   e
ed<   eed<   y)WorkflowTestResulta:  
    Container for workflow test results

    Attributes:
        collected (list[Event]): List of collected events
        event_type (dict[EventType, int]): Dictionary that maps each event type with its number of occurencies within the collected events
        result (Any): Final output of the workflow run
    	collectedevent_typesresultctxN)__name__
__module____qualname____doc__listr	   __annotations__dictr
   intr   r        j/var/www/html/BankruptcyAI-uat/bankruptcy-ai/venv/lib/python3.12/site-packages/workflows/testing/runner.pyr   r   	   s,     E{in%%K	Lr   r   c                   ^    e Zd ZdZ	 	 ddZ e       dddfdeded   ded	eee	      d
e
f
dZy)WorkflowTestRunnerz
    Utility class that can be used to test workflows end-to-end.

    Attributes:
        _workflow (Workflow): The workflow to be tested
    c                     || _         y )N)	_workflow)selfworkflows     r   __init__zWorkflowTestRunner.__init__"   s     "r   NTstart_eventr   r   expose_internalexclude_eventsreturnc           
        K   | j                   j                  ||      }g }|j                  |      2 3 d{   }|rt        |      |v r|j	                  |       +7 &6 | d{  7  }t        t        |D 	cg c]  }	t        |	       nc c}	w c}	            }
|j                  J t        |||
|j                        S w)a  
        Run a workflow end-to-end and collect the events that are streamed during its execution.

        Args:
            start_event (StartEvent): The input event for the workflow
            expose_internal (bool): Whether or not to expose internal events. Defaults to True if not set.
            exclude_events. (list[EventType]): A list of event types to exclude from the collected events. Defaults to None if not set.

        Returns:
            WorkflowTestResult

        Example:
            ```
            wf = GreetingWorkflow()
            runner = WorkflowTestRunner(wf)
            test_result = runner.run(start_even=StartEvent(message="hello"), expose_internal = True, exclude_events = [StepStateChanged])
            assert test_result.collected == 22
            assert test_result.event_types.get(StepStateChanged, 0) == 8
            assert str(test_result.result) == "hello Adam!"
            ```
        )r$   r   )r%   N)r   r   r   r   )	r    runstream_eventstypeappendr   r   r   r   )r!   r$   r   r%   r&   handlercollected_eventseventr   evevent_freqss              r   r)   zWorkflowTestRunner.run(   s     8 ..$$#$F(*"000Q 	+ 	+%$u+"?##E*	+Q ,0(89"T"X99:-
 {{&&&!&#	
 	
s=   2CA!AA!#CA!!C'A*(C;B8C)r"   r   )r   r   r   r   r#   r   r   boolr   r
   r   r)   r   r   r   r   r      sg    "" #-,#' $48,
,
 i ,
 	,

 !i1,
 
,
r   r   N)collectionsr   dataclassesr   typingr   r   	workflowsr   r   workflows.eventsr	   r
   r   r   r   r   r   r   <module>r8      s:     !   ' 9 9    :
 :
r   