o
    d)                     @   s   d dl Zd dlmZ d dlmZ d dlmZ d dlmZ d dlm	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 d
dlmZ ejrSd dl
mZ d
dlmZ G dd dejjZG dd deZG dd deZdS )    N)contextmanager)	ExitStack)copy)TracebackType)urlsplit)	CliRunner)Client)Request   )
ScriptInfo)SessionMixin)TestResponse)Flaskc                       s|   e Zd ZdZ				ddddedeje deje d	eje d
ejdejddf fddZdejdejdefddZ	  Z
S )EnvironBuildera  An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the
    application.

    :param app: The Flask application to configure the environment from.
    :param path: URL path being requested.
    :param base_url: Base URL where the app is being served, which
        ``path`` is relative to. If not given, built from
        :data:`PREFERRED_URL_SCHEME`, ``subdomain``,
        :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`.
    :param subdomain: Subdomain name to append to :data:`SERVER_NAME`.
    :param url_scheme: Scheme to use instead of
        :data:`PREFERRED_URL_SCHEME`.
    :param json: If given, this is serialized as JSON and passed as
        ``data``. Also defaults ``content_type`` to
        ``application/json``.
    :param args: other positional arguments passed to
        :class:`~werkzeug.test.EnvironBuilder`.
    :param kwargs: other keyword arguments passed to
        :class:`~werkzeug.test.EnvironBuilder`.
    /Nappr   pathbase_url	subdomain
url_schemeargskwargsreturnc                    s   |s|s|r|d ut |p|ksJ d|d u re|jdpd}|jd }	|r.| d| }|d u r7|jd }t|}
|
jp?| d|
jpE| d|	d }|
j}|
jret	|
jt
r\d	nd
}|||
j 7 }|| _t j||g|R i | d S )Nz8Cannot pass "subdomain" or "url_scheme" with "base_url".SERVER_NAME	localhostAPPLICATION_ROOT.PREFERRED_URL_SCHEMEz://r      ??)boolconfiggetr   schemenetloclstripr   query
isinstancebytesr   super__init__)selfr   r   r   r   r   r   r   	http_hostapp_rooturlsep	__class__ R/var/www/html/visualizacion-main/env/lib/python3.10/site-packages/flask/testing.pyr*   ,   s4   


 zEnvironBuilder.__init__objc                 K   s   | j jj|fi |S )zSerialize ``obj`` to a JSON-formatted string.

        The serialization will be configured according to the config associated
        with this EnvironBuilder's ``app``.
        )r   jsondumps)r+   r4   r   r2   r2   r3   
json_dumpsT   s   zEnvironBuilder.json_dumps)r   NNN)__name__
__module____qualname____doc__strtOptionalAnyr*   r7   __classcell__r2   r2   r0   r3   r      s0    	"(r   c                       s   e Zd ZU dZded< dejdejddf fdd	Zedejdejdej	e
ddf fd
dZdd Zdd Zddddejdededejddf
 fddZdddZdeje deje deje ddfddZ  ZS )FlaskClienta  Works like a regular Werkzeug test client but has knowledge about
    Flask's contexts to defer the cleanup of the request context until
    the end of a ``with`` block. For general information about how to
    use this class refer to :class:`werkzeug.test.Client`.

    .. versionchanged:: 0.12
       `app.test_client()` includes preset default environment, which can be
       set after instantiation of the `app.test_client()` object in
       `client.environ_base`.

    Basic usage is outlined in the :doc:`/testing` chapter.
    r   applicationr   r   r   Nc                    s>   t  j|i | d| _g | _t | _ddtj d| _d S )NFz	127.0.0.1z	werkzeug/)REMOTE_ADDRHTTP_USER_AGENT)	r)   r*   preserve_context_new_contextsr   _context_stackwerkzeug__version__environ_base)r+   r   r   r0   r2   r3   r*   m   s   
zFlaskClient.__init__c              	   o   s   t | dr	| jn| j}|du rtd| j}|j|i |}t | dr,| |jj n| j	|jj | |j
||j}W d   n1 sIw   Y  |du rVtd|V  | }|j
|redS | |j
||| W d   n1 szw   Y  t | drz| |jjdd |jj|jd	 W dS  ty   | |jjdd |jd	 Y dS w | j|jj|j dS )
a  When used in combination with a ``with`` statement this opens a
        session transaction.  This can be used to modify the session that
        the test client uses.  Once the ``with`` block is left the session is
        stored back.

        ::

            with client.session_transaction() as session:
                session['value'] = 42

        Internally this is implemented by going through a temporary test
        request context and since session handling could depend on
        request variables this function accepts the same arguments as
        :meth:`~flask.Flask.test_request_context` which are directly
        passed through.
        _cookiesNz>Cookies are disabled. Create a client with 'use_cookies=True'._add_cookies_to_wsgiz'Session backend did not open a session._update_cookies_from_response:r   z
Set-Cookie)hasattrrK   
cookie_jar	TypeErrorrB   test_request_contextrL   requestenvironinject_wsgisession_interfaceopen_sessionRuntimeErrorresponse_classis_null_sessionsave_sessionrM   host	partitionr   headersgetlistextract_wsgi)r+   r   r   cookie_storager   ctxsessrespr2   r2   r3   session_transactionw   sN   






zFlaskClient.session_transactionc                 C   s$   i | j |}| jr| jj|d< |S )Nzwerkzeug.debug.preserve_context)rJ   rE   rF   append)r+   otheroutr2   r2   r3   _copy_environ   s   zFlaskClient._copy_environc                 C   sL   |  |di |d< t| jg|R i |}z	| W |  S |  w )NrJ   )ri   r"   r   rB   get_requestclose)r+   r   r   builderr2   r2   r3   _request_from_builder_args   s
   z&FlaskClient._request_from_builder_argsFbufferedfollow_redirectsro   rp   r   c          	         s   |rQt |d tjjttfrQt |d tjjr+t|d }| |jp#i |_|	 }n,t |d trCtj
|d | j| i d	 }nt|d }| |j|_n| ||}| j  t j|||d}| jj|_| jr{| j }| j| | jsm|S )Nr   )r   rJ   rn   )r'   rH   testr   dictBaseRequestr   ri   rJ   rj   from_environrB   rT   rm   rG   rk   r)   openr5   json_modulerF   popenter_context)	r+   ro   rp   r   r   rl   rS   responsecmr0   r2   r3   ru      s8   



zFlaskClient.openc                 C   s   | j rtdd| _ | S )NzCannot nest client invocationsT)rE   rX   r+   r2   r2   r3   	__enter__   s   zFlaskClient.__enter__exc_type	exc_valuetbc                 C   s   d| _ | j  d S )NF)rE   rG   rk   )r+   r}   r~   r   r2   r2   r3   __exit__  s   zFlaskClient.__exit__)r   rA   )r8   r9   r:   r;   __annotations__r=   r?   r*   r   	Generatorr   re   ri   rm   r    ru   r|   r>   typeBaseExceptionr   r   r@   r2   r2   r0   r3   rA   ]   sJ   
 
F
-rA   c                	       sZ   e Zd ZdZdddejddf fddZ	dd	ejd
ejdejdejf fddZ  ZS )FlaskCliRunnerzA :class:`~click.testing.CliRunner` for testing a Flask app's
    CLI commands. Typically created using
    :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`.
    r   r   r   r   Nc                    s   || _ t jdi | d S )Nr2   )r   r)   r*   )r+   r   r   r0   r2   r3   r*     s   zFlaskCliRunner.__init__clir   c                    sD   |du r j j}d|vrt fddd|d< t j||fi |S )ac  Invokes a CLI command in an isolated environment. See
        :meth:`CliRunner.invoke <click.testing.CliRunner.invoke>` for
        full method documentation. See :ref:`testing-cli` for examples.

        If the ``obj`` argument is not given, passes an instance of
        :class:`~flask.cli.ScriptInfo` that knows how to load the Flask
        app being tested.

        :param cli: Command object to invoke. Default is the app's
            :attr:`~flask.app.Flask.cli` group.
        :param args: List of strings to invoke the command with.

        :return: a :class:`~click.testing.Result` object.
        Nr4   c                      s    j S )N)r   r2   r{   r2   r3   <lambda>+  s    z'FlaskCliRunner.invoke.<locals>.<lambda>)
create_app)r   r   r   r)   invoke)r+   r   r   r   r0   r{   r3   r     s
   zFlaskCliRunner.invoke)NN)	r8   r9   r:   r;   r=   r?   r*   r   r@   r2   r2   r0   r3   r     s    r   )typingr=   
contextlibr   r   r   typesr   urllib.parser   werkzeug.testrH   click.testingr   r   werkzeug.wrappersr	   rs   r   r   sessionsr   TYPE_CHECKINGr   r   r   rq   r   rA   r   r2   r2   r2   r3   <module>   s&    G 0