o
    i'                     @   s   d Z ddl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 G dd dejjZdd ZG dd deZG dd deZdS )z
    flask.testing
    ~~~~~~~~~~~~~

    Implements test support helpers.  This module is lazily imported
    and usually not used in production environments.

    :copyright: 2010 Pallets
    :license: BSD-3-Clause
    N)contextmanager)	CliRunner)Client)	url_parse   )_request_ctx_stack)
ScriptInfo)dumpsc                       s2   e Zd ZdZ				d fdd	Z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`.
    /Nc                    s   |s|s|r|d ut |p|ksJ d|d u rb|jdpd}|jd }	|r-d||}|d u r6|jd }t|}
dj|
jp@||
jpD||	dd	}|
j}|
j	rbt
|
j	trYd
nd}|||
j	 7 }|| _tt| j||g|R i | d S )Nz8Cannot pass "subdomain" or "url_scheme" with "base_url".SERVER_NAME	localhostAPPLICATION_ROOTz{0}.{1}PREFERRED_URL_SCHEMEz{scheme}://{netloc}/{path}r   )schemenetlocpath   ??)boolconfiggetformatr   r   r   lstripr   query
isinstancebytesappsuperr
   __init__)selfr   r   base_url	subdomain
url_schemeargskwargs	http_hostapp_rooturlsep	__class__ H/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/flask/testing.pyr   /   s6   


$zEnvironBuilder.__init__c                 K   s   | d| j t|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   )
setdefaultr   
json_dumps)r    objr%   r,   r,   r-   r/   X   s   zEnvironBuilder.json_dumps)r   NNN)__name__
__module____qualname____doc__r   r/   __classcell__r,   r,   r*   r-   r
      s    )r
   c                  O   s   t td t| i |S )zCreate a :class:`flask.testing.EnvironBuilder`.

    .. deprecated: 1.1
        Will be removed in 2.0. Construct
        ``flask.testing.EnvironBuilder`` directly instead.
    z"make_test_environ_builder()" is deprecated and will be removed in 2.0. Construct "flask.testing.EnvironBuilder" directly instead.)warningswarnDeprecationWarningr
   )r$   r%   r,   r,   r-   make_test_environ_builderb   s   r9   c                       sH   e Zd ZdZdZ fddZedd Zdd Zd	d
 Z	dd Z
  ZS )FlaskClientaD  Works like a regular Werkzeug test client but has some knowledge about
    how Flask works to defer the cleanup of the request context stack to the
    end of a ``with`` body when used in a ``with`` statement.  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 :ref:`testing` chapter.
    Fc                    s,   t t| j|i | ddtj d| _d S )Nz	127.0.0.1z	werkzeug/)REMOTE_ADDRHTTP_USER_AGENT)r   r:   r   werkzeug__version__environ_base)r    r$   r%   r*   r,   r-   r      s   zFlaskClient.__init__c              	   o   s    | j du r
td| j}|di }| j | tj}|j|i |O}|j}|	||j
}|du r7tdt| z	|V  W t  nt  w | }	||s[||||	 |	|j
j}
| j |j
j|
 W d   dS 1 svw   Y  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:Session transactions only make sense with cookies enabled.environ_overridesz?Session backend did not open a session. Check the configuration)
cookie_jarRuntimeErrorapplicationr.   inject_wsgir   toptest_request_contextsession_interfaceopen_sessionrequestpushpopresponse_classis_null_sessionsave_sessionget_wsgi_headersenvironextract_wsgi)r    r$   r%   r   r@   outer_reqctxcrG   sessrespheadersr,   r,   r-   session_transaction   s4   


"zFlaskClient.session_transactionc                 O   s   | dd}| dd}| dd}|sJt|dkrJt|d tjjtfrJ| j }t|d tjjr=|	|d 
  n|	|d  | j|d< n,| j|di d< |d	| j t| jg|R i |}z
|
 }W |  n|  w tj| ||||d
S )Nas_tupleFbufferedfollow_redirectsr   r   zflask._preserve_contextr@   r?   )rX   rY   rZ   )rK   lenr   r=   testr
   dictr?   copyupdateget_environpreserve_contextr.   rC   closer   open)r    r$   r%   rX   rY   rZ   rP   builderr,   r,   r-   rc      s:   


zFlaskClient.openc                 C   s   | j rtdd| _ | S )NzCannot nest client invocationsT)ra   rB   r    r,   r,   r-   	__enter__   s   zFlaskClient.__enter__c                 C   s,   d| _ 	 tj}|d ur|jr|  nd S q)NF)ra   r   rE   	preservedrK   )r    exc_type	exc_valuetbrE   r,   r,   r-   __exit__   s   
zFlaskClient.__exit__)r1   r2   r3   r4   ra   r   r   rW   rc   rf   rk   r5   r,   r,   r*   r-   r:   s   s    
4&r:   c                       s.   e Zd ZdZ fddZ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`.
    c                    s    || _ tt| jdi | d S )Nr,   )r   r   rl   r   )r    r   r%   r*   r,   r-   r     s   zFlaskCliRunner.__init__Nc                    sH   |du r j j}d|vrt fddd|d< t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.
        Nr0   c                      s    j S )N)r   r,   re   r,   r-   <lambda>  s    z'FlaskCliRunner.invoke.<locals>.<lambda>)
create_app)r   clir   r   rl   invoke)r    ro   r$   r%   r*   re   r-   rp     s
   zFlaskCliRunner.invoke)NN)r1   r2   r3   r4   r   rp   r5   r,   r,   r*   r-   rl      s    rl   )r4   r6   
contextlibr   werkzeug.testr=   click.testingr   r   werkzeug.urlsr    r   ro   r   jsonr	   r/   r\   r
   r9   r:   rl   r,   r,   r,   r-   <module>   s   
I 
