a
    ^gl                     @  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
 d dl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l!m Z  zd dl"Z"W n e#y   e$dY n0 ej%g ej&ej'j( f Z)ej%eegej*d f Z+ej%ege+f Z,ej%eeegej*d f Z-ej.e/ej0e/ej1e/ e2f f Z3dddddZ4G dd dZ5G dd dej6Z7G dd de8Z9G dd de"j:eZ;G dd dZ<G dd de"j=Z>G dd de"j?Z@dS )     )annotationsN)Future)GeneratorType)unquoteurljoin)StapledObjectStream)is_async_callable)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect)   
   )	TypeGuardzThe starlette.testclient module requires the httpx package to be installed.
You can install this with:
    $ pip install httpx
zASGI2App | ASGI3AppzTypeGuard[ASGI3App]appreturnc                 C  s   t | rt| dS t| S )N	__await__)inspectisclasshasattrr   r    r   b/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/starlette/testclient.py	_is_asgi3.   s    

r   c                   @  s4   e Zd ZdZdddddZddd	dd
ddZdS )
_WrapASGI2z7
    Provide an ASGI3 interface onto an ASGI2 app.
    ASGI2AppNoner   c                 C  s
   || _ d S Nr   )selfr   r   r   r   __init__9   s    z_WrapASGI2.__init__r   r   r   )scopereceivesendr   c                   s   |  |}|||I d H  d S r    r   )r!   r#   r$   r%   instancer   r   r   __call__<   s    
z_WrapASGI2.__call__N)__name__
__module____qualname____doc__r"   r'   r   r   r   r   r   4   s   r   c                   @  s   e Zd ZU ded< ded< dS )_AsyncBackendstrbackenddict[str, typing.Any]backend_optionsN)r(   r)   r*   __annotations__r   r   r   r   r,   A   s   
r,   c                   @  s   e Zd ZdddddZdS )_UpgradeWebSocketTestSessionr   )sessionr   c                 C  s
   || _ d S r    )r4   )r!   r4   r   r   r   r"   G   s    z_Upgrade.__init__N)r(   r)   r*   r"   r   r   r   r   r2   F   s   r2   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   r5   K   s   r5   c                   @  s   e Zd ZdddddddZd dd	d
ZdddddZdddddZdddddZdddddZdddddZ	ddddd Z
d6dd"dd#d$d%Zd7d(d)dd*d+d,Zddd-d.Zddd/d0Zddd1d2Zd8d"dd3d4d5Zd'S )9r3   ASGI3Appr   _PortalFactoryTyper   )r   r#   portal_factoryr   c                 C  s"   || _ || _d | _|| _d | _d S r    )r   r#   accepted_subprotocolr8   extra_headers)r!   r   r#   r8   r   r   r   r"   V   s
    zWebSocketTestSession.__init__r   c                 C  s   t  }||   | _}|| j\}}||j ||j	|j
 | ddi |  }| | |dd | _|dd | _|| jd | | _| W  d    S 1 s0    Y  d S )Ntypezwebsocket.connectsubprotocolheaders  )
contextlib	ExitStackenter_contextr8   portal
start_task_runcallbackresultcallcancelr%   r$   _raise_on_closegetr9   r:   closepop_all
exit_stack)r!   stackrC   futcsmessager   r   r   	__enter__b   s    


zWebSocketTestSession.__enter__
typing.Anyzbool | Noneargsr   c                 G  s   | j j| S r    )rN   __exit__r!   rV   r   r   r   rW   q   s    zWebSocketTestSession.__exit__z'anyio.abc.TaskStatus[anyio.CancelScope])task_statusr   c          	        s$  t tj}|\}}t tj}|\}}| | | |v t  N}|| _|| _|| | | j	|j
|jI dH  t  I dH  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  dS )zE
        The sub-thread in which the websocket session runs.
        N)anyiocreate_memory_object_streammathinfZCancelScope_receive_tx_send_rxstartedr   r#   r$   r%   Zsleep_forever)	r!   rY   r%   Zsend_txZsend_rxr$   Z
receive_txZ
receive_rxrQ   r   r   r   rE   t   s    "
zWebSocketTestSession._runr
   rR   r   c                 C  s   |d dkr*t |dd|dddnj|d dkr|d	 }|d
 }g }|  }|d dksbJ ||d  |ddsJqqJt||d|dd S )Nr<   zwebsocket.closecoder?   reason )rb   rc   zwebsocket.http.response.startstatusr>   zwebsocket.http.response.bodybody	more_bodyF    )status_coder>   content)r   rK   r$   appendr5   join)r!   rR   ri   r>   rf   r   r   r   rJ      s    z$WebSocketTestSession._raise_on_closec                 C  s   | j | jj| d S r    )rC   rH   r^   r%   r!   rR   r   r   r   r%      s    zWebSocketTestSession.sendr-   )datar   c                 C  s   |  d|d d S )Nwebsocket.receiver<   textr%   r!   rn   r   r   r   	send_text   s    zWebSocketTestSession.send_textbytesc                 C  s   |  d|d d S )Nro   r<   ru   rr   rs   r   r   r   
send_bytes   s    zWebSocketTestSession.send_bytesrq   z typing.Literal['text', 'binary'])rn   moder   c                 C  sD   t j|ddd}|dkr*| d|d n| d|dd d S )	N),:F)
separatorsensure_asciirq   ro   rp   utf-8rv   )jsondumpsr%   encode)r!   rn   rx   rq   r   r   r   	send_json   s    zWebSocketTestSession.send_jsonr?   Nintz
str | None)rb   rc   r   c                 C  s   |  d||d d S )Nzwebsocket.disconnect)r<   rb   rc   rr   )r!   rb   rc   r   r   r   rL      s    zWebSocketTestSession.closec                 C  s   | j | jjS r    )rC   rH   r_   r$   r!   r   r   r   r$      s    zWebSocketTestSession.receivec                 C  s"   |   }| | tt|d S )Nrq   )r$   rJ   typingcastr-   rm   r   r   r   receive_text   s    
z!WebSocketTestSession.receive_textc                 C  s"   |   }| | tt|d S )Nru   )r$   rJ   r   r   ru   rm   r   r   r   receive_bytes   s    
z"WebSocketTestSession.receive_bytes)rx   r   c                 C  s<   |   }| | |dkr$|d }n|d d}t|S )Nrq   ru   r}   )r$   rJ   decoder~   loads)r!   rx   rR   rq   r   r   r   receive_json   s    

z!WebSocketTestSession.receive_json)rq   )r?   N)rq   )r(   r)   r*   r"   rS   rW   rE   rJ   r%   rt   rw   r   rL   r$   r   r   r   r   r   r   r   r3   U   s   r3   c                	   @  s8   e Zd Zdddddddd	d
ddZdddddZdS )_TestClientTransportTrd   r6   r7   boolr-   tuple[str, int]r/   r   )r   r8   raise_server_exceptions	root_pathclient	app_stater   c                C  s(   || _ || _|| _|| _|| _|| _d S r    )r   r   r   r8   r   r   )r!   r   r8   r   r   r   r   r   r   r   r"      s    
z_TestClientTransport.__init__zhttpx.Requesthttpx.Response)requestr   c                   s  j j}j jjdd}j j}j j}j jjdd}ddddd| }d|v rl|dd\}}	t|	}
n|}|}
dj	v rg }n0|
|krd	|
 fg}nd	| d|
 
 fg}|d
d j	 D 7 }|dv rbj	dd }|d u rg }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dfdd}ddd  fd!d"}zL|  .}|tj|| j||| W d    n1 s:0    Y  W n2 tyx } z| jrd|W Y d }~n
d }~0 0 | jrsJ d#nsd$g t d%td   d< tj!f i d&i}d ur|_" |_#|S )'Nascii)encodingP   i  )httpwshttpswssrz      hosts   hostc                 S  s$   g | ]\}}|   | fqS r   )lowerr   .0keyvaluer   r   r   
<listcomp>   rh   z7_TestClientTransport.handle_request.<locals>.<listcomp>>   r   r   sec-websocket-protocolc                 S  s   g | ]}|  qS r   )strip)r   r   r   r   r   r      rh   ry   Z	websocket   ?r   zwebsocket.http.response)r<   pathraw_pathr   schemequery_stringr>   r   serversubprotocolsstate
extensionsr   z1.1http.response.debug)r<   http_versionmethodr   r   r   r   r   r>   r   r   r   r   Fstreamr
   r;   c                    s   r"  s I d H  ddiS   } t| tr@| d}nl| d u rNd}n^t| trz,| d }t|trx|d}d|ddW S  ty   dddd Y S 0 n| }dd|dS )	Nr<   zhttp.disconnectr}   rh   zhttp.requestT)r<   rf   rg   )r<   rf   )	is_setwaitread
isinstancer-   r   r   r%   StopIteration)rf   Z
body_byteschunk)r   request_completeresponse_completer   r   r$     s*    




z4_TestClientTransport.handle_request.<locals>.receiver   ra   c                   s   | d dkrDrJ d| d d< dd |  dg D d< d	n| d d
krs\J d rlJ d|  dd}|  dd}jdkrd | |s܈d d   n$| d dkr| d d | d d  d S )Nr<   zhttp.response.startz1Received multiple "http.response.start" messages.re   ri   c                 S  s    g | ]\}}|  |  fqS r   )r   r   r   r   r   r   =  rh   zE_TestClientTransport.handle_request.<locals>.send.<locals>.<listcomp>r>   Tzhttp.response.bodyz<Received "http.response.body" without "http.response.start".z7Received "http.response.body" after response completed.rf   rh   rg   FHEADr   r   r   infotemplatecontext)rK   r   r   writeseekset)rR   rf   rg   )r   
raw_kwargsr   r   response_startedr   r   r   r%   7  s$    

z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )ri   r>   r   r   )$urlr   netlocr   r   r   querysplitr   r>   r   Zmulti_itemsrK   r   r   r   r   copyr3   r   r8   r2   r   ioBytesIOrH   rZ   EventBaseExceptionr   httpxZ
ByteStreamr   Responser   r   )r!   r   r   r   r   r   r   default_portr   Zport_stringportr>   r=   r   r#   r4   r$   r%   rC   excresponser   )r   r   r   r   r   r   r   r   handle_request   s    



6
z#_TestClientTransport.handle_requestN)Trd   )r(   r)   r*   r"   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< dLdddddddddddd fddZejddddZ	ddddddde
jje
jje
jjddddddd d!d"d#dd$d%d&dd'd( fd)d*Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd-d.Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd/d0Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd1d2Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd4d5Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd6d7Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd8d9Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd:d;ZdMdd<d!d=d> fd?d@Zd ddAdBZd!ddCdDdEZdddFdGZdddHdIZdddJdKZ  ZS )N
TestClientFzFuture[None]taskNzanyio.abc.BlockingPortal | NonerC   http://testserverTrd   asyncio
testclientiP  r	   r-   r   z!typing.Literal['asyncio', 'trio']zdict[str, typing.Any] | Nonezhttpx._types.CookieTypes | Nonezdict[str, str] | Noner   r   )r   base_urlr   r   r.   r0   cookiesr>   follow_redirectsr   r   c                   s   t ||p
i d| _t|r |}ntt|}t|}|| _i | _t	| j| j
||| j|
d}|d u rfi }|dd t j||||	|d d S )N)r.   r0   )r8   r   r   r   r   z
user-agentr   )r   r>   	transportr   r   )r,   async_backendr   r   r   r   r   r   r   r   _portal_factory
setdefaultsuperr"   )r!   r   r   r   r   r.   r0   r   r>   r   r   Zasgi_appr   	__class__r   r   r"   l  s2    zTestClient.__init__z6typing.Generator[anyio.abc.BlockingPortal, None, None]r;   c                 c  sR   | j d ur| j V  n:tjjf i | j}|V  W d    n1 sD0    Y  d S r    )rC   rZ   from_threadstart_blocking_portalr   )r!   rC   r   r   r   r     s    

zTestClient._portal_factoryrj   rn   filesr~   paramsr>   r   authr   timeoutr   zhttpx._types.URLTypesz"httpx._types.RequestContent | Nonez_RequestData | Nonez httpx._types.RequestFiles | NonerT   z#httpx._types.QueryParamTypes | Nonezhttpx._types.HeaderTypes | Nonez7httpx._types.AuthTypes | httpx._client.UseClientDefaultz%bool | httpx._client.UseClientDefaultz:httpx._types.TimeoutTypes | httpx._client.UseClientDefaultr   )r   r   rj   rn   r   r~   r   r>   r   r   r   r   r   r   c                  s0   |  |}t j|||||||||	|
|||dS Nr   )Z
_merge_urlr   r   )r!   r   r   rj   rn   r   r~   r   r>   r   r   r   r   r   r   r   r   r     s     
zTestClient.requestr   r>   r   r   r   r   r   )	r   r   r>   r   r   r   r   r   r   c          	   
     s   t  j||||||||dS Nr   )r   rK   	r!   r   r   r>   r   r   r   r   r   r   r   r   rK     s    zTestClient.getc          	   
     s   t  j||||||||dS r   )r   optionsr   r   r   r   r     s    zTestClient.optionsc          	   
     s   t  j||||||||dS r   )r   headr   r   r   r   r     s    zTestClient.head)r   rj   rn   r   r~   r   r>   r   r   r   r   r   r   c                  s$   t  j|||||||||	|
||dS r   )r   postr!   r   rj   rn   r   r~   r   r>   r   r   r   r   r   r   r   r   r     s    zTestClient.postc                  s$   t  j|||||||||	|
||dS r   )r   putr   r   r   r   r   "  s    zTestClient.putc                  s$   t  j|||||||||	|
||dS r   )r   patchr   r   r   r   r   A  s    zTestClient.patchc          	   
     s   t  j||||||||dS r   )r   deleter   r   r   r   r   `  s    zTestClient.deleteztyping.Sequence[str] | Noner3   )r   r   kwargsr   c              
     s   t d|}|di }|dd |dd |dd |d urT|d	d
| ||d< zt jd|fi | W n* ty } z|j}W Y d }~nd }~0 0 td|S )Nzws://testserverr>   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-versionZ13r   z, GETzExpected WebSocket upgrade)	r   rK   r   rl   r   r   r2   r4   RuntimeError)r!   r   r   r   r>   r   r4   r   r   r   websocket_connectw  s    
zTestClient.websocket_connectc                   s   t  }|tjjf i j _ |jddfdd}t	t
j}t	t
j}g ||R D ]}||j qht| _t| _ j_ j |jdd fdd}| _W d    n1 s0    Y  S )Nr   r;   c                     s
   d  _ d S r    )rC   r   r   r   r   reset_portal  s    z*TestClient.__enter__.<locals>.reset_portalc                     s     j d S r    )rH   wait_shutdownr   rC   r!   r   r   r     s    z+TestClient.__enter__.<locals>.wait_shutdown)r@   rA   rB   rZ   r   r   r   rC   rF   r[   r\   r]   rL   r   stream_sendstream_receiveZstart_task_soonlifespanr   rH   wait_startuprM   rN   )r!   rO   r   r%   r$   Zchannelr   r   r   r   rS     s$    
 



(zTestClient.__enter__rU   c                 G  s   | j   d S r    )rN   rL   rX   r   r   r   rW     s    zTestClient.__exit__c              	     sX   d| j d}z2| || jj| jjI d H  W | jd I d H  n| jd I d H  0 d S )Nr   )r<   r   )r   r   r   r$   r   r%   )r!   r#   r   r   r   r     s    zTestClient.lifespanc                   s`    j ddiI d H  dd fdd}| I d H }|d dv sDJ |d dkr\| I d H  d S )	Nr<   zlifespan.startuprT   r;   c                    s&    j  I d H } | d u r" j  | S r    r   r$   r   rG   rR   r   r   r   r$     s    
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedr  r   r%   r!   r$   rR   r   r   r   r    s    zTestClient.wait_startupc                   s`   dd fdd} j ddiI d H  | I d H }|d dv sDJ |d dkr\| I d H  d S )	NrT   r;   c                    s&    j  I d H } | d u r" j  | S r    r  r  r   r   r   r$     s    
z)TestClient.wait_shutdown.<locals>.receiver<   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedr  r  r  r   r   r   r     s    zTestClient.wait_shutdown)	r   Trd   r   NNNTr   )N)r(   r)   r*   Z__test__r1   rC   r"   r@   contextmanagerr   r   Z_clientZUSE_CLIENT_DEFAULTr   rK   r   r   r   r   r   r   r   rS   rW   r   r  r   __classcell__r   r   r   r   r   g  s   
         ((0&&&&.#.#.#& r   )A
__future__r   r@   r   r   r~   r\   sysr   concurrent.futuresr   typesr   urllib.parser   r   rZ   Z	anyio.abcZanyio.from_threadZanyio.streams.stapledr   Zstarlette._utilsr   Zstarlette.typesr	   r
   r   r   r   Zstarlette.websocketsr   version_infor   Ztyping_extensionsr   ModuleNotFoundErrorr   CallableContextManagerabcZBlockingPortalr7   	AwaitableZASGIInstancer   r6   Mappingr-   UnionIterableru   Z_RequestDatar   r   	TypedDictr,   	Exceptionr2   r   r5   r3   BaseTransportr   ZClientr   r   r   r   r   <module>   sV   

 

i *