a
    �ÏOcd)  ã                   @   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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 d
dlmZ ejr²d 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)Ú	CliRunner)ÚClient)Ú	url_parse)ÚRequesté   )Ú
ScriptInfo)Ú_cv_request)ÚSessionMixin)ÚTestResponse)ÚFlaskc                
       sb   e Zd ZdZddeeje eje eje ejejddœ‡ fdd„Zejeje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   )Ú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rÊt	|
jt
ƒr¸d	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__© úD/var/www/html/gsl.tools/lib/python3.9/site-packages/flask/testing.pyr(   -   s4    
ÿþü

ÿÿzEnvironBuilder.__init__)Úobjr   r   c                 K   s   | j jj|fi |¤ŽS )z³Serialize ``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)   r0   r   r.   r.   r/   Ú
json_dumpsU   s    zEnvironBuilder.json_dumps)r   NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚtÚOptionalÚAnyr(   r3   Ú__classcell__r.   r.   r,   r/   r      s        ú÷(r   c                       sÈ   e Zd ZU dZded< ejejddœ‡ fdd„Zeejejej	e
ddf dœdd	„ƒZd
d„ Zdd„ Zdddœejeeejddœ‡ fdd„Zd dœdd„Zeje eje eje 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   ÚapplicationN)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,   r.   r/   r(   n   s    
þzFlaskClient.__init__c              
   o   sþ   | j du rtdƒ‚| j}| di ¡}| j  |¡ t d¡}|j|i |¤Ž� }|j}| 	||j
¡}|du rptdƒ‚t |¡}	z|V  W t |	¡ nt |	¡ 0 | ¡ }
| |¡s¼| |||
¡ |
 |j
j¡}| j  |j
j|¡ W d  ƒ n1 sð0    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)Z
cookie_jarÚRuntimeErrorr>   Ú
setdefaultZinject_wsgir   r    Ztest_request_contextÚsession_interfaceZopen_sessionÚrequestÚsetÚresetÚresponse_classZis_null_sessionZsave_sessionZget_wsgi_headersÚenvironZextract_wsgi)r)   r   r   r   rE   Zouter_reqctxÚcrH   ÚsessÚtokenÚrespÚheadersr.   r.   r/   Úsession_transactionx   s0    
ÿ
ÿ

zFlaskClient.session_transactionc                 C   s$   i | j ¥|¥}| jr | jj|d< |S )Nzwerkzeug.debug.preserve_context)rD   r?   r@   Úappend)r)   ÚotherÚoutr.   r.   r/   Ú_copy_environ¯   s    zFlaskClient._copy_environc                 C   sP   |   | di ¡¡|d< t| jg|¢R i |¤Ž}z| ¡ W | ¡  S | ¡  0 d S )NrD   )rW   r    r   r>   Úget_requestÚclose)r)   r   r   Úbuilderr.   r.   r/   Ú_request_from_builder_args·   s    þz&FlaskClient._request_from_builder_argsF©ÚbufferedÚfollow_redirectsr   )r   r]   r^   r   r   c          	         sö   |r¢t |d tjjttfƒr¢t |d tjjƒrVt|d ƒ}|  |jpFi ¡|_| 	¡ }q®t |d tƒr†tj
|d | j|  i ¡d� 	¡ }q®t|d ƒ}|  |j¡|_n|  ||¡}| j ¡  tƒ j|||d�}| jj|_| jrò| j ¡ }| j |¡ qÔ|S )Nr   )r   rD   r\   )r%   rB   Útestr   ÚdictÚBaseRequestr   rW   rD   rX   Zfrom_environr>   rM   r[   rA   rY   r'   Úopenr1   Zjson_moduler@   ÚpopÚenter_context)	r)   r]   r^   r   r   rZ   rI   ÚresponseÚcmr,   r.   r/   rb   À   s2    ÿ
ÿ
ý

zFlaskClient.open)r   c                 C   s   | j rtdƒ‚d| _ | S )NzCannot nest client invocationsT)r?   rF   ©r)   r.   r.   r/   Ú	__enter__í   s    zFlaskClient.__enter__)Úexc_typeÚ	exc_valueÚtbr   c                 C   s   d| _ | j ¡  d S )NF)r?   rA   rY   )r)   ri   rj   rk   r.   r.   r/   Ú__exit__ó   s    zFlaskClient.__exit__)r4   r5   r6   r7   Ú__annotations__r9   r;   r(   r   Ú	Generatorr   rS   rW   r[   r   rb   rh   r:   ÚtypeÚBaseExceptionr   rl   r<   r.   r.   r,   r/   r=   ^   s0   

þ6üú-ûr=   c                       sN   e Zd ZdZdejddœ‡ fdd„Zd
ejejejejdœ‡ fdd	„Z‡  ZS )ÚFlaskCliRunnerz®A :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   N)r   r   r   c                    s   || _ tƒ jf i |¤Ž d S ©N)r   r'   r(   )r)   r   r   r,   r.   r/   r(     s    zFlaskCliRunner.__init__)Ú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.
        Nr0   c                      s   ˆ j S rr   )r   r.   rg   r.   r/   Ú<lambda>  ó    z'FlaskCliRunner.invoke.<locals>.<lambda>)Z
create_app)r   rs   r   r'   Úinvoke)r)   rs   r   r   r,   rg   r/   rv     s
    zFlaskCliRunner.invoke)NN)	r4   r5   r6   r7   r9   r;   r(   rv   r<   r.   r.   r,   r/   rq   ý   s    ÿþrq   ) Útypingr9   Ú
contextlibr   r   r   Útypesr   Zwerkzeug.testrB   Zclick.testingr   r   Zwerkzeug.urlsr   Zwerkzeug.wrappersr	   ra   rs   r   Úglobalsr   Úsessionsr   ÚTYPE_CHECKINGr   r   r   r_   r   r=   rq   r.   r.   r.   r/   Ú<module>   s&   G  