o
     Þhç9  ã                   @   sÄ  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
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j/ƒZ0G d(d)„ d)ej1ƒZ2d*d+„ Z3G d,d-„ d-ej/ƒZ4d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   úS/var/www/html/premium_crap/venv/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_environ2   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_responseR   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   ÚsendL   s   

zDjangoTestAdapter.sendc                 C   s   d S r   r   r,   r   r   r   r.   f   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)   j   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   p   s   
zRequestsClient.request)r!   r"   r#   r)   r   Ú__classcell__r   r   re   r   ra   i   s    ra   c                  O   ó   t dƒ‚)Nz:requests must be installed in order to use RequestsClient.r   ©r\   rB   r   r   r   ra   v   ó   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ƒ‚|r2z|   ||¡}W n	 ty'   Y nw t|tjƒ}||fS |p6| j}|| jv sMJ d |d dd„ | jD ƒ¡¡ƒ‚| j| ƒ }| 	|¡}|j
}|jred ||j¡}t|tƒrp| |j¡}||fS )	zP
        Encode the data returning a two tuple of (bytes, content_type)
        NrT   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={})Ú_encode_jsonÚAttributeErrorr   r   ÚDEFAULT_CHARSETÚdefault_formatrx   rz   rW   ÚrenderÚ
media_typeÚcharsetÚ
isinstanceÚstrÚencode)r   r4   rz   r5   ÚretÚrendererr   r   r   Ú_encode_data•   s>   ÿÿ
æþý

ÿ
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.optionsÚ ú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    

1




ÿ	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¢   1  rÂ   zAPIClient.putc                    r¿   rÀ   )rb   r¤   r¼   rÁ   re   r   r   r¤   9  rÂ   zAPIClient.patchc                    r¿   rÀ   )rb   r¦   r¼   rÁ   re   r   r   r¦   A  rÂ   zAPIClient.deletec                    r¿   rÀ   )rb   r¨   r¼   rÁ   re   r   r   r¨   I  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»   Q  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Ä   \  ó    rÄ   c                   @   rÃ   )ÚAPITestCaseNrÅ   r   r   r   r   rÈ   `  rÇ   rÈ   c                   @   rÃ   )ÚAPISimpleTestCaseNrÅ   r   r   r   r   rÉ   d  rÇ   rÉ   c                   @   rÃ   )ÚAPILiveServerTestCaseNrÅ   r   r   r   r   rÊ   h  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_patternsl  s   

rÏ   c                       s$   e Zd ZdZe‡ fdd„ƒZ‡  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                    sl   t | jƒ| _t| jd�| _t| jdƒr| jj| _| j| j_| j ¡  |  	| jj
¡ |  	t| ¡ tƒ  ¡  d S )N)ÚROOT_URLCONFrÍ   )r   r"   rÌ   r   Ú	_overrider<   rÍ   rË   ÚenableÚaddClassCleanupÚdisablerÏ   rb   Ú
setUpClassrÎ   re   r   r   rÖ   ƒ  s   


zURLPatternsTestCase.setUpClass)r!   r"   r#   r`   ÚclassmethodrÖ   rj   r   r   re   r   rÐ   s  s    rÐ   r¯   )5rU   Ú	importlibr   Ú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>   s@   
@lT