o
    wvXjÏ7  ã                   @   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ƒZ2G d*d+„ d+ej/ƒZ3d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   úP/var/www/html/myproject/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                    sZ   i ‰ ‡ fdd„}|   |¡}|  ||¡}t d |¡¡ˆ d< tjjjdi ˆ ¤Ž}|  	||¡S )zR
            Make an outgoing request to the Django WSGI application.
            c                    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_headersrF   r8   rG   ©Ú
raw_kwargsr   r   Ústart_responseR   s   z.DjangoTestAdapter.send.<locals>.start_responseó    r;   Nr   )
rD   r0   ÚioÚBytesIOÚjoinr   ÚpackagesÚurllib3ÚHTTPResponseÚbuild_response)r   r   ÚargsrB   rR   rA   Úwsgi_responseÚrawr   rP   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Ú
ValueErrorra   r   )r   r9   r:   r[   rB   rd   r   r   r   p   s   
zRequestsClient.request)r!   r"   r#   r)   r   Ú__classcell__r   r   rd   r   r`   i   s    r`   c                  O   ó   t dƒ‚)Nz:requests must be installed in order to use RequestsClient.r   ©r[   rB   r   r   r   r`   v   ó   c                       s(   e Zd Z‡ fdd„Zedd„ ƒZ‡  ZS )ÚCoreAPIClientc                    s0   t ƒ | _tjj| jd�g|d< tƒ j|i |¤ŽS )N)ÚsessionÚ
transports)r`   Ú_sessionr   ro   ÚHTTPTransportrn   ra   r)   ©r   r[   rB   rd   r   r   r)   |   s   zCoreAPIClient.__init__c                 C   r*   r   )rp   r,   r   r   r   rn   �   s   zCoreAPIClient.session)r!   r"   r#   r)   Úpropertyrn   ri   r   r   rd   r   rm   {   s    rm   c                  O   rj   )Nz8coreapi must be installed in order to use CoreAPIClient.r   rk   r   r   r   rm   †   rl   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Úformatra   r)   )r   rv   ÚdefaultsÚclsrd   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| ƒ }| |¡}d |j|j	¡}t
|tƒrY| |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_formatrw   ry   rV   ÚrenderÚ
media_typeÚcharsetÚ
isinstanceÚstrÚencode)r   r4   ry   r5   ÚretÚrendererr   r   r   Ú_encode_data•   s0   ÿ
èþý

ÿ
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   ry   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‡   ra   r@   )r   r9   r”   r4   r5   Úsecurer•   rd   r   r   r@   á   s   
ÿÿzAPIRequestFactory.genericc                    s    t ƒ jdi |¤Ž}| j |_|S ru   )ra   r   rv   Ú_dont_enforce_csrf_checks)r   rB   r   rd   r   r   r   ê   s   
zAPIRequestFactory.request©F©NNr   )NNN)r|   r§   F)r!   r"   r#   r   ÚTEST_REQUEST_RENDERER_CLASSESrx   ÚTEST_REQUEST_DEFAULT_FORMATr‚   r)   r‹   r˜   r�   r    r¢   r¤   r¦   r@   r   ri   r   r   rd   r   rt   Š   s    

+




ÿ	rt   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_tokenra   r)   rr   rd   r   r   r)   ö   s   zForceAuthClientHandler.__init__c                    s   t || j| jƒ tƒ  |¡S r   )r   r°   r±   ra   Úget_response)r   r   rd   r   r   r²   û   s   z#ForceAuthClientHandler.get_response)r!   r"   r#   r_   r)   r²   ri   r   r   rd   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 ru   )ra   r)   r¯   ÚhandlerÚ_credentials)r   rv   rz   rd   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   s(   || j _|| j _|du r|  ¡  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 ru   )r“   rµ   ra   r   r¶   rd   r   r   r     s   zAPIClient.requestc                    s2   t ƒ j|fd|i|¤Ž}|r| j|fi |¤Ž}|S )Nr4   )ra   r˜   Ú_handle_redirects)r   r”   r4   Úfollowr•   Úresponserd   r   r   r˜     s   zAPIClient.getc                    ó6   t ƒ j|f|||dœ|¤Ž}|r| j|fi |¤Ž}|S ©N)r4   ry   r5   )ra   r�   r¹   ©r   r”   r4   ry   r5   rº   r•   r»   rd   r   r   r�   #  ó   ÿÿÿzAPIClient.postc                    r¼   r½   )ra   r    r¹   r¾   rd   r   r   r    +  r¿   zAPIClient.putc                    r¼   r½   )ra   r¢   r¹   r¾   rd   r   r   r¢   3  r¿   zAPIClient.patchc                    r¼   r½   )ra   r¤   r¹   r¾   rd   r   r   r¤   ;  r¿   zAPIClient.deletec                    r¼   r½   )ra   r¦   r¹   r¾   rd   r   r   r¦   C  r¿   zAPIClient.optionsc                    s.   i | _ d | j_d | j_| jrtƒ  ¡  d S d S r   )rµ   r´   r°   r±   rn   ra   r¸   r,   rd   r   r   r¸   K  s   ÿzAPIClient.logoutr«   r¬   r%   )NNNF)r!   r"   r#   r)   r·   r   r   r˜   r�   r    r¢   r¤   r¦   r¸   ri   r   r   rd   r   r³     s,    

ÿÿÿÿÿr³   c                   @   ó   e Zd ZeZdS )ÚAPITransactionTestCaseN©r!   r"   r#   r³   Úclient_classr   r   r   r   rÁ   V  ó    rÁ   c                   @   rÀ   )ÚAPITestCaseNrÂ   r   r   r   r   rÅ   Z  rÄ   rÅ   c                   @   rÀ   )ÚAPISimpleTestCaseNrÂ   r   r   r   r   rÆ   ^  rÄ   rÆ   c                   @   rÀ   )ÚAPILiveServerTestCaseNrÂ   r   r   r   r   rÇ   b  rÄ   rÇ   c                       s4   e Zd ZdZe‡ fd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                    sR   t | jƒ| _t| jd�| _t| jdƒr| jj| _| j| j_| j ¡  t	ƒ  
¡  d S )N)ÚROOT_URLCONFÚurlpatterns)r   r"   Ú_moduler   Ú	_overrider<   rÊ   Ú_module_urlpatternsÚenablera   Ú
setUpClass©r{   rd   r   r   rÏ   v  s   


zURLPatternsTestCase.setUpClassc                    s6   t ƒ  ¡  | j ¡  t| dƒr| j| j_d S | j`d S )NrÍ   )ra   ÚtearDownClassrÌ   Údisabler<   rÍ   rË   rÊ   rÐ   rd   r   r   rÑ   „  s
   



z!URLPatternsTestCase.tearDownClass)r!   r"   r#   r_   ÚclassmethodrÏ   rÑ   ri   r   r   rd   r   rÈ   f  s    rÈ   r¬   )4rT   Ú	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   rW   rX   Ú_collectionsÚHTTPHeaderDictr   r$   ÚadaptersÚHTTPAdapterr/   ÚSessionr`   rm   rt   r¯   r³   ÚTransactionTestCaserÁ   ÚTestCaserÅ   ÚSimpleTestCaserÆ   ÚLiveServerTestCaserÇ   rÈ   r   r   r   r   Ú<module>   s>   
@fT