B
    [sY                 @   s  d Z ddlZddl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 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mZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ej'(ej')e*Z+dddZ,G dd deZ-dS )z*Test installation of JupyterLab extensions    N)join)TemporaryDirectory)TestCase)patch)NotebookApp)paths)commands)load_jupyter_server_extension)install_extensionuninstall_extensionlist_extensionsbuildlink_packageunlink_packagebuild_checkdisable_extensionenable_extensionget_app_infocheck_extension_test_overlap_get_core_dataupdate_extensionc             C   s\   t j| }t j|s"t | t| d  |rPt | j}t 	| ||f t | j
S )zgensure a file exists, and set its modification time

    returns the modification time of the file
    a)ospathdirnameexistsmakedirsopenclosestatst_atimeutimest_mtime)filemtimer   Zatime r&   ?lib/python3.7/site-packages/jupyterlab/tests/test_jupyterlab.pytouch!   s    
r(   c               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;S )<TestExtensionc             C   s   t  }| j| |jS )N)r   tempdirsappendname)selfZtdr&   r&   r'   tempdir3   s    zTestExtension.tempdirc       
   
      sD  g  _ ttjd _ j fdd}   _t jd _t jd _	t
  _xdD ]}ttd|}dd	 }t j|}tj|||d
 tt|d t d| | tt|d}t|}W d Q R X |d  j|< qZW g  _t
d j	 jt jdd} j| xtgD ]}	t|	drLt|	d jg} j| t|	drvt|	d j	g} j| t|	drt|	d j	} j| t|	drt|	d j} j| qW x$ jD ]}|   |j qW  tj j	g  tj jg  t tj !t jd t  _"d S )Nwc                 s   x j D ]} |   qW d S )N)r*   Zcleanup)d)r-   r&   r'   cleanup_tempdirs>   s    z-TestExtension.setUp.<locals>.cleanup_tempdirsdataZconfig)	extensionincompatpackagemimeextensionZmock_packagesc             S   s&   d| krg }d|kr| d | |fS )Nnode_modules)remove)Zdnamefilesr&   r&   r'   ignoreM   s
    
z#TestExtension.setUp.<locals>.ignore)r:   r7   Zmock_zpackage.jsonr,   z
os.environZlab)ZJUPYTER_CONFIG_DIRZJUPYTER_DATA_DIRZJUPYTERLAB_DIRENV_JUPYTER_PATHENV_CONFIG_PATHZCONFIG_PATHZ
BUILD_PATH)#r*   r   r   devnullZ
addCleanupr.   Ztest_dirpjoinZdata_dirZ
config_dirdict	pkg_nameshereshutilZcopytreer   setattrjsonloadZpatchesr   r+   r   hasattrobjectstartstopZassertEqualr<   r;   r   get_app_dirr   realpathapp_dir)
r-   r1   r,   srcr:   destfidr2   pmodr&   )r-   r'   setUp8   sZ    

zTestExtension.setUpc             C   sb   t | jdkstt| jdd}t|s.tt| jd }| jd }||ksRtt|s^td S )NT
extensionsz*.tgzr3   )	r
   mock_extensionAssertionErrorr>   rL   globr   r@   r   )r-   r   rS   r,   r&   r&   r'   test_install_extension   s    
z$TestExtension.test_install_extensionc             C   sv   t | jdksttt dd}t | jdks4tt|sBtt| jd }| j	d }||ksftt
|srtd S )NTrS   z*.tgzr3   )r
   rT   rU   r>   r   rJ   rV   r   rL   r@   r   )r-   r   rS   r,   r&   r&   r'   test_install_twice   s    
z TestExtension.test_install_twicec             C   sl   t | j | jd }|t| jd ks*tt|s6tt|dksFt|t| jd ks\tt|rhtd S )Nr6   rS   T)r
   mock_mimeextensionr@   r   rL   rU   r   r   )r-   r,   r&   r&   r'   test_install_mime_renderer   s    

z(TestExtension.test_install_mime_rendererc          	   C   sH   t t}t| j W d Q R X dt|jks2tt| j	d rDtd S )NzConflicting Dependenciesr4   )
pytestraises
ValueErrorr
   Zmock_incompatstrvaluerU   r   r@   )r-   excinfor&   r&   r'   test_install_incompatible   s    z'TestExtension.test_install_incompatiblec          	   C   sz   | j }tt t| W d Q R X tt|d}t|}W d Q R X t	| j
d }|d }||ksjtt|rvtd S )Nzpackage.jsonrS   r,   )mock_packager[   r\   r]   r
   r   r>   rD   rE   r   rL   rU   r   )r-   r   rO   r2   rS   r,   r&   r&   r'   test_install_failed   s    z!TestExtension.test_install_failedc          	   C   s   | j }tt|d tt t| W d Q R X t| j	d rFt
| j}tt|d tt t| W d Q R X t| j	d rt
d S )Nzindex.jsr3   r6   )rT   r   r8   r>   r[   r\   r]   r
   r   r@   rU   rY   )r-   r   r&   r&   r'   test_validation   s    zTestExtension.test_validationc             C   s   t | jdkst| jd }t|s(tt| jd dks>tt| jdd}t|rZtt	| jd }||ksttt|rtd S )NTr3   rS   z*.tgz)
r
   rT   rU   r@   r   r   r>   rL   rV   r   )r-   r,   r   rS   r&   r&   r'   test_uninstall_extension   s    
z&TestExtension.test_uninstall_extensionc          	   C   s   t ddkst| j}t| tt|dd}t|}W d Q R X |d d }d|ks\ttdrhtt	ddksxtt| tt|dd}t|}W d Q R X |d d }d|ksttdstd S )Nz@jupyterlab/console-extensionTstagingzpackage.json
jupyterlabrS   )
r   rU   rL   r   r   r>   rD   rE   r   r
   )r-   rL   rO   r2   rS   r&   r&   r'   test_uninstall_core_extension   s    z+TestExtension.test_uninstall_core_extensionc             C   s   | j }| jd }t| | j}t|d }||ks6t|t|d ksJtt|sVtt|dksftt|d }||ks~t|t|d kstt|rtd S )Nr3   linked_packagesrS   T)rT   r@   r   rL   r   rU   r   r   )r-   r   r,   rL   linkedr&   r&   r'   test_link_extension   s    
z!TestExtension.test_link_extensionc             C   s   | j }| jd }t|dks t| j}t|d }||ks>t|t|d ksRtt|s^tt|sjtt|d }||kstt|rtd S )Nr5   Tri   rS   )rb   r@   r   rU   rL   r   r   r   )r-   r   r,   rL   rj   r&   r&   r'   test_link_package   s    
zTestExtension.test_link_packagec             C   sZ   | j }t|dkstt|dks&tt| jd }| jd }||ksJtt|rVtd S )NTri   r5   )rb   r   rU   r   r   rL   r@   r   )r-   targetrj   r,   r&   r&   r'   test_unlink_package   s    
z!TestExtension.test_unlink_packagec             C   s   t | jdkstt  d S )NT)r
   rT   rU   r   )r-   r&   r&   r'   test_list_extensions   s    z"TestExtension.test_list_extensionsc             C   sH  |   }t| j|dkstt|dd}t|s6tt|d }| jd }||ksXtt||sftt	| jd |dks~tt|dd}t|rtt|d }||kstt||rtt
| j|dkstt|d }| jd }||kstt||stt| j|dkstt|d }||ks4tt||rDtd S )NTrS   z*.tgzr3   ri   r5   )r.   r
   rT   rU   r>   rV   r   r@   r   r   r   rb   r   )r-   rL   r   rS   ext_namerj   pkg_namer&   r&   r'   test_app_dir  s.    

zTestExtension.test_app_dirc             C   s   |   }tj| jr"t| j t| jdks4tt	|dd}t

|rNtt|d }| jd }||ksptt||s~td S )NTrS   z*.tgzr3   )r.   r   r   r   rL   
removedirsr
   rT   rU   r>   rV   r   r@   r   )r-   rL   r   rS   rp   r&   r&   r'   test_app_dir_use_sys_prefix   s    
z)TestExtension.test_app_dir_use_sys_prefixc             C   s  |   }| j}tj|r$t| t| jdks6tt	|dd}t

|sPtt	|dd}t

|rjtt|d }| jd }||kstt||stt| j|dkstt

|stt|d }||kstt||stt| jd |dkstt

|r
tt

|stt|d }||ks4tt||sDtt| jd |dks^tt

|rntt

|r~tt|d }||kstt||rtd S )NTrS   z*.tgzr3   )r.   rL   r   r   r   rs   r
   rT   rU   r>   rV   r   r@   r   r   )r-   rL   Zsys_dirZsys_pathZapp_pathrS   rp   r&   r&   r'   test_app_dir_shadowing-  s<    

z$TestExtension.test_app_dir_shadowingc          	   C   s   t | jdkstt  t| jddd}t|}| }W d Q R X | jd |ksVtt| jdd}t|}| }W d Q R X | jd |kstd S )NTrf   r   zindex.out.jsr3   static)	r
   rT   rU   r   r>   rL   r   readr@   )r-   entryrO   r2   r&   r&   r'   
test_buildQ  s    

zTestExtension.test_buildc          	   C   s   t | jdksttdddd t| jdd}t|}| }W d Q R X | jd |ks\tt| jdd	}t|}t	
|}W d Q R X |d
 d dkst|d
 d dkst|d
 d dkstd S )NTfooz1.0bar)r,   versionZ
public_urlrv   zindex.out.jsr3   zpackage.jsonrg   r,   r|   Z	publicUrl)r
   rT   rU   r   r>   rL   r   rw   r@   rD   rE   )r-   rx   rO   r2   pkgr&   r&   r'   test_build_custom`  s    

zTestExtension.test_build_customc             C   s2   t  }tj}| jt_|jg d |t_t| d S )N)argv)r   sysstderrr=   Z
initializer	   )r-   Zappr   r&   r&   r'   test_load_extensionq  s    z!TestExtension.test_load_extensionc             C   s   |   }t| j|dkstt| jd |dks4tt|}| jd }||d ksVtt||rdtt||dstttd|dkstt|}d|d ksttd|rttd|dst||d kstt||rtt||dstd S )NTr3   disabledz@jupyterlab/notebook-extension)r.   r
   rT   rU   r   r@   r   r   )r-   rL   infor,   r&   r&   r'   test_disable_extensiony  s     
z$TestExtension.test_disable_extensionc             C   s   |   }t| j|dkstt| jd |dks4tt| jd |dksLtt|}| jd }||d ksntt||s|ttd|dkst||d kstt||std|d ksttd|rtd S )NTr3   r   z@jupyterlab/notebook-extension)	r.   r
   rT   rU   r   r@   r   r   r   )r-   rL   r   r,   r&   r&   r'   test_enable_extension  s    
z#TestExtension.test_enable_extensionc          	   C   s  t  s
tt| jdkstt| jdks.tt  t  r>tt| jdksPtt  sZtt| j	d dksptt  rztt
| jd}t|}t|}W d Q R X t|d}| }W d Q R X d|d< t|d}t|| W d Q R X t  stt  stt|d}|| W d Q R X t  r.tt
| jd	}t|d}| }W d Q R X t|d}||d
  W d Q R X t  stt  stt|d}|| W d Q R X t  rtd S )NTr6   zpackage.jsonrbr{   rz   r/   wbzindex.jss   
console.log("hello");)r   rU   r
   rT   r   rb   r   rY   r   r@   r>   r   rD   rE   rw   dumpwrite)r-   Zpkg_pathrO   r2   Zorigr&   r&   r'   test_build_check  s@    





zTestExtension.test_build_checkc             C   s|   t ddstt ddstt dds*tt dds8tt ddrFtt d	d
rTtt ddd ksftt ddd ksxtd S )Nz^0.6.0z^0.6.1z>0.1z0.6z~0.5.0z~0.5.2z0.5.2z^0.5.0z~1.5.0z^1.6.0*z<0.6z0.1)r   rU   )r-   r&   r&   r'   test_compatibility  s    z TestExtension.test_compatibilityc                s   t  }|d d dd fdd}fdd}G d	d
 d
t  fdd}ttd|}ttjd|}ttjd|}|T |D tjj|, t  t	ddkst
W d Q R X W d Q R X W d Q R X W d Q R X d S )Ndependenciesz@jupyterlab/applicationc             S   s   dd| iiS )Nr   z@jupyterlab/applicationr&   )Zverr&   r&   r'   _gen_dep  s    z7TestExtension.test_install_compatible.<locals>._gen_depc          	      sB   |dkst |    d  d dddS )Nmockextensionz	^2000.0.0)z0.9.0z1.0.0z1.1.0z2.0.0z2.0.0-b0z2.1.0-b0z2.1.0)r,   Zversions)rU   )registryr,   Zlogger)r   current_app_depr&   r'   _mock_metadata  s    z=TestExtension.test_install_compatible.<locals>._mock_metadatac          
      sJ   t |dt dddgd}| d t |d|||d d	t|d	d
}|S )Nz2.1.0T)r3   zindex.js)r,   r|   rg   Zjupyterlab_extracted_filesz	^2000.0.0Fr|   zmockextension.tgz)sourceis_dirr2   r,   r|   filenamer   )r?   updater>   )r-   r   r.   argskwargsr2   r   )r   r&   r'   _mock_extract  s    
z<TestExtension.test_install_compatible.<locals>._mock_extractc               @   s   e Zd ZdS )z6TestExtension.test_install_compatible.<locals>.SuccessN)__name__
__module____qualname__r&   r&   r&   r'   Success  s   r   c                s,   |dkst |dkr  | |f||S )N)r   zmockextension@1.1.0zmockextension@1.1.0)rU   )r-   r,   r   r   )r   orig_installr&   r'   _mock_install  s    z<TestExtension.test_install_compatible.<locals>._mock_installZ_fetch_package_metadataZ_extract_package_install_extensionr   T)r   	Exceptionr   rG   r   _AppHandlerr   r[   r\   r
   rU   )r-   Z	core_datar   r   r   p1p2Zp3r&   )r   r   r   r   r'   test_install_compatible  s.    z%TestExtension.test_install_compatiblec          
      s   g   fdd}dd }t tjd|}t tjd|}t| jdksJtt| jdks\t|, | t| j	d dks~tW d Q R X W d Q R X  | j	d gkstd S )	Nc                s6     |d |dd  dd   t|dd| dS )Nr      @Fzfoo/bar/)r,   r   r   )r+   splitr?   )r-   r,   r   r   )	installedr&   r'   r     s    $z7TestExtension.test_update_single.<locals>._mock_installc             S   s   dS )Nz	10000.0.0r&   )r-   r,   r&   r&   r'   _mock_latest  s    z6TestExtension.test_update_single.<locals>._mock_latestr   "_latest_compatible_package_versionTr3   )
r   rG   r   r   r
   rT   rU   rY   r   r@   )r-   r   r   r   r   r&   )r   r'   test_update_single  s     *z TestExtension.test_update_singlec             C   s   dt dkstd S )NFrz   )r   rU   )r-   r&   r&   r'   test_update_missing_extension,  s    z+TestExtension.test_update_missing_extensionc          
      s   g   fdd}dd }t tjd|}t tjd|}t| j t| j |B |2 t| jd dksnt	t| jd	 dkst	W d Q R X W d Q R X  | jd | jd	 gkst	d S )
Nc                s6     |d |dd  dd   t|dd| dS )Nr   r   r   Fzfoo/bar/)r,   r   r   )r+   r   r?   )r-   r,   r   r   )r   r&   r'   r   2  s    $z9TestExtension.test_update_multiple.<locals>._mock_installc             S   s   dS )Nz	10000.0.0r&   )r-   r,   r&   r&   r'   r   6  s    z8TestExtension.test_update_multiple.<locals>._mock_latestr   r   r3   Tr6   )
r   rG   r   r   r
   rT   rY   r   r@   rU   )r-   r   r   r   r   r&   )r   r'   test_update_multiple0  s"    

*z"TestExtension.test_update_multiplec          
      s   g fdd}t jj  fdd}t| jdks6tt| jdksHttt jd|}tt jd|}|* | t	d dddkstW d Q R X W d Q R X t
| jd	 | jd
 gkstd S )Nc                s(     |d |dd  dd   dS )Nr   r   r   T)r+   r   )r-   r,   r   r   )updatedr&   r'   _mock_updateL  s    $z3TestExtension.test_update_all.<locals>._mock_updatec                s    | }g |d< |S )NZlocal_extensionsr&   )r-   r   )original_app_infor&   r'   _mock_app_infoQ  s    z5TestExtension.test_update_all.<locals>._mock_app_infoTZ_update_extension_get_app_info)Zall_r3   r6   )r   r   r   r
   rT   rU   rY   r   rG   r   sortedr@   )r-   r   r   r   r   r&   )r   r   r'   test_update_allJ  s"    (zTestExtension.test_update_allN) r   r   r   r.   rR   rW   rX   rZ   ra   rc   rd   re   rh   rk   rl   rn   ro   rr   rt   ru   ry   r~   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   r)   1   s:   I	

	$,@r)   )N).__doc__rV   rD   r   rB   r   os.pathr   r>   Ztempfiler   Zunittestr   Zunittest.mockr   r[   Znotebook.notebookappr   Zjupyter_corer   rg   r   Zjupyterlab.extensionr	   Zjupyterlab.commandsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   abspath__file__rA   r(   r)   r&   r&   r&   r'   <module>   s$   @
