Ë
    JU h³'  ã                  ó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                  r0t        |
j                  t        «      rd	nd
}|||
j                  z   z  }|| _        t        ‰| �4  ||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Ú
isinstanceÚbytesÚappÚsuperÚ__init__)Úselfr'   r#   Úbase_urlÚ	subdomainÚ
url_schemeÚargsÚkwargsÚ	http_hostÚapp_rootÚurlÚsepÚ	__class__s               €úE/var/www/timesheet/venv/lib/python3.12/site-packages/flask/testing.pyr)   zEnvironBuilder.__init__0   s1  ø€ ñ ¡	©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Ü(¨¯©´EÔ:‘dÀ�Ø˜˜cŸi™i™Ñ'�àˆŒÜ‰Ñ˜˜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      r5   Ú
json_dumpszEnvironBuilder.json_dumpsX   s$   € ð #ˆt�x‰x�}‰}×"Ñ" 3Ñ1¨&Ñ1Ð1r6   )r   NNN)r'   r   r#   Ústrr+   ú
str | Noner,   r=   r-   r=   r.   út.Anyr/   r>   ÚreturnÚNone)r:   r>   r/   r>   r?   r<   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r;   Ú__classcell__©r4   s   @r5   r   r      so   ø„ ñð0 Ø#Ø $Ø!%ð&:àð&:ð ð&:ð ð	&:ð
 ð&:ð ð&:ð ð&:ð ð&:ð 
õ&:÷P2r6   r   Ú c                 óX   — t         st        j                  j                  d«      a t         S )NÚwerkzeug)Ú_werkzeug_versionÚ	importlibÚmetadataÚversion© r6   r5   Ú_get_werkzeug_versionrO   d   s$   € õ Ü%×.Ñ.×6Ñ6°zÓBÐäÐr6   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_stackrO   Úenviron_base)r*   r.   r/   r4   s      €r5   r)   zFlaskClient.__init__}   sK   ø€ Ü‰Ñ˜$Ð) &Ò)Ø %ˆÔØ<>ˆÔÜ'›kˆÔà&Ø!*Ô+@Ó+BÐ*CÐDñ
ˆÕr6   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Ú	TypeErrorrR   Ú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          r5   Ú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)rY   rV   rW   Úappend)r*   ÚotherÚouts      r5   Ú_copy_environzFlaskClient._copy_environ¹   s<   € Ø,�×"Ñ"Ð, eÐ,ˆà× Ò Ø59×5GÑ5G×5NÑ5NˆCÐ1Ñ2àˆ
r6   c                óè   — | j                  |j                  di «      «      |d<   t        | j                  g|¢­i |¤Ž}	 |j	                  «       |j                  «        S # |j                  «        w xY w)NrY   )ru   r   r   rR   Úget_requestÚclose)r*   r.   r/   Úbuilders       r5   Ú_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'   rY   r{   )r%   rI   Útestr   ÚdictÚBaseRequestr   ru   rY   rw   Úfrom_environrR   ra   rz   rX   rx   r(   Úopenr8   Újson_modulerW   ÚpopÚenter_context)
r*   r|   r}   r.   r/   ry   r`   ÚresponseÚcmr4   s
            €r5   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ð × Ó ð ˆr6   c                óB   — | j                   rt        d«      ‚d| _         | S )NzCannot nest client invocationsT)rV   rd   ©r*   s    r5   Ú	__enter__zFlaskClient.__enter__ù   s$   € Ø× Ò ÜÐ?Ó@Ð@Ø $ˆÔØˆr6   c                óF   — d| _         | j                  j                  «        y )NF)rV   rX   rx   )r*   Úexc_typeÚ	exc_valueÚtbs       r5   Ú__exit__zFlaskClient.__exit__ÿ   s   € ð !&ˆÔØ×Ñ×!Ñ!Õ#r6   )r.   r>   r/   r>   r?   r@   )r.   r>   r/   r>   r?   zt.Iterator[SessionMixin])rs   r   r?   r   )r.   ztuple[t.Any, ...]r/   zdict[str, t.Any]r?   r�   )
r.   r>   r|   r   r}   r   r/   r>   r?   r   )r?   rQ   )r�   ztype | NonerŽ   zBaseException | Noner�   zTracebackType | Noner?   r@   )rA   rB   rC   rD   Ú__annotations__r)   r   rp   ru   rz   rƒ   r‹   r�   rE   rF   s   @r5   rQ   rQ   m   sÒ   ø… ñð Óõ
ð ð/
Øð/
Ø&+ð/
à	!ò/
ó ð/
óbð	Ø%ð	Ø/?ð	à	ó	ð Ø!&ñ	+àð+ð ð+ð ð	+ð
 ð+ð 
õ+óZð$àð$ð (ð$ð !ð	$ð
 
÷$r6   rQ   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 )NrN   )r'   r(   r)   )r*   r'   r/   r4   s      €r5   r)   zFlaskCliRunner.__init__  s   ø€ ØˆŒÜ‰ÑÑ"˜6Ó"r6   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.
        r:   c                 ó   •— ‰ j                   S )N)r'   rŠ   s   €r5   ú<lambda>z'FlaskCliRunner.invoke.<locals>.<lambda>(  s   ø€ ¸$¿(¹(€ r6   )Ú
create_app)r'   Úclir   r(   Úinvoke)r*   r™   r.   r/   r4   s   `   €r5   rš   zFlaskCliRunner.invoke  sD   ù€ ð" ˆ;Ø—(‘(—,‘,ˆCà˜ÑÜ&Ó2BÔCˆF�5‰Mä‰w‰~˜c 4Ñ2¨6Ñ2Ð2r6   )r'   r   r/   r>   r?   r@   )NN)r™   r>   r.   r>   r/   r>   r?   r>   )rA   rB   rC   rD   r)   rš   rE   rF   s   @r5   r“   r“   	  s<   ø„ ñõ
#ð
 04ð3Øð3Ø',ð3Ø?Dð3à	÷3ñ 3r6   r“   )r?   r<   )&Ú
__future__r   Úimportlib.metadatarK   ÚtypingÚtÚ
contextlibr   r   r   Útypesr   Úurllib.parser   Úwerkzeug.testrI   Úclick.testingr	   r
   Úwerkzeug.wrappersr   r�   r™   r   Úsessionsr   ÚTYPE_CHECKINGÚ_typeshed.wsgir   r   r'   r   r   r   rJ   rO   rQ   r“   rN   r6   r5   ú<module>r¨      s€   ðÝ "ã Û Ý %Ý  Ý Ý Ý !ã Ý #Ý  Ý 4å Ý "à‡?‚?Ý.Ý*åôD2�X—]‘]×1Ñ1ô D2ðN Ð óôY$�&ô Y$ôx!3�Yõ !3r6   