o
    i                     @   s|  d Z ddlZddl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ZddlZz
ddlmZmZ W n eyO   dZdZddlmZmZ Y nw dd	lmZ dd
lmZ ddlmZmZ ddlmZmZ ddlm Z  eej!"e#$ Z%e&e%d d d ddZ'e(e'd d Z)W d   n1 sw   Y  G dd dZ*G dd dZ+dd Z,dd Z-dddZ.dS ) zTesting utils.    N)SimpleCookie)Path)Optional)parse_qsurlparse)V30RequestValidatorV30ResponseValidator)openapi_request_validatoropenapi_response_validator)Spec)RequestParameters)HTTPRequestHTTPResponse)HeadersImmutableMultiDict)get_openapi_spec	test_datazapp-settingszoverrides.jsonutf-8)encodingz$@jupyterlab/unicode-extension:plugincommentc                   @   s   e Zd ZdZdedefddZedefddZ	edefd	d
Z
edefddZedee fddZedefddZdS )TornadoOpenAPIRequestz6
    Converts a torando request to an OpenAPI one
    requestspecc           
      C   s   || _ || _|jdu rd}t|t|j| _t }||j	dd i }|
 D ]	\}}|j||< q*t|j}i }	ttt|jt|jt||	d| _dS )zInitialize the request.NzRequest URL is missingz
Set-Cookie )queryheadercookiepath)r   r   urlRuntimeErrorr   _url_parsedr   loadheadersgetitemsvaluer   r   r   r   dict
parameters)
selfr   r   msgr   cookieskeymorselor    r.   W/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/jupyterlab_server/test_utils.py__init__(   s&   

zTornadoOpenAPIRequest.__init__returnc                 C   s   | j j}|d |d S )Nz/lab)r   r   index)r(   r   r.   r.   r/   host_urlD   s   zTornadoOpenAPIRequest.host_urlc                 C   s   d }t | jj}| jd D ]C}|rqd|v }|r!|d |d n|}||jv rP|j|j|d  }|s?t|t|kr?|}|rP|dsP|d t| d }q|d u r_d|j }t||S )Npaths{/fooz$Could not find matching pattern for )	r   r   r   r   r2   r   lenendswith
ValueError)r(   r   r-   path_has_argr   ur)   r.   r.   r/   r   I   s$   
zTornadoOpenAPIRequest.pathc                 C   s   | j j}|r
| pdS )Nr   )r   methodlower)r(   r>   r.   r.   r/   r>   a   s   zTornadoOpenAPIRequest.methodc                 C   s8   | j jd u rd S t| j jtsd}t|| j jdS )NzRequest body is invalidr   )r   body
isinstancebytesAssertionErrordecoder(   r)   r.   r.   r/   r@   f   s   zTornadoOpenAPIRequest.bodyc                 C   s"   | j }|jdp|jdpdS )NContent-TypeAcceptapplication/json)r   r"   r#   )r(   r   r.   r.   r/   mimetypeo   s   
zTornadoOpenAPIRequest.mimetypeN)__name__
__module____qualname____doc__r   r   r0   propertystrr3   r   r>   r   r@   rI   r.   r.   r.   r/   r   #   s    r   c                   @   sf   e Zd ZdZdefddZedefddZede	fdd	Z
edefd
dZedefddZdS )TornadoOpenAPIResponsezA tornado open API response.responsec                 C   s
   || _ dS )zInitialize the response.N)rQ   )r(   rQ   r.   r.   r/   r0   ~   s   
zTornadoOpenAPIResponse.__init__r1   c                 C   s(   t | jjtsd}t|| jjdS )NzResponse body is invalidr   )rA   rQ   r@   rB   rC   rD   rE   r.   r.   r/   data   s   zTornadoOpenAPIResponse.datac                 C   s   t | jjS N)intrQ   coder(   r.   r.   r/   status_code   s   z"TornadoOpenAPIResponse.status_codec                 C   s   t | jjddS )NrF   rH   )rO   rQ   r"   r#   rV   r.   r.   r/   rI      s   zTornadoOpenAPIResponse.mimetypec                 C   s   t t| jjS rS   )r   r&   rQ   r"   rV   r.   r.   r/   r"      s   zTornadoOpenAPIResponse.headersN)rJ   rK   rL   rM   r   r0   rN   rO   rR   rT   rW   rI   r   r"   r.   r.   r.   r/   rP   {   s    rP   c                 C   sr   t  }t| j|}trt||}nt||}|  t| } tr,t||| }nt	||| }|  dS )zValidate an API requestN)
r   r   r   r   validater	   raise_for_errorsrP   r   r
   )rQ   openapi_specr   resultresult2r.   r.   r/   validate_request   s   r]   c                  C   s   t jdr;tjdk r=t jdkr?z
ddlm} m} W n
 ty$   Y dS w ddlm	}m
} t| | u rA||  dS dS dS dS dS )z)a windows 3.8+ patch for the asyncio loopwin)      )      r   )WindowsProactorEventLoopPolicyWindowsSelectorEventLoopPolicy)get_event_loop_policyset_event_loop_policyN)sysplatform
startswithtornadoversion_infoasynciorc   rd   ImportErrorre   rf   type)rc   rd   re   rf   r.   r.   r/   maybe_patch_ioloop   s    



ro   c                 C   s   | j }t|tjjr||jkrdS |dur|t|krdS dS tt|tjj	t|tjjgrK||j
kr6dS |rIt|jj d }||krIdS dS dS )z7Check that the error matches the expected output error.FNTmessage)r%   rA   rj   web	HTTPErrorrW   rO   any
httpclientHTTPClientErrorrU   jsonloadsrQ   r@   rD   )errorexpected_codeexpected_messageerp   r.   r.   r/   expected_http_error   s(   

r|   rS   )/rM   rv   osrg   http.cookiesr   pathlibr   typingr   urllib.parser   r   tornado.httpclientrj   tornado.webopenapi_corer   r   rm   r	   r
   openapi_core.spec.pathsr   )openapi_core.validation.request.datatypesr   r   r   werkzeug.datastructuresr   r   jupyterlab_server.specr   r   dirname__file__resolveHEREopenfptr!   big_unicode_stringr   rP   r]   ro   r|   r.   r.   r.   r/   <module>   s>   X