o
    ê}”e!'  ã                   @  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 ejr]d dlmZ ddlmZ G dd„ dejjƒZda 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)ÚClient)ÚRequesté   )Ú
ScriptInfo)ÚSessionMixin)ÚTestResponse)ÚFlaskc                      s6   e Zd ZdZ				dd‡ fdd„Z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`.
    ú/NÚappr   ÚpathÚstrÚbase_urlú
str | NoneÚ	subdomainÚ
url_schemeÚargsút.AnyÚkwargsÚreturnÚNonec                   sð   |s|s|r|d ut |p|ƒksJ dƒ‚|d u re|j d¡pd}|jd }	|r.|› d|› �}|d u r7|jd }t|ƒ}
|
jp?|› d|
jpE|› d|	 d¡› �}|
j}|
jret	|
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__© úV/Users/abhinavbhinder/Documents/map/venv/lib/python3.10/site-packages/flask/testing.pyr,   /   s4   
ÿþü

ÿÿ zEnvironBuilder.__init__Úobjc                 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-   r4   r   r2   r2   r3   Ú
json_dumpsW   s   zEnvironBuilder.json_dumps)r   NNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r4   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r7   Ú__classcell__r2   r2   r0   r3   r      s    ú(r   Ú r   r   c                   C  s   t stj d¡a t S )NÚwerkzeug)Ú_werkzeug_versionÚ	importlibÚmetadataÚversionr2   r2   r2   r3   Ú_get_werkzeug_versionc   s   rC   c                      st   e Zd ZU dZded< d$‡ fd	d
„Zed%dd„ƒZdd„ Zdd„ Z	dddœd&‡ fdd„Z
d'dd„Z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_stackrC   Úenviron_base)r-   r   r   r0   r2   r3   r,   |   s   
þzFlaskClient.__init__ú%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 s1w   Y  |du r>t	dƒ‚|V  | 
¡ }|j |¡rMdS |� |j |||¡ W d  ƒ n1 sbw   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Ú	TypeErrorrE   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Úrespr2   r2   r3   Úsession_transaction†   s2   €
ÿÿÿ
ýzFlaskClient.session_transactionc                 C  s$   i | j ¥|¥}| jr| jj|d< |S )Nzwerkzeug.debug.preserve_context)rI   rF   rG   Úappend)r-   ÚotherÚoutr2   r2   r3   Ú_copy_environ¸   s   zFlaskClient._copy_environc                 C  sL   |   | di ¡¡|d< t| jg|¢R i |¤Ž}z	| ¡ W | ¡  S | ¡  w )NrI   )r]   r$   r   rE   Úget_requestÚclose)r-   r   r   Úbuilderr2   r2   r3   Ú_request_from_builder_argsÀ   s
   z&FlaskClient._request_from_builder_argsF©ÚbufferedÚfollow_redirectsrc   r"   rd   r   c          	        sú   |rQt |d tjjttfƒrQt |d tjjƒr+t|d ƒ}|  |jp#i ¡|_| 	¡ }n,t |d tƒrCtj
|d | j|  i ¡d� 	¡ }nt|d ƒ}|  |j¡|_n|  ||¡}| j ¡  tƒ j|||d�}| jj|_| jr{| j ¡ }| j |¡ | jsm|S )Nr   )r   rI   rb   )r)   r>   Útestr   ÚdictÚBaseRequestr   r]   rI   r^   Zfrom_environrE   rO   ra   rH   r_   r+   Úopenr5   Zjson_modulerG   ÚpopÚenter_context)	r-   rc   rd   r   r   r`   rN   ÚresponseÚcmr0   r2   r3   rh   É   s8   ÿ
ÿþ
ý

þzFlaskClient.openc                 C  s   | j rtdƒ‚d| _ | S )NzCannot nest client invocationsT)rF   rP   ©r-   r2   r2   r3   Ú	__enter__ö   s   zFlaskClient.__enter__Úexc_typeútype | NoneÚ	exc_valueúBaseException | NoneÚtbúTracebackType | Nonec                 C  s   d| _ | j ¡  d S )NF)rF   rH   r_   )r-   ro   rq   rs   r2   r2   r3   Ú__exit__ü   s   zFlaskClient.__exit__)r   r   r   r   r   r   )r   r   r   r   r   rJ   )
r   r   rc   r"   rd   r"   r   r   r   r   )r   rD   )ro   rp   rq   rr   rs   rt   r   r   )r8   r9   r:   r;   Ú__annotations__r,   r   rY   r]   ra   rh   rn   ru   r<   r2   r2   r0   r3   rD   l   s   
 
1ü
-rD   c                      s4   e Zd ZdZd‡ fdd	„Z	
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di |¤Ž d S )Nr2   )r   r+   r,   )r-   r   r   r0   r2   r3   r,     s   zFlaskCliRunner.__init__NÚclir   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.
        Nr4   c                     s   ˆ j S )N)r   r2   rm   r2   r3   Ú<lambda>%  s    z'FlaskCliRunner.invoke.<locals>.<lambda>)Z
create_app)r   rx   r   r+   Úinvoke)r-   rx   r   r   r0   rm   r3   rz     s
   zFlaskCliRunner.invoke)r   r   r   r   r   r   )NN)rx   r   r   r   r   r   r   r   )r8   r9   r:   r;   r,   rz   r<   r2   r2   r0   r3   rw     s
    ÿrw   )r   r   )$Ú
__future__r   Úimportlib.metadatar@   ÚtypingÚtÚ
contextlibr   r   r   Útypesr   Úurllib.parser   Zwerkzeug.testr>   Zclick.testingr   r	   Zwerkzeug.wrappersr
   rg   rx   r   Úsessionsr   ÚTYPE_CHECKINGr   r   r   re   r   r?   rC   rD   rw   r2   r2   r2   r3   Ú<module>   s.    G
	 