Ë
    tPêj®'  ã                   ó¸   — d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZmZ ddl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)ÚAsyncIterableÚIterable)Ú	dataclass)Ú	timedelta)ÚFinalÚcast)Ú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
dz  ed	<   dZee   dz  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_varéd   Ú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    úm/home/oem/CyberBrain26-unified/.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   Údictr   Úlistr   Úboolr   r   r   © r   r   r   r      sm   … á3à
ƒIØƒLØ!Ð˜Ó!Ø"Ð˜Ó"Ø%)Ð�t˜d‘{Ó)Ø%)€L�$�s‘)˜dÑ"Ó)Ø $Ð˜Ó$Ø#Ð�tÓ#Ø$Ð˜Ó$ó#r   r   c            	       óˆ   — e Zd ZdZ	 	 	 	 ddededz  dedz  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ˆÔÙ%(”5—9‘9˜S”>¬e¯i©i¸«mˆŒÜ ¨Ô9ˆŒÙ4=”T—Z‘Z §¡Ô0À2ˆŒ
ØŸ
™
×)Ñ)¨'Ó2ˆ�r   Úreturnc                 ó   — | j                   S )zReturn response text.)r?   r   s    r   ÚtextzMockResponse.text>   s   € ð �z‰zÐr   c                 ó   — | j                   S )zReturn response content.©rA   r   s    r   ÚcontentzMockResponse.contentC   s   € ð �}‰}Ðr   c                 ó   — | j                   S )zReturn JSON response data.)r4   r   s    r   r=   zMockResponse.jsonH   s   € à�‰Ðr   c                 ó   — | j                   S )zRead response content.rG   r   s    r   ÚreadzMockResponse.readL   s   € à�}‰}Ðr   c                 óR   — | j                   dk\  rt        d| j                   › �«      ‚y)z'Raise exception for error status codes.r1   zHTTP N)r*   Ú	Exceptionr   s    r   Úraise_for_statuszMockResponse.raise_for_statusP   s.   € à×Ñ˜sÒ"Ü˜e D×$4Ñ$4Ð#5Ð6Ó7Ð7ð #r   )r   NNg        )r   r   r   r    r#   r$   r!   ÚfloatrB   ÚpropertyrE   ÚbytesrH   r=   rK   rN   r'   r   r   r)   r)   )   s™   „ ÙFð Ø!%ØØ!$ñ3àð3ð ˜$‘;ð3ð �4‰Zð	3ð
 ó3ð$ ð�cò ó ðð ð˜ò ó ðð�dó ð�eó ó8r   r)   ÚmatchersrC   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.r2   T)Ú	localhostz	127.0.0.1F)Ú
isinstancer!   r5   r;   ÚlowerÚhostrM   )r,   rR   Ú
parsed_urlÚurl_strÚhostnameÚmatchers         r   Ú_is_url_matchr\   V   sµ   € ðÜ.8¸¼cÔ.BœEŸI™I cœNÈˆ
Ü˜Z›×.Ñ.Ó0ˆØ$Ÿ/™/Ò/¨Rˆàò 	ˆGØ�}‰}‹ 'Ñ)¨W¯]©]«_ÀÇÁÓ@PÒ-PÙð	ð
 Ð1Ñ1Ø#ò  �Ø—=‘=“? gÒ-Ùð ð øÜò Ùðús*   ‚BB- Â
B- ÂB- Â)B- Â+B- Â-	B9Â8B9Úconfigc           	      ó(  ‡ ‡‡‡‡‡	‡
‡‡‡— dŠdŠdŠdŠ
ddl }‰ j                  j                  «       › d�}t        |j	                  |t        ‰ j                  «      «      «      dz  Šdt        fˆ fd„Š	 	 	 	 	 	 	 	 	 ddt
        t        z  t        t           z  t        t           z  dz  fˆˆˆˆ fd	„Šˆˆˆˆ fd
„Š		 	 	 	 	 	 	 	 	 ddt
        t        z  t        t           z  t        t           z  dz  fˆˆˆˆ 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     @�@rC   c                 óZ   •— t        | t        t        t           ‰j                  «      «      S )N)r\   r   r%   r!   r   )r,   r]   s    €r   Ú_is_mock_urlz0create_mock_client_factory.<locals>._is_mock_url€   s!   ø€ ä˜S¤$¤t¬C¡y°&×2EÑ2EÓ"FÓGÐGr   rH   c              “   óV  •K  — t        |t        «      ri ‰|«      rat        j                  d‰j                  |«       t        j                  ‰«      ƒ d{  –—†  t        ‰j                  ‰j                  |‰¬«      S ‰� ‰| |||||||||	|
¬«      ƒ d{  –—† S t        d«      ‚7 ŒO7 Œ­w)z?Monkey-patched AsyncHTTPHandler.post that intercepts API calls.ú[%s MOCK] POST to %sN©r*   r+   r,   r-   )
r,   Údatar=   Úparamsr7   ÚtimeoutÚstreamÚlogging_objÚfilesrH   z,Original AsyncHTTPHandler.post not available)rU   r!   r	   Úinfor   ÚasyncioÚsleepr)   r   r   ÚRuntimeError)r   r,   re   r=   rf   r7   rg   rh   ri   rj   rH   Ú_MOCK_LATENCY_SECONDSra   Ú_original_async_handler_postr]   s              €€€€r   Ú_mock_async_handler_postz<create_mock_client_factory.<locals>._mock_async_handler_post…   s½   øè ø€ ô �cœ3Ô¡L°Ô$5Ü×ÑÐ 6¸¿¹ÀSÔIÜ—-‘-Ð 5Ó6×6Ð6ÜØ"×6Ñ6Ø ×2Ñ2ØØ 5ô	ð ð (Ð3Ù5ØØØØØØØØØ'ØØô÷ ð ô ÐIÓJÐJð+ 7øðús$   ƒAB)ÁB%Á?B)ÂB'ÂB)Â'B)c                 ó¶   •—  ‰|«      rDt        j                  d‰j                  |«       t        ‰j                  ‰j
                  |‰¬«      S ‰�
 ‰| |fi |¤ŽS y)z;Monkey-patched httpx.Client.post that intercepts API calls.z[%s MOCK] POST to %s (sync)rd   N)r	   rk   r   r)   r   r   )r   r,   Úkwargsro   ra   Ú_original_sync_client_postr]   s      €€€€r   Ú_mock_sync_client_postz:create_mock_client_factory.<locals>._mock_sync_client_post­   sf   ø€ á˜ÔÜ×ÑÐ =¸v¿{¹{ÈCÔPÜØ"×6Ñ6Ø ×2Ñ2ØØ 5ô	ð ð &Ð1Ù-¨d°CÑB¸6ÑBÐBð 2r   c                 ó&  •— t        |t        «      ra ‰|«      rYt        j                  d‰j                  |«       ddl}|j                  ‰«       t        ‰j                  ‰j                  |‰¬«      S ‰� ‰| |||||||||	|
¬«      S t        d«      ‚)z:Monkey-patched HTTPHandler.post that intercepts API calls.rc   r   Nrd   )
r,   re   r=   rf   r7   rg   rh   rj   rH   ri   z'Original HTTPHandler.post not available)rU   r!   r	   rk   r   Útimerm   r)   r   r   rn   )r   r,   re   r=   rf   r7   rg   rh   rj   rH   ri   rw   ro   ra   Ú_original_http_handler_postr]   s               €€€€r   Ú_mock_http_handler_postz;create_mock_client_factory.<locals>._mock_http_handler_post»   s¦   ø€ ô �cœ3Ô¡L°Ô$5Ü×ÑÐ 6¸¿¹ÀSÔIÛà�J‰JÐ,Ô-ÜØ"×6Ñ6Ø ×2Ñ2ØØ 5ô	ð ð 'Ð2Ù.ØØØØØØØØØØØ'ôð ô ÐDÓEÐEr   c                  óæ  •	— ‰ryt        j                  d‰
j                  ‰
j                  «       ‰
j                  r;‰€9ddlm}  | j                  Š‰| _        t        j                  d‰
j                  «       ‰
j                  rQ‰	€Ot        j                  j                  Š	‰t        j                  _        t        j                  d‰
j                  «       ‰
j                  r;‰€9ddlm} |j                  Š‰|_        t        j                  d‰
j                  «       t        j                  d	‰
j                  › d
‰dz  d›d�«       t        j                  d‰
j                  ‰
j                  «       dŠy)z5Initialize the mock client by patching HTTP handlers.Nz([%s MOCK] Initializing %s mock client...r   )ÚAsyncHTTPHandlerz'[%s MOCK] Patched AsyncHTTPHandler.postz#[%s MOCK] Patched httpx.Client.post)ÚHTTPHandlerz"[%s MOCK] Patched HTTPHandler.postú[z MOCK] Mock latency set to iè  z.0fÚmsz0[%s MOCK] %s mock client initialization completeT)r	   Údebugr   r   Ú&litellm.llms.custom_httpx.http_handlerr{   Úpostr   r5   ÚClientr   r|   )r{   r|   ro   rq   ry   ru   Ú_mocks_initializedrp   rx   rt   r]   s     €€€€€€€€€r   Úcreate_mock_clientz6create_mock_client_factory.<locals>.create_mock_clientå   s5  ø€ ñ Øä×ÑÐGÈÏÉÐV\×VaÑVaÔbà×%Ò%Ð*FÐ*NÝOà+;×+@Ñ+@Ð(Ø$<ÐÔ!Ü× Ñ Ð!JÈFÏKÉKÔXà×#Ò#Ð(BÐ(JÜ).¯©×):Ñ):Ð&Ø 6ŒE�L‰LÔÜ× Ñ Ð!FÈÏÉÔTà×$Ò$Ð)DÐ)LÝJà*5×*:Ñ*:Ð'Ø6ˆKÔÜ× Ñ Ð!EÀvÇ{Á{ÔSä×Ñ˜q §¡ Ð-HÐI^ÐaeÑIeÐfiÐHjÐjlÐmÔnÜ×ÑÐOÐQW×Q\ÑQ\Ð^d×^iÑ^iÔjà!Ñr   c                  óÆ   •— ddl } ddlm} | j                  ‰j                  d«      } ||«      }|�t        |«      nd}|r t        j                  d‰j                  «       |S )z)Determine if mock mode should be enabled.r   N)Ústr_to_boolÚfalseFz0%s Mock Mode: ENABLED - API calls will be mocked)	ÚosÚlitellm.secret_managers.mainr†   Úgetenvr   r&   r	   rk   r   )rˆ   r†   Ú	mock_modeÚresultr]   s       €r   Úshould_use_mockz3create_mock_client_factory.<locals>.should_use_mock  sW   ø€ ãå<àŸ9™9 V§^¡^°WÓ=ˆ	Ù˜YÓ'ˆØ!'Ð!3”�f”¸ˆáÜ×ÑÐ RÐTZ×T_ÑT_Ô`àˆr   )	NNNNNFNNN)rˆ   r   ÚupperrO   rŠ   r!   r   r&   rQ   r   r   )r]   rˆ   Úlatency_envr„   r�   ro   ra   rq   ry   ru   rƒ   rp   rx   rt   s   `    @@@@@@@@@r   Úcreate_mock_client_factoryr�   l   s?  ÿù€ ð $(Ð Ø!%ÐØ"&ÐØÐó à"ŸK™K×-Ñ-Ó/Ð0Ð0@ÐA€KÜ#(¨¯©°;ÄÀF×D]ÑD]Ó@^Ó)_Ó#`ÐciÑ#iÐðHœTõ Hð ØØØØØØØØOSñ%Kô ”u‘œx¬™Ñ.´¼uÑ1EÑEÈÑL÷%Kð %K÷PCð" ØØØØØØØOSØñ'Fô ”u‘œx¬™Ñ.´¼uÑ1EÑEÈÑL÷'Fð 'F÷T#"ô #"ðLœTõ ð ˜Ð.Ð.r   )r    rl   r=   Úcollections.abcr   r   Údataclassesr   Údatetimer   Útypingr   r   r5   Úlitellm._loggingr	   r   r)   r%   r!   r&   r\   r�   r'   r   r   ú<module>r–      sn   ðñó Û ß 3Ý !Ý ß ã å +ð ÷#ð #ó ð#÷&*8ñ *8ðZ  c¡ð ¨tó ð,n/Ð'7ô n/r   