Ë
    ‚@‹gt'  ã                  óR  — 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j4                  rd dlmZ d dlmZ ddlmZ  G d„ dej@                  jB                  «      Z!da"dd„Z# G d„ de«      Z$ G d„ de«      Z%y)é    )ÚannotationsN)Úcontextmanager)Ú	ExitStack)Úcopy)ÚTracebackType)Úurlsplit)Ú	CliRunner)ÚClient)ÚRequesté   )Ú
ScriptInfo)ÚSessionMixin)ÚWSGIEnvironment)ÚTestResponse)ÚFlaskc                  óT   ‡ — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ x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`.
    c                óä  •— |s|s|r|d ut        |xs |«      k7  sJ d«       ‚|€±|j                  j                  d«      xs d}|j                  d   }	|r|› d|› �}|€|j                  d   }t        |«      }
|
j                  xs |› d|
j
                  xs |› d|	j                  d«      › �}|
j                  }|
j                  r|› d	|
j                  › �}|| _	        t        ‰| �,  ||g|¢­i |¤Ž y )
Nz8Cannot pass "subdomain" or "url_scheme" with "base_url".ÚSERVER_NAMEÚ	localhostÚAPPLICATION_ROOTú.ÚPREFERRED_URL_SCHEMEz://ú/ú?)ÚboolÚconfigÚgetr   ÚschemeÚnetlocÚlstripÚpathÚqueryÚappÚsuperÚ__init__)Úselfr$   r"   Úbase_urlÚ	subdomainÚ
url_schemeÚargsÚkwargsÚ	http_hostÚapp_rootÚurlÚ	__class__s              €úL/var/www/html/AdoubleTech/venv/lib/python3.12/site-packages/flask/testing.pyr&   zEnvironBuilder.__init__0   s  ø€ ñ ¡	©ZØ˜DÐ ÜØÒ#˜ó
ò=
ð 	Fð Fó		Fð 
ð ÐØŸ
™
Ÿ™ }Ó5ÒD¸ˆIØ—z‘zÐ"4Ñ5ˆHáØ(˜k¨¨9¨+Ð6�	àÐ!Ø ŸZ™ZÐ(>Ñ?�
ä˜4“.ˆCà—:‘:Ò+ Ð,¨C°·
±
Ò0G¸iÐ/HØ�H—O‘O CÓ(Ð)ð+ð ð —8‘8ˆDà�yŠyØ˜˜q §¡ Ð,�àˆŒÜ‰Ñ˜˜xÐ9¨$Ò9°&Ó9ó    c                óP   —  | 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'   Úobjr,   s      r1   Ú
json_dumpszEnvironBuilder.json_dumpsW   s$   € ð #ˆt�x‰x�}‰}×"Ñ" 3Ñ1¨&Ñ1Ð1r2   )r   NNN)r$   r   r"   Ústrr(   ú
str | Noner)   r9   r*   r9   r+   út.Anyr,   r:   ÚreturnÚNone)r6   r:   r,   r:   r;   r8   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r7   Ú__classcell__©r0   s   @r1   r   r      so   ø„ ñð0 Ø#Ø $Ø!%ð%:àð%:ð ð%:ð ð	%:ð
 ð%:ð ð%:ð ð%:ð ð%:ð 
õ%:÷N2r2   r   Ú c                 óX   — t         st        j                  j                  d«      a t         S )NÚwerkzeug)Ú_werkzeug_versionÚ	importlibÚmetadataÚversion© r2   r1   Ú_get_werkzeug_versionrK   c   s$   € õ Ü%×.Ñ.×6Ñ6°zÓBÐäÐr2   c                  ó°   ‡ — e Zd ZU dZded<   dˆ fd„Ze	 	 	 	 	 	 dd„«       Zdd„Z	 	 	 	 	 	 dd„Z	ddd	œ	 	 	 	 	 	 	 	 	 dˆ fd
„Z
dd„Z	 	 	 	 	 	 	 	 dd„Zˆ x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   Úapplicationc                óˆ   •— t        ‰| �  |i |¤Ž d| _        g | _        t	        «       | _        ddt        «       › �dœ| _        y )NFz	127.0.0.1z	Werkzeug/)ÚREMOTE_ADDRÚHTTP_USER_AGENT)r%   r&   Úpreserve_contextÚ_new_contextsr   Ú_context_stackrK   Úenviron_base)r'   r+   r,   r0   s      €r1   r&   zFlaskClient.__init__|   sK   ø€ Ü‰Ñ˜$Ð) &Ò)Ø %ˆÔØ<>ˆÔÜ'›kˆÔà&Ø!*Ô+@Ó+BÐ*CÐDñ
ˆÕr2   c              /  óè  K  — | j                   €t        d«      ‚| j                  } |j                  |i |¤Ž}| j	                  |j
                  j                  «       |5  |j                  j                  ||j
                  «      }ddd«       €t        d«      ‚|–— |j                  «       }|j                  j                  |«      ry|5  |j                  j                  |||«       ddd«       | j                  |j
                  j                  j                  d«      d   |j
                  j                   |j"                  j%                  d«      «       y# 1 sw Y   ŒÕxY w# 1 sw Y   Œ|xY w­w)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Ú	TypeErrorrN   Útest_request_contextÚ_add_cookies_to_wsgiÚrequestÚenvironÚsession_interfaceÚopen_sessionÚRuntimeErrorÚresponse_classÚis_null_sessionÚsave_sessionÚ_update_cookies_from_responseÚhostÚ	partitionr"   ÚheadersÚgetlist)r'   r+   r,   r$   ÚctxÚsessÚresps          r1   Úsession_transactionzFlaskClient.session_transaction†   sR  è ø€ ð( �=‰=Ð ÜØPóð ð ×ÑˆØ&ˆc×&Ñ&¨Ð7°Ñ7ˆØ×!Ñ! #§+¡+×"5Ñ"5Ô6àñ 	HØ×(Ñ(×5Ñ5°c¸3¿;¹;ÓGˆD÷	Hð ˆ<ÜÐHÓIÐIàŠ
Ø×!Ñ!Ó#ˆà× Ñ ×0Ñ0°Ô6Øàñ 	@Ø×!Ñ!×.Ñ.¨s°D¸$Ô?÷	@ð 	×*Ñ*Ø�K‰K×Ñ×&Ñ& sÓ+¨AÑ.Ø�K‰K×ÑØ�L‰L× Ñ  Ó.õ	
÷	Hð 	Hú÷	@ð 	@üs8   ‚AE2Á'EÂAE2ÃE&Ã+A/E2ÅE#ÅE2Å&E/Å+E2c                óp   — i | j                   ¥|¥}| j                  r| j                  j                  |d<   |S )Nzwerkzeug.debug.preserve_context)rU   rR   rS   Úappend)r'   ÚotherÚouts      r1   Ú_copy_environzFlaskClient._copy_environ¸   s<   € Ø,�×"Ñ"Ð, eÐ,ˆà× Ò Ø59×5GÑ5G×5NÑ5NˆCÐ1Ñ2àˆ
r2   c                óè   — | j                  |j                  di «      «      |d<   t        | j                  g|¢­i |¤Ž}	 |j	                  «       |j                  «        S # |j                  «        w xY w)NrU   )rq   r   r   rN   Úget_requestÚclose)r'   r+   r,   Úbuilders       r1   Ú_request_from_builder_argsz&FlaskClient._request_from_builder_argsÀ   sb   € ð "&×!3Ñ!3°F·J±J¸~ÈrÓ4RÓ!Sˆˆ~ÑÜ  ×!1Ñ!1ÐC°DÒC¸FÑCˆð	Ø×&Ñ&Ó(à�M‰M�OøˆG�M‰M�Oús   ¿A ÁA1F©ÚbufferedÚfollow_redirectsc               óž  •— |�r!t        |d   t        j                  j                  t        t
        f«      rït        |d   t        j                  j                  «      rCt        |d   «      }| j                  |j                  xs i «      |_        |j                  «       }n—t        |d   t        «      rCt        j                  |d   | j                  | j                  i «      ¬«      j                  «       }nAt        |d   «      }| j                  |j                  «      |_        n| j                  ||«      }| j                  j                  «        t         ‰	| �E  |||¬«      }| j                  j$                  |_        | j(                  rB| j(                  j+                  «       }| j                  j-                  |«       | j(                  rŒB|S )Nr   )r$   rU   rw   )Ú
isinstancerE   Útestr   ÚdictÚBaseRequestr   rq   rU   rs   Úfrom_environrN   r]   rv   rT   rt   r%   Úopenr4   Újson_modulerS   ÚpopÚenter_context)
r'   rx   ry   r+   r,   ru   r\   ÚresponseÚcmr0   s
            €r1   r€   zFlaskClient.openË   s‹  ø€ ò ”JØ�‰G”h—m‘m×2Ñ2´D¼+ÐFô
ô ˜$˜q™'¤8§=¡=×#?Ñ#?Ô@Ü˜t A™w›-�Ø'+×'9Ñ'9¸'×:NÑ:NÒ:TÐRTÓ'U�Ô$Ø!×-Ñ-Ó/‘Ü˜D ™G¤TÔ*Ü(×5Ñ5Ø˜‘G ×!1Ñ!1À×@RÑ@RÐSUÓ@Vð 6ó ç‘+“-ñ ô
 ˜t A™w›-�Ø"&×"4Ñ"4°W·_±_Ó"E�•ð ×5Ñ5°d¸FÓCˆGð
 	×Ñ×!Ñ!Ô#ä‘7‘<ØØØ-ð  ó 
ˆð
  $×/Ñ/×4Ñ4ˆÔð × Ò Ø×#Ñ#×'Ñ'Ó)ˆBØ×Ñ×-Ñ-¨bÔ1ð × Ó ð ˆr2   c                óB   — | j                   rt        d«      ‚d| _         | S )NzCannot nest client invocationsT)rR   r`   ©r'   s    r1   Ú	__enter__zFlaskClient.__enter__ø   s$   € Ø× Ò ÜÐ?Ó@Ð@Ø $ˆÔØˆr2   c                óF   — d| _         | j                  j                  «        y )NF)rR   rT   rt   )r'   Úexc_typeÚ	exc_valueÚtbs       r1   Ú__exit__zFlaskClient.__exit__þ   s   € ð !&ˆÔØ×Ñ×!Ñ!Õ#r2   )r+   r:   r,   r:   r;   r<   )r+   r:   r,   r:   r;   zt.Iterator[SessionMixin])ro   r   r;   r   )r+   ztuple[t.Any, ...]r,   zdict[str, t.Any]r;   r~   )
r+   r:   rx   r   ry   r   r,   r:   r;   r   )r;   rM   )rŠ   ztype | Noner‹   zBaseException | NonerŒ   zTracebackType | Noner;   r<   )r=   r>   r?   r@   Ú__annotations__r&   r   rl   rq   rv   r€   rˆ   r�   rA   rB   s   @r1   rM   rM   l   sÒ   ø… ñð Óõ
ð ð/
Øð/
Ø&+ð/
à	!ò/
ó ð/
óbð	Ø%ð	Ø/?ð	à	ó	ð Ø!&ñ	+àð+ð ð+ð ð	+ð
 ð+ð 
õ+óZð$àð$ð (ð$ð !ð	$ð
 
÷$r2   rM   c                  óB   ‡ — e Zd ZdZdˆ fd„Z	 d	 	 	 	 	 	 	 dˆ fd„Zˆ x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`.
    c                ó2   •— || _         t        ‰| �  di |¤Ž y )NrJ   )r$   r%   r&   )r'   r$   r,   r0   s      €r1   r&   zFlaskCliRunner.__init__  s   ø€ ØˆŒÜ‰ÑÑ"˜6Ó"r2   c                ó„   •‡ — |€‰ j                   j                  }d|vrt        ˆ fd„¬«      |d<   t        ‰‰ �  ||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.
        r6   c                 ó   •— ‰ j                   S )N)r$   r‡   s   €r1   ú<lambda>z'FlaskCliRunner.invoke.<locals>.<lambda>'  s   ø€ ¸$¿(¹(€ r2   )Ú
create_app)r$   Úclir   r%   Úinvoke)r'   r–   r+   r,   r0   s   `   €r1   r—   zFlaskCliRunner.invoke  sD   ù€ ð" ˆ;Ø—(‘(—,‘,ˆCà˜ÑÜ&Ó2BÔCˆF�5‰Mä‰w‰~˜c 4Ñ2¨6Ñ2Ð2r2   )r$   r   r,   r:   r;   r<   )NN)r–   r:   r+   r:   r,   r:   r;   r:   )r=   r>   r?   r@   r&   r—   rA   rB   s   @r1   r�   r�     s<   ø„ ñõ
#ð
 04ð3Øð3Ø',ð3Ø?Dð3à	÷3ñ 3r2   r�   )r;   r8   )&Ú
__future__r   Úimportlib.metadatarG   ÚtypingÚtÚ
contextlibr   r   r   Útypesr   Úurllib.parser   Úwerkzeug.testrE   Úclick.testingr	   r
   Úwerkzeug.wrappersr   r~   r–   r   Úsessionsr   ÚTYPE_CHECKINGÚ_typeshed.wsgir   r   r$   r   r|   r   rF   rK   rM   r�   rJ   r2   r1   ú<module>r¥      s€   ðÝ "ã Û Ý %Ý  Ý Ý Ý !ã Ý #Ý  Ý 4å Ý "à‡?‚?Ý.Ý*åôC2�X—]‘]×1Ñ1ô C2ðL Ð óôY$�&ô Y$ôx!3�Yõ !3r2   