
    F dj)                     (   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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 d
dlmZ ej        rd dlmZ d
dlmZ  G d de	j        j                  Z G d de          Z G d de          ZdS )    N)contextmanager)	ExitStack)copy)TracebackType)	CliRunner)Client)	url_parse)Request   )
ScriptInfo)_cv_request)SessionMixin)TestResponse)Flaskc                        e Zd ZdZ	 	 	 	 ddddedej        e         dej        e         d	ej        e         d
ej        dej        ddf fdZdej        dej        def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base_url	subdomain
url_schemeargskwargsreturnc                    |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+t          |
j        t                    rd	nd
}|||
j        z   z  }|| _         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   query
isinstancebytesr   super__init__)selfr   r   r   r   r   r   r   	http_hostapp_rooturlsep	__class__s               VC:\Users\ChattiNader\Documents\MyHotelMatch\api\dev\Lib\site-packages\flask/testing.pyr.   zEnvironBuilder.__init__-   s}     	F	 	FZ 	FD #
 
=
 =
 =
 F	=
 =
 =
 
}55DIz"45H 7(66966	! Z(>?
D//C:+ + +
0Gi + +OOC((+ +  8Dy ((E::Cddci'x9$999&99999    objc                 2     | j         j        j        |fi |S )zSerialize ``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/   r7   r   s      r5   
json_dumpszEnvironBuilder.json_dumpsU   s#     #tx}"311&111r6   )r   NNN)__name__
__module____qualname____doc__strtOptionalAnyr.   r;   __classcell__r4   s   @r5   r   r      s         0 $(%)&*&: &:&: &: *S/	&:
 :c?&: JsO&: u&: %&: 
&: &: &: &: &: &:P2ae 2qu 2 2 2 2 2 2 2 2 2r6   r   c                   N    e Zd ZU dZded<   dej        dej        ddf fdZedej        dej        dej	        e
ddf         fd	            Zd
 Zd Zddddej        dededej        ddf
 fdZddZdej        e         dej        e         dej        e         ddf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   Nc                      t                      j        |i | d| _        g | _        t	                      | _        ddt          j         d| _        d S )NFz	127.0.0.1z	werkzeug/)REMOTE_ADDRHTTP_USER_AGENT)	r-   r.   preserve_context_new_contextsr   _context_stackwerkzeug__version__environ_base)r/   r   r   r4   s      r5   r.   zFlaskClient.__init__n   sa    $)&))) %>@'kk&A8+?AA
 
r6   c              /     K   | j         t          d          | j        }|                    di           }| j                             |           t          j        d          } |j        |i |5 }|j        }|	                    ||j
                  }|t          d          t          j        |          }		 |V  t          j        |	           n# t          j        |	           w xY w|                                }
|                    |          s|                    |||
           |
                    |j
        j                  }| j                             |j
        j        |           ddd           dS # 1 swxY w Y   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:Session transactions only make sense with cookies enabled.environ_overridesz?Session backend did not open a session. Check the configuration)
cookie_jarRuntimeErrorrH   
setdefaultinject_wsgir   r&   test_request_contextsession_interfaceopen_sessionrequestsetresetresponse_classis_null_sessionsave_sessionget_wsgi_headersenvironextract_wsgi)r/   r   r   r   rS   outer_reqctxcrY   sesstokenrespheaderss               r5   session_transactionzFlaskClient.session_transactionx   s     ( ?"L   "--.A2FF##$5666"t,,%S%t6v66 	E! # 5$11#qyAAD|"U    OL11E)


!%((((!%((((%%''D$44T:: @!..sD$???++AI,=>>GO(():GDDD3	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es,   1AE=:C>E=C))BE==FFc                 H    i | j         |}| j        r| j        j        |d<   |S )Nzwerkzeug.debug.preserve_context)rQ   rL   rM   append)r/   otherouts      r5   _copy_environzFlaskClient._copy_environ   s6    ,",e,  	O595G5NC12
r6   c                    |                      |                    di                     |d<   t          | j        g|R i |}	 |                                |                                 S # |                                 w xY w)NrQ   )ro   r&   r   rH   get_requestclose)r/   r   r   builders       r5   _request_from_builder_argsz&FlaskClient._request_from_builder_args   s}    !%!3!3FJJ~r4R4R!S!S~ !1CDCCCFCC	&&((MMOOOOGMMOOOOs   A+ +BFbufferedfollow_redirectsrv   rw   r   c                   |rAt          |d         t          j        j        t          t
          f          rt          |d         t          j        j                  rKt          |d                   }|                     |j        pi           |_        |	                                }nt          |d         t                    rNt          
                    |d         | j        |                     i                     	                                }nKt          |d                   }|                     |j                  |_        n|                     ||          }| j                                         t!                                          |||          }| j        j        |_        | j        r:| j                                        }| j                            |           | j        :|S )Nr   )r   rQ   ru   )r+   rO   testr   dictBaseRequestr   ro   rQ   rq   from_environrH   rb   rt   rN   rr   r-   openr9   json_modulerM   popenter_context)
r/   rv   rw   r   r   rs   r[   responsecmr4   s
            r5   r}   zFlaskClient.open   s     	DJGhm2D+F
 
 	D $q'8=#?@@ FtAw--'+'9'9':N:TRT'U'U$!--//DGT** F(55G!1@R@RSU@V@V 6  +-- 
 tAw--"&"4"4W_"E"E 55dFCCG
 	!!###77<<-   
 

  $/4   	2#''))B--b111   	2 r6   c                 @    | j         rt          d          d| _         | S )NzCannot nest client invocationsT)rL   rU   r/   s    r5   	__enter__zFlaskClient.__enter__   s*      	A?@@@ $r6   exc_type	exc_valuetbc                 F    d| _         | j                                         d S )NF)rL   rN   rr   )r/   r   r   r   s       r5   __exit__zFlaskClient.__exit__   s'     !&!!#####r6   )r   rG   )r<   r=   r>   r?   __annotations__rA   rC   r.   r   	Generatorr   rj   ro   rt   r$   r}   r   rB   typeBaseExceptionr   r   rD   rE   s   @r5   rG   rG   ^   s          
ae 
qu 
 
 
 
 
 
 
 4EU4E&'e4E	
\4-	.4E 4E 4E ^4El     !&	+ + +u+ + 	+
 %+ 
+ + + + + +Z   $*T"$ :m,$ J}%	$
 
$ $ $ $ $ $ $ $r6   rG   c            	            e Zd ZdZdddej        ddf fdZ	 ddej        d	ej        dej        dej        f fd
Z xZS )FlaskCliRunnerzA :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   Nc                 H    || _          t                      j        di | d S )N )r   r-   r.   )r/   r   r   r4   s      r5   r.   zFlaskCliRunner.__init__  s-    ""6"""""r6   clir   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.
        Nr7   c                       j         S )N)r   r   s   r5   <lambda>z'FlaskCliRunner.invoke.<locals>.<lambda>  s	    $( r6   )
create_app)r   r   r   r-   invoke)r/   r   r   r   r4   s   `   r5   r   zFlaskCliRunner.invoke  s]    " ;(,C&2B2B2B2BCCCF5Muww~c4226222r6   )NN)	r<   r=   r>   r?   rA   rC   r.   r   rD   rE   s   @r5   r   r      s         
#G #qu # # # # # # #
 043 353'(u3?@u3	
3 3 3 3 3 3 3 3 3 3r6   r   ) typingrA   
contextlibr   r   r   typesr   werkzeug.testrO   click.testingr   r   werkzeug.urlsr	   werkzeug.wrappersr
   r{   r   r   globalsr   sessionsr   TYPE_CHECKINGr   r   r   ry   r   rG   r   r   r6   r5   <module>r      s       % % % % % %                             # # # # # #             # # # # # # 4 4 4 4 4 4                   " " " " " "? ******D2 D2 D2 D2 D2X]1 D2 D2 D2N\$ \$ \$ \$ \$& \$ \$ \$~!3 !3 !3 !3 !3Y !3 !3 !3 !3 !3r6   