o
    ưi%                     @   s   d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ eG dd dZG d	d
 d
Zde	e defddZdefddZdS )a  
Factory for creating mock HTTP clients for integration testing.

This module provides a simple factory pattern to create mock clients that intercept
API calls and return successful mock responses, allowing full code execution without
making actual network calls.
    N)	timedelta)DictOptionalListcast)	dataclass)verbose_loggerc                   @   s   e Zd ZU dZeed< eed< dZeed< dZeed< dZ	e
e ed	< dZe
ee  ed
< dZeed< dZeed< dZeed< dd ZdS )MockClientConfigz)Configuration for creating a mock client.nameenv_vard   default_latency_ms   default_status_codeNdefault_json_dataurl_matchersTpatch_async_handlerFpatch_sync_clientpatch_http_handlerc                 C   s   | j du r
g | _ dS dS )zEnsure url_matchers is a list.N)r   self r   _/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/mock_client_factory.py__post_init__    s   

zMockClientConfig.__post_init__)__name__
__module____qualname____doc__str__annotations__r   intr   r   r   r   r   r   r   boolr   r   r   r   r   r   r   r	      s   
 r	   c                	   @   s|   e Zd ZdZddedee dee defd	d
Z	e
defddZe
defddZdefddZdefddZdd ZdS )MockResponsez<Generic mock httpx.Response that satisfies API requirements.r   N        status_code	json_dataurlelapsed_secondsc                 C   s   || _ |pddi| _ti | _|dk | _|dk| _d|  ko#dk n  | _|r.t|ntd| _	t
|d| _|rBt| jnd| _| jd| _d S )Nstatussuccess  i,   )secondszutf-8)r$   
_json_datahttpxZHeadersheadersZ
is_successZis_erroris_redirectURLr&   r   elapsedjsondumps_textencode_content)r   r$   r%   r&   r'   r   r   r   __init__)   s   

zMockResponse.__init__returnc                 C      | j S )zReturn response text.)r5   r   r   r   r   text5      zMockResponse.textc                 C   r:   )zReturn response content.r7   r   r   r   r   content:   r<   zMockResponse.contentc                 C   r:   )zReturn JSON response data.)r-   r   r   r   r   r3   ?      zMockResponse.jsonc                 C   r:   )zRead response content.r=   r   r   r   r   readC   r?   zMockResponse.readc                 C   s   | j dkrtd| j  dS )z'Raise exception for error status codes.r*   zHTTP N)r$   	Exceptionr   r   r   r   raise_for_statusG   s   
zMockResponse.raise_for_status)r   NNr#   )r   r   r   r   r    r   r   r   floatr8   propertyr;   bytesr>   r3   r@   rB   r   r   r   r   r"   &   s    $r"   matchersr9   c                 C   s   zDt | trt| n| }t| }|jpd}|D ]}| |v s*| | v r. W dS q|dv rB|D ]}| |v rA W dS q5W dS  tyN   Y dS w )z2Check if URL matches any of the provided matchers.r+   T)	localhostz	127.0.0.1F)
isinstancer   r.   r1   lowerhostrA   )r&   rF   
parsed_urlZurl_strhostnameZmatcherr   r   r   _is_url_matchM   s"   
rM   configc              	      s   ddddddl }	j  d}t||t	jd  dtf	fddd 	fd	d
	 	fddd 	fdd	 	f	dd}dtf	fdd}||fS )z
    Factory function that creates mock client functions based on configuration.
    
    Returns:
        tuple: (create_mock_client_func, should_use_mock_func)
    NFr   Z_MOCK_LATENCY_MSg     @@r9   c                    s   t | ttt  jS )N)rM   r   r   r   r   )r&   rN   r   r   _is_mock_urlv   s   z0create_mock_client_factory.<locals>._is_mock_urlc                    s   t |tr(|r(tdj d|  t I dH  tjj	| dS dur>| |||||||||	|
dI dH S t
d)z?Monkey-patched AsyncHTTPHandler.post that intercepts API calls.[ MOCK] POST to Nr$   r%   r&   r'   )
r&   datar3   paramsr/   timeoutstreamlogging_objfilesr>   z,Original AsyncHTTPHandler.post not available)rH   r   r   infor
   asynciosleepr"   r   r   RuntimeError)r   r&   rT   r3   rU   r/   rV   rW   rX   rY   r>   )_MOCK_LATENCY_SECONDSrP   _original_async_handler_postrN   r   r   _mock_async_handler_post{   s   $z<create_mock_client_factory.<locals>._mock_async_handler_postc                    sT   |rt dj d| d tjj| dS dur(| |fi |S dS )z;Monkey-patched httpx.Client.post that intercepts API calls.rQ   rR   z (sync)rS   N)r   rZ   r
   r"   r   r   )r   r&   kwargs)r^   rP   _original_sync_client_postrN   r   r   _mock_sync_client_post   s   z:create_mock_client_factory.<locals>._mock_sync_client_postc                    s~   t |tr(|r(tdj d|  ddl}|  tjj	| dS dur;| |||||||||	|
dS t
d)z:Monkey-patched HTTPHandler.post that intercepts API calls.rQ   rR   r   NrS   )
r&   rT   r3   rU   r/   rV   rW   rY   r>   rX   z'Original HTTPHandler.post not available)rH   r   r   rZ   r
   timer\   r"   r   r   r]   )r   r&   rT   r3   rU   r/   rV   rW   rY   r>   rX   rd   )r^   rP   _original_http_handler_postrN   r   r   _mock_http_handler_post   s   
z;create_mock_client_factory.<locals>._mock_http_handler_postc                     s  rdS t dj dj d jr/du r/ddlm}  | j| _t dj d jrHdu rHtj	jtj	_t dj d j
redu redd	lm} |j|_t dj d
 t dj d d dd t dj dj d ddS )z5Initialize the mock client by patching HTTP handlers.NrQ   z MOCK] Initializing z mock client...r   )AsyncHTTPHandlerz$ MOCK] Patched AsyncHTTPHandler.postz  MOCK] Patched httpx.Client.post)HTTPHandlerz MOCK] Patched HTTPHandler.postz MOCK] Mock latency set to i  z.0fmsz MOCK] z$ mock client initialization completeT)r   debugr
   r   Z&litellm.llms.custom_httpx.http_handlerrg   postr   r.   ZClientr   rh   )rg   rh   )	r^   r`   rf   rc   _mocks_initializedr_   re   rb   rN   r   r   create_mock_client   s(    z6create_mock_client_factory.<locals>.create_mock_clientc                     sX   ddl } ddlm} |  jd}||}|durt|nd}|r*t j d |S )z)Determine if mock mode should be enabled.r   N)str_to_boolfalseFz. Mock Mode: ENABLED - API calls will be mocked)	osZlitellm.secret_managers.mainrn   getenvr   r!   r   rZ   r
   )rp   rn   Z	mock_moderesultrO   r   r   should_use_mock   s   z3create_mock_client_factory.<locals>.should_use_mock)	NNNNNFNNN)rp   r
   upperrC   rq   r   r   r!   )rN   rp   Zlatency_envrm   rs   r   )
r^   rP   r`   rf   rc   rl   r_   re   rb   rN   r   create_mock_client_factoryc   s    ru   )r   r.   r3   r[   datetimer   typingr   r   r   r   dataclassesr   Zlitellm._loggingr   r	   r"   r   r!   rM   ru   r   r   r   r   <module>   s    '