o
    1)h'                     @  s  d dl m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 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 ddlmZ ejrid dlmZ d dlmZ ddlm Z  G dd dej!j"Z"da#dddZ$G dd deZ%G dd deZ&dS )    )annotationsN)contextmanager)	ExitStack)copy)TracebackType)urlsplit)	CliRunner)Result)Client)Request   )
ScriptInfo)SessionMixin)WSGIEnvironment)TestResponse)Flaskc                      s6   e Zd ZdZ				dd fddZd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strbase_url
str | None	subdomain
url_schemeargst.AnykwargsreturnNonec                   s   |s|s|r|d ut |p|ksJ d|d u r\|jdpd}|jd }	|r.| d| }|d u r7|jd }t|}
|
jp?| d|
jpE| d|	d }|
j}|
jr\| d	|
j }|| _	t
 j||g|R i | d S )
Nz8Cannot pass "subdomain" or "url_scheme" with "base_url".ZSERVER_NAME	localhostZAPPLICATION_ROOT.ZPREFERRED_URL_SCHEMEz://r   ?)boolconfiggetr   schemenetloclstripr   queryr   super__init__)selfr   r   r   r   r   r   r   Z	http_hostZapp_rooturl	__class__ LC:\Users\User\Downloads\Proyecto_IoT\venv\Lib\site-packages\flask/testing.pyr+   1   s.   



 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,   r2   r   r0   r0   r1   
json_dumpsX   s   zEnvironBuilder.json_dumps)r   NNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r2   r   r   r   r   r   )__name__
__module____qualname____doc__r+   r5   __classcell__r0   r0   r.   r1   r      s    'r    r   r   c                   C  s   t stjda t S )Nwerkzeug)_werkzeug_version	importlibmetadataversionr0   r0   r0   r1   _get_werkzeug_versiond   s   rA   c                      sx   e Zd ZU dZded< d) fd	d
Zed*ddZd+ddZd,ddZ	dddd- fddZ
d.dd Zd/d'd(Z  ZS )0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   r   r   c                   s>   t  j|i | d| _g | _t | _ddt  d| _d S )NFz	127.0.0.1z	Werkzeug/)ZREMOTE_ADDRZHTTP_USER_AGENT)r*   r+   preserve_context_new_contextsr   _context_stackrA   environ_base)r,   r   r   r.   r0   r1   r+   }   s   
zFlaskClient.__init__t.Iterator[SessionMixin]c                 o  s    | j du r
td| j}|j|i |}| |jj | |j||j}W d   n1 s1w   Y  |du r>t	d|V  |
 }|j|rMdS | |j||| W d   n1 sbw   Y  | |jjdd |jj|jd 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.
        Nz>Cookies are disabled. Create a client with 'use_cookies=True'.z'Session backend did not open a session.:r   z
Set-Cookie)_cookies	TypeErrorrC   Ztest_request_contextZ_add_cookies_to_wsgirequestenvironZsession_interfaceZopen_sessionRuntimeErrorresponse_classZis_null_sessionZsave_sessionZ_update_cookies_from_responsehost	partitionr   headersgetlist)r,   r   r   r   ctxsessrespr0   r0   r1   session_transaction   s2   

zFlaskClient.session_transactionotherr   c                 C  s$   i | j |}| jr| jj|d< |S )Nzwerkzeug.debug.preserve_context)rG   rD   rE   append)r,   rX   outr0   r0   r1   _copy_environ   s   zFlaskClient._copy_environtuple[t.Any, ...]dict[str, t.Any]BaseRequestc                 C  sL   |  |di |d< t| jg|R i |}z	| W |  S |  w )NrG   )r[   r%   r   rC   get_requestclose)r,   r   r   builderr0   r0   r1   _request_from_builder_args   s
   z&FlaskClient._request_from_builder_argsFbufferedfollow_redirectsrd   r#   re   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   rG   rc   )
isinstancer<   testr   dictr^   r   r[   rG   r_   Zfrom_environrC   rM   rb   rF   r`   r*   openr3   Zjson_modulerE   popenter_context)	r,   rd   re   r   r   ra   rL   responsecmr.   r0   r1   ri      s8   



zFlaskClient.openc                 C  s   | j rtdd| _ | S )NzCannot nest client invocationsT)rD   rN   r,   r0   r0   r1   	__enter__   s   zFlaskClient.__enter__exc_typetype | None	exc_valueBaseException | NonetbTracebackType | Nonec                 C  s   d| _ | j  d S )NF)rD   rF   r`   )r,   rp   rr   rt   r0   r0   r1   __exit__   s   zFlaskClient.__exit__)r   r   r   r   r   r   )r   r   r   r   r   rH   )rX   r   r   r   )r   r\   r   r]   r   r^   )
r   r   rd   r#   re   r#   r   r   r   r   )r   rB   )rp   rq   rr   rs   rt   ru   r   r   )r6   r7   r8   r9   __annotations__r+   r   rW   r[   rb   ri   ro   rv   r:   r0   r0   r.   r1   rB   m   s   
 

1

-rB   c                      s4   e Zd ZdZd fdd	Z	
dd 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   r   r   c                   s   || _ t jdi | d S )Nr0   )r   r*   r+   )r,   r   r   r.   r0   r1   r+     s   zFlaskCliRunner.__init__Nclir   r	   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.
        Nr2   c                     s    j S )N)r   r0   rn   r0   r1   <lambda>(  s    z'FlaskCliRunner.invoke.<locals>.<lambda>)Z
create_app)r   ry   r   r*   invoke)r,   ry   r   r   r.   rn   r1   r{     s
   zFlaskCliRunner.invoke)r   r   r   r   r   r   )NN)ry   r   r   r   r   r   r   r	   )r6   r7   r8   r9   r+   r{   r:   r0   r0   r.   r1   rx   	  s
    rx   )r   r   )'
__future__r   importlib.metadatar>   typingt
contextlibr   r   r   typesr   urllib.parser   Zwerkzeug.testr<   Zclick.testingr   r	   r
   Zwerkzeug.wrappersr   r^   ry   r   sessionsr   TYPE_CHECKINGZ_typeshed.wsgir   r   r   r   rg   r   r=   rA   rB   rx   r0   r0   r0   r1   <module>   s2    F
	 