§
    „ßj…'  ã                  óT  — 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ej!        j"        ¦  «        Z"da#dd„Z$ G d„ de¦  «        Z% G d„ de¦  «        Z&dS )é    )ÚannotationsN)Úcontextmanager)Ú	ExitStack)Úcopy)ÚTracebackType)Úurlsplit)Ú	CliRunner)ÚResult)ÚClient)ÚRequesté   )Ú
ScriptInfo)ÚSessionMixin)ÚWSGIEnvironment)ÚTestResponse)ÚFlaskc                  ó6   ‡ — 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`.
    ú/NÚappr   ÚpathÚstrÚbase_urlú
str | NoneÚ	subdomainÚ
url_schemeÚargsút.AnyÚkwargsÚreturnÚNonec                óÎ  •— |s|s|r!|d ut          |p|¦  «        k    s
J d¦   «         ‚|€•|j                             d¦  «        pd}|j        d         }	|r|› d|› �}|€|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".ÚSERVER_NAMEÚ	localhostÚAPPLICATION_ROOTú.ÚPREFERRED_URL_SCHEMEz://r   ú?)ÚboolÚconfigÚgetr   ÚschemeÚnetlocÚlstripr   Úqueryr   ÚsuperÚ__init__)Úselfr   r   r   r   r   r   r   Ú	http_hostÚapp_rootÚurlÚ	__class__s              €ú@/var/www/html/venv/lib/python3.11/site-packages/flask/testing.pyr1   zEnvironBuilder.__init__1   s`  ø€ ð ð 	
 	ð 	
¨Zð 	
Ø˜DÐ Ý�)Ð)˜zÑ*Ô*ò=+ð =+ð =+ð Gñ=+ô =+ð =+ð ÐØœ
Ÿš }Ñ5Ô5ÐD¸ˆIØ”zÐ"4Ô5ˆHàð 7Ø(Ð6Ð6¨9Ð6Ð6�	àÐ!Ø œZÐ(>Ô?�
å˜4‘.”.ˆCà”:Ð+ ð +ð +°´
Ð0G¸ið +ð +Ø—O’O CÑ(Ô(ð+ð +ð ð ”8ˆDàŒyð -ØÐ,Ð, ¤Ð,Ð,�àˆŒØ�‰ŒÔ˜˜xÐ9¨$Ð9Ð9Ð9°&Ð9Ð9Ð9Ð9Ð9ó    Úobjc                ó2   —  | 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)r2   r9   r   s      r7   Ú
json_dumpszEnvironBuilder.json_dumpsX   s#   € ð #ˆtŒxŒ}Ô" 3Ð1Ð1¨&Ð1Ð1Ð1r8   )r   NNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   )r9   r   r   r   r    r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r=   Ú__classcell__©r6   s   @r7   r   r      so   ø€ € € € € ðð ð0 Ø#Ø $Ø!%ð%:ð %:ð %:ð %:ð %:ð %:ð %:ðN2ð 2ð 2ð 2ð 2ð 2ð 2ð 2r8   r   Ú r    r   c                 ó\   — t           st          j                             d¦  «        a t           S )NÚwerkzeug)Ú_werkzeug_versionÚ	importlibÚmetadataÚversion© r8   r7   Ú_get_werkzeug_versionrL   d   s*   € õ ð CÝ%Ô.×6Ò6°zÑBÔBÐåÐr8   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   Úapplicationr   r   r   r    r!   c                ó®   •—  t          ¦   «         j        |i |¤Ž d| _        g | _        t	          ¦   «         | _        ddt          ¦   «         › �dœ| _        d S )NFz	127.0.0.1z	Werkzeug/)ÚREMOTE_ADDRÚHTTP_USER_AGENT)r0   r1   Úpreserve_contextÚ_new_contextsr   Ú_context_stackrL   Úenviron_base)r2   r   r   r6   s      €r7   r1   zFlaskClient.__init__}   se   ø€ Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ø %ˆÔØ<>ˆÔÝ'™kœkˆÔà&ØDÕ+@Ñ+BÔ+BÐDÐDð
ð 
ˆÔÐÐr8   út.Iterator[SessionMixin]c              /  ó¾  K  — | j         €t          d¦  «        ‚| j        } |j        |i |¤Ž}|                      |j        j        ¦  «         |5  |j                             ||j        ¦  «        }ddd¦  «         n# 1 swxY w Y   |€t          d¦  «        ‚|V — | 
                    ¦   «         }|j                             |¦  «        rdS |5  |j                             |||¦  «         ddd¦  «         n# 1 swxY w 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Ú	TypeErrorrO   Ú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)r2   r   r   r   ÚctxÚsessÚresps          r7   Úsession_transactionzFlaskClient.session_transaction‡   s  è è € ð( Œ=Ð ÝØPñô ð ð ÔˆØ&ˆcÔ&¨Ð7°Ð7Ð7ˆØ×!Ò! #¤+Ô"5Ñ6Ô6Ð6àð 	Hð 	HØÔ(×5Ò5°c¸3¼;ÑGÔGˆDð	Hð 	Hð 	Hñ 	Hô 	Hð 	Hð 	Hð 	Hð 	Hð 	Hð 	Høøøð 	Hð 	Hð 	Hð 	Hð ˆ<ÝÐHÑIÔIÐIàˆ
ˆ
ˆ
Ø×!Ò!Ñ#Ô#ˆàÔ ×0Ò0°Ñ6Ô6ð 	ØˆFàð 	@ð 	@ØÔ!×.Ò.¨s°D¸$Ñ?Ô?Ð?ð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@ð 	×*Ò*ØŒKÔ×&Ò& sÑ+Ô+¨AÔ.ØŒKÔØŒL× Ò  Ñ.Ô.ñ	
ô 	
ð 	
ð 	
ð 	
s$   Á!A;Á;A?ÂA?ÃC6Ã6C:Ã=C:Úotherr   c                óH   — i | j         ¥|¥}| j        r| j        j        |d<   |S )Nzwerkzeug.debug.preserve_context)rV   rS   rT   Úappend)r2   ro   Úouts      r7   Ú_copy_environzFlaskClient._copy_environ¹   s6   € Ø,�Ô"Ð, eÐ,ˆàÔ ð 	OØ59Ô5GÔ5NˆCÐ1Ñ2àˆ
r8   útuple[t.Any, ...]údict[str, t.Any]ÚBaseRequestc                ó  — |                       |                     di ¦  «        ¦  «        |d<   t          | j        g|¢R i |¤Ž}	 |                     ¦   «         |                     ¦   «          S # |                     ¦   «          w xY w)NrV   )rs   r+   r   rO   Úget_requestÚclose)r2   r   r   Úbuilders       r7   Ú_request_from_builder_argsz&FlaskClient._request_from_builder_argsÁ   s   € ð "&×!3Ò!3°F·J²J¸~ÈrÑ4RÔ4RÑ!SÔ!Sˆˆ~ÑÝ  Ô!1ÐC°DÐCÐCÐC¸FÐCÐCˆð	Ø×&Ò&Ñ(Ô(à�MŠM‰OŒOˆOˆOøˆG�MŠM‰OŒOˆOˆOøøøs   ÁA+ Á+BF©ÚbufferedÚfollow_redirectsr}   r)   r~   r   c               óÒ  •— |�rAt          |d         t          j        j        t          t
          f¦  «        �rt          |d         t          j        j        ¦  «        rKt          |d         ¦  «        }|                      |j        pi ¦  «        |_        | 	                    ¦   «         }n´t          |d         t          ¦  «        rNt           
                    |d         | j        |                      i ¦  «        ¬¦  «         	                    ¦   «         }nKt          |d         ¦  «        }|                      |j        ¦  «        |_        n|                      ||¦  «        }| j                             ¦   «          t!          ¦   «                              |||¬¦  «        }| j        j        |_        | j        D ]}| j                             |¦  «         Œ| j                             ¦   «          |S )Nr   )r   rV   r|   )Ú
isinstancerF   Útestr   Údictrv   r   rs   rV   rx   Úfrom_environrO   r_   r{   rU   ry   r0   Úopenr;   Újson_modulerT   Úenter_contextÚclear)
r2   r}   r~   r   r   rz   r^   ÚresponseÚcmr6   s
            €r7   r„   zFlaskClient.openÌ   sÅ  ø€ ð ñ 	D•JØ�ŒG•h”mÔ2µD½+ÐFñ
ô 
ñ 	Dõ ˜$˜qœ'¥8¤=Ô#?Ñ@Ô@ð FÝ˜t Aœw™-œ-�Ø'+×'9Ò'9¸'Ô:NÐ:TÐRTÑ'UÔ'U�Ô$Ø!×-Ò-Ñ/Ô/��Ý˜D œG¥TÑ*Ô*ð FÝ(×5Ò5Ø˜”G Ô!1À×@RÒ@RÐSUÑ@VÔ@Vð 6ñ ô ç’+‘-”-ð �õ
 ˜t Aœw™-œ-�Ø"&×"4Ò"4°W´_Ñ"EÔ"E�”�ð ×5Ò5°d¸FÑCÔCˆGð
 	Ô×!Ò!Ñ#Ô#Ð#å‘7”7—<’<ØØØ-ð  ñ 
ô 
ˆð
  $Ô/Ô4ˆÔð Ô$ð 	2ð 	2ˆBØÔ×-Ò-¨bÑ1Ô1Ð1Ð1àÔ× Ò Ñ"Ô"Ð"Øˆr8   c                ó@   — | j         rt          d¦  «        ‚d| _         | S )NzCannot nest client invocationsT)rS   rb   ©r2   s    r7   Ú	__enter__zFlaskClient.__enter__ù   s*   € ØÔ ð 	AÝÐ?Ñ@Ô@Ð@Ø $ˆÔØˆr8   Úexc_typeútype | NoneÚ	exc_valueúBaseException | NoneÚtbúTracebackType | Nonec                óF   — d| _         | j                             ¦   «          d S )NF)rS   rU   ry   )r2   r�   r�   r‘   s       r7   Ú__exit__zFlaskClient.__exit__ÿ   s'   € ð !&ˆÔØÔ×!Ò!Ñ#Ô#Ð#Ð#Ð#r8   )r   r   r   r   r    r!   )r   r   r   r   r    rW   )ro   r   r    r   )r   rt   r   ru   r    rv   )
r   r   r}   r)   r~   r)   r   r   r    r   )r    rN   )r�   rŽ   r�   r�   r‘   r’   r    r!   )r>   r?   r@   rA   Ú__annotations__r1   r   rn   rs   r{   r„   rŒ   r”   rB   rC   s   @r7   rN   rN   m   sù   ø€ € € € € € ðð ð ÐÐÑð
ð 
ð 
ð 
ð 
ð 
ð ð/
ð /
ð /
ñ „^ð/
ðbð ð ð ð	ð 	ð 	ð 	ð Ø!&ð	+ð +ð +ð +ð +ð +ð +ð +ðZð ð ð ð$ð $ð $ð $ð $ð $ð $ð $r8   rN   c                  ó4   ‡ — 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`.
    r   r   r   r   r    r!   c                óH   •— || _          t          ¦   «         j        di |¤Ž d S )NrK   )r   r0   r1   )r2   r   r   r6   s      €r7   r1   zFlaskCliRunner.__init__  s-   ø€ ØˆŒØ�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"Ð"Ð"r8   NÚclir   r
   c                óŒ   •‡ — |€‰ j         j        }d|vrt          ˆ f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.
        Nr9   c                 ó   •— ‰ j         S )N)r   r‹   s   €r7   ú<lambda>z'FlaskCliRunner.invoke.<locals>.<lambda>(  s	   ø€ ¸$¼(€ r8   )Ú
create_app)r   r™   r   r0   Úinvoke)r2   r™   r   r   r6   s   `   €r7   rž   zFlaskCliRunner.invoke  s]   øø€ ð" ˆ;Ø”(”,ˆCà˜ÐÐÝ&Ð2BÐ2BÐ2BÐ2BÐCÑCÔCˆF�5‰Mà�u‰wŒwŒ~˜c 4Ð2Ð2¨6Ð2Ð2Ð2r8   )r   r   r   r   r    r!   )NN)r™   r   r   r   r   r   r    r
   )r>   r?   r@   rA   r1   rž   rB   rC   s   @r7   r—   r—   	  so   ø€ € € € € ðð ð
#ð #ð #ð #ð #ð #ð
 04ð3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3r8   r—   )r    r   )'Ú
__future__r   Úimportlib.metadatarH   ÚtypingÚtÚ
contextlibr   r   r   Útypesr   Úurllib.parser   Úwerkzeug.testrF   Úclick.testingr	   r
   r   Úwerkzeug.wrappersr   rv   r™   r   Úsessionsr   ÚTYPE_CHECKINGÚ_typeshed.wsgir   r   r   r   r�   r   rG   rL   rN   r—   rK   r8   r7   ú<module>r¬      sü  ðØ "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !à Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø  Ð  Ð  Ð  Ð  Ð  Ø  Ð  Ð  Ð  Ð  Ð  Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4à Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "à„?ð Ø.Ð.Ð.Ð.Ð.Ð.Ø*Ð*Ð*Ð*Ð*Ð*àÐÐÐÐÐðC2ð C2ð C2ð C2ð C2�X”]Ô1ñ C2ô C2ð C2ðL Ð ðð ð ð ðY$ð Y$ð Y$ð Y$ð Y$�&ñ Y$ô Y$ð Y$ðx!3ð !3ð !3ð !3ð !3�Yñ !3ô !3ð !3ð !3ð !3r8   