o
    ÖèFhí:  ã                   @   sÌ  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d„Zedur„G dd„ dejjjj ƒZ!G dd„ dƒZ"G dd„ dej#j$ƒZ%G dd„ dej&ƒZ'ndd„ Z'edur–G dd„ dejƒZ(ndd„ Z(G dd„ deƒZ)G dd„ deƒZ*G d d!„ d!e)eƒZ+G d"d#„ d#ej,ƒZ-G d$d%„ d%ej.ƒZ/G d&d'„ d'ej0ƒZ1G d(d)„ d)ej2ƒZ3d*d+„ Z4G d,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                 C   s   || _ || _d S ©N)Ú_force_auth_userÚ_force_auth_token)ÚrequestÚuserÚtoken© r   úL/var/www/html/loop/nvenv/lib/python3.10/site-packages/rest_framework/test.pyÚforce_authenticate   s   
r   c                   @   s   e Zd Zdd„ ZdS )Ú
HeaderDictc                 C   s
   |   |¡S r   )Ú
getheaders)ÚselfÚkeyÚdefaultr   r   r   Úget_all   ó   
zHeaderDict.get_allN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s    r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚMockOriginalResponsec                 C   s   t |ƒ| _d| _d S ©NF)r   ÚmsgÚclosed)r   Úheadersr   r   r   Ú__init__    s   

zMockOriginalResponse.__init__c                 C   ó   | j S r   ©r'   ©r   r   r   r   Úisclosed$   s   zMockOriginalResponse.isclosedc                 C   s
   d| _ d S )NTr+   r,   r   r   r   Úclose'   r    zMockOriginalResponse.closeN)r!   r"   r#   r)   r-   r.   r   r   r   r   r$      s    r$   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zd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                 C   s   t ƒ | _tƒ | _d S r   )r   ÚappÚDjangoRequestFactoryÚfactoryr,   r   r   r   r)   /   s   zDjangoTestAdapter.__init__c                 C   sª   |j }|j}i }|jdur t|jdƒr|j ¡ |d< n|j|d< d|jv r,|jd |d< |j ¡ D ]\}}| ¡ }|dv r>q1||d| dd	¡ < q1| 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Úhasattrr3   r(   ÚitemsÚupperÚreplacer2   ÚgenericÚenviron)r   r   r9   r:   Úkwargsr   Úvaluer   r   r   Úget_environ3   s   


zDjangoTestAdapter.get_environc                    s\   i ‰ d‡ fdd„	}|   |¡}|  ||¡}t d |¡¡ˆ d< tjjjdi ˆ ¤Ž}|  	||¡S )zR
            Make an outgoing request to the Django WSGI application.
            Nc                    sL   |   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_inforF   r8   rG   ©Ú
raw_kwargsr   r   Ústart_responseS   s   z.DjangoTestAdapter.send.<locals>.start_responseó    r;   r   r   )
rD   r0   ÚioÚBytesIOÚjoinr   ÚpackagesÚurllib3ÚHTTPResponseÚbuild_response)r   r   ÚargsrB   rS   rA   Úwsgi_responseÚrawr   rQ   r   ÚsendM   s   

zDjangoTestAdapter.sendc                 C   s   d S r   r   r,   r   r   r   r.   g   s   zDjangoTestAdapter.closeN)r!   r"   r#   Ú__doc__r)   rD   r_   r.   r   r   r   r   r/   *   s    r/   c                       s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚRequestsClientc                    s4   t ƒ j|i |¤Ž tƒ }|  d|¡ |  d|¡ d S )Nzhttp://zhttps://)Úsuperr)   r/   Úmount)r   r\   rB   Úadapter©Ú	__class__r   r   r)   k   s   zRequestsClient.__init__c                    s2   |  d¡std| ƒ‚tƒ j||g|¢R i |¤ŽS )NÚhttpzPMissing "http:" or "https:". Use a fully qualified URL, eg "http://testserver%s")Ú
startswithÚ
ValueErrorrb   r   )r   r9   r:   r\   rB   re   r   r   r   q   s   
zRequestsClient.request)r!   r"   r#   r)   r   Ú__classcell__r   r   re   r   ra   j   s    ra   c                  O   ó   t dƒ‚)Nz:requests must be installed in order to use RequestsClient.r   ©r\   rB   r   r   r   ra   w   ó   c                       s(   e Zd Z‡ fdd„Zedd„ ƒZ‡  ZS )ÚCoreAPIClientc                    s4   t ƒ | _tjj| jd�g|d< tƒ j|i |¤Ž d S )N)ÚsessionÚ
transports)ra   Ú_sessionr   rp   ÚHTTPTransportro   rb   r)   ©r   r\   rB   re   r   r   r)   }   s   zCoreAPIClient.__init__c                 C   r*   r   )rq   r,   r   r   r   ro   ‚   s   zCoreAPIClient.session)r!   r"   r#   r)   Úpropertyro   rj   r   r   re   r   rn   |   s    rn   c                  O   rk   )Nz8coreapi must be installed in order to use CoreAPIClient.r   rl   r   r   r   rn   ‡   rm   c                       sŽ   e Zd ZejZejZd‡ fdd„	Zddd„Z	ddd„Z
dd	d
„Zddd„Zddd„Zddd„Zddd„Z		d‡ fdd„	Z‡ fdd„Z‡  ZS )ÚAPIRequestFactoryFc                    s:   || _ i | _| jD ]}|| j|j< q	tƒ jdi |¤Ž d S ©Nr   )Úenforce_csrf_checksÚrenderer_classesÚrenderer_classes_listÚformatrb   r)   )r   rw   ÚdefaultsÚclsre   r   r   r)   �   s
   
zAPIRequestFactory.__init__Nc                 C   sÄ   |du rd|fS |du s|du sJ dƒ‚|r t |tjƒ}||fS |p$| j}|| jv s;J d |d dd„ | jD ƒ¡¡ƒ‚| j| ƒ }| |¡}|j}|j	rSd ||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                 S   s   g | ]}d | d  ‘qS )ú'r   )Ú.0Úfmtr   r   r   Ú
<listcomp>®   s    z2APIRequestFactory._encode_data.<locals>.<listcomp>z{}; charset={})r   r   ÚDEFAULT_CHARSETÚdefault_formatrx   rz   rW   ÚrenderÚ
media_typeÚcharsetÚ
isinstanceÚstrÚencode)r   r4   rz   r5   ÚretÚrendererr   r   r   Ú_encode_data–   s4   ÿ
æþý

ÿ
zAPIRequestFactory._encode_datac                 K   sb   dt |pi dd�i}|s"d|v r"t| d¡d ƒ}| d¡}||d< | |¡ | jd|fi |¤ŽS )NÚQUERY_STRINGT)Údoseqú?é   z
iso-8859-1ÚGET)r   r   ÚsplitÚdecodeÚupdater@   )r   Úpathr4   ÚextraÚrÚquery_stringr   r   r   ÚgetÃ   s   ÿ

zAPIRequestFactory.getc                 K   ó*   |   |||¡\}}| jd|||fi |¤ŽS )NÚPOST©rŒ   r@   ©r   r•   r4   rz   r5   r–   r   r   r   ÚpostÐ   ó   zAPIRequestFactory.postc                 K   rš   )NÚPUTrœ   r�   r   r   r   ÚputÔ   rŸ   zAPIRequestFactory.putc                 K   rš   )NÚPATCHrœ   r�   r   r   r   ÚpatchØ   rŸ   zAPIRequestFactory.patchc                 K   rš   )NÚDELETErœ   r�   r   r   r   ÚdeleteÜ   rŸ   zAPIRequestFactory.deletec                 K   rš   )NÚOPTIONSrœ   r�   r   r   r   Úoptionsà   rŸ   zAPIRequestFactory.optionsr}   úapplication/octet-streamc                    s0   |d ur
t |ƒ|d< tƒ j|||||fi |¤ŽS )NÚCONTENT_TYPE)rˆ   rb   r@   )r   r9   r•   r4   r5   Úsecurer–   re   r   r   r@   ä   s   
ÿÿzAPIRequestFactory.genericc                    s    t ƒ jdi |¤Ž}| j |_|S rv   )rb   r   rw   Ú_dont_enforce_csrf_checks)r   rB   r   re   r   r   r   í   s   
zAPIRequestFactory.request©F©NNr   )NNN)r}   r¨   F)r!   r"   r#   r   ÚTEST_REQUEST_RENDERER_CLASSESry   ÚTEST_REQUEST_DEFAULT_FORMATrƒ   r)   rŒ   r™   rž   r¡   r£   r¥   r§   r@   r   rj   r   r   re   r   ru   ‹   s    

-




ÿ	ru   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚForceAuthClientHandlerzj
    A patched version of ClientHandler that can enforce authentication
    on the outgoing requests.
    c                    s"   d | _ d | _tƒ j|i |¤Ž d S r   )Ú_force_userÚ_force_tokenrb   r)   rs   re   r   r   r)   ù   s   zForceAuthClientHandler.__init__c                    s   t || j| jƒ tƒ  |¡S r   )r   r±   r²   rb   Úget_response)r   r   re   r   r   r³   þ   s   z#ForceAuthClientHandler.get_response)r!   r"   r#   r`   r)   r³   rj   r   r   re   r   r°   ó   s    r°   c                       s°   e Zd Zd‡ fdd„	Zdd„ Zddd„Z‡ fd	d
„Zd‡ fdd„	Z		d‡ fdd„	Z		d‡ fdd„	Z			d‡ fdd„	Z
		d‡ fdd„	Z		d‡ fdd„	Z‡ fdd„Z‡  ZS )Ú	APIClientFc                    s&   t ƒ jdi |¤Ž t|ƒ| _i | _d S rv   )rb   r)   r°   ÚhandlerÚ_credentials)r   rw   r{   re   r   r   r)     s   

zAPIClient.__init__c                 K   s
   || _ dS )zK
        Sets headers that will be used on every outgoing request.
        N)r¶   ©r   rB   r   r   r   Úcredentials  s   
zAPIClient.credentialsNc                 C   s4   || j _|| j _|du r|du r|  ¡  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   r   r   r   r     s
   ÿzAPIClient.force_authenticatec                    s   |  | j¡ tƒ jdi |¤ŽS rv   )r”   r¶   rb   r   r·   re   r   r   r     s   zAPIClient.requestc                    s6   t ƒ j|fd|i|¤Ž}|r| j|fd|i|¤Ž}|S )Nr4   )rb   r™   Ú_handle_redirects)r   r•   r4   Úfollowr–   Úresponsere   r   r   r™      s   zAPIClient.getc                    ó>   t ƒ j|f|||dœ|¤Ž}|r| j|f|||dœ|¤Ž}|S ©N)r4   rz   r5   )rb   rž   rº   ©r   r•   r4   rz   r5   r»   r–   r¼   re   r   r   rž   &  ó   ÿÿÿzAPIClient.postc                    r½   r¾   )rb   r¡   rº   r¿   re   r   r   r¡   .  rÀ   zAPIClient.putc                    r½   r¾   )rb   r£   rº   r¿   re   r   r   r£   6  rÀ   zAPIClient.patchc                    r½   r¾   )rb   r¥   rº   r¿   re   r   r   r¥   >  rÀ   zAPIClient.deletec                    r½   r¾   )rb   r§   rº   r¿   re   r   r   r§   F  rÀ   zAPIClient.optionsc                    s.   i | _ d | j_d | j_| jrtƒ  ¡  d S d S r   )r¶   rµ   r±   r²   ro   rb   r¹   r,   re   r   r   r¹   N  s   ÿzAPIClient.logoutr¬   r­   r%   )NNNF)r!   r"   r#   r)   r¸   r   r   r™   rž   r¡   r£   r¥   r§   r¹   rj   r   r   re   r   r´     s,    

ÿÿÿÿÿr´   c                   @   ó   e Zd ZeZdS )ÚAPITransactionTestCaseN©r!   r"   r#   r´   Úclient_classr   r   r   r   rÂ   Y  ó    rÂ   c                   @   rÁ   )ÚAPITestCaseNrÃ   r   r   r   r   rÆ   ]  rÅ   rÆ   c                   @   rÁ   )ÚAPISimpleTestCaseNrÃ   r   r   r   r   rÇ   a  rÅ   rÇ   c                   @   rÁ   )ÚAPILiveServerTestCaseNrÃ   r   r   r   r   rÈ   e  rÅ   rÈ   c                 C   s"   t | dƒr| j| j_d S | j`d S ©NÚ_module_urlpatterns)r<   rÊ   Ú_moduleÚurlpatterns©r|   r   r   r   Úcleanup_url_patternsi  s   

rÎ   c                       sF   e Zd ZdZe‡ fdd„ƒZejdk re‡ fdd„ƒZ‡  Z	S ‡  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                    sv   t | jƒ| _t| jd�| _t| jdƒr| jj| _| j| j_| j ¡  t	j
dkr4|  | jj¡ |  t| ¡ tƒ  ¡  d S )N)ÚROOT_URLCONFrÌ   ©é   r   )r   r"   rË   r   Ú	_overrider<   rÌ   rÊ   ÚenableÚdjangoÚVERSIONÚaddClassCleanupÚdisablerÎ   rb   Ú
setUpClassrÍ   re   r   r   rÙ   €  s   



zURLPatternsTestCase.setUpClassrÑ   c                    s6   t ƒ  ¡  | j ¡  t| dƒr| j| j_d S | j`d S rÉ   )rb   ÚtearDownClassrÓ   rØ   r<   rÊ   rË   rÌ   rÍ   re   r   r   rÚ   ”  s
   



z!URLPatternsTestCase.tearDownClass)
r!   r"   r#   r`   ÚclassmethodrÙ   rÕ   rÖ   rÚ   rj   r   r   re   r   rÏ   p  s    
þrÏ   r­   )6rU   Ú	importlibr   rÕ   Údjango.confr   Údjango.core.exceptionsr   Údjango.core.handlers.wsgir   Údjango.testr   r   Údjango.test.clientr	   ÚDjangoClientr
   r   r1   Údjango.utils.encodingr   Údjango.utils.httpr   Úrest_framework.compatr   r   Úrest_framework.settingsr   r   rX   rY   Ú_collectionsÚHTTPHeaderDictr   r$   ÚadaptersÚHTTPAdapterr/   ÚSessionra   rn   ru   r°   r´   ÚTransactionTestCaserÂ   ÚTestCaserÆ   ÚSimpleTestCaserÇ   ÚLiveServerTestCaserÈ   rÎ   rÏ   r   r   r   r   Ú<module>   sB   
@hT