
    im'                         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             Z G d	 d
      Zde	e   defdZdefdZy)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                       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 Zy)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                 ,    | j                   g | _         yy)zEnsure url_matchers is a list.N)r   selfs    y/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/integrations/mock_client_factory.py__post_init__zMockClientConfig.__post_init__%   s    $ "D %    )__name__
__module____qualname____doc__str__annotations__r   intr   r   r   r   r   r   r   boolr   r   r    r   r   r   r      s}    3
IL!!""(,x~, 	 (S	  !%$#t#  #r   r   c            	           e Zd ZdZ	 	 	 	 ddedee   dee   defdZ	e
defd	       Ze
defd
       ZdefdZdefdZd Zy)MockResponsez<Generic mock httpx.Response that satisfies API requirements.Nstatus_code	json_dataurlelapsed_secondsc                    || _         |xs ddi| _        t        j                  i       | _        |dk  | _        |dk\  | _        d|cxk  xr dk  nc | _        |rt        j                  |      nt        j                  d      | _	        t        |      | _        |rt        j                  | j                        nd| _        | j                  j                  d      | _        y )Nstatussuccess  i,   )secondszutf-8)r(   
_json_datahttpxHeadersheaders
is_successis_erroris_redirectURLr*   r   elapsedjsondumps_textencode_content)r   r(   r)   r*   r+   s        r   __init__zMockResponse.__init__.   s     '#<)'<}}R(%+#s*+33%(599S>eiim 94=TZZ02


))'2r   returnc                     | j                   S )zReturn response text.)r=   r   s    r   textzMockResponse.text@   s     zzr   c                     | j                   S )zReturn response content.r?   r   s    r   contentzMockResponse.contentE   s     }}r   c                     | j                   S )zReturn JSON response data.)r2   r   s    r   r;   zMockResponse.jsonJ   s    r   c                     | j                   S )zRead response content.rE   r   s    r   readzMockResponse.readN   s    }}r   c                 R    | j                   dk\  rt        d| j                          y)z'Raise exception for error status codes.r/   zHTTP N)r(   	Exceptionr   s    r   raise_for_statuszMockResponse.raise_for_statusR   s.    s"eD$4$4#5677 #r   )r   NNg        )r   r   r   r    r#   r   r   r!   floatr@   propertyrC   bytesrF   r;   rI   rL   r%   r   r   r'   r'   +   s    F $(!!$33 D>3 c]	3
 3$ c     d e 8r   r'   matchersrA   c                 x   	 t        | t              rt        j                  |       n| }t        |      j	                         }|j
                  xs d}|D ]6  }|j	                         |v s!|j	                         |j	                         v s6 y |dv r|D ]  }|j	                         |v s y y# t        $ r Y yw xY w)z2Check if URL matches any of the provided matchers.r0   T)	localhostz	127.0.0.1F)
isinstancer!   r3   r9   lowerhostrK   )r*   rP   
parsed_urlurl_strhostnamematchers         r   _is_url_matchrZ   X   s    '1#s';UYYs^
j/'')??(bG}}')W]]_@P-P  
 11#==?g- $  s*   BB- 
B- B- )B- +B- -	B98B9configc           	      t   	
 dddd
ddl } j                  j                          d}t        |j	                  |t         j                                    dz  dt        f fd	 	 	 	 	 	 	 	 	 d fd	 fd			 	 	 	 	 	 	 	 	 d fd
		
 f	d}dt        f f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   _MOCK_LATENCY_MSg     @@rA   c                 Z    t        | t        t        t           j                              S )N)rZ   r   r   r!   r   )r*   r[   s    r   _is_mock_urlz0create_mock_client_factory.<locals>._is_mock_url   s!    S$tCy&2E2E"FGGr   c                 ^  K   t        |t              rm |      ret        j                  dj                   d|        t        j                         d{    t        j                  j                  |      S  | |||||||||	|
       d{   S t        d      7 O7 w)z?Monkey-patched AsyncHTTPHandler.post that intercepts API calls.[ MOCK] POST to Nr(   r)   r*   r+   )
r*   datar;   paramsr5   timeoutstreamlogging_objfilesrF   z,Original AsyncHTTPHandler.post not available)rS   r!   r	   infor   asynciosleepr'   r   r   RuntimeError)r   r*   rd   r;   re   r5   rf   rg   rh   ri   rF   _MOCK_LATENCY_SECONDSr_   _original_async_handler_postr[   s              r   _mock_async_handler_postz<create_mock_client_factory.<locals>._mock_async_handler_post   s      c3L$5!FKK=u EF-- 5666"66 22 5	  (35'   IJJ+ 7s$   AB-B)?B-B+B-+B-c                      |      rIt        j                  dj                   d| d       t        j                  j
                  |      S 
 | |fi |S y)z;Monkey-patched httpx.Client.post that intercepts API calls.ra   rb   z (sync)rc   N)r	   rj   r   r'   r   r   )r   r*   kwargsrn   r_   _original_sync_client_postr[   s      r   _mock_sync_client_postz:create_mock_client_factory.<locals>._mock_sync_client_post   sp    !FKK=uG LM"66 22 5	  &1-dCB6BB 2r   c                 .   t        |t              re |      r]t        j                  dj                   d|        ddl}|j                         t        j                  j                  |      S  | |||||||||	|
      S t        d      )z:Monkey-patched HTTPHandler.post that intercepts API calls.ra   rb   r   Nrc   )
r*   rd   r;   re   r5   rf   rg   ri   rF   rh   z'Original HTTPHandler.post not available)rS   r!   r	   rj   r   timerl   r'   r   r   rm   )r   r*   rd   r;   re   r5   rf   rg   ri   rF   rh   rv   rn   r_   _original_http_handler_postr[   s               r   _mock_http_handler_postz;create_mock_client_factory.<locals>._mock_http_handler_post   s     c3L$5!FKK=u EFJJ,-"66 22 5	  '2.'  DEEr   c                    	 ryt        j                  d
j                   d
j                   d       
j                  r><ddlm}  | j                  | _        t        j                  d
j                   d       
j                  rT	Rt        j                  j                  	t        j                  _        t        j                  d
j                   d       
j                  r><dd	lm} |j                  |_        t        j                  d
j                   d
       t        j                  d
j                   ddz  dd       t        j                  d
j                   d
j                   d       dy)z5Initialize the mock client by patching HTTP handlers.Nra   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   &litellm.llms.custom_httpx.http_handlerrz   postr   r3   Clientr   r{   )rz   r{   rn   rp   rx   rt   _mocks_initializedro   rw   rs   r[   s     r   create_mock_clientz6create_mock_client_factory.<locals>.create_mock_client   se    }0_M	
 %%*F*NO+;+@+@($<!  1V[[M1U!VW##(B(J).):):& 6ELL  1V[[M1Q!RS$$)D)LJ*5*:*:'6K  1V[[M1P!QR}78Md8RSV7WWYZ	
 	}GFKK=0TU	
 "r   c                      ddl } ddlm} | j                  j                  d      } ||      }|t        |      nd}|r"t        j                  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)	oslitellm.secret_managers.mainr   getenvr   r$   r	   rj   r   )r   r   	mock_moderesultr[   s       r   should_use_mockz3create_mock_client_factory.<locals>.should_use_mock  s^    <IIfnng6	Y'!'!3f;;-MN r   )	NNNNNFNNN)r   r   upperrM   r   r!   r   r$   )r[   r   latency_envr   r   rn   r_   rp   rx   rt   r   ro   rw   rs   s   `    @@@@@@@@@r   create_mock_client_factoryr   n   s     $( !%"& [[&&())9:KbiiS)B)B%CDEN 
HT H %K %KPC" 'F 'FT%" %"PT   ..r   )r    r3   r;   rk   datetimer   typingr   r   r   r   dataclassesr   litellm._loggingr	   r   r'   r!   r$   rZ   r   r%   r   r   <module>r      sn        - - ! + # # #.*8 *8Zc t ,s/'7 s/r   