U
    ڲg`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k	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k	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   7/tmp/pip-unpacked-wheel-11h17kvo/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   s    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   s   | j S r   r#   r   r   r   r   isclosed#   s    zMockOriginalResponse.isclosedc                 C   s
   d| _ d S )NTr&   r'   r   r   r   close&   s    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k	r@t|jdr6|j |d< n
|j|d< d|jkrX|jd |d< |j D ].\}}| }|dkr|qb||d|dd	 < qb| j	j
||f|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hasattrr.   r$   itemsupperreplacer-   genericenviron)r   r   r3   r4   kwargsr   valuer   r   r   get_environ2   s    


zDjangoTestAdapter.get_environc                    sX   i  d fdd	}|  |}| ||}td| d< tjjjf  }| 	||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_infor@   r2   rA   Z
raw_kwargsr   r   start_responseR   s    z.DjangoTestAdapter.send.<locals>.start_response    r5   )N)
r>   r+   ioBytesIOjoinr   packagesurllib3HTTPResponsebuild_response)r   r   argsr<   rJ   r;   Zwsgi_responserawr   rI   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%   r>   rU   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                    s0   t  j|| t }| d| | d| d S )Nzhttp://zhttps://)superr%   r*   mount)r   rS   r<   adapter	__class__r   r   r%   j   s    zRequestsClient.__init__c                    s,   | dstd| t j||f||S )NhttpzPMissing "http:" or "https:". Use a fully qualified URL, eg "http://testserver%s")
startswith
ValueErrorrX   r   )r   r3   r4   rS   r<   r[   r   r   r   p   s    
zRequestsClient.request)r   r   r    r%   r   __classcell__r   r   r[   r   rW   i   s   rW   c                  O   s   t dd S )Nz:requests must be installed in order to use RequestsClient.r   rS   r<   r   r   r   rW   v   s    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|| d S )N)session
transports)rW   _sessionr   rd   ZHTTPTransportrc   rX   r%   r   rS   r<   r[   r   r   r%   |   s    zCoreAPIClient.__init__c                 C   s   | j S r   )re   r'   r   r   r   rc      s    zCoreAPIClient.session)r   r   r    r%   propertyrc   r`   r   r   r[   r   rb   {   s   rb   c                  O   s   t dd S )Nz8coreapi must be installed in order to use CoreAPIClient.r   ra   r   r   r   rb      s    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                    s6   || _ i | _| jD ]}|| j|j< qt jf | d S r   )enforce_csrf_checksrenderer_classesrenderer_classes_listformatrX   r%   )r   ri   defaultsclsr[   r   r   r%      s
    
zAPIRequestFactory.__init__Nc                 C   s   |dkrd|fS |dks(|dks(t d|r:t|tj}n||pB| j}|| jkspt d|ddd | jD | j|  }||}|j	}|j
rd||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={})AssertionErrorr   r   DEFAULT_CHARSETdefault_formatrj   rl   rN   render
media_typecharset
isinstancestrencode)r   r/   rl   r0   retZrendererr   r   r   _encode_data   s2    


 
zAPIRequestFactory._encode_datac                 K   s^   dt |p
i ddi}|sDd|krDt|dd }|d}||d< || | jd|f|S )NQUERY_STRINGT)doseq?   z
iso-8859-1GET)r   r   splitdecodeupdater:   )r   pathr/   extrarZquery_stringr   r   r   get   s     

zAPIRequestFactory.getc                 K   s&   |  |||\}}| jd|||f|S )NPOSTr~   r:   r   r   r/   rl   r0   r   r   r   r   post   s    zAPIRequestFactory.postc                 K   s&   |  |||\}}| jd|||f|S )NPUTr   r   r   r   r   put   s    zAPIRequestFactory.putc                 K   s&   |  |||\}}| jd|||f|S )NPATCHr   r   r   r   r   patch   s    zAPIRequestFactory.patchc                 K   s&   |  |||\}}| jd|||f|S )NDELETEr   r   r   r   r   delete   s    zAPIRequestFactory.deletec                 K   s&   |  |||\}}| jd|||f|S )NOPTIONSr   r   r   r   r   options   s    zAPIRequestFactory.optionsro   application/octet-streamc                    s,   |d k	rt ||d< t j|||||f|S )NCONTENT_TYPE)r{   rX   r:   )r   r3   r   r/   r0   securer   r[   r   r   r:      s        zAPIRequestFactory.genericc                    s   t  jf |}| j |_|S r   )rX   r   ri   Z_dont_enforce_csrf_checks)r   r<   r   r[   r   r   r      s    
zAPIRequestFactory.request)F)NN)N)NNN)NNN)NNN)NNN)NNN)ro   r   F)r   r   r    r   ZTEST_REQUEST_RENDERER_CLASSESrk   ZTEST_REQUEST_DEFAULT_FORMATrv   r%   r~   r   r   r   r   r   r   r:   r   r`   r   r   r[   r   rh      s   
-





    	rh   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|| d S r   )_force_user_force_tokenrX   r%   rf   r[   r   r   r%      s    zForceAuthClientHandler.__init__c                    s   t || j| j t |S r   )r   r   r   rX   get_response)r   r   r[   r   r   r      s    z#ForceAuthClientHandler.get_response)r   r   r    rV   r%   r   r`   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f | t|| _i | _d S r   )rX   r%   r   handler_credentials)r   ri   rm   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   s,   || j _|| j _|dkr(|dkr(|   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f |S r   )r   r   rX   r   r   r[   r   r   r     s    zAPIClient.requestc                    s6   t  j|fd|i|}|r2| j|fd|i|}|S )Nr/   )rX   r   _handle_redirects)r   r   r/   followr   responser[   r   r   r     s    zAPIClient.getc                    s>   t  j|f|||d|}|r:| j|f|||d|}|S N)r/   rl   r0   )rX   r   r   r   r   r/   rl   r0   r   r   r   r[   r   r   r   %  s      zAPIClient.postc                    s>   t  j|f|||d|}|r:| j|f|||d|}|S r   )rX   r   r   r   r[   r   r   r   -  s      zAPIClient.putc                    s>   t  j|f|||d|}|r:| j|f|||d|}|S r   )rX   r   r   r   r[   r   r   r   5  s      zAPIClient.patchc                    s>   t  j|f|||d|}|r:| j|f|||d|}|S r   )rX   r   r   r   r[   r   r   r   =  s      zAPIClient.deletec                    s>   t  j|f|||d|}|r:| j|f|||d|}|S r   )rX   r   r   r   r[   r   r   r   E  s      zAPIClient.optionsc                    s*   i | _ d | j_d | j_| jr&t   d S r   )r   r   r   r   rc   rX   r   r'   r[   r   r   r   M  s
    zAPIClient.logout)F)NN)NF)NNNF)NNNF)NNNF)NNNF)NNNF)r   r   r    r%   r   r   r   r   r   r   r   r   r   r   r`   r   r   r[   r   r     s*   

          r   c                   @   s   e Zd ZeZdS )APITransactionTestCaseNr   r   r    r   Zclient_classr   r   r   r   r   X  s   r   c                   @   s   e Zd ZeZdS )APITestCaseNr   r   r   r   r   r   \  s   r   c                   @   s   e Zd ZeZdS )APISimpleTestCaseNr   r   r   r   r   r   `  s   r   c                   @   s   e Zd ZeZdS )APILiveServerTestCaseNr   r   r   r   r   r   d  s   r   c                 C   s    t | dr| j| j_n| j`d S )N_module_urlpatterns)r6   r   _moduleurlpatternsrn   r   r   r   cleanup_url_patternsh  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r0| jj| _| j| j_| j  | 	| jj
 | 	t|  t   d S )N)ZROOT_URLCONFr   )r   r   r   r   Z	_overrider6   r   r   enableZaddClassCleanupdisabler   rX   
setUpClassr   r[   r   r   r     s    


zURLPatternsTestCase.setUpClass)r   r   r    rV   classmethodr   r`   r   r   r[   r   r   o  s   r   )NN)5rL   	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   rO   rP   _collectionsHTTPHeaderDictr   r!   adaptersHTTPAdapterr*   SessionrW   rb   rh   r   r   ZTransactionTestCaser   ZTestCaser   ZSimpleTestCaser   ZLiveServerTestCaser   r   r   r   r   r   r   <module>   s>   

@
hT