
    i                        d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZmZ ddlZddlmZmZmZ  G d d          Z G d d	          Z G d
 d          ZdS )z'Tests for LLM client abstraction layer.    )annotationsN)	MagicMockpatch)AnthropicClientOpenAIClientcreate_clientc                  *   e Zd ZdZ ej        ej        ddd          dd            Z ej        ej        ddd	          dd
            Z	 ej        ej        ddid          dd            Z
 ej        ej        i d          dd            ZdS )TestCreateClientz-Tests for the create_client factory function.	anthropicztest-key)LLM_PROVIDERANTHROPIC_API_KEYreturnNonec                f   t                      }t          |t                    }|sd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dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          dz  }t          t          j	        |                    d}dS )z)Default provider creates AnthropicClient.5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceclientr   py0py1py2py4N)
r   r   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationselfr   @py_assert3@py_format5s       </root/projects/multi-agents-meeting/tests/test_llm_client.pytest_create_anthropic_clientz-TestCreateClient.test_create_anthropic_client   s    &/222222222222222z22222z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222222222222222222222222    openai)r   OPENAI_API_KEYc                f   t                      }t          |t                    }|sd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dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          dz  }t          t          j	        |                    d}dS )z'Provider 'openai' creates OpenAIClient.r   r   r   r   r   N)
r   r   r   r   r   r   r   r   r   r   r    s       r$   test_create_openai_clientz*TestCreateClient.test_create_openai_client   s    &,///////////////z/////z/////////////&/////&/////////////,/////,//////////////////////////r&   r   invalidF)clearc                    t          j        t          d          5  t                       ddd           dS # 1 swxY w Y   dS )z#Unknown provider raises ValueError.zUnknown LLM provider)matchN)pytestraises
ValueErrorr   )r!   s    r$   test_invalid_provider_raisesz-TestCreateClient.test_invalid_provider_raises   s     ]:-CDDD 	 	OOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   8<<Tc                   t          d          5 }t                      |j        _        t	                      }t          |t                    }|sd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dt          j                    v st          j
        t                    rt          j        t                    ndt          j        |          dz  }t          t          j        |                    d}ddd           dS # 1 swxY w Y   dS )z.No LLM_PROVIDER env var defaults to anthropic.zsrc.llm_client.anthropicr   r   r   r   r   N)r   r   	Anthropicreturn_valuer   r   r   r   r   r   r   r   r   r   )r!   mock_anthropicr   r"   r#   s        r$   "test_default_provider_is_anthropicz3TestCreateClient.test_default_provider_is_anthropic"   s    -.. 	7.4=KKN$1"__Ffo666666666666666:66666:6666666666666f66666f6666666666666o66666o666666666666666666666666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   E	E&&E*-E*Nr   r   )__name__
__module____qualname____doc__r   dictosenvironr%   r*   r2   r7    r&   r$   r
   r
      s        77UZ
[zZZ[[3 3 3 \[3
 UZ
XTTUU0 0 0 VU0
 UZ
^Y7uEEE   FE
 UZ
Bd+++7 7 7 ,+7 7 7r&   r
   c                      e Zd ZdZddZdS )TestAnthropicClientz&Tests for AnthropicClient.chat method.r   r   c                |   t                      }t                      }t          d          g|_        ||j        j        _        t          |d          }|                    ddddg	          }d}||k    }|st          j        d
|fd||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j        |                    dx}}|j        j                            ddddddg           dS )z6AnthropicClient.chat sends system and messages to API.zHello from Claude)textzclaude-sonnet-4-20250514r   modelYou are helpful.userHirolecontentsystemmessages==z%(py0)s == %(py3)sresultr   py3assert %(py5)spy5Ni   )rF   
max_tokensrN   rO   )r   rL   rO   creater5   r   chatr   _call_reprcomparer   r   r   r   r   r   assert_called_once_with)	r!   mock_sdkmock_responser   rS   @py_assert2@py_assert1@py_format4@py_format6s	            r$   test_chat_calls_api_correctlyz1TestAnthropicClient.test_chat_calls_api_correctly.   s   ;;!!*0C!D!D!D E0= - 8RSSS%%$778  
 

 -,v,,,,,,,,,,,v,,,,,,,,,,,,,v,,,,,v,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 88,%%$778	 	9 	
 	
 	
 	
 	
r&   Nr8   r9   r:   r;   r<   rc   r@   r&   r$   rB   rB   +   s.        00
 
 
 
 
 
r&   rB   c                      e Zd ZdZddZdS )TestOpenAIClientz#Tests for OpenAIClient.chat method.r   r   c                   t                      }t                      }d|j        _        t          |g          |j        j        j        _        t          |d          }|                    ddddg	          }d}||k    }|st          j	        d
|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j        |                    dx}}|j        j        j                            dddddddg           dS )z3OpenAIClient.chat sends system and messages to API.zHello from GPT)choiceszgpt-4orE   rG   rH   rI   rJ   rM   rP   rR   rS   rT   rV   rW   NrN   )rF   rO   )r   messagerL   rZ   completionsrY   r5   r   r   r[   r   r   r   r   r   r   r\   )	r!   r]   mock_choicer   rS   r_   r`   ra   rb   s	            r$   rc   z.TestOpenAIClient.test_chat_calls_api_correctlyG   s   ;;kk&6#8A;-8X8X8X!(5XX>>>%%$778  
 

 *)v)))))))))))v)))))))))))))v)))))v))))))))))))))))))))))))))))))))!(@@!.@AAD11 	A 	
 	
 	
 	
 	
r&   Nr8   rd   r@   r&   r$   rf   rf   D   s.        --
 
 
 
 
 
r&   rf   )r<   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r>   unittest.mockr   r   r/   src.llm_clientr   r   r   r
   rB   rf   r@   r&   r$   <module>rs      s   - - " " " " " "              				 * * * * * * * *  G G G G G G G G G G7 7 7 7 7 7 7 7<
 
 
 
 
 
 
 
2
 
 
 
 
 
 
 
 
 
r&   