
    ^f:                        d dl 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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mZ d dlmZ d,dZe[ G d dej        j        j        j                   Z! G d d          Z" G d dej#        j$                  Z% G d dej&                  Z'nd Z'e G d dej                  Z(nd Z( G d de          Z) G d de          Z* G d d e)e          Z+ G d! d"ej,                  Z- G d# d$ej.                  Z/ G d% d&ej0                  Z1 G d' d(ej2                  Z3d) Z4 G d* d+ej0                  Z5dS )-    N)import_module)settingsImproperlyConfigured)WSGIHandler)override_settings	testcases)Client)ClientHandler)RequestFactory)force_bytes)	urlencode)coreapirequests)api_settingsc                 "    || _         || _        d S N)_force_auth_user_force_auth_token)requestusertokens      E/var/www/html/env/lib/python3.11/site-packages/rest_framework/test.pyforce_authenticater      s    #G %G    c                       e Zd Zd ZdS )
HeaderDictc                 ,    |                      |          S r   )
getheaders)selfkeydefaults      r   get_allzHeaderDict.get_all   s    ??3'''r   N)__name__
__module____qualname__r#    r   r   r   r      s#        	( 	( 	( 	( 	(r   r   c                        e Zd Zd Zd Zd ZdS )MockOriginalResponsec                 <    t          |          | _        d| _        d S NF)r   msgclosed)r    headerss     r   __init__zMockOriginalResponse.__init__    s    !'**DHDKKKr   c                     | j         S r   r-   r    s    r   isclosedzMockOriginalResponse.isclosed$   s
    ;r   c                     d| _         d S )NTr1   r2   s    r   closezMockOriginalResponse.close'   s    DKKKr   N)r$   r%   r&   r/   r3   r5   r'   r   r   r)   r)      sA        	  	  	 	 	 		 	 	 	 	r   r)   c                   *    e Zd ZdZd Zd Zd Zd ZdS )DjangoTestAdapterz
        A transport adapter for `requests`, that makes requests via the
        Django WSGI app, rather than making actual HTTP requests over the network.
        c                 R    t                      | _        t                      | _        d S r   )r   appDjangoRequestFactoryfactoryr2   s    r   r/   zDjangoTestAdapter.__init__/   s    "}}DH/11DLLLr   c                    |j         }|j        }i }|j        <t          |j        d          r|j                                        |d<   n
|j        |d<   d|j        v r|j        d         |d<   |j                                        D ]:\  }}|                                }|dv r||d|                    dd	          z  <   ; | j	        j
        ||fi |j        S )
zb
            Given a `requests.PreparedRequest` instance, return a WSGI environ dict.
            Nreaddatazcontent-typecontent_type)
CONNECTIONzCONTENT-LENGTHzCONTENT-TYPEzHTTP_%s-_)methodurlbodyhasattrr=   r.   itemsupperreplacer;   genericenviron)r    r   rC   rD   kwargsr!   values          r   get_environzDjangoTestAdapter.get_environ3   s     ^F+CF |'7<00 2%,\%6%6%8%8F6NN%,\F6N00)0)H~& &o3355 B B
UiikkJJJ<Ay3;;sC#8#8899'4<'>>v>>FFr   c                     i dfd	}|                      |          }|                     ||          }t          j        d                    |                    d<   t          j        j        j        di }| 	                    ||          S )zR
            Make an outgoing request to the Django WSGI application.
            Nc                     |                      d          \  }}}t          |          d<   |d<   |d<   dd<   dd<   t          |          d	<   d S )
N statusreasonr.      versionFpreload_contentoriginal_response)	partitionintr)   )wsgi_statuswsgi_headersexc_inforR   rB   rS   
raw_kwargss         r   start_responsez.DjangoTestAdapter.send.<locals>.start_responseS   so    $/$9$9#$>$>!6'*6{{
8$'-
8$(4
9%(*
9%05
,-2F|2T2T
.///r   r   rE   r   r'   )
rN   r9   ioBytesIOjoinr   packagesurllib3HTTPResponsebuild_response)	r    r   argsrL   r^   rK   wsgi_responserawr]   s	           @r   sendzDjangoTestAdapter.sendM   s     JU U U U U U &&w//G HHWn==M "$CHH],C,C!D!DJv#+8FF:FFC &&w444r   c                     d S r   r'   r2   s    r   r5   zDjangoTestAdapter.closeg   s    Dr   N)r$   r%   r&   __doc__r/   rN   ri   r5   r'   r   r   r7   r7   *   s]        	 		2 	2 	2	G 	G 	G4	5 	5 	54	 	 	 	 	r   r7   c                   (     e Zd Z fdZ fdZ xZS )RequestsClientc                      t                      j        |i | t                      }|                     d|           |                     d|           d S )Nzhttp://zhttps://)superr/   r7   mount)r    rf   rL   adapter	__class__s       r   r/   zRequestsClient.__init__k   sX    EGGd-f---'))GJJy'***JJz7+++++r   c                     |                     d          st          d|z             t                      j        ||g|R i |S )NhttpzPMissing "http:" or "https:". Use a fully qualified URL, eg "http://testserver%s")
startswith
ValueErrorro   r   )r    rC   rD   rf   rL   rr   s        r   r   zRequestsClient.requestq   sU    >>&)) { !svy!yzzz"577?63@@@@@@@r   )r$   r%   r&   r/   r   __classcell__rr   s   @r   rm   rm   j   sZ        	, 	, 	, 	, 	,	A 	A 	A 	A 	A 	A 	A 	A 	Ar   rm   c                       t          d          )Nz:requests must be installed in order to use RequestsClient.r   rf   rL   s     r   rm   rm   w   s    "#_```r   c                   4     e Zd Z fdZed             Z xZS )CoreAPIClientc                     t                      | _        t          j                            | j                  g|d<    t                      j        |i | d S )N)session
transports)rm   _sessionr   r   HTTPTransportr~   ro   r/   r    rf   rL   rr   s      r   r/   zCoreAPIClient.__init__}   sU    *,,DM$+$6$D$DT\$D$Z$Z#[F< EGGd-f-----r   c                     | j         S r   )r   r2   s    r   r~   zCoreAPIClient.session   s
    = r   )r$   r%   r&   r/   propertyr~   rw   rx   s   @r   r|   r|   |   sS        	. 	. 	. 	. 	.
 
	! 	! 
	! 	! 	! 	! 	!r   r|   c                       t          d          )Nz8coreapi must be installed in order to use CoreAPIClient.r   rz   s     r   r|   r|      s    "#]^^^r   c                        e Zd Zej        Zej        Zd fd	ZddZ	ddZ
ddZddZddZdd	Zdd
Z	 	 d fd	Z fdZ xZS )APIRequestFactoryFc                     || _         i | _        | j        D ]}|| j        |j        <    t	                      j        di | d S Nr'   )enforce_csrf_checksrenderer_classesrenderer_classes_listformatro   r/   )r    r   defaultsclsrr   s       r   r/   zAPIRequestFactory.__init__   sZ    #6  "- 	4 	4C03D!#*--$$8$$$$$r   Nc                    |d|fS ||
J d            |rt          |t          j                  }n|p| j        }|| j        v s@J d                    |d                    d | j        D                                              | j        |                     }|                    |          }|j        }|j	        rd                    ||j	                  }t          |t                    r|                    |j	                  }||fS )zP
        Encode the data returning a two tuple of (bytes, content_type)
        N z1You may not set both `format` and `content_type`.zqInvalid format '{}'. Available formats are {}. Set TEST_REQUEST_RENDERER_CLASSES to enable extra request formats.z, c                     g | ]
}d |z   d z   S )'r'   ).0fmts     r   
<listcomp>z2APIRequestFactory._encode_data.<locals>.<listcomp>   s     PPP3sSy3PPPr   z{}; charset={})r   r   DEFAULT_CHARSETdefault_formatr   r   ra   render
media_typecharset
isinstancestrencode)r    r>   r   r?   retrenderers         r   _encode_datazAPIRequestFactory._encode_data   s=   
 <%%~!5!5? "6!55  	3dH$<==CC 2t2FT2222))/IIPP$:OPPPQQ* * 322 5t,V466H//$''C $.L /66 ("2   
 #s## 3jj!122L  r   c                    dt          |pi d          i}|sFd|v rBt          |                    d          d                   }|                    d          }||d<   |                    |            | j        d|fi |S )NQUERY_STRINGT)doseq?   z
iso-8859-1GET)r   r   splitdecodeupdaterJ   )r    pathr>   extrarquery_strings         r   getzAPIRequestFactory.get   s    Idjb===
  	-t 'tzz#q'9::L'..|<<L ,An	t|E4--1---r   c                 X    |                      |||          \  }} | j        d|||fi |S )NPOSTr   rJ   r    r   r>   r   r?   r   s         r   postzAPIRequestFactory.post   s>    !..tV\JJlt|FD$FFFFFr   c                 X    |                      |||          \  }} | j        d|||fi |S )NPUTr   r   s         r   putzAPIRequestFactory.put   s>    !..tV\JJlt|E4|EEuEEEr   c                 X    |                      |||          \  }} | j        d|||fi |S )NPATCHr   r   s         r   patchzAPIRequestFactory.patch   s>    !..tV\JJlt|GT4GGGGGr   c                 X    |                      |||          \  }} | j        d|||fi |S )NDELETEr   r   s         r   deletezAPIRequestFactory.delete   s>    !..tV\JJlt|HdD,HH%HHHr   c                 X    |                      |||          \  }} | j        d|||fi |S )NOPTIONSr   r   s         r   optionszAPIRequestFactory.options   s>    !..tV\JJlt|ItT<II5IIIr   r   application/octet-streamc                 h    |t          |          |d<    t                      j        |||||fi |S )NCONTENT_TYPE)r   ro   rJ   )r    rC   r   r>   r?   securer   rr   s          r   rJ   zAPIRequestFactory.generic   sO     #$'$5$5E.!uwwD$f? ?8=? ? 	?r   c                 T     t                      j        di |}| j         |_        |S r   )ro   r   r   _dont_enforce_csrf_checks)r    rL   r   rr   s      r   r   zAPIRequestFactory.request   s1    !%''/++F++040H,H)r   FNNr   )NNN)r   r   F)r$   r%   r&   r   TEST_REQUEST_RENDERER_CLASSESr   TEST_REQUEST_DEFAULT_FORMATr   r/   r   r   r   r   r   r   r   rJ   r   rw   rx   s   @r   r   r      s.       (F!=N% % % % % %+! +! +! +!Z. . . .G G G GF F F FH H H HI I I IJ J J J *,@E? ? ? ? ? ?        r   r   c                   ,     e Zd ZdZ fdZ fdZ xZS )ForceAuthClientHandlerzj
    A patched version of ClientHandler that can enforce authentication
    on the outgoing requests.
    c                 V    d | _         d | _         t                      j        |i | d S r   )_force_user_force_tokenro   r/   r   s      r   r/   zForceAuthClientHandler.__init__   s5     $)&)))))r   c                 |    t          || j        | j                   t                                          |          S r   )r   r   r   ro   get_response)r    r   rr   s     r   r   z#ForceAuthClientHandler.get_response   s5     	7D$4d6GHHHww##G,,,r   )r$   r%   r&   rk   r/   r   rw   rx   s   @r   r   r      s[         
* * * * *
- - - - - - - - -r   r   c                        e Zd Zd fd	Zd ZddZ fdZd fd	Z	 	 d fd	Z	 	 d fd		Z		 	 d fd
	Z
	 	 d fd	Z	 	 d fd	Z fdZ xZS )	APIClientFc                 p     t                      j        di | t          |          | _        i | _        d S r   )ro   r/   r   handler_credentials)r    r   r   rr   s      r   r/   zAPIClient.__init__  s>    $$8$$$-.ABBr   c                     || _         dS )zK
        Sets headers that will be used on every outgoing request.
        N)r   )r    rL   s     r   credentialszAPIClient.credentials  s     #r   Nc                 n    || j         _        || j         _        |||                                  dS dS dS )zd
        Forcibly authenticates outgoing requests with the given
        user and/or token.
        N)r   r   r   logout)r    r   r   s      r   r   zAPIClient.force_authenticate  s=    
 $( $)!<EMKKMMMMM <MMr   c                 j    |                     | j                    t                      j        di |S r   )r   r   ro   r   )r    rL   rr   s     r   r   zAPIClient.request  s4    d'(((uww(((((r   c                 d     t                      j        |fd|i|}|r | j        |fd|i|}|S )Nr>   )ro   r   _handle_redirects)r    r   r>   followr   responserr   s         r   r   zAPIClient.get   sR    577;t88$8%88 	L-t-hKKTKUKKHr   c                 l     t                      j        |f|||d|}|r | j        |f|||d|}|S N)r>   r   r?   )ro   r   r   	r    r   r>   r   r?   r   r   r   rr   s	           r   r   zAPIClient.post&  sn    577<PFP PINP P 	v-t-huT&_kuuotuuHr   c                 l     t                      j        |f|||d|}|r | j        |f|||d|}|S r   )ro   r   r   r   s	           r   r   zAPIClient.put.  sn    577;PFP PINP P 	v-t-huT&_kuuotuuHr   c                 l     t                      j        |f|||d|}|r | j        |f|||d|}|S r   )ro   r   r   r   s	           r   r   zAPIClient.patch6  sn     577=PFP PINP P 	v-t-huT&_kuuotuuHr   c                 l     t                      j        |f|||d|}|r | j        |f|||d|}|S r   )ro   r   r   r   s	           r   r   zAPIClient.delete>  sn    !577>PFP PINP P 	v-t-huT&_kuuotuuHr   c                 l     t                      j        |f|||d|}|r | j        |f|||d|}|S r   )ro   r   r   r   s	           r   r   zAPIClient.optionsF  sn    "577?PFP PINP P 	v-t-huT&_kuuotuuHr   c                     i | _         d | j        _        d | j        _        | j        r"t                                                       d S d S r   )r   r   r   r   r~   ro   r   )r    rr   s    r   r   zAPIClient.logoutN  sO     $( $(!< 	GGNN	 	r   r   r   r+   )NNNF)r$   r%   r&   r/   r   r   r   r   r   r   r   r   r   r   rw   rx   s   @r   r   r     sv            
# # #   ) ) ) ) )
      ?C      >B      @D      AE      BF             r   r   c                       e Zd ZeZdS )APITransactionTestCaseNr$   r%   r&   r   client_classr'   r   r   r   r   Y          LLLr   r   c                       e Zd ZeZdS )APITestCaseNr   r'   r   r   r   r   ]  r   r   r   c                       e Zd ZeZdS )APISimpleTestCaseNr   r'   r   r   r   r   a  r   r   r   c                       e Zd ZeZdS )APILiveServerTestCaseNr   r'   r   r   r   r   e  r   r   r   c                 Z    t          | d          r| j        | j        _        d S | j        `d S N_module_urlpatterns)rF   r   _moduleurlpatterns)r   s    r   cleanup_url_patternsr   i  s6    s)** $"%"9K###r   c                   j     e Zd ZdZe fd            Zej        dk     re fd            Z xZ	S  xZ	S )URLPatternsTestCaseaC  
    Isolate URL patterns on a per-TestCase basis. For example,

    class ATestCase(URLPatternsTestCase):
        urlpatterns = [...]

        def test_something(self):
            ...

    class AnotherTestCase(URLPatternsTestCase):
        urlpatterns = [...]

        def test_something_else(self):
            ...
    c                    t          | j                  | _        t          | j                  | _        t          | j        d          r| j        j        | _        | j        | j        _        | j                                         t          j
        dk    r:|                     | j        j                   |                     t          |            t                                                       d S )N)ROOT_URLCONFr      r   )r   r%   r   r   	_overriderF   r   r   enabledjangoVERSIONaddClassCleanupdisabler   ro   
setUpClassr   rr   s    r   r  zURLPatternsTestCase.setUpClass  s     $CN33)s~FFF3;.. 	>&)k&=C#"%/>F"" 5666 4c:::r   r   c                     t                                                       | j                                         t	          | d          r| j        | j        _        d S | j        `d S r   )ro   tearDownClassr   r  rF   r   r   r   r  s    r   r  z!URLPatternsTestCase.tearDownClass  sa    GG!!###M!!###s122 ,*-*A'''K+++r   )
r$   r%   r&   rk   classmethodr  r  r  r  rw   rx   s   @r   r   r   p  s              [$ ~		, 	, 	, 	, 
	, 	, 	, 	, 	, r   r   r   )6r_   	importlibr   r  django.confr   django.core.exceptionsr   django.core.handlers.wsgir   django.testr   r	   django.test.clientr
   DjangoClientr   r   r:   django.utils.encodingr   django.utils.httpr   rest_framework.compatr   r   rest_framework.settingsr   r   rb   rc   _collectionsHTTPHeaderDictr   r)   adaptersHTTPAdapterr7   Sessionrm   r|   r   r   r   TransactionTestCaser   TestCaser   SimpleTestCaser   LiveServerTestCaser   r   r   r'   r   r   <module>r     s   
			 # # # # # #              7 7 7 7 7 7 1 1 1 1 1 1 4 4 4 4 4 4 4 4 5 5 5 5 5 5 , , , , , , E E E E E E - - - - - - ' ' ' ' ' ' 3 3 3 3 3 3 3 3 0 0 0 0 0 0& & & &
 ( ( ( ( (X&.;J ( ( (	 	 	 	 	 	 	 	> > > > >H-9 > > >@
A 
A 
A 
A 
A) 
A 
A 
A 
Aa a a ! ! ! ! ! ! ! ! !_ _ _e e e e e, e e eP- - - - -] - - -$Q Q Q Q Q!< Q Q Qh    Y:       )$       	0       I8   $ $ $,, ,, ,, ,, ,,)2 ,, ,, ,, ,, ,,r   