o
    ¤ó·iç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)Z_force_auth_userZ_force_auth_token)ÚrequestÚuserÚtoken© r   úYC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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)Z
CONNECTIONzCONTENT-LENGTHzCONTENT-TYPEzHTTP_%sú-Ú_)ÚmethodÚurlÚbodyÚhasattrr1   r&   ÚitemsÚupperÚreplacer0   ÚgenericÚenviron)r   r   r6   r7   Ú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"   )Zwsgi_statusZwsgi_headersÚexc_inforC   r5   rD   ©Z
raw_kwargsr   r   Ústart_responseR   s   z.DjangoTestAdapter.send.<locals>.start_responseó    r8   r   r   )
rA   r.   ÚioÚBytesIOÚjoinr   ÚpackagesÚurllib3ÚHTTPResponseÚbuild_response)r   r   Úargsr?   rM   r>   Zwsgi_responseÚrawr   rL   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'   rA   rX   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   rV   r?   Ú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Ú
ValueErrorr[   r   )r   r6   r7   rV   r?   r^   r   r   r   p   s   
zRequestsClient.request)r   r    r!   r'   r   Ú__classcell__r   r   r^   r   rZ   i   s    rZ   c                  O   ó   t dƒ‚)Nz:requests must be installed in order to use RequestsClient.r   ©rV   r?   r   r   r   rZ   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)rZ   Ú_sessionr   ri   ZHTTPTransportrh   r[   r'   ©r   rV   r?   r^   r   r   r'   |   s   zCoreAPIClient.__init__c                 C   r(   r   )rj   r*   r   r   r   rh   �   s   zCoreAPIClient.session)r   r    r!   r'   Úpropertyrh   rc   r   r   r^   r   rg   {   s    rg   c                  O   rd   )Nz8coreapi must be installed in order to use CoreAPIClient.r   re   r   r   r   rg   †   rf   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Úformatr[   r'   )r   ro   ÚdefaultsÚclsr^   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)
        NrN   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={})Z_encode_jsonÚAttributeErrorr   r   ÚDEFAULT_CHARSETÚdefault_formatrp   rr   rQ   ÚrenderÚ
media_typeÚcharsetÚ
isinstanceÚstrÚencode)r   r2   rr   r3   ÚretZ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   Úpathr2   ÚextraÚrZquery_stringr   r   r   ÚgetÆ   s   ÿ

zAPIRequestFactory.getc                 K   ó*   |   |||¡\}}| jd|||fi |¤ŽS )NÚPOST©rƒ   r=   ©r   rŒ   r2   rr   r3   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€   r[   r=   )r   r6   rŒ   r2   r3   Úsecurer�   r^   r   r   r=   ç   s   
ÿÿzAPIRequestFactory.genericc                    s    t ƒ jdi |¤Ž}| j |_|S rn   )r[   r   ro   Z_dont_enforce_csrf_checks)r   r?   r   r^   r   r   r   ð   s   
zAPIRequestFactory.request©F©NNr   )NNN)rž   rŸ   F)r   r    r!   r   ZTEST_REQUEST_RENDERER_CLASSESrq   ZTEST_REQUEST_DEFAULT_FORMATr{   r'   rƒ   r�   r”   r—   r™   r›   r�   r=   r   rc   r   r   r^   r   rm   Š   s    

1




ÿ	rm   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_tokenr[   r'   rk   r^   r   r   r'   ü   s   zForceAuthClientHandler.__init__c                    s   t || j| jƒ tƒ  |¡S r   )r   r¥   r¦   r[   Úget_response)r   r   r^   r   r   r§     s   z#ForceAuthClientHandler.get_response)r   r    r!   rY   r'   r§   rc   r   r   r^   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 rn   )r[   r'   r¤   ÚhandlerÚ_credentials)r   ro   rs   r^   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   r?   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 rn   )r‹   rª   r[   r   r«   r^   r   r   r     s   zAPIClient.requestc                    s6   t ƒ j|fd|i|¤Ž}|r| j|fd|i|¤Ž}|S )Nr2   )r[   r�   Ú_handle_redirects)r   rŒ   r2   Úfollowr�   Úresponser^   r   r   r�   #  s   zAPIClient.getc                    ó>   t ƒ j|f|||dœ|¤Ž}|r| j|f|||dœ|¤Ž}|S ©N)r2   rr   r3   )r[   r”   r®   ©r   rŒ   r2   rr   r3   r¯   r�   r°   r^   r   r   r”   )  ó   ÿÿÿzAPIClient.postc                    r±   r²   )r[   r—   r®   r³   r^   r   r   r—   1  r´   zAPIClient.putc                    r±   r²   )r[   r™   r®   r³   r^   r   r   r™   9  r´   zAPIClient.patchc                    r±   r²   )r[   r›   r®   r³   r^   r   r   r›   A  r´   zAPIClient.deletec                    r±   r²   )r[   r�   r®   r³   r^   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¦   rh   r[   r­   r*   r^   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­   rc   r   r   r^   r   r¨     s,    

ÿÿÿÿÿr¨   c                   @   ó   e Zd ZeZdS )ÚAPITransactionTestCaseN©r   r    r!   r¨   Z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)r9   r¼   Ú_moduleÚurlpatterns©rt   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)ZROOT_URLCONFr¾   )r   r    r½   r   Z	_overrider9   r¾   r¼   ÚenableZaddClassCleanupÚdisablerÀ   r[   Ú
setUpClassr¿   r^   r   r   rÄ   ƒ  s   


zURLPatternsTestCase.setUpClass)r   r    r!   rY   ÚclassmethodrÄ   rc   r   r   r^   r   rÁ   s  s    rÁ   r£   )5rO   Ú	importlibr   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.core.handlers.wsgir   Zdjango.testr   r   Zdjango.test.clientr	   ZDjangoClientr
   r   r/   Zdjango.utils.encodingr   Zdjango.utils.httpr   Zrest_framework.compatr   r   Zrest_framework.settingsr   r   rR   rS   Ú_collectionsÚHTTPHeaderDictr   r"   ÚadaptersÚHTTPAdapterr-   ÚSessionrZ   rg   rm   r¤   r¨   ZTransactionTestCaser¶   ZTestCaser¹   ZSimpleTestCaserº   ZLiveServerTestCaser»   rÀ   rÁ   r   r   r   r   Ú<module>   s@   
@lT