o
    ђhkm                     @  sd  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 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'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- ej.dkrd dlm/Z/ nd dl0m/Z/ ej.dkrd dlm1Z1 nd dl0m1Z1 zd dl2Z2W n e3y   e4dw eg eej5j6 f Z7ee)e+ge
d f Z8ee*ge8f Z9ee*e)e+ge
d f Z:ee;ee;ee; e<f f Z=d&ddZ>G dd dZ?G dd deZ@G dd deAZBG dd de2jCe-ZDG d d! d!ZEG d"d# d#e2jFZGG d$d% d%e2jHZIdS )'    )annotationsN)	Awaitable	GeneratorIterableMappingMutableMappingSequence)Future)AbstractContextManager)GeneratorType)AnyCallableLiteral	TypedDictUnioncast)unquoteurljoin)StapledObjectStream)is_async_callable)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect)   
   )	TypeGuard)r      )SelfzThe starlette.testclient module requires the httpx package to be installed.
You can install this with:
    $ pip install httpx
appASGI2App | ASGI3AppreturnTypeGuard[ASGI3App]c                 C  s   t | r
t| dS t| S )N	__await__)inspectisclasshasattrr   r!    r*   M/var/www/html/govbot/env/lib/python3.10/site-packages/starlette/testclient.py	_is_asgi3=   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__H      
z_WrapASGI2.__init__scoper   receiver   sendr   c                   s    |  |}|||I d H  d S r1   r)   )r2   r5   r6   r7   instancer*   r*   r+   __call__K   s   
z_WrapASGI2.__call__N)r!   r.   r#   r/   )r5   r   r6   r   r7   r   r#   r/   )__name__
__module____qualname____doc__r3   r9   r*   r*   r*   r+   r-   C   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>   P   s   
 r>   c                   @  s   e Zd ZdddZdS )	_UpgradesessionWebSocketTestSessionr#   r/   c                 C  r0   r1   )rE   )r2   rE   r*   r*   r+   r3   V   r4   z_Upgrade.__init__N)rE   rF   r#   r/   )r:   r;   r<   r3   r*   r*   r*   r+   rD   U   s    rD   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+   rG   Z   s    rG   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 )GrF   r!   ASGI3Appr5   r   portal_factory_PortalFactoryTyper#   r/   c                 C  s"   || _ || _d | _|| _d | _d S r1   )r!   r5   accepted_subprotocolrI   extra_headers)r2   r!   r5   rI   r*   r*   r+   r3   e   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_contextrI   portal
start_task_runcallbackresultcallcancelr7   r6   _raise_on_closegetrK   rL   closepop_all
exit_stack)r2   stackrT   futcsmessager*   r*   r+   	__enter__q   s   


$zWebSocketTestSession.__enter__argsr   bool | Nonec                 G  s   | j j| S r1   )r_   __exit__r2   re   r*   r*   r+   rg      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!   r5   r6   r7   sleep_forever)	r2   ri   r7   send_txsend_rxr6   
receive_tx
receive_rxrb   r*   r*   r+   rV      s$   "
  P zWebSocketTestSession._runrc   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 )NrM   zwebsocket.closecoderP   reason )rx   ry   zwebsocket.http.response.startstatusrO   Tzwebsocket.http.response.bodybody	more_bodyF    )status_coderO   content)r   r\   r6   appendrG   join)r2   rc   r   rO   r|   r*   r*   r+   r[      s   z$WebSocketTestSession._raise_on_closec                 C  s   | j | jj| d S r1   )rT   rY   rp   r7   r2   rc   r*   r*   r+   r7         zWebSocketTestSession.senddatar?   c                 C     |  d|d d S )Nwebsocket.receiverM   textr7   r2   r   r*   r*   r+   	send_text      zWebSocketTestSession.send_textbytesc                 C  r   )Nr   rM   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dumpsr7   encode)r2   r   r   r   r*   r*   r+   	send_json   s   zWebSocketTestSession.send_jsonrP   Nrx   intry   
str | Nonec                 C  s   |  d||d d S )Nzwebsocket.disconnect)rM   rx   ry   r   )r2   rx   ry   r*   r*   r+   r]      r   zWebSocketTestSession.closec                 C  s   | j | jjS r1   )rT   rY   rq   r6   r2   r*   r*   r+   r6      s   zWebSocketTestSession.receivec                 C      |   }| | tt|d S )Nr   )r6   r[   r   r?   r   r*   r*   r+   receive_text      
z!WebSocketTestSession.receive_textc                 C  r   )Nr   )r6   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   )r6   r[   decoder   loads)r2   r   rc   r   r*   r*   r+   receive_json   s   


z!WebSocketTestSession.receive_json)r!   rH   r5   r   rI   rJ   r#   r/   )r#   rF   )re   r   r#   rf   )ri   rj   r#   r/   rc   r   r#   r/   )r   r?   r#   r/   )r   r   r#   r/   )r   )r   r   r   r   r#   r/   )rP   N)rx   r   ry   r   r#   r/   r#   r   )r#   r?   )r#   r   )r   r   r#   r   )r:   r;   r<   r3   rd   rg   rV   r[   r7   r   r   r   r]   r6   r   r   r   r*   r*   r*   r+   rF   d   s    










rF   c                   @  s&   e Zd Z		ddddZdddZdS )_TestClientTransportTrz   r!   rH   rI   rJ   raise_server_exceptionsbool	root_pathr?   clienttuple[str, int]	app_staterA   r#   r/   c                C  s(   || _ || _|| _|| _|| _|| _d S r1   )r!   r   r   rI   r   r   )r2   r!   rI   r   r   r   r   r*   r*   r+   r3      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)rM   pathraw_pathr   schemequery_stringrO   r   serversubprotocolsstate
extensionsr   z1.1http.response.debug)rM   http_versionmethodr   r   r   r   r   rO   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 )	NrM   zhttp.disconnectr   r~   zhttp.requestT)rM   r|   r}   )rM   r|   )	is_setwaitread
isinstancer?   r   r   r7   StopIteration)r|   
body_byteschunk)r   request_completeresponse_completer*   r+   r6   *  s.   





z4_TestClientTransport.handle_request.<locals>.receiverc   r/   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 )NrM   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   L  s     zE_TestClientTransport.handle_request.<locals>.send.<locals>.<listcomp>rO   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)rc   r|   r}   )r   
raw_kwargsr   r   response_startedr   r*   r+   r7   F  s*   
z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )r   rO   r   r   r   r   r*   )$urlr   netlocr   r   r   querysplitr   rO   r   multi_itemsr\   r   r   r   r   copyrF   r!   rI   rD   r   ioBytesIOrY   rk   EventBaseExceptionr   httpx
ByteStreamr   Responser   r   )r2   r   r   r   r   r   r   default_portr   port_stringportrO   rN   r   r5   rE   r6   r7   rT   excresponser*   )r   r   r   r   r   r   r   r+   handle_request   s   



z#_TestClientTransport.handle_requestN)Trz   )r!   rH   rI   rJ   r   r   r   r?   r   r   r   rA   r#   r/   )r   r   r#   r   )r:   r;   r<   r3   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 | NonerT   http://testserverTrz   asyncio
testclientiP  r!   r   base_urlr?   r   r   r   r@   Literal['asyncio', 'trio']rB   dict[str, Any] | Nonecookieshttpx._types.CookieTypes | NonerO   dict[str, str] | Nonefollow_redirectsr   r   r#   r/   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)r@   rB   )rI   r   r   r   r   z
user-agentr   )r   rO   	transportr  r   )r>   async_backendr,   r   r.   r-   r!   r   r   _portal_factory
setdefaultsuperr3   )r2   r!   r   r   r   r@   rB   r   rO   r  r   asgi_appr  	__class__r*   r+   r3   {  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*   )rT   rk   from_threadstart_blocking_portalr  )r2   rT   r*   r*   r+   r    s   
"zTestClient._portal_factoryr   r   filesr   paramsrO   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/encode/starlette/issues/1108 for more information.r  )r   USE_CLIENT_DEFAULTwarningswarnDeprecationWarning
_merge_urlr  r   )r2   r   r   r   r   r  r   r  rO   r   r  r  r  r   r	  r*   r+   r     s*   

zTestClient.requestr  rO   r   r  r  r  r   c          	   
        t  j||||||||dS Nr!  )r  r\   	r2   r   r  rO   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r2   r   r   r   r  r   r  rO   r   r  r  r  r   r	  r*   r+   r*       zTestClient.postc                  r(  r)  )r  putr+  r	  r*   r+   r-  7  r,  zTestClient.putc                  r(  r)  )r  patchr+  r	  r*   r+   r.  V  r,  zTestClient.patchc          	   
     r"  r#  )r  deleter$  r	  r*   r+   r/  u  r%  zTestClient.deleter   Sequence[str] | NonekwargsrF   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://testserverrO   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-version13r   z, GETzExpected WebSocket upgrade)	r   r\   r  r   r  r   rD   rE   RuntimeError)r2   r   r   r1  rO   r   rE   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#   r/   c                     s
   d  _ d S r1   )rT   r*   r   r*   r+   reset_portal  s   
z*TestClient.__enter__.<locals>.reset_portalc                     s     j d S r1   )rY   wait_shutdownr*   rT   r2   r*   r+   r9    s   z+TestClient.__enter__.<locals>.wait_shutdownr*   r#   r/   )rQ   rR   rS   rk   r  r  r  rT   rW   rl   rm   rn   r]   r   stream_sendstream_receivestart_task_soonlifespanr   rY   wait_startupr^   r_   )r2   r`   r8  r7   r6   channelr9  r*   r:  r+   rd     s,   
 



zTestClient.__enter__re   c                 G  s   | j   d S r1   )r_   r]   rh   r*   r*   r+   rg     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 )Nr?  )rM   r   )r   r!   r=  r6   r<  r7   )r2   r5   r*   r*   r+   r?    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 )
NrM   zlifespan.startupr#   r   c                    (    j  I d H } | d u r j  | S r1   r<  r6   r   rX   rc   r   r*   r+   r6     
   
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedrF  r#   r   r=  r7   r2   r6   rc   r*   r   r+   r@    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                    rB  r1   rC  rD  r   r*   r+   r6     rE  z)TestClient.wait_shutdown.<locals>.receiverM   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedrJ  rG  rH  rI  r*   r   r+   r9    s   zTestClient.wait_shutdown)	r   Trz   r   NNNTr   )r!   r   r   r?   r   r   r   r?   r@   r   rB   r   r   r   rO   r  r  r   r   r   r#   r/   )r#   r  )r   r?   r   r  r   r  r   r  r  r  r   r   r  r  rO   r  r   r   r  r  r  r  r  r  r   r   r#   r   )r   r  r  r  rO   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  rO   r  r   r   r  r  r  r  r  r  r   r   r#   r   r1   )r   r?   r   r0  r1  r   r#   rF   )r#   r    )re   r   r#   r/   r;  )r:   r;   r<   __test__rC   rT   r3   rQ   contextmanagerr  r   _clientr  r   r\   r&  r'  r*  r-  r.  r/  r7  rd   rg   r?  r@  r9  __classcell__r*   r*   r	  r+   r   v  s   
 (,###



r   )r!   r"   r#   r$   )J
__future__r   rQ   r&   r   r   rm   sysr  collections.abcr   r   r   r   r   r   concurrent.futuresr	   r
   typesr   typingr   r   r   r   r   r   urllib.parser   r   rk   	anyio.abcanyio.from_threadanyio.streams.stapledr   starlette._utilsr   starlette.typesr   r   r   r   r   starlette.websocketsr   version_infor   typing_extensionsr    r   ModuleNotFoundErrorr6  abcBlockingPortalrJ   ASGIInstancer.   rH   r?   r   _RequestDatar,   r-   r>   	ExceptionrD   r   rG   rF   BaseTransportr   Clientr   r*   r*   r*   r+   <module>   sf      




i *