o
    ).h:                     @   s  d dl Z 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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rG 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rG 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j0Z1G d(d) d)ej2Z3d*d+ Z4G d,d- d-ej0Z5d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   R/var/www/supernova/superenvnew/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_environ3   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_responseS   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   sendM   s   

zDjangoTestAdapter.sendc                 C   s   d S r   r   r,   r   r   r   r.   g   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)   k   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   q   s   
zRequestsClient.request)r!   r"   r#   r)   r   __classcell__r   r   re   r   ra   j   s    ra   c                  O      t d)Nz:requests must be installed in order to use RequestsClient.r   r\   rB   r   r   r   ra   w      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|r t |tj}||fS |p$| j}|| jv s;J d|ddd | jD | j|  }||}|j}|j	rSd||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={})r   r   DEFAULT_CHARSETdefault_formatrx   rz   rW   render
media_typecharset
isinstancestrencode)r   r4   rz   r5   retrendererr   r   r   _encode_data   s4   



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.optionsr}   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    

-




	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   .  r   zAPIClient.putc                    r   r   )rb   r   r   r   re   r   r   r   6  r   zAPIClient.patchc                    r   r   )rb   r   r   r   re   r   r   r   >  r   zAPIClient.deletec                    r   r   )rb   r   r   r   re   r   r   r   F  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   N  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   Y      r   c                   @   r   )APITestCaseNr   r   r   r   r   r   ]  r   r   c                   @   r   )APISimpleTestCaseNr   r   r   r   r   r   a  r   r   c                   @   r   )APILiveServerTestCaseNr   r   r   r   r   r   e  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_patternsi  s   

r   c                       sF   e Zd ZdZe fddZejdk re fddZ  Z	S   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r| jj| _| j| j_| j  t	j
dkr4| | jj | t|  t   d S )N)ROOT_URLCONFr      r   )r   r"   r   r   	_overrider<   r   r   enabledjangoVERSIONaddClassCleanupdisabler   rb   
setUpClassr   re   r   r   r     s   



zURLPatternsTestCase.setUpClassr   c                    s6   t    | j  t| dr| j| j_d S | j`d S r   )rb   tearDownClassr   r   r<   r   r   r   r   re   r   r   r     s
   



z!URLPatternsTestCase.tearDownClass)
r!   r"   r#   r`   classmethodr   r   r   r   rj   r   r   re   r   r   p  s    
r   r   )6rU   	importlibr   r   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>   sB   
@hT