B
    3\J                 @   s2  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mZ ddl	m
Z
mZ ddlmZ ddlmZ yddlmZ W n  ek
r   ddlmZ Y nX ddlm  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* ddl+m,Z, dddZ-dd Z.G dd deZ/dS )z(Test installation of notebook extensions    N)BytesIOStringIO)basenamejoin)check_help_all_output)TestCase)patch)	py3compat)TemporaryDirectory)nbextensions)install_nbextensioncheck_nbextensionenable_nbextensiondisable_nbextensioninstall_nbextension_pythonuninstall_nbextension_pythonenable_nbextension_pythondisable_nbextension_python_get_config_dirvalidate_nbextensionvalidate_nbextension_python)BaseJSONConfigManagerc             C   s:   t | d  |r.t| j}t| ||f t| jS )zkensure a file exists, and set its modification time
    
    returns the modification time of the file
    a)opencloseosstatst_atimeutimest_mtime)	file_namemtimeZatime r"   ?lib/python3.7/site-packages/notebook/tests/test_nbextensions.pytouch$   s
    r$   c               C   s<   t d t ddg t ddg t ddg t ddg d S )Nznotebook.nbextensionsenabledisableZinstallZ	uninstall)r   r"   r"   r"   r#   test_help_output1   s
    r'   c               @   s|  e Zd Zdd Zdd Zdd Zdd ZdXd
dZdYd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d0d1 Zejd2d3 Zejd4d5 Zejd6d7 Zejd8d9 Z d:d; Z!d<d= Z"d>d? Z#dZdAdBZ$d[dCdDZ%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSdT Z-dUdV Z.dWS )\TestInstallNBExtensionc             C   s   t  }| j| t|jS )N)r
   tempdirsappendr	   Zcast_unicodename)selftdr"   r"   r#   tempdir;   s    zTestInstallNBExtension.tempdirc                sF  g  _  j fdd}   _tdtddtdddg  _}xF|D ]>}tj j|}tj	|}tj
|st| t| qJW    _tj jd _tj jd	 _tj jd
 _ jg _tj jd _td j jd _ j    jj ttd j _ j    jj d S )Nc                 s   x j D ]} |   qW d S )N)r)   Zcleanup)d)r,   r"   r#   cleanup_tempdirsE   s    z6TestInstallNBExtension.setUp.<locals>.cleanup_tempdirsu   ƒileu   ∂iru   ƒile1u   ∂ir2u   ƒile2dataZconfigZsystem_datar   z
os.environ)ZJUPYTER_CONFIG_DIRJUPYTER_DATA_DIRSYSTEM_JUPYTER_PATH)r)   Z
addCleanupr.   srcpjoinfilesr   pathr   dirnameexistsmakedirsr$   Ztest_dirdata_dir
config_dirZsystem_data_dirZsystem_pathsystem_nbextr   dictZ	patch_envstartstopobjectr   Zpatch_system_path)r,   r0   r6   r    Zfullpathparentr"   )r,   r#   setUp@   s6    






zTestInstallNBExtension.setUpc             C   s4   t j|s0t t j|}| d||f  d S )Nz%s should exist (found %s))r   r7   r9   listdirr8   fail)r,   r7   Zdo_existr"   r"   r#   assert_dir_existso   s    z(TestInstallNBExtension.assert_dir_existsc             C   s   t j|r| d|  d S )Nz%s should not exist)r   r7   r9   rE   )r,   r7   r"   r"   r#   assert_not_dir_existst   s    z,TestInstallNBExtension.assert_not_dir_existsFc             C   s,   |rt | jd}n| j}| t || d S )Nr   )r5   r;   r=   rF   )r,   relative_pathusernbextr"   r"   r#   assert_installedx   s
    z'TestInstallNBExtension.assert_installedc             C   s,   |rt | jd}n| j}| t || d S )Nr   )r5   r;   r=   rG   )r,   rH   rI   rJ   r"   r"   r#   assert_not_installed   s
    z+TestInstallNBExtension.assert_not_installedc          
   C   s   t  t}tj|| j}tdd|iH t| jdd | 	| x(| j
D ]}| jtt| j|dd qJW W dQ R X W dQ R X dS )z/install_nbextension when data_dir doesn't existz
os.environr2   T)rI   N)r
   r   r7   r   r;   r   r>   r   r4   rF   r6   rK   r5   r   )r,   r-   r;   r    r"   r"   r#   test_create_data_dir   s    
z+TestInstallNBExtension.test_create_data_dirc          	   C   s>   t  .}t| jdd | jtt| jddd W d Q R X d S )NT)rI   u   ƒile)r
   r   r4   rK   r5   r   )r,   r-   r"   r"   r#   test_create_nbextensions_user   s
    z4TestInstallNBExtension.test_create_nbextensions_userc          
   C   sf   t  V}t|d| _ttd|g. t| jdd | jtt	| jddd W d Q R X W d Q R X d S )Nr   r3   F)rI   u   ƒile)
r
   r5   r=   r   rA   r   r   r4   rK   r   )r,   r-   r"   r"   r#   test_create_nbextensions_system   s    z6TestInstallNBExtension.test_create_nbextensions_systemc             C   s(   | j d }tt| j| | | d S )Nr   )r6   r   r5   r4   rK   )r,   r    r"   r"   r#   test_single_file   s    
z'TestInstallNBExtension.test_single_filec             C   s(   d}t t| j| | | jd  d S )Nu   ∂ir)r   r5   r4   rK   r6   )r,   r/   r"   r"   r#   test_single_dir   s    z&TestInstallNBExtension.test_single_dirc             C   sV   d}t t| j| | | jd  tjdkrRd}t t| j| | | jd  d S )Nu   ∂ir/rQ   ntu   ∂ir\)r   r5   r4   rK   r6   r   r+   )r,   r/   r"   r"   r#   test_single_dir_trailing_slash   s    
z5TestInstallNBExtension.test_single_dir_trailing_slashc             C   s,   | j d }tt| j|dd | d d S )Nr   u	   ƒiledest)destination)r6   r   r5   r4   rK   )r,   r    r"   r"   r#   test_destination_file   s    
z,TestInstallNBExtension.test_destination_filec             C   s.   d}t t| j|dd | tddd d S )Nu   ∂iru
   ƒiledest2)rU   u   ∂ir2u   ƒile2)r   r5   r4   rK   )r,   r/   r"   r"   r#   test_destination_dir   s    z+TestInstallNBExtension.test_destination_dirc          	   C   s0   |  t ttt| jd W d Q R X d S )N*)assertRaises	TypeErrorr   globr5   r4   )r,   r"   r"   r#   test_install_nbextension   s    z/TestInstallNBExtension.test_install_nbextensionc          
   C   s   t  }d}t||}t|d}|d W d Q R X t|}t| j|}t| t|d}|d W d Q R X t||d }t|dd t|}| | d W d Q R X W d Q R X d S )Nu   ƒ.jswfirst	overwrited   T)r_   )	r
   r5   r   writer$   r=   r   assertEqualread)r,   r/   fnamer4   fr!   destr"   r"   r#   test_overwrite_file   s    

z*TestInstallNBExtension.test_overwrite_filec          	   C   s   t  }t|}d}tt|| t| | t|| tt|| d}tt|| t|dd | t|| | t|| W d Q R X d S )Nu   ƒ.jsu   ∂.jsT)r_   )	r
   r   r$   r5   r   rK   r   removerL   )r,   r4   baserd   Zfname2r"   r"   r#   test_overwrite_dir   s    z)TestInstallNBExtension.test_overwrite_dirc          
   C   s   t  }d}t||}t|d}|d W d Q R X t|}t| | | t| j|}t	|j
 t|d}|d W d Q R X t||d  t| t|}| | d W d Q R X W d Q R X d S )Nu   ƒ.jsr]   r^   r_   
   )r
   r5   r   ra   r$   r   rK   r=   r   r   r   rb   rc   )r,   r/   rd   r4   re   r!   rf   r"   r"   r#   test_update_file   s     


z'TestInstallNBExtension.test_update_filec          	   C   s   t  t}d}t||}t|}t| | | t| j|}t|j}t||d }t| t|j}| 	|| W d Q R X d S )Nu   ƒ.jsr`   )
r
   r5   r$   r   rK   r=   r   r   r   rb   )r,   r/   rd   r4   r!   rf   Z	old_mtimeZ	new_mtimer"   r"   r#   test_skip_old_file   s    

z)TestInstallNBExtension.test_skip_old_filec          
   C   sn   t  }t  }ttd|* ttd| t| j W d Q R X W d Q R X | | d | | d d S )Nstdoutstderr )r   r   rA   sysr   r4   rb   getvalue)r,   rn   ro   r"   r"   r#   
test_quiet  s    z!TestInstallNBExtension.test_quietc          	   C   sb   t | jd}t|d}|dd |dd W d Q R X t| | d | t dd d S )Nzmyjsext.zipr]   za.jss   b();zfoo/a.jss   foo();foo)r5   r4   zipfileZipFilewritestrr   rK   )r,   r7   re   r"   r"   r#   test_install_zip  s    
z'TestInstallNBExtension.test_install_zipc          
   C   s   dd }xt dD ]z\}}t| jd| }t|d&}||d| d ||d| d	 W d Q R X t| | d|  | td
d|  qW d S )Nc             S   s(   t |}t||_| |t| d S )N)tarfileZTarInfolensizeZaddfiler   )re   rd   Zbufinfor"   r"   r#   	_add_file  s    

z:TestInstallNBExtension.test_install_tar.<locals>._add_file)z.tar.gzz.tgzz.tar.bz2Zmyjsextr]   zb%i.jss   b();z
foo/b%i.jss   foo();rt   )	enumerater5   r4   ry   r   r   rK   )r,   r}   iZextr7   re   r"   r"   r#   test_install_tar  s    z'TestInstallNBExtension.test_install_tarc             C   s`   dd }t j}|t _z>td | d td | d tddd | d W d |t _X d S )	Nc             S   s   t | d S )N)r$   )Zurlrf   r"   r"   r#   fake_urlretrieve-  s    zATestInstallNBExtension.test_install_url.<locals>.fake_urlretrievez!http://example.com/path/to/foo.jszfoo.jsz*https://example.com/path/to/another/bar.jszbar.jsz	foobar.js)rU   )r   Zurlretriever   rK   )r,   r   Zsave_urlretriever"   r"   r#   test_install_url,  s    

z'TestInstallNBExtension.test_install_urlc          	   C   st   t  (}d}t||}t| t|dd W d Q R X t|ddsDtt|gddsVtt|td|gddrptd S )Nu   ƒ.jsT)rI   Zdne)r
   r5   r$   r   r   AssertionError)r,   r/   re   r4   r"   r"   r#   test_check_nbextension<  s    
z-TestInstallNBExtension.test_check_nbextensionc          	   C   sj   t  (}d}t||}t| t|dd W d Q R X t| j|}tj|sPtt	|}| 
|| d S )Nu   ƒ.jsT)symlink)r
   r5   r$   r   r=   r   r7   islinkr   readlinkrb   )r,   r/   re   r4   rf   linkr"   r"   r#   test_install_symlinkG  s    

z+TestInstallNBExtension.test_install_symlinkc          	   C   s   t  R}d}d}t||}t||}t| t|dd t|| t|dd|d W d Q R X t| j|}tj|szt	t
|}| || d S )Nu   ƒ.jsu   ƒ2.jsT)r   )r   r_   rU   )r
   r5   r$   r   r   renamer=   r7   r   r   r   rb   )r,   r/   re   f2r4   Zsrc2rf   r   r"   r"   r#   test_overwrite_broken_symlinkS  s    


z4TestInstallNBExtension.test_overwrite_broken_symlinkc          	   C   sp   t  .}d}d}t||}t| t|d|d W d Q R X t| j|}tj|sVtt	|}| 
|| d S )Nu   ƒ.jsu	   ƒlink.jsT)r   rU   )r
   r5   r$   r   r=   r   r7   r   r   r   rb   )r,   r/   re   Zflinkr4   rf   r   r"   r"   r#    test_install_symlink_destinationc  s    

z7TestInstallNBExtension.test_install_symlink_destinationc          
   C   s   |  t tddd W d Q R X t Z}d}t||}t|d}|dd W d Q R X |  t t|dd W d Q R X W d Q R X d S )Nzhttp://example.com/foo.jsT)r   u   ƒ.zipr]   za.jss   b();)rY   
ValueErrorr   r
   r5   ru   rv   rw   )r,   r/   zfzsrczr"   r"   r#   test_install_symlink_badp  s    
z/TestInstallNBExtension.test_install_symlink_badc          
   C   sj   t  Z}d}t||}t|d}|dd W d Q R X | t t|dd W d Q R X W d Q R X d S )Nu   ƒ.zipr]   za.jss   b();rt   )rU   )r
   r5   ru   rv   rw   rY   r   r   )r,   r/   r   r   r   r"   r"   r#   test_install_destination_bad~  s    
z3TestInstallNBExtension.test_install_destination_badc          	   C   s   t  4}d}t||}t| t|dd tddd W d Q R X tjtddd}t	|d}|
d
d	i 
dd
}|std S )Nu   ƒ.jsT)rI   notebooku   ƒ)sectionrequirenbconfig)r<   load_extensionsF)r
   r5   r$   r   r   r   r7   r   r   r   getr   )r,   r/   re   r4   r<   cmenabledr"   r"   r#   test_nbextension_enable  s    

z.TestInstallNBExtension.test_nbextension_enablec             C   sX   |    tddd tjtddd}t|d}|ddi dd	}|rTtd S )
Nr   u   ƒ)r   r   T)rI   r   )r<   r   F)	r   r   r   r7   r   r   r   r   r   )r,   r<   r   r   r"   r"   r#   test_nbextension_disable  s    
z/TestInstallNBExtension.test_nbextension_disabler   c             C   s   |ddddS )NmockextensionZ_mockdestinationz_mockdestination/index)r   r4   rf   r   r"   )r,   r   r"   r"   r#   _mock_extension_spec_meta  s    z0TestInstallNBExtension._mock_extension_spec_metac                s8   t | | G  fddd}dd l}||jd< d S )Nc                   s    e Zd ZZe fddZdS )z;TestInstallNBExtension._inject_mock_extension.<locals>.mockc                  s    gS )Nr"   r"   )metar"   r#   _jupyter_nbextension_paths  s    zVTestInstallNBExtension._inject_mock_extension.<locals>.mock._jupyter_nbextension_pathsN)__name__
__module____qualname____file__staticmethodr   r"   )r   
outer_filer"   r#   mock  s   r   r   r   )r   r   rq   modules)r,   r   r   rq   r"   )r   r   r#   _inject_mock_extension  s
    
z-TestInstallNBExtension._inject_mock_extensionc             C   s.   |    td tdsttdgs*td S )Nr   z_mockdestination/index.js)r   r   r   r   )r,   r"   r"   r#   test_nbextensionpy_files  s    z/TestInstallNBExtension.test_nbextensionpy_filesc             C   s:   |    tddd tddds$ttdgdds6td S )Nr   T)rI   z_mockdestination/index.js)r   r   r   r   )r,   r"   r"   r#   test_nbextensionpy_user_files  s    z4TestInstallNBExtension.test_nbextensionpy_user_filesc             C   s>   |    tddd tddd tdr,ttdgr:td S )Nr   T)rI   z_mockdestination/index.js)r   r   r   r   r   )r,   r"   r"   r#   "test_nbextensionpy_uninstall_files  s
    z9TestInstallNBExtension.test_nbextensionpy_uninstall_filesc             C   sb   |  d tddd td tjtddd}t|d}|ddi dd	}|s^t	d S )
Nr   r   T)rI   r   )r<   r   z_mockdestination/indexF)
r   r   r   r   r7   r   r   r   r   r   )r,   r<   r   r   r"   r"   r#   test_nbextensionpy_enable  s    

z0TestInstallNBExtension.test_nbextensionpy_enablec             C   sn   |  d tddd td tddd tjtddd}t|d}|	d	di 	dd	}|rjt
d S )
Nr   r   T)rI   r   )r<   r   z_mockdestination/indexF)r   r   r   r   r   r7   r   r   r   r   r   )r,   r<   r   r   r"   r"   r#   test_nbextensionpy_disable  s    

z1TestInstallNBExtension.test_nbextensionpy_disablec             C   sF   |  d tddd}td |  }t||d }| g || d S )Nr   r   T)rI   r   )r   r   r   r   r   rb   )r,   pathsr   warningsr"   r"   r#   test_nbextensionpy_validate  s    
z2TestInstallNBExtension.test_nbextensionpy_validatec             C   sR   |  d tddd}td |  }|jdd t||d }| g || d S )Nr   r   T)rI   zbad-require)r   r   )r   r   r   r   updater   assertNotEqual)r,   r   r   r   r"   r"   r#   test_nbextensionpy_validate_bad  s    
z6TestInstallNBExtension.test_nbextensionpy_validate_badc             C   s8   |  d tddd td td}| g || d S )Nr   r   T)rI   z_mockdestination/index)r   r   r   r   rb   )r,   r   r"   r"   r#   test_nbextension_validate  s
    
z0TestInstallNBExtension.test_nbextension_validatec             C   s   t d}| g || d S )Nzthis-doesn't-exist)r   r   )r,   r   r"   r"   r#   test_nbextension_validate_bad  s    z4TestInstallNBExtension.test_nbextension_validate_badN)F)F)r   )r   )/r   r   r   r.   rC   rF   rG   rK   rL   rM   rN   rO   rP   rR   rT   rV   rW   r\   rg   rj   rl   rm   rs   rx   r   r   r   decZ
skip_win32r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r(   9   sT   /
	
	
			






r(   )N)0__doc__r[   r   rq   ry   ru   ior   r   os.pathr   r   r5   Ztraitlets.tests.utilsr   Zunittestr   Zunittest.mockr   ImportErrorr   Z#ipython_genutils.testing.decoratorsZtestingZ
decoratorsr   Zipython_genutilsr	   Zipython_genutils.tempdirr
   r   r   Znotebook.nbextensionsr   r   r   r   r   r   r   r   r   r   r   Znotebook.config_managerr   r$   r'   r(   r"   r"   r"   r#   <module>   s,   4
