a
    ì´«j…'  ã                   @  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rÒd 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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                
      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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__© úL/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/flask/testing.pyr*   1   s.    

þý

ÿÿ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+   r1   r   r/   r/   r0   Ú
json_dumpsX   s    zEnvironBuilder.json_dumps)r   NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r4   Ú__classcell__r/   r/   r-   r0   r      s       ú"'r   Ú r   ©r   c                   C  s   t stj d¡a t S )NÚwerkzeug)Ú_werkzeug_versionÚ	importlibÚmetadataÚversionr/   r/   r/   r0   Ú_get_werkzeug_versiond   s    rA   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dœdd„Zddddœ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ƒ › �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-   r/   r0   r*   }   s    
þzFlaskClient.__init__zt.Iterator[SessionMixin]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 |¡r˜dS |�  |j |||¡ W d  ƒ n1 sÂ0    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Úrespr/   r/   r0   Úsession_transaction‡   s,    
ÿ..
ýzFlaskClient.session_transactionr   )Úotherr   c                 C  s$   i | j ¥|¥}| jr | jj|d< |S )Nzwerkzeug.debug.preserve_context)rG   rD   rE   Úappend)r+   rW   Úoutr/   r/   r0   Ú_copy_environ¹   s    zFlaskClient._copy_environztuple[t.Any, ...]zdict[str, t.Any]ÚBaseRequestc                 C  sP   |   | di ¡¡|d< t| jg|¢R i |¤Ž}z| ¡ W | ¡  S | ¡  0 d S )NrG   )rZ   r$   r   rC   Úget_requestÚclose)r+   r   r   Úbuilderr/   r/   r0   Ú_request_from_builder_argsÁ   s    þz&FlaskClient._request_from_builder_argsF©ÚbufferedÚfollow_redirectsr"   r   )r   ra   rb   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D ]}| j |¡ qÚ| j ¡  |S )Nr   )r   rG   r`   )Ú
isinstancer<   Útestr   Údictr[   r   rZ   rG   r\   Zfrom_environrC   rL   r_   rF   r]   r)   Úopenr2   Zjson_modulerE   Úenter_contextÚclear)	r+   ra   rb   r   r   r^   rK   ÚresponseÚcmr-   r/   r0   rf   Ì   s2    ÿ
ÿ
ý


zFlaskClient.openr;   c                 C  s   | j rtdƒ‚d| _ | S )NzCannot nest client invocationsT)rD   rM   ©r+   r/   r/   r0   Ú	__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)rD   rF   r]   )r+   rm   rn   ro   r/   r/   r0   Ú__exit__ÿ   s    zFlaskClient.__exit__)r5   r6   r7   r8   Ú__annotations__r*   r   rV   rZ   r_   rf   rl   rp   r9   r/   r/   r-   r0   rB   m   s   

1ü-rB   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 )Ú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   r   r   )r   r   r   c                   s   || _ tƒ jf i |¤Ž d S ©N)r   r)   r*   )r+   r   r   r-   r/   r0   r*     s    zFlaskCliRunner.__init__Nr	   )Ú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.
        Nr1   c                     s   ˆ j S rs   )r   r/   rk   r/   r0   Ú<lambda>(  ó    z'FlaskCliRunner.invoke.<locals>.<lambda>)Z
create_app)r   rt   r   r)   Úinvoke)r+   rt   r   r   r-   rk   r0   rw     s
    zFlaskCliRunner.invoke)NN)r5   r6   r7   r8   r*   rw   r9   r/   r/   r-   r0   rr   	  s    ÿrr   )'Ú
__future__r   Úimportlib.metadatar>   ÚtypingÚtÚ
contextlibr   r   r   Útypesr   Úurllib.parser   Zwerkzeug.testr<   Zclick.testingr   r	   r
   Zwerkzeug.wrappersr   r[   rt   r   Úsessionsr   ÚTYPE_CHECKINGZ_typeshed.wsgir   r   r   r   rd   r   r=   rA   rB   rr   r/   r/   r/   r0   Ú<module>   s0   F	 