a
    }3e-                     @   s  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m	Z	m
Z
mZ d dlZd dlmZmZ d dlmZ ddlmZmZmZmZmZmZmZmZ zd dlZW n ey   dZY n0 zd dlZW n ey   dZY n0 eeeef gee f Zdd	 Z d
d Z!ej"dd Z#ej"dd Z$ej%dd Z&ej%d0ddZ'dd Z(dd Z)dd Z*ej"dd Z+ej"dd Z,ej"dd  Zej"d!d" Z-ej"d#d$ Z.ej"d%d& Z/ej"d'd( Z0ej"d)d* Z1ej"e j2e	eddf d+d,d-Z3ej"d.d/ Z4dS )1    N)Callable)Any	Awaitabler   Dict	GeneratorOptionalUnion)PY_37isasyncgenfunction)Application   )BaseTestServerRawTestServer
TestClient
TestServerloop_contextsetup_test_loopteardown_test_loopunused_portc                 C   s:   | j ddddd | j dddd	d | j d
dddd d S )N--aiohttp-fast
store_trueFz*run tests faster by disabling extra checks)actiondefaulthelpz--aiohttp-loopstorepyloopz:run tests with specific loop: pyloop, uvloop, tokio or all--aiohttp-enable-loop-debugzenable event loop debug mode)Z	addoption)parser r   H/home/pi/bot/my_env/lib/python3.9/site-packages/aiohttp/pytest_plugin.pypytest_addoption$   s$    r    c                    sb   | j  t rdnt r$dndS dd| jvrH|  jd7  _d fdd}|| _ dS )zjSet up pytest fixture.

    Allow fixtures to be coroutines. Run coroutine fixtures in an event loop.
    TFNrequestr!   c                     s~   |d }r|d= d|j vr$td|d rf| i | fdd}||   S  | i |S d S )Nr!   loopz^Asynchronous fixtures must depend on the 'loop' fixture or be used in tests depending from it.c                      s(   z   W S  ty"   Y n0 d S N)run_until_complete	__anext__StopAsyncIterationr   _loopgenr   r   	finalizerd   s    z8pytest_fixture_setup.<locals>.wrapper.<locals>.finalizer)fixturenames	ExceptionZgetfixturevalueZaddfinalizerr%   r&   )argskwargsr!   r+   funcZis_async_genZstrip_requestr(   r   wrapperO   s    


z%pytest_fixture_setup.<locals>.wrapper)r1   r
   asyncioiscoroutinefunctionargnames)Z
fixturedefr2   r   r0   r   pytest_fixture_setup9   s    

 r6   c                 C   s   | j dS )z--fast config optionr   config	getoptionr"   r   r   r   fastr   s    r:   c                 C   s   | j dS )z!--enable-loop-debug config optionr   r7   r"   r   r   r   
loop_debugx   s    r;   c               	   c   st   t jddT} dV  dd | D }|rRtdt|t|dkrBdnd	d
|W d   n1 sf0    Y  dS )zContext manager which checks for RuntimeWarnings.

    This exists specifically to
    avoid "coroutine 'X' was never awaited" warnings being missed.

    If RuntimeWarnings occur in the context a RuntimeError is raised.
    T)recordNc                 S   s"   g | ]}|j tkrd j|dqS )z#{w.filename}:{w.lineno}:{w.message})w)categoryRuntimeWarningformat).0r=   r   r   r   
<listcomp>   s   
z,_runtime_warning_context.<locals>.<listcomp>z{} Runtime Warning{},
{}r    s
)warningscatch_warningsRuntimeErrorr@   lenjoin)	_warningsrwr   r   r   _runtime_warning_context~   s    	 rM   Fc                 c   s(   | r| V  nt  } | V  t| |d dS )zPassthrough loop context.

    Sets up and tears down a loop unless one is passed in via the loop
    argument when it's passed straight through.
    r:   N)r   r   )r#   r:   r   r   r   _passthrough_loop_context   s
    rO   c                 C   s(   |  |r$t|r$t| ||S dS )z%Fix pytest collecting for coroutines.N)Zfuncnamefilterr3   r4   listZ_genfunctions)	collectornameobjr   r   r   pytest_pycollect_makeitem   s    rT   c              	      s    j d}t jr jdp0 jdd}t h t||d<} fdd j	j
D }| jf i | W d   n1 s0    Y  W d   n1 s0    Y  dS dS )	zBRun coroutines in an event loop instead of a normal function call.r   proactor_loopr#   NrN   c                    s   i | ]}| j | qS r   )funcargs)rA   arg
pyfuncitemr   r   
<dictcomp>   s   z&pytest_pyfunc_call.<locals>.<dictcomp>T)r8   r9   r3   r4   functionrV   getrM   rO   Z_fixtureinfor5   r%   rS   )rY   r:   Zexisting_loopr)   Ztestargsr   rX   r   pytest_pyfunc_call   s    
Rr]   c                 C   s   d| j vrd S | jjj}dtji}td ur4tj|d< td urFtj|d< |dkrRd}i }|	dD ]N}|
d }|d	}||vr|r`td
|t| f nq`|| ||< q`| jdt| t| d d S )Nloop_factoryr   uvlooptokioallzpyloop,uvloop?,tokio?,?z ?z&Unknown loop '%s', available loops: %s)ids)r,   r8   optionZaiohttp_loopr3   ZDefaultEventLoopPolicyr_   ZEventLoopPolicyr`   splitendswithstrip
ValueErrorrP   keysZparametrizevalues)ZmetafuncZloopsZavail_factoriesZ	factoriesrR   requiredr   r   r   pytest_generate_tests   s4    





rm   c                 c   s\   |  }t | t|d.}|r*|d t | |V  W d   n1 sN0    Y  dS )z%Return an instance of the event loop.rN   TN)r3   set_event_loop_policyr   Z	set_debugset_event_loop)r^   r:   r;   policyr)   r   r   r   r#      s    


r#   c                  c   sf   t st } tj| _nt } t|  t| j }t	| |V  W d    n1 sX0    Y  d S r$   )
r	   r3   Zget_event_loop_policyZProactorEventLoopZ_loop_factoryZWindowsProactorEventLoopPolicyrn   r   Znew_event_loopro   )rp   r)   r   r   r   rU      s    


rU   c                 C   s   t jdtdd | S )Nz3Deprecated, use aiohttp_unused_port fixture instead   
stacklevelrF   warnDeprecationWarning)aiohttp_unused_portr   r   r   r      s    r   c                   C   s   t S )z1Return a port that is unused on the current host.)_unused_portr   r   r   r   rw     s    rw   c                 #   s@   g dd fdd
}|V  ddfdd}  |  dS )z^Factory to create a TestServer instance, given an app.

    aiohttp_server(app, **kwargs)
    Nportc                   s4   t | |d}|jf d i|I d H  | |S Nry   r#   )r   start_serverappend)Zapprz   r/   serverr#   serversr   r   go  s    
zaiohttp_server.<locals>.goreturnc                      s    r    I d H  q d S r$   popcloser   r   r   r   finalize  s    z aiohttp_server.<locals>.finalizer%   r#   r   r   r   r   r   aiohttp_server  s
    r   c                 C   s   t jdtdd | S )Nz.Deprecated, use aiohttp_server fixture insteadrq   rr   rt   )r   r   r   r   test_server"  s    r   c                 #   s@   g dd fdd
}|V  ddfdd}  |  dS )zpFactory to create a RawTestServer instance, given a web handler.

    aiohttp_raw_server(handler, **kwargs)
    Nry   c                   s4   t | |d}|jf d i|I d H  | |S r{   )r   r|   r}   )handlerrz   r/   r~   r   r   r   r   4  s    
zaiohttp_raw_server.<locals>.gor   c                      s    r    I d H  q d S r$   r   r   r   r   r   r   <  s    z$aiohttp_raw_server.<locals>.finalizer   r   r   r   r   aiohttp_raw_server,  s
    r   c                 C   s   t jdtdd | S )Nz2Deprecated, use aiohttp_raw_server fixture insteadrq   rr   rt   )r   r   r   r   raw_test_serverC  s    r   )r#   r   c                 #   sb   g  ddt ttf tttttf  ttd fdd}|V  dd fdd}|  dS )	zFactory to create a TestClient instance.

    aiohttp_client(app, **kwargs)
    aiohttp_client(server, **kwargs)
    aiohttp_client(raw_server, **kwargs)
    N)server_kwargs)__paramr.   r   r/   r   c                   s   t | tr4t | ttfs4| g|R i |} i }n|r@J dt | tr||pPi }t| fdi|}t|fdi|}n0t | trt| fdi|}ntdt|  | I d H   	| |S )Nzargs should be emptyr#   zUnknown argument type: %r)

isinstancer   r   r   r   r   ri   typer|   r}   )r   r   r.   r/   r~   clientclientsr#   r   r   r   [  s     


zaiohttp_client.<locals>.gor   c                      s    r    I d H  q d S r$   r   r   )r   r   r   r   y  s    z aiohttp_client.<locals>.finalize)	r   r   r   r   r   r   strr   r%   r   r   r   r   aiohttp_clientO  s    

r   c                 C   s   t jdtdd | S )Nz.Deprecated, use aiohttp_client fixture insteadrq   rr   rt   )r   r   r   r   test_client  s    r   )F)5r3   
contextlibrF   collections.abcr   typingr   r   r   r   r   r   ZpytestZaiohttp.helpersr	   r
   Zaiohttp.webr   Z
test_utilsr   r   r   r   r   r   r   r   rx   r_   ImportErrorr`   ZAiohttpClientr    r6   Zfixturer:   r;   contextmanagerrM   rO   rT   r]   rm   r#   rU   rw   r   r   r   r   ZAbstractEventLoopr   r   r   r   r   r   <module>   sh   $(

9


"


	


	

0