
    KTic                         d Z ddlZddlmc mZ ddlmZ ddlm	Z	m
Z
mZmZmZ  G d d          Z G d d          Z G d	 d
          ZddlZddlmZ  G d d          Z G d d          ZdS )zTests for Pydantic data models.    N)datetime)AgentConfigMeetingResultMeetingState
PMDecisionScratchpadEntryc                   *    e Zd ZdZddZddZddZdS )TestAgentConfigzTests for AgentConfig model.returnNc                    t          ddd          }|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    dx}x}}|j
        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    dx}x}}|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    dx}x}}|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    dx}x}}|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    dx}x}}dS )z/AgentConfig requires name, role, system_prompt.
test_agentTesterzYou are a tester.namerolesystem_prompt==)z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)sconfigpy0py2py5assert %(py7)spy7N)z,%(py2)s
{%(py2)s = %(py0)s.role
} == %(py5)s)z5%(py2)s
{%(py2)s = %(py0)s.system_prompt
} == %(py5)s z4%(py2)s
{%(py2)s = %(py0)s.input_schema
} == %(py5)sz5%(py2)s
{%(py2)s = %(py0)s.output_schema
} == %(py5)s)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   input_schemaoutput_schemaselfr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s          8/root/projects/multi-agents-meeting/tests/test_models.py test_create_minimal_agent_configz0TestAgentConfig.test_create_minimal_agent_config   s   -
 
 

 {*l*{l**********{l************v*****v******{****l***************************{&h&{h&&&&&&&&&&{h&&&&&&&&&&&&v&&&&&v&&&&&&{&&&&h&&&&&&&&&&&&&&&&&&&&&&&&&&&#:'::#':::::::::::#':::::::::::::v:::::v::::::#::::'::::::::::::::::::::::::::::"(b("b(((((((((("b((((((((((((v(((((v(((((("((((b(((((((((((((((((((((((((((#)r)#r))))))))))#r))))))))))))v)))))v))))))#))))r)))))))))))))))))))))))))))))    c                 2   t          ddddd          }|j        }d}||k    }|st          j        d|fd||f          d	t	          j                    v st          j        |          rt          j        |          nd	t          j        |          t          j        |          d
z  }dd|iz  }t          t          j	        |                    dx}x}}|j
        }d}||k    }|st          j        d|fd||f          d	t	          j                    v st          j        |          rt          j        |          nd	t          j        |          t          j        |          d
z  }dd|iz  }t          t          j	        |                    dx}x}}dS )z&AgentConfig with all fields populated.
full_agentz	Full RolezFull prompt.zexpects a question stringzreturns analysis string)r   r   r   r'   r(   r   r   r   r   r   r   Nr   )r   r'   r   r    r!   r"   r#   r$   r%   r&   r(   r)   s          r0   test_create_full_agent_configz-TestAgentConfig.test_create_full_agent_config   s   (43
 
 
 "A&AA"&AAAAAAAAAAA"&AAAAAAAAAAAAAvAAAAAvAAAAAA"AAAA&AAAAAAAAAAAAAAAAAAAAAAAAAAAA#@'@@#'@@@@@@@@@@@#'@@@@@@@@@@@@@v@@@@@v@@@@@@#@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r2   c                    t          ddd          }|                                }t          di |}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          nddt	          j                    v st          j        |          rt          j        |          ndd	z  }d
d|iz  }t          t          j	        |                    d}dS )z%AgentConfig round-trips through JSON.testRolezPrompt.r   r   )z%(py0)s == %(py2)srestoredr   )r   r   zassert %(py4)spy4N )
r   
model_dumpr   r    r!   r"   r#   r$   r%   r&   )r*   r   datar9   r+   @py_format3@py_format5s          r0   test_agent_config_serializationz/TestAgentConfig.test_agent_config_serialization$   s.   #
 
 

   ""&&&&6!!!!!!!!!!x6!!!!!!!!!!!!x!!!!!x!!!!!!!!!!!!!6!!!!!6!!!!!!!!!!!!!!!!!!!!!!!!!!!r2   r   N)__name__
__module____qualname____doc__r1   r5   r@   r;   r2   r0   r
   r
      sZ        &&* * * *
A 
A 
A 
A	" 	" 	" 	" 	" 	"r2   r
   c                       e Zd ZdZddZdS )TestScratchpadEntryz Tests for ScratchpadEntry model.r   Nc                 &   t          dddddd          }t          dd|          }|j        }d}||k    }|st          j        d	|fd
||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    dx}x}}|j        }d}||k    }|st          j        d	|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    dx}x}}|j        }||k    }|st          j        d	|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }	t          t          j
        |	                    dx}}dS )z6ScratchpadEntry stores agent name, content, timestamp.        
   r   	architectzWe should use microservices.
agent_namecontent	timestampr   )z2%(py2)s
{%(py2)s = %(py0)s.agent_name
} == %(py5)sentryr   r   r   N)z/%(py2)s
{%(py2)s = %(py0)s.content
} == %(py5)s)z1%(py2)s
{%(py2)s = %(py0)s.timestamp
} == %(py4)snowr   r   r:   assert %(py6)spy6)r   r   rO   r   r    r!   r"   r#   r$   r%   r&   rP   rQ   )
r*   rS   rR   r+   r,   r-   r.   r/   r?   @py_format7s
             r0   test_create_scratchpad_entryz0TestScratchpadEntry.test_create_scratchpad_entry3   s   tQB1--"2
 
 

 .;.;..........;............u.....u..........;...........................}> >>} >>>>>>>>>>>} >>>>>>>>>>>>>u>>>>>u>>>>>>}>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>%#%%%%%%%%%%#%%%%%%%%%%%%u%%%%%u%%%%%%%%%%%%%%%%%#%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%r2   rA   )rB   rC   rD   rE   rX   r;   r2   r0   rG   rG   0   s.        **
& 
& 
& 
& 
& 
&r2   rG   c                   2    e Zd ZdZddZddZddZddZdS )	TestMeetingStatezTests for MeetingState model.r   Nc                 .   t          d          }|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d	x}x}}|j
        }g }||k    }|st          j        d|fd
||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d	x}x}}|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d	x}x}}|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d	x}x}}d	S )z<MeetingState with defaults has empty scratchpad and round 0.
Test topictopicr   z-%(py2)s
{%(py2)s = %(py0)s.topic
} == %(py5)sstater   r   r   N)z2%(py2)s
{%(py2)s = %(py0)s.scratchpad
} == %(py5)sr   )z5%(py2)s
{%(py2)s = %(py0)s.current_round
} == %(py5)srL   )z2%(py2)s
{%(py2)s = %(py0)s.max_rounds
} == %(py5)s)r   r^   r   r    r!   r"   r#   r$   r%   r&   
scratchpadcurrent_round
max_roundsr*   r`   r+   r,   r-   r.   r/   s          r0   !test_create_default_meeting_statez2TestMeetingState.test_create_default_meeting_stateC   s   <000{*l*{l**********{l************u*****u******{****l***************************%2%2%%%%%%%%%%2%%%%%%%%%%%%u%%%%%u%%%%%%%%%%2%%%%%%%%%%%%%%%%%%%%%%%%%%%"'a'"a''''''''''"a''''''''''''u'''''u''''''"''''a'''''''''''''''''''''''''''%2%2%%%%%%%%%%2%%%%%%%%%%%%u%%%%%u%%%%%%%%%%2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%r2   c                    t          dd          }|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd	|iz  }t          t          j	        |                    d
x}x}}d
S )z%MeetingState accepts a context field.TopiczBackground info)r^   contextr   z/%(py2)s
{%(py2)s = %(py0)s.context
} == %(py5)sr`   r   r   r   N
r   rh   r   r    r!   r"   r#   r$   r%   r&   rd   s          r0   "test_meeting_state_accepts_contextz3TestMeetingState.test_meeting_state_accepts_contextK   s    74EFFF}1 11} 11111111111} 1111111111111u11111u111111}1111 111111111111111111111111111111r2   c                    t          d          }|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd	|iz  }t          t          j	        |                    d
x}x}}d
S )z.MeetingState context defaults to empty string.rg   r]   r   r   ri   r`   r   r   r   Nrj   rd   s          r0   )test_meeting_state_context_defaults_emptyz:TestMeetingState.test_meeting_state_context_defaults_emptyP   s    7+++}""}""""""""""}""""""""""""u"""""u""""""}"""""""""""""""""""""""""""""""""r2   c                    t          ddt          dddddd                    }t          d	|g
          }|j        }t	          |          }d}||k    }|st          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    nddt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    dx}x}x}}|j        d         }	|	j        }d}
||
k    }|st          j        d|fd||
f          t          j
        |	          t          j
        |          t          j
        |
          dz  }dd|iz  }t          t          j        |                    dx}	x}x}}
dS )z)MeetingState can hold scratchpad entries.r7   HellorI   rJ   rK   rL   r   rN   rg   )r^   ra      r   )zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.scratchpad
})
} == %(py8)slenr`   r   py1py3r   py8assert %(py10)spy10N)z2%(py3)s
{%(py3)s = %(py1)s.agent_name
} == %(py6)s)rs   rt   rV   zassert %(py8)sru   )r   r   r   ra   rq   r   r    r!   r"   r#   r$   r%   r&   rO   )r*   rR   r`   @py_assert2r,   @py_assert7@py_assert6@py_format9@py_format11@py_assert0@py_assert5rW   s               r0   test_meeting_state_with_entriesz0TestMeetingState.test_meeting_state_with_entriesU   sU   tQB155
 
 

 7w???#)s#$$))$))))))))))$))))))))))))s)))))s)))))))))))))5)))))5))))))#))))$)))))))))))))))))))))))))))))))))"7"-77-7777777777-77777"7777-77777777777777777777777777777777777r2   rA   )rB   rC   rD   rE   re   rk   rm   r   r;   r2   r0   rZ   rZ   @   sj        ''& & & &2 2 2 2
# # # #
	8 	8 	8 	8 	8 	8r2   rZ   )ValidationErrorc                   B    e Zd ZdZd
dZd
dZd
dZd
dZd
dZd
d	Z	dS )TestPMDecisionz7Tests for PMDecision model with conditional validation.r   Nc                 0   t          dddd          }|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          d	z  }d
d|iz  }t          t          j	        |                    dx}x}}|j
        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          d	z  }d
d|iz  }t          t          j	        |                    dx}x}}dS )z6CALL_AGENT requires target_agent and prompt_for_agent.zNeed architect input.
CALL_AGENTrM   zWhat about scalability?)analysisnext_actiontarget_agentprompt_for_agentr   z3%(py2)s
{%(py2)s = %(py0)s.next_action
} == %(py5)sdecisionr   r   r   N)z4%(py2)s
{%(py2)s = %(py0)s.target_agent
} == %(py5)s)r   r   r   r    r!   r"   r#   r$   r%   r&   r   r*   r   r+   r,   r-   r.   r/   s          r0   test_call_agent_decisionz'TestPMDecision.test_call_agent_decisionh   s   ,$$6	
 
 
 #3|3#|3333333333#|333333333333x33333x333333#3333|333333333333333333333333333$33$3333333333$333333333333x33333x333333$333333333333333333333333333333333r2   c                 *   t          ddd          }|j        }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    dx}x}}|j
        }d}||u}|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    dx}x}}dS )zFINISH requires final_report.zAll topics covered.FINISHz# Meeting Report

Done.)r   r   final_reportr   r   r   r   r   r   N)is not)z8%(py2)s
{%(py2)s = %(py0)s.final_report
} is not %(py5)s)r   r   r   r    r!   r"   r#   r$   r%   r&   r   r   s          r0   test_finish_decisionz#TestPMDecision.test_finish_decisions   s   * 4
 
 

 #/x/#x//////////#x////////////x/////x//////#////x///////////////////////////$0D0$D0000000000$D000000000000x00000x000000$0000D00000000000000000000000000000r2   c                     t          j        t          d          5  t          ddd           ddd           dS # 1 swxY w Y   dS )z7CALL_AGENT without target_agent raises ValidationError.r   matchNeed input.r   z	Question?)r   r   r   Npytestraisesr   r   r*   s    r0   %test_call_agent_missing_target_raisesz4TestPMDecision.test_call_agent_missing_target_raises}   s    ]?.AAA 	 	&(!,   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   <A A c                     t          j        t          d          5  t          ddd           ddd           dS # 1 swxY w Y   dS )z;CALL_AGENT without prompt_for_agent raises ValidationError.r   r   r   r   rM   )r   r   r   Nr   r   s    r0   %test_call_agent_missing_prompt_raisesz4TestPMDecision.test_call_agent_missing_prompt_raises   s    ]?2DEEE 	 	&((   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r   c                     t          j        t          d          5  t          dd           ddd           dS # 1 swxY w Y   dS )z3FINISH without final_report raises ValidationError.r   r   zDone.r   r   r   Nr   r   s    r0   !test_finish_missing_report_raisesz0TestPMDecision.test_finish_missing_report_raises   s    ]?.AAA 	 	 $   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   ;??c                     t          j        t                    5  t          dd           ddd           dS # 1 swxY w Y   dS )z1Invalid next_action value raises ValidationError.zHmm.INVALIDr   Nr   r   s    r0   test_invalid_next_action_raisesz.TestPMDecision.test_invalid_next_action_raises   s    ]?++ 	 	%   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   9= =rA   )
rB   rC   rD   rE   r   r   r   r   r   r   r;   r2   r0   r   r   e   s        AA	4 	4 	4 	41 1 1 1              r2   r   c                   "    e Zd ZdZddZddZdS )TestMeetingResultzTests for MeetingResult model.r   Nc           	         t          dddddd          }t          dd|          }t          d	d
ddg|gd||          }|j        }d	}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    dx}x}}|j        }d
}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    dx}x}}|j        }ddg}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    dx}x}}|j        }	t          |	          }d}
||
k    }|st	          j        d|fd||
f          dt          j                    v st	          j        t                    rt	          j	        t                    nddt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |	          t	          j	        |          t	          j	        |
          dz  }dd|iz  }t          t	          j        |                    dx}	x}x}}
|j        }d}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    dx}x}}|j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          dt          j                    v st	          j        |          rt	          j	        |          ndd z  }d!d"|iz  }t          t	          j        |                    dx}}|j        }||k    }|st	          j        d|fd#||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          dt          j                    v st	          j        |          rt	          j	        |          ndd z  }d!d"|iz  }t          t	          j        |                    dx}}dS )$z;MeetingResult stores all meeting data including transcript.rI   rJ   rK   rL   r   archro   rN   r\   zSome backgrounddevops# Report)r^   rh   participants
transcriptr   
started_atfinished_atr   r_   resultr   r   r   Nri   z4%(py2)s
{%(py2)s = %(py0)s.participants
} == %(py5)srp   )zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.transcript
})
} == %(py8)srq   rr   rv   rw   )z4%(py2)s
{%(py2)s = %(py0)s.final_report
} == %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.started_at
} == %(py4)srS   rT   rU   rV   )z3%(py2)s
{%(py2)s = %(py0)s.finished_at
} == %(py4)s)r   r   r   r^   r   r    r!   r"   r#   r$   r%   r&   rh   r   r   rq   r   r   r   )r*   rS   rR   r   r+   r,   r-   r.   r/   rx   ry   rz   r{   r|   r?   rW   s                   r0   $test_meeting_result_model_validationz6TestMeetingResult.test_meeting_result_model_validation   s/   tQB1--67cRRR% (+w#
 
 
 |+|+||++++++++++||++++++++++++v+++++v++++++|++++|+++++++++++++++++++++++++++~2!22~!22222222222~!2222222222222v22222v222222~2222!2222222222222222222222222222"8vx&88"&88888888888"&8888888888888v88888v888888"8888&8888888888888888888888888888$*s$%%**%**********%************s*****s*************6*****6******$****%*********************************"0j0"j0000000000"j000000000000v00000v000000"0000j000000000000000000000000000 ' C'''''''''' C''''''''''''v'''''v'''''' '''''''''''C'''''C'''''''''''''''''''''''''''!(!S((((((((((!S((((((((((((v(((((v((((((!(((((((((((S(((((S(((((((((((((((((((((((((((((r2   c                    t          dddddd          }t          dd||          }|j        }d	}||k    }|st          j        d
|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    dx}x}}|j        }g }||k    }|st          j        d
|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    dx}x}}|j        }g }||k    }|st          j        d
|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    dx}x}}dS )z8MeetingResult has sensible defaults for optional fields.rI   rJ   rK   rL   r   Testr   )r^   r   r   r   r   r   ri   r   r   r   r   Nr   )z2%(py2)s
{%(py2)s = %(py0)s.transcript
} == %(py5)s)r   r   rh   r   r    r!   r"   r#   r$   r%   r&   r   r   )r*   rS   r   r+   r,   r-   r.   r/   s           r0   test_meeting_result_defaultsz.TestMeetingResult.test_meeting_result_defaults   s   tQB1--#	
 
 
 ~##~##########~############v#####v######~###############################"(b("b(((((((((("b((((((((((((v(((((v(((((("((((b((((((((((((((((((((((((((( &B& B&&&&&&&&&& B&&&&&&&&&&&&v&&&&&v&&&&&& &&&&B&&&&&&&&&&&&&&&&&&&&&&&&&&&&&r2   rA   )rB   rC   rD   rE   r   r   r;   r2   r0   r   r      sB        (() ) ) )*' ' ' ' ' 'r2   r   )rE   builtinsr!   _pytest.assertion.rewrite	assertionrewriter   r   
src.modelsr   r   r   r   r   r
   rG   rZ   r   pydanticr   r   r   r;   r2   r0   <module>r      sT   % %                     \ \ \ \ \ \ \ \ \ \ \ \ \ \%" %" %" %" %" %" %" %"P& & & & & & & & 8 8 8 8 8 8 8 8B  $ $ $ $ $ $8 8 8 8 8 8 8 8v#' #' #' #' #' #' #' #' #' #'r2   