
     f'                    H   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 ej        rd dlmZ d dlmZ ddlmZ  G d dej         j!                  Z!da"ddZ# G d de          Z$ G d de          Z%dS )    )annotationsN)contextmanager)	ExitStack)copy)TracebackType)urlsplit)	CliRunner)Client)Request   )
ScriptInfo)SessionMixin)WSGIEnvironment)TestResponse)Flaskc                  6     e Zd ZdZ	 	 	 	 dd fdZddZ x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|r!|d ut          |p|          k    s
J d            ||j                            d          pd}|j        d         }	|r| d| }||j        d         }t          |          }
|
j        p| d|
j        p| d|	                    d           }|
j        }|
j        r+t          |
j        t                    rd	nd
}|||
j        z   z  }|| _         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__s               P/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/flask/testing.pyr3   zEnvironBuilder.__init__0   s}     	F	 	FZ 	FD #
 
=
 =
 =
 F	=
 =
 =
 
}55DIz"45H 7(66966	! Z(>?
4..C:+ + +
0Gi + +OOC((+ +  8Dy ((E::Cddci'x9$999&99999    objc                2     | 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)r4   r<   r   s      r:   
json_dumpszEnvironBuilder.json_dumpsX   s#     #tx}"311&111r;   )r   NNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    )r<   r   r   r   r   r   )__name__
__module____qualname____doc__r3   r@   __classcell__r9   s   @r:   r   r      so         0 # $!%&: &: &: &: &: &: &:P2 2 2 2 2 2 2 2r;   r    r   r   c                 \    t           st          j                            d          a t           S )Nwerkzeug)_werkzeug_version	importlibmetadataversion r;   r:   _get_werkzeug_versionrO   d   s*      C%.66zBBr;   c                  |     e Zd ZU dZded<   d" fd	Zed#d            Zd$dZd%dZ	dddd& fdZ
d'dZd(d!Z x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   r   r    c                     t                      j        |i | d| _        g | _        t	                      | _        ddt                       d| _        d S )NFz	127.0.0.1z	Werkzeug/)REMOTE_ADDRHTTP_USER_AGENT)r2   r3   preserve_context_new_contextsr   _context_stackrO   environ_base)r4   r   r   r9   s      r:   r3   zFlaskClient.__init__}   se    $)&))) %<>'kk&D+@+B+BDD
 
r;   t.Iterator[SessionMixin]c              /    K   | j         t          d          | j        } |j        |i |}|                     |j        j                   |5  |j                            ||j                  }ddd           n# 1 swxY w Y   |t          d          |V  |
                                }|j                            |          rdS |5  |j                            |||           ddd           n# 1 swxY w 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	TypeErrorrR   test_request_context_add_cookies_to_wsgirequestenvironsession_interfaceopen_sessionRuntimeErrorresponse_classis_null_sessionsave_session_update_cookies_from_responsehost	partitionr   headersgetlist)r4   r   r   r   ctxsessresps          r:   session_transactionzFlaskClient.session_transaction   s     ( = P   &c&777!!#+"5666 	H 	H(55c3;GGD	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H <HIII


!!## 0066 	F 	@ 	@!..sD$???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	**K&&s++A.KL  ..	
 	
 	
 	
 	
s$   !A;;A?A?C66C:=C:otherr   c                H    i | j         |}| j        r| j        j        |d<   |S )Nzwerkzeug.debug.preserve_context)rY   rV   rW   append)r4   rr   outs      r:   _copy_environzFlaskClient._copy_environ   s6    ,",e,  	O595G5NC12
r;   tuple[t.Any, ...]dict[str, t.Any]BaseRequestc                   |                      |                    di                     |d<   t          | j        g|R i |}	 |                                |                                 S # |                                 w xY w)NrY   )rv   r+   r   rR   get_requestclose)r4   r   r   builders       r:   _request_from_builder_argsz&FlaskClient._request_from_builder_args   s     "&!3!3FJJ~r4R4R!S!S~ !1CDCCCFCC	&&((MMOOOOGMMOOOOs   A+ +BFbufferedfollow_redirectsr   r)   r   r   c                  |rAt          |d         t          j        j        t          t
          f          rt          |d         t          j        j                  rKt          |d                   }|                     |j        pi           |_        |	                                }nt          |d         t                    rNt          
                    |d         | j        |                     i                     	                                }nKt          |d                   }|                     |j                  |_        n|                     ||          }| j                                         t!                                          |||          }| j        j        |_        | j        r:| j                                        }| j                            |           | j        :|S )Nr   )r   rY   r   )r0   rI   testr   dictry   r   rv   rY   r{   from_environrR   rb   r~   rX   r|   r2   openr>   json_modulerW   popenter_context)
r4   r   r   r   r   r}   ra   responsecmr9   s
            r:   r   zFlaskClient.open   s     	DJGhm2D+F
 
 	D $q'8=#?@@ FtAw--'+'9'9':N:TRT'U'U$!--//DGT** F(55G!1@R@RSU@V@V 6  +-- 
 tAw--"&"4"4W_"E"E 55dFCCG
 	!!###77<<-   
 

  $/4   	2#''))B--b111   	2 r;   c                @    | j         rt          d          d| _         | S )NzCannot nest client invocationsT)rV   re   r4   s    r:   	__enter__zFlaskClient.__enter__   s*      	A?@@@ $r;   exc_typetype | None	exc_valueBaseException | NonetbTracebackType | Nonec                F    d| _         | j                                         d S )NF)rV   rX   r|   )r4   r   r   r   s       r:   __exit__zFlaskClient.__exit__   s'     !&!!#####r;   )r   r   r   r   r   r    )r   r   r   r   r   rZ   )rr   r   r   r   )r   rw   r   rx   r   ry   )
r   r   r   r)   r   r)   r   r   r   r   )r   rQ   )r   r   r   r   r   r   r   r    )rA   rB   rC   rD   __annotations__r3   r   rq   rv   r~   r   r   r   rE   rF   s   @r:   rQ   rQ   m   s           
 
 
 
 
 
 /
 /
 /
 ^/
b   	 	 	 	 !&	+ + + + + + + +Z   $ $ $ $ $ $ $ $r;   rQ   c                  4     e Zd ZdZd fdZ	 dd fdZ x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                H    || _          t                      j        di | d S )NrN   )r   r2   r3   )r4   r   r   r9   s      r:   r3   zFlaskCliRunner.__init__  s-    ""6"""""r;   Nclir   c                     | j         j        }d|vrt           f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.
        Nr<   c                      j         S )N)r   r   s   r:   <lambda>z'FlaskCliRunner.invoke.<locals>.<lambda>(  s	    $( r;   )
create_app)r   r   r   r2   invoke)r4   r   r   r   r9   s   `   r:   r   zFlaskCliRunner.invoke  s]    " ;(,C&2B2B2B2BCCCF5Muww~c4226222r;   )r   r   r   r   r   r    )NN)r   r   r   r   r   r   r   r   )rA   rB   rC   rD   r3   r   rE   rF   s   @r:   r   r   	  so         
# # # # # #
 043 3 3 3 3 3 3 3 3 3 3r;   r   )r   r   )&
__future__r   importlib.metadatarK   typingt
contextlibr   r   r   typesr   urllib.parser   werkzeug.testrI   click.testingr	   r
   werkzeug.wrappersr   ry   r   r   sessionsr   TYPE_CHECKING_typeshed.wsgir   r   r   r   r   r   rJ   rO   rQ   r   rN   r;   r:   <module>r      s   " " " " " "         % % % % % %                         ! ! ! ! ! !     # # # # # #             4 4 4 4 4 4       " " " " " "? ......******D2 D2 D2 D2 D2X]1 D2 D2 D2N     Y$ Y$ Y$ Y$ Y$& Y$ Y$ Y$x!3 !3 !3 !3 !3Y !3 !3 !3 !3 !3r;   