3
=^9                 @   s  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
 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 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e%Z&G dd dej'j(Z)G dd dej*Z+ndd Z+edk	rBG 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j0Z1G d&d' d'ej2Z3G d(d) d)ej4Z5G d*d+ d+ej6Z7G d,d- d-ej4Z8dS )/    )unicode_literalsN)import_module)settings)ImproperlyConfigured)WSGIHandler)override_settings	testcases)Client)ClientHandler)RequestFactory)six)force_bytes)	urlencode)coreapirequests)api_settingsc             C   s   || _ || _d S )N)Z_force_auth_userZ_force_auth_token)requestusertoken r   B/tmp/pip-build-8app2_gc/djangorestframework/rest_framework/test.pyforce_authenticate   s    r   c               @   s   e Zd Zdd ZdS )
HeaderDictc             C   s
   | j |S )N)
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 )N)r#   )r   r   r   r   isclosed(   s    zMockOriginalResponse.isclosedc             C   s
   d| _ d S )NT)r#   )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 )N)r   appDjangoRequestFactoryfactory)r   r   r   r   r%   3   s    zDjangoTestAdapter.__init__c             C   s   |j }|j}i }|jdk	r@t|jdr6|jj |d< n
|j|d< d|jkrX|jd |d< x<|jj D ].\}}|j }|dkr~qd||d	|jd
d < qdW | j	j
||f|jS )zb
            Given a `requests.PreparedRequest` instance, return a WSGI environ dict.
            Nreaddatazcontent-typecontent_type
CONNECTIONCONTENT-LENGTHCONTENT-TYPEzHTTP_%s-_)r/   r0   r1   )methodurlbodyhasattrr,   r$   itemsupperreplacer+   genericenviron)r   r   r4   r5   kwargsr   valuer   r   r   get_environ7   s    


zDjangoTestAdapter.get_environc                sV   i   fdd}| j |}| j||}tjdj| d< tjjjf  }| j	||S )zR
            Make an outgoing request to the Django WSGI application.
            c                sL   | j 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_headersrA   r3   rB   )
raw_kwargsr   r   start_responseW   s    z.DjangoTestAdapter.send.<locals>.start_response    r6   )
r?   r)   ioBytesIOjoinr   packagesurllib3HTTPResponsebuild_response)r   r   argsr=   rJ   r<   Zwsgi_responserawr   )rI   r   sendQ   s    

zDjangoTestAdapter.sendc             C   s   d S )Nr   )r   r   r   r   r'   k   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                s4   t t| j|| t }| jd| | jd| d S )Nzhttp://zhttps://)superrW   r%   r(   mount)r   rS   r=   adapter)	__class__r   r   r%   o   s    zRequestsClient.__init__c                s0   |j dstd| tt| j||f||S )NhttpzPMissing "http:" or "https:". Use a fully qualified URL, eg "http://testserver%s")
startswith
ValueErrorrX   rW   r   )r   r4   r5   rS   r=   )r[   r   r   r   u   s    
zRequestsClient.request)r   r   r    r%   r   __classcell__r   r   )r[   r   rW   n   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   {   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t| j||S )N)session
transports)	rW   _sessionr   rb   ZHTTPTransportra   rX   r`   r%   )r   rS   r=   )r[   r   r   r%      s    zCoreAPIClient.__init__c             C   s   | j S )N)rc   )r   r   r   r   ra      s    zCoreAPIClient.session)r   r   r    r%   propertyra   r_   r   r   )r[   r   r`      s   r`   c              O   s   t dd S )Nz8coreapi must be installed in order to use CoreAPIClient.)r   )rS   r=   r   r   r   r`      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                s>   || _ i | _x| jD ]}|| j|j< qW tt| jf | d S )N)enforce_csrf_checksrenderer_classesrenderer_classes_listformatrX   re   r%   )r   rf   defaultscls)r[   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}nx|pB| j}|| jkspt dj|djdd | jD | j|  }|j|}dj|j	|j
}t|tjrt|j|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`.zsInvalid format '{0}'. Available formats are {1}. 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{0}; charset={1})AssertionErrorr   r   DEFAULT_CHARSETdefault_formatrg   ri   rN   render
media_typecharset
isinstancer   	text_typebytesencode)r   r-   ri   r.   retZrendererr   r   r   _encode_data   s$    

zAPIRequestFactory._encode_datac             K   sf   dt |p
i ddi}| rLd|krLt|jdd }tjrD|jd}||d< |j| | jd|f|S )NQUERY_STRINGT)doseq?   z
iso-8859-1GET)r   r   splitr   PY3decodeupdater;   )r   pathr-   extrarZquery_stringr   r   r   get   s    

zAPIRequestFactory.getc             K   s&   | j |||\}}| jd|||f|S )NPOST)r|   r;   )r   r   r-   ri   r.   r   r   r   r   post   s    zAPIRequestFactory.postc             K   s&   | j |||\}}| jd|||f|S )NPUT)r|   r;   )r   r   r-   ri   r.   r   r   r   r   put   s    zAPIRequestFactory.putc             K   s&   | j |||\}}| jd|||f|S )NPATCH)r|   r;   )r   r   r-   ri   r.   r   r   r   r   patch   s    zAPIRequestFactory.patchc             K   s&   | j |||\}}| jd|||f|S )NDELETE)r|   r;   )r   r   r-   ri   r.   r   r   r   r   delete   s    zAPIRequestFactory.deletec             K   s&   | j |||\}}| jd|||f|S )NOPTIONS)r|   r;   )r   r   r-   ri   r.   r   r   r   r   options   s    zAPIRequestFactory.optionsrl   application/octet-streamc                s0   |d k	rt ||d< tt| j|||||f|S )NCONTENT_TYPE)strrX   re   r;   )r   r4   r   r-   r.   securer   )r[   r   r   r;      s    
zAPIRequestFactory.genericc                s    t t| jf |}| j |_|S )N)rX   re   r   rf   Z_dont_enforce_csrf_checks)r   r=   r   )r[   r   r   r      s    
zAPIRequestFactory.request)F)NN)N)NNN)NNN)NNN)NNN)NNN)rl   r   F)r   r   r    r   ZTEST_REQUEST_RENDERER_CLASSESrh   ZTEST_REQUEST_DEFAULT_FORMATrs   r%   r|   r   r   r   r   r   r   r;   r   r_   r   r   )r[   r   re      s   
+





 re   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t| j|| d S )N)_force_user_force_tokenrX   r   r%   )r   rS   r=   )r[   r   r   r%      s    zForceAuthClientHandler.__init__c                s    t || j| j tt| j|S )N)r   r   r   rX   r   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 t| jf | t|| _i | _d S )N)rX   r   r%   r   handler_credentials)r   rf   rj   )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 | j  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 | j tt| jf |S )N)r   r   rX   r   r   )r   r=   )r[   r   r   r     s    zAPIClient.requestc                s2   t t| j|fd|i|}|r.| j|f|}|S )Nr-   )rX   r   r   _handle_redirects)r   r   r-   followr   response)r[   r   r   r   #  s    zAPIClient.getc                s6   t t| j|f|||d|}|r2| j|f|}|S )N)r-   ri   r.   )rX   r   r   r   )r   r   r-   ri   r.   r   r   r   )r[   r   r   r   )  s
    
zAPIClient.postc                s6   t t| j|f|||d|}|r2| j|f|}|S )N)r-   ri   r.   )rX   r   r   r   )r   r   r-   ri   r.   r   r   r   )r[   r   r   r   1  s
    
zAPIClient.putc                s6   t t| j|f|||d|}|r2| j|f|}|S )N)r-   ri   r.   )rX   r   r   r   )r   r   r-   ri   r.   r   r   r   )r[   r   r   r   9  s
    
zAPIClient.patchc                s6   t t| j|f|||d|}|r2| j|f|}|S )N)r-   ri   r.   )rX   r   r   r   )r   r   r-   ri   r.   r   r   r   )r[   r   r   r   A  s
    
zAPIClient.deletec                s6   t t| j|f|||d|}|r2| j|f|}|S )N)r-   ri   r.   )rX   r   r   r   )r   r   r-   ri   r.   r   r   r   )r[   r   r   r   I  s
    
zAPIClient.optionsc                s.   i | _ d | j_d | j_| jr*tt| j  d S )N)r   r   r   r   ra   rX   r   r   )r   )r[   r   r   r   Q  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   client_classr   r   r   r   r   \  s   r   c               @   s   e Zd ZeZdS )APITestCaseN)r   r   r    r   r   r   r   r   r   r   `  s   r   c               @   s   e Zd ZeZdS )APISimpleTestCaseN)r   r   r    r   r   r   r   r   r   r   d  s   r   c               @   s   e Zd ZeZdS )APILiveServerTestCaseN)r   r   r    r   r   r   r   r   r   r   h  s   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                sV   t | j| _t| jd| _t| jdr0| jj| _| j| j_| jj  t	t
| j  d S )N)ZROOT_URLCONFurlpatterns)r   r   _moduler   	_overrider7   r   _module_urlpatternsenablerX   r   
setUpClass)rk   )r[   r   r   r   |  s    


zURLPatternsTestCase.setUpClassc                s8   t t| j  | jj  t| dr.| j| j_n| j`d S )Nr   )	rX   r   tearDownClassr   disabler7   r   r   r   )rk   )r[   r   r   r     s
    

z!URLPatternsTestCase.tearDownClass)r   r   r    rV   classmethodr   r   r_   r   r   )r[   r   r   l  s   r   )NN)9
__future__r   rL   	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.utilsr   Zdjango.utils.encodingr   Zdjango.utils.httpr   Zrest_framework.compatr   r   Zrest_framework.settingsr   r   rO   rP   _collectionsHTTPHeaderDictr   objectr!   adaptersHTTPAdapterr(   SessionrW   r`   re   r   r   ZTransactionTestCaser   ZTestCaser   ZSimpleTestCaser   ZLiveServerTestCaser   r   r   r   r   r   <module>   s@   

@
gT