a
    !f(&                     @  s   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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rd 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 )    )annotationsN)contextmanager)	ExitStack)copy)TracebackType)urlsplit)	CliRunner)Client)Request   )
ScriptInfo)SessionMixin)TestResponse)Flaskc                
      sH   e Zd ZdZdddddddddd	 fd
dZddd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`.
    /Nr   strz
str | Nonet.AnyNone)apppathbase_url	subdomain
url_schemeargskwargsreturnc                   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 rn|jd }t|}
|
jp~| d|
jp| d|	d }|
j}|
jrt	|
jt
rd	nd
}|||
j 7 }|| _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   query
isinstancebytesr   super__init__)selfr   r   r   r   r   r   r   Z	http_hostZapp_rooturlsep	__class__ N/var/www/html/python-backend/venv/lib/python3.9/site-packages/flask/testing.pyr+   .   s4    


zEnvironBuilder.__init__)objr   r   c                 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,   r3   r   r1   r1   r2   
json_dumpsV   s    zEnvironBuilder.json_dumps)r   NNN)__name__
__module____qualname____doc__r+   r6   __classcell__r1   r1   r/   r2   r      s       "(r   c                      s   e Zd ZU dZded< dddd fddZeddd	dd
dZdd Zdd Z	ddddddddd fddZ
d dddZddddd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   r   r   c                   s>   t  j|i | d| _g | _t | _ddtj d| _d S )NFz	127.0.0.1z	werkzeug/)ZREMOTE_ADDRZHTTP_USER_AGENT)	r*   r+   preserve_context_new_contextsr   _context_stackwerkzeug__version__environ_base)r,   r   r   r/   r1   r2   r+   o   s    
zFlaskClient.__init__z%t.Generator[SessionMixin, None, None]c                 o  s   | j du rtd| j}|j|i |}| |jj |  |j||j}W d   n1 s`0    Y  |du rzt	d|V  |
 }|j|rdS |  |j||| W d   n1 s0    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	TypeErrorr=   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respr1   r1   r2   session_transactiony   s,    
..
zFlaskClient.session_transactionc                 C  s$   i | j |}| jr | jj|d< |S )Nzwerkzeug.debug.preserve_context)rC   r>   r?   append)r,   otheroutr1   r1   r2   _copy_environ   s    zFlaskClient._copy_environc                 C  sP   |  |di |d< t| jg|R i |}z| W |  S |  0 d S )NrC   )rV   r#   r   r=   get_requestclose)r,   r   r   builderr1   r1   r2   _request_from_builder_args   s    z&FlaskClient._request_from_builder_argsFbufferedfollow_redirectsr!   r   )r   r\   r]   r   r   c          	        s   |rt |d tjjttfrt |d tjjrVt|d }| |jpFi |_|	 }qt |d trtj
|d | j| i d	 }qt|d }| |j|_n| ||}| j  t j|||d}| jj|_| jr| j }| j| q|S )Nr   )r   rC   r[   )r(   rA   testr   dictBaseRequestr   rV   rC   rW   Zfrom_environr=   rH   rZ   r@   rX   r*   openr4   Zjson_moduler?   popenter_context)	r,   r\   r]   r   r   rY   rG   responsecmr/   r1   r2   ra      s2    



zFlaskClient.open)r   c                 C  s   | j rtdd| _ | S )NzCannot nest client invocationsT)r>   rI   r,   r1   r1   r2   	__enter__   s    zFlaskClient.__enter__ztype | NonezBaseException | NonezTracebackType | None)exc_type	exc_valuetbr   c                 C  s   d| _ | j  d S )NF)r>   r@   rX   )r,   rh   ri   rj   r1   r1   r2   __exit__   s    zFlaskClient.__exit__)r7   r8   r9   r:   __annotations__r+   r   rR   rV   rZ   ra   rg   rk   r;   r1   r1   r/   r2   r<   _   s   

1-r<   c                      sD   e Zd ZdZdddd fddZdddd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f i | d S N)r   r*   r+   )r,   r   r   r/   r1   r2   r+      s    zFlaskCliRunner.__init__N)clir   r   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.
        Nr3   c                     s    j S rn   )r   r1   rf   r1   r2   <lambda>      z'FlaskCliRunner.invoke.<locals>.<lambda>)Z
create_app)r   ro   r   r*   invoke)r,   ro   r   r   r/   rf   r2   rr     s
    zFlaskCliRunner.invoke)NN)r7   r8   r9   r:   r+   rr   r;   r1   r1   r/   r2   rm      s    rm   ) 
__future__r   typingt
contextlibr   r   r   typesr   urllib.parser   Zwerkzeug.testrA   Zclick.testingr   r	   Zwerkzeug.wrappersr
   r`   ro   r   sessionsr   TYPE_CHECKINGr   r   r   r^   r   r<   rm   r1   r1   r1   r2   <module>   s&   G 