o
    L)jn                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZmZ d dl Z d dl!Z d dl"Z d d	l#m$Z$ d d
l%m&Z& d dl'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 ej1dkrd dlm2Z2 nd dl3m2Z2 erd dl4Z5n*zd dl4Z5W n# e6y   zd dl5Z5W n e6y   e7dw ej8de(dd Y nw eg ee j9j: f Z;ee,e.ge
d f Z<ee-ge<f Z=ee-e,e.ge
d f Z>ee?e?ee? B e@B f ZAd(ddZBG dd dZCG dd deZDG dd deEZFG d d! d!e5jGe0ZHG d"d# d#ZIG d$d% d%e5jJZKG d&d' d'e5jLZMdS ))    )annotationsN)	AwaitableCallable	GeneratorIterableMappingMutableMappingSequence)Future)AbstractContextManager)GeneratorType)TYPE_CHECKINGAnyLiteral	TypedDict	TypeGuardcast)unquoteurljoin)StapledObjectStream)is_async_callable)StarletteDeprecationWarning)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect)      )SelfzThe starlette.testclient module requires the httpx2 package to be installed.
You can install this with:
    $ pip install httpx2
zRUsing `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.   )
stacklevelappASGI2App | ASGI3AppreturnTypeGuard[ASGI3App]c                 C  s   t | r
t| dS t| S )N	__await__)inspectisclasshasattrr   r#    r,   y/var/www/html/finance-dev.cargoinsureonline.com/_shared/backend-venv/lib/python3.10/site-packages/starlette/testclient.py	_is_asgi3E   s   

r.   c                   @  s$   e Zd ZdZdddZdddZdS )
_WrapASGI2z7
    Provide an ASGI3 interface onto an ASGI2 app.
    r#   ASGI2Appr%   Nonec                 C  
   || _ d S Nr+   )selfr#   r,   r,   r-   __init__P      
z_WrapASGI2.__init__scoper   receiver   sendr   c                   s    |  |}|||I d H  d S r3   r+   )r4   r7   r8   r9   instancer,   r,   r-   __call__S   s   
z_WrapASGI2.__call__N)r#   r0   r%   r1   )r7   r   r8   r   r9   r   r%   r1   )__name__
__module____qualname____doc__r5   r;   r,   r,   r,   r-   r/   K   s    
r/   c                   @  s   e Zd ZU ded< ded< dS )_AsyncBackendstrbackenddict[str, Any]backend_optionsN)r<   r=   r>   __annotations__r,   r,   r,   r-   r@   X   s   
 r@   c                   @  s   e Zd ZdddZdS )	_UpgradesessionWebSocketTestSessionr%   r1   c                 C  r2   r3   )rG   )r4   rG   r,   r,   r-   r5   ^   r6   z_Upgrade.__init__N)rG   rH   r%   r1   )r<   r=   r>   r5   r,   r,   r,   r-   rF   ]   s    rF   c                   @  s   e Zd ZdZdS )WebSocketDenialResponsez
    A special case of `WebSocketDisconnect`, raised in the `TestClient` if the
    `WebSocket` is closed before being accepted with a `send_denial_response()`.
    N)r<   r=   r>   r?   r,   r,   r,   r-   rI   b   s    rI   c                   @  s   e Zd Zd8d	d
Zd9ddZd:ddZd;ddZd<ddZd<ddZd=ddZ	d>d!d"Z
d?d@d&d'ZdAdBd.d/ZdCd0d1ZdDd2d3ZdEd4d5Zd?dFd6d7Zd)S )GrH   r#   ASGI3Appr7   r   portal_factory_PortalFactoryTyper%   r1   c                 C  s"   || _ || _d | _|| _d | _d S r3   )r#   r7   accepted_subprotocolrK   extra_headers)r4   r#   r7   rK   r,   r,   r-   r5   m   s
   
zWebSocketTestSession.__init__c                 C  s   t  T}||   | _}|| j\}}||j ||j	|j
 | ddi |  }| | |dd | _|dd | _|| jd | | _| W  d    S 1 s[w   Y  d S )Ntypezwebsocket.connectsubprotocolheaders  )
contextlib	ExitStackenter_contextrK   portal
start_task_runcallbackresultcallcancelr9   r8   _raise_on_closegetrM   rN   closepop_all
exit_stack)r4   stackrV   futcsmessager,   r,   r-   	__enter__y   s   


$zWebSocketTestSession.__enter__argsr   bool | Nonec                 G  s   | j j| S r3   )ra   __exit__r4   rg   r,   r,   r-   ri      s   zWebSocketTestSession.__exit__task_status'anyio.abc.TaskStatus[anyio.CancelScope]c          	        s6  t tj}|\}}t tj}|\}}|z |_ |M |; t  '}|| _|| _|| | | j	|j
|jI dH  t  I dH  W d   n1 sOw   Y  W d   n1 s^w   Y  W d   n1 smw   Y  W d   n1 s|w   Y  W d   dS W d   dS 1 sw   Y  dS )zE
        The sub-thread in which the websocket session runs.
        N)anyiocreate_memory_object_streammathinfCancelScope_receive_tx_send_rxstartedr#   r7   r8   r9   sleep_forever)	r4   rk   r9   send_txsend_rxr8   
receive_tx
receive_rxrd   r,   r,   r-   rX      s$   "
  P zWebSocketTestSession._runre   r   c                 C  s   |d dkrt |dd|ddd|d dkrJ|d	 }|d
 }g }	 |  }|d dks1J ||d  |dds?nq%t||d|dd S )NrO   zwebsocket.closecoderR   reason )rz   r{   zwebsocket.http.response.startstatusrQ   Tzwebsocket.http.response.bodybody	more_bodyF    )status_coderQ   content)r   r^   r8   appendrI   join)r4   re   r   rQ   r~   r,   r,   r-   r]      s   z$WebSocketTestSession._raise_on_closec                 C  s   | j | jj| d S r3   )rV   r[   rr   r9   r4   re   r,   r,   r-   r9         zWebSocketTestSession.senddatarA   c                 C     |  d|d d S )Nwebsocket.receiverO   textr9   r4   r   r,   r,   r-   	send_text      zWebSocketTestSession.send_textbytesc                 C  r   )Nr   rO   r   r   r   r,   r,   r-   
send_bytes   r   zWebSocketTestSession.send_bytesr   modeLiteral['text', 'binary']c                 C  sF   t j|ddd}|dkr| d|d d S | d|dd d S )	N),:F)
separatorsensure_asciir   r   r   utf-8r   )jsondumpsr9   encode)r4   r   r   r   r,   r,   r-   	send_json   s   zWebSocketTestSession.send_jsonrR   Nrz   intr{   
str | Nonec                 C  s   |  d||d d S )Nzwebsocket.disconnect)rO   rz   r{   r   )r4   rz   r{   r,   r,   r-   r_      r   zWebSocketTestSession.closec                 C  s   | j | jjS r3   )rV   r[   rs   r8   r4   r,   r,   r-   r8      s   zWebSocketTestSession.receivec                 C      |   }| | tt|d S )Nr   )r8   r]   r   rA   r   r,   r,   r-   receive_text      
z!WebSocketTestSession.receive_textc                 C  r   )Nr   )r8   r]   r   r   r   r,   r,   r-   receive_bytes   r   z"WebSocketTestSession.receive_bytesc                 C  s<   |   }| | |dkr|d }n|d d}t|S )Nr   r   r   )r8   r]   decoder   loads)r4   r   re   r   r,   r,   r-   receive_json   s   


z!WebSocketTestSession.receive_json)r#   rJ   r7   r   rK   rL   r%   r1   )r%   rH   )rg   r   r%   rh   )rk   rl   r%   r1   re   r   r%   r1   )r   rA   r%   r1   )r   r   r%   r1   )r   )r   r   r   r   r%   r1   )rR   N)rz   r   r{   r   r%   r1   r%   r   )r%   rA   )r%   r   )r   r   r%   r   )r<   r=   r>   r5   rf   ri   rX   r]   r9   r   r   r   r_   r8   r   r   r   r,   r,   r,   r-   rH   l   s    










rH   c                   @  s&   e Zd Z		ddddZdddZdS )_TestClientTransportTr|   r#   rJ   rK   rL   raise_server_exceptionsbool	root_pathrA   clienttuple[str, int]	app_staterC   r%   r1   c                C  s(   || _ || _|| _|| _|| _|| _d S r3   )r#   r   r   rK   r   r   )r4   r#   rK   r   r   r   r   r,   r,   r-   r5      s   

z_TestClientTransport.__init__requesthttpx.Requesthttpx.Responsec                   s  j j}j jjdd}j j}j j}j jjdd}ddddd| }d|v r6|dd\}}	t|	}
n|}|}
dj	v rBg }n|
|krNd	|
 fg}nd	| d|
 
 fg}|d
d j	 D 7 }|dv rj	dd }|d u rxg }n
dd |dD }dt||ddd | j||
 || j||
g|| j di id}t| j|| j}t|ddjt||ddd | j||
 || j||
gdi i| j d}dddt id d  d'fdd}d( fd!d"}z&|  }|tj|| j||| W d    n	1 sw   Y  W n ty6 } z| jr,|W Y d }~nd }~ww | jrCsBJ d#nsNd$g t d%td   d< tj!d)i d&i}d urp|_" |_#|S )*Nascii)encodingP   i  )httpwshttpswssr      hosts   hostc                 S  s$   g | ]\}}|   | fqS r,   )lowerr   .0keyvaluer,   r,   r-   
<listcomp>   s   $ z7_TestClientTransport.handle_request.<locals>.<listcomp>>   r   r   sec-websocket-protocolc                 S  s   g | ]}|  qS r,   )strip)r   r   r,   r,   r-   r   	  s    r   	websocket   ?r   zwebsocket.http.response)rO   pathraw_pathr   schemequery_stringrQ   r   serversubprotocolsstate
extensionsr   z1.1http.response.debug)rO   http_versionmethodr   r   r   r   r   rQ   r   r   r   r   Fstreamr%   r   c                    s   r  s I d H  ddiS   } t| tr!| d}n5| d u r(d}n.t| trTz| d }t|tr=|d}d|ddW S  tyS   dddd Y S w | }dd|dS )	NrO   zhttp.disconnectr   r   zhttp.requestT)rO   r~   r   )rO   r~   )	is_setwaitread
isinstancerA   r   r   r9   StopIteration)r~   
body_byteschunk)r   request_completeresponse_completer,   r-   r8   2  s.   





z4_TestClientTransport.handle_request.<locals>.receivere   r1   c                   s   | d dkr$rJ d| d d< dd |  dg D d< d	d S | d d
kras0J d r8J d|  dd}|  dd}jdkrPd | |s_d d   d S d S | d dkru| d d | d d  d S d S )NrO   zhttp.response.startz1Received multiple "http.response.start" messages.r}   r   c                 S  s    g | ]\}}|  |  fqS r,   )r   r   r,   r,   r-   r   T  s     zE_TestClientTransport.handle_request.<locals>.send.<locals>.<listcomp>rQ   Tzhttp.response.bodyz<Received "http.response.body" without "http.response.start".z7Received "http.response.body" after response completed.r~   r   r   FHEADr   r   r   infotemplatecontext)r^   r   r   writeseekset)re   r~   r   )r   
raw_kwargsr   r   response_startedr   r,   r-   r9   N  s*   
z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )r   rQ   r   r   r   r   r,   )$urlr   netlocr   r   r   querysplitr   rQ   r   multi_itemsr^   r   r   r   r   copyrH   r#   rK   rF   r   ioBytesIOr[   rm   EventBaseExceptionr   httpx
ByteStreamr   Responser   r   )r4   r   r   r   r   r   r   default_portr   port_stringportrQ   rP   r   r7   rG   r8   r9   rV   excresponser,   )r   r   r   r   r   r   r   r-   handle_request   s   



z#_TestClientTransport.handle_requestN)Tr|   )r#   rJ   rK   rL   r   r   r   rA   r   r   r   rC   r%   r1   )r   r   r%   r   )r<   r=   r>   r5   r   r,   r,   r,   r-   r      s
    r   c                      s   e Zd ZU dZded< dZded< 					
					d^d_ fd d!Zejd`d#d$Z	ddddddde
jje
jje
jjdd%da fd;d<Zddde
jje
jje
jjdd=db fd>d?Zddde
jje
jje
jjdd=db fd@dAZddde
jje
jje
jjdd=db fdBdCZddddddde
jje
jje
jjdd%dc fdDdEZddddddde
jje
jje
jjdd%dc fdFdGZddddddde
jje
jje
jjdd%dc fdHdIZddde
jje
jje
jjdd=db fdJdKZ	ddde fdPdQZdfdSdTZdgdVdWZdhdXdYZdhdZd[Zdhd\d]Z  ZS )i
TestClientFzFuture[None]taskNzanyio.abc.BlockingPortal | NonerV   http://testserverTr|   asyncio
testclientiP  r#   r   base_urlrA   r   r   r   rB   Literal['asyncio', 'trio']rD   dict[str, Any] | Nonecookieshttpx._types.CookieTypes | NonerQ   dict[str, str] | Nonefollow_redirectsr   r   r%   r1   c                   s   t ||pi d| _t|r|}n	tt|}t|}|| _i | _t| j| j	||| j|
d}|d u r2i }|
dd t j||||	|d d S )N)rB   rD   )rK   r   r   r   r   z
user-agentr   )r   rQ   	transportr  r  )r@   async_backendr.   r   r0   r/   r#   r   r   _portal_factory
setdefaultsuperr5   )r4   r#   r   r   r   rB   rD   r  rQ   r  r   asgi_appr  	__class__r,   r-   r5     s2   

zTestClient.__init__/Generator[anyio.abc.BlockingPortal, None, None]c                 c  sX    | j d ur| j V  d S tjjdi | j}|V  W d    d S 1 s%w   Y  d S )Nr,   )rV   rm   from_threadstart_blocking_portalr  )r4   rV   r,   r,   r-   r    s   
"zTestClient._portal_factoryr   r   filesr   paramsrQ   r  authr  timeoutr   r   r   httpx._types.URLTypesr   "httpx._types.RequestContent | Noner   _RequestData | Noner   httpx._types.RequestFiles | Noner   r   r  #httpx._types.QueryParamTypes | Nonehttpx._types.HeaderTypes | Noner  7httpx._types.AuthTypes | httpx._client.UseClientDefault%bool | httpx._client.UseClientDefaultr  :httpx._types.TimeoutTypes | httpx._client.UseClientDefaultr   r   c                  sF   |t jurtdt | |}t j|||||||||	|
|||dS )NzYou should not use the 'timeout' argument with the TestClient. See https://github.com/Kludex/starlette/issues/1108 for more information.r  )r   USE_CLIENT_DEFAULTwarningswarnDeprecationWarning
_merge_urlr	  r   )r4   r   r   r   r   r  r   r  rQ   r  r  r  r  r   r  r,   r-   r     s*   

zTestClient.requestr  rQ   r  r  r  r  r   c          	   
        t  j||||||||dS Nr#  )r	  r^   	r4   r   r  rQ   r  r  r  r  r   r  r,   r-   r^        zTestClient.getc          	   
     r$  r%  )r	  optionsr&  r  r,   r-   r(    r'  zTestClient.optionsc          	   
     r$  r%  )r	  headr&  r  r,   r-   r)  	  r'  zTestClient.headc                  $   t  j|||||||||	|
||dS Nr  )r	  postr4   r   r   r   r  r   r  rQ   r  r  r  r  r   r  r,   r-   r,        zTestClient.postc                  r*  r+  )r	  putr-  r  r,   r-   r/  ?  r.  zTestClient.putc                  r*  r+  )r	  patchr-  r  r,   r-   r0  ^  r.  zTestClient.patchc          	   
     r$  r%  )r	  deleter&  r  r,   r-   r1  }  r'  zTestClient.deleter   Sequence[str] | NonekwargsrH   c              
     s   t d|}|di }|dd |dd |dd |d ur*|d	d
| ||d< zt jd|fi | W td tyT } z
|j}W Y d }~|S d }~ww )Nzws://testserverrQ   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-version13r   z, GETzExpected WebSocket upgrade)	r   r^   r  r   r	  r   rF   rG   RuntimeError)r4   r   r   r3  rQ   r   rG   r  r,   r-   websocket_connect  s    
zTestClient.websocket_connectr    c                   s   t  f}|tjjdi j _ |jdfdd}t	t
j}t	t
j}g ||R D ]}||j q2t| _t| _ j_ j |jd fdd}| _W d    S 1 smw   Y  S )	Nr%   r1   c                     s
   d  _ d S r3   )rV   r,   r   r,   r-   reset_portal  s   
z*TestClient.__enter__.<locals>.reset_portalc                     s     j d S r3   )r[   wait_shutdownr,   rV   r4   r,   r-   r;    s   z+TestClient.__enter__.<locals>.wait_shutdownr,   r%   r1   )rS   rT   rU   rm   r  r  r  rV   rY   rn   ro   rp   r_   r   stream_sendstream_receivestart_task_soonlifespanr   r[   wait_startupr`   ra   )r4   rb   r:  r9   r8   channelr;  r,   r<  r-   rf     s,   
 



zTestClient.__enter__rg   c                 G  s   | j   d S r3   )ra   r_   rj   r,   r,   r-   ri     s   zTestClient.__exit__c              	     sX   d| j d}z| || jj| jjI d H  W | jd I d H  d S | jd I d H  w )NrA  )rO   r   )r   r#   r?  r8   r>  r9   )r4   r7   r,   r,   r-   rA    s
   *zTestClient.lifespanc                   sb    j ddiI d H  d	 fdd}| I d H }|d dv s!J |d dkr/| I d H  d S d S )
NrO   zlifespan.startupr%   r   c                    (    j  I d H } | d u r j  | S r3   r>  r8   r   rZ   re   r   r,   r-   r8     
   
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedrH  r%   r   r?  r9   r4   r8   re   r,   r   r-   rB    s   zTestClient.wait_startupc                   sb   d	 fdd} j ddiI d H  | I d H }|d dv s!J |d dkr/| I d H  d S d S )
Nr%   r   c                    rD  r3   rE  rF  r   r,   r-   r8     rG  z)TestClient.wait_shutdown.<locals>.receiverO   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedrL  rI  rJ  rK  r,   r   r-   r;    s   zTestClient.wait_shutdown)	r   Tr|   r   NNNTr   )r#   r   r   rA   r   r   r   rA   rB   r   rD   r   r  r  rQ   r  r  r   r   r   r%   r1   )r%   r  )r   rA   r   r  r   r  r   r  r  r  r   r   r  r  rQ   r  r  r  r  r  r  r  r  r  r   r   r%   r   )r   r  r  r  rQ   r  r  r  r  r  r  r  r  r  r   r   r%   r   )r   r  r   r  r   r  r  r  r   r   r  r  rQ   r  r  r  r  r  r  r  r  r  r   r   r%   r   r3   )r   rA   r   r2  r3  r   r%   rH   )r%   r    )rg   r   r%   r1   r=  )r<   r=   r>   __test__rE   rV   r5   rS   contextmanagerr  r   _clientr  r   r^   r(  r)  r,  r/  r0  r1  r9  rf   ri   rA  rB  r;  __classcell__r,   r,   r  r-   r   ~  s   
 (,###



r   )r#   r$   r%   r&   )N
__future__r   rS   r(   r   r   ro   sysr  collections.abcr   r   r   r   r   r   r	   concurrent.futuresr
   r   typesr   typingr   r   r   r   r   r   urllib.parser   r   rm   	anyio.abcanyio.from_threadanyio.streams.stapledr   starlette._utilsr   starlette.exceptionsr   starlette.typesr   r   r   r   r   starlette.websocketsr   version_infor    typing_extensionshttpx2r   ModuleNotFoundErrorr8  r   abcBlockingPortalrL   ASGIInstancer0   rJ   rA   r   _RequestDatar.   r/   r@   	ExceptionrF   r   rI   rH   BaseTransportr   Clientr   r,   r,   r,   r-   <module>   sx    $ 





i *