o
    i<w                     @   sF  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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mZ ddl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'm(Z(m)Z)m*Z* ddl+m,Z,m-Z- ej./ej.0e1Z2dddZ3G dd deZ4G dd de4Z5dd Z6dS )z*Test installation of JupyterLab extensions    N)join)Path)TemporaryDirectory)TestCase)patch)paths)commands)DEV_DIR
AppOptions_compare_ranges_test_overlapbuildbuild_checkcheck_extensiondisable_extensionenable_extensionget_app_infoget_app_versioninstall_extensionlink_packagelist_extensionsuninstall_extensionunlink_packageupdate_extension)
CoreConfig_get_default_core_datac                 C   s\   t j| }t j|st | t| d  |r(t | 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   atime r+   [/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/jupyterlab/tests/test_jupyterlab.pytouch/   s   
r-   c                   @   s   e Zd Zdd Zdd ZdS )AppHandlerTestc                 C   s   t  }| j| |jS N)r   tempdirsappendname)selftdr+   r+   r,   tempdirG   s   zAppHandlerTest.tempdirc           
   	      s`  g  _ ttjd _ j fdd}   _t jd _t jd _	i  _
dD ]V}ttd|}dd	 }t j|}tj|||d
 tjt|dsVtt|d t d| | tt|d}t|}W d    n1 suw   Y  |d  j
|< q+g  _td j	 jt jdd} j| tfD ]P}	t|	drt|	d jg} j| t|	drt|	d j	g} j| t|	drt|	d j	} j| t|	drt|	d j} j| q jD ]}|   |j q tj j	g  tj jg  t t!" # t  jd #  t!"  _$ddg _%d S )Nwc                     s    j D ]} |   qd S r/   )r0   cleanup)dr3   r+   r,   cleanup_tempdirsR   s   

z.AppHandlerTest.setUp.<locals>.cleanup_tempdirsdataconfig)	extensionincompatpackagemimeextensionmock_packagesc                 S   s&   d| v rg }d|v r| d | |fS )Nnode_modules)remove)dnamefilesr+   r+   r,   ignorea   s
   
z$AppHandlerTest.setUp.<locals>.ignore)rF   rB   mock_package.jsonr2   z
os.environlab)JUPYTER_CONFIG_DIRJUPYTER_DATA_DIRJUPYTERLAB_DIRENV_JUPYTER_PATHENV_CONFIG_PATHCONFIG_PATH
BUILD_PATHzjupyterlab-test-extension@1.0zjupyterlab-test-extension@2.0)&r0   r"   r   devnull
addCleanupr5   test_dirpjoindata_dir
config_dir	pkg_nameshereshutilcopytreer   r    r!   setattrjsonloadpatchesr   dictr1   r   hasattrobjectstartstopassertEqualrN   rM   r   r   get_app_dirresolveapp_dirpinned_packages)
r3   r:   r2   srcrF   destfidr;   pmodr+   r9   r,   setUpL   sj   








zAppHandlerTest.setUpN)__name__
__module____qualname__r5   rn   r+   r+   r+   r,   r.   F   s    r.   c                   @   sv  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
ejjdd Zdd Zejje dkdd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ejjd*d+ Zejjejjeje  d,dd-d. Z!ejjd/d0 Z"ejjd1d2 Z#d3d4 Z$d5d6 Z%ejjd7d8 Z&d9d: Z'd;d< Z(d=d> Z)d?d@ Z*dAdB Z+dCdD Z,dEdF Z-dGS )HTestExtensionc                 C   s^   t | jdu s	J t| jdd}t|sJ t d }| jd }||v s'J t|s-J d S NT
extensions*.tgzr=   r   mock_extensionrT   rg   globr   rW   r   r3   r   rt   r2   r+   r+   r,   test_install_extension   s   

z$TestExtension.test_install_extensionc                 C   sp   t | jdu s	J t| jdd}t | jdu sJ t|s J t d }| jd }||v s0J t|s6J d S rs   rv   ry   r+   r+   r,   test_install_twice   s   

z TestExtension.test_install_twicec                 C   sd   t | j | jd }|t d v sJ t|sJ t|du s!J |t d vs*J t|r0J d S )Nr@   rt   T)r   mock_mimeextensionrW   r   r   r   r3   r2   r+   r+   r,   test_install_mime_renderer   s   

z(TestExtension.test_install_mime_rendererc                 C   s\   t t}t| j W d    n1 sw   Y  dt|jv s#J t| jd r,J d S )NzConflicting Dependenciesr>   )	pytestraises
ValueErrorr   mock_incompatstrvaluer   rW   )r3   excinfor+   r+   r,   test_install_incompatible   s
   z'TestExtension.test_install_incompatiblec                 C   s   | j }tt t| W d    n1 sw   Y  tt|d}t|}W d    n1 s3w   Y  t	 d }|d }||vsGJ t
|rMJ d S )NrH   rt   r2   )mock_packager   r   r   r   r"   rT   r\   r]   r   r   )r3   r   rk   r;   rt   r2   r+   r+   r,   test_install_failed   s   

z!TestExtension.test_install_failedc                 C   s   | j }tt|d tt t| W d    n1 sw   Y  t| j	d r-J | j
}tt|d tt t| W d    n1 sLw   Y  t| j	d rZJ d S )Nindex.jsr=   r@   )rw   r   rC   rT   r   r   r   r   r   rW   r|   )r3   r   r+   r+   r,   test_validation   s   

zTestExtension.test_validationc                 C   s   t | jdu s	J | jd }t|sJ t| jd du sJ t| jdd}t|r-J t d }||vs8J t|r>J d S )NTr=   rt   ru   )	r   rw   rW   r   r   rT   rg   rx   r   )r3   r2   r   rt   r+   r+   r,   test_uninstall_extension   s   

z&TestExtension.test_uninstall_extensionc                 C   s   t | j t | j | jd }| jd }t|du sJ t|du s$J tdddu s-J t d }||vs8J ||vs>J d S )Nr=   r@   Tall_rt   )r   rw   r|   rW   r   r   r   )r3   ext_namemime_ext_namert   r+   r+   r,   test_uninstall_all_extensions   s   




z+TestExtension.test_uninstall_all_extensionsc                 C   s   t ddu sJ | j}t  tt|dd}t|}W d    n1 s&w   Y  |d d }d|vs7J tdr=J tddu sEJ t  tt|dd}t|}W d    n1 s`w   Y  |d d }d|v sqJ tdswJ d S )Nz@jupyterlab/console-extensionTstagingrH   
jupyterlabrt   )	r   rg   r   r"   rT   r\   r]   r   r   )r3   rg   rk   r;   rt   r+   r+   r,   test_uninstall_core_extension   s"   z+TestExtension.test_uninstall_core_extensionc                 C   s   ddg}t | jd |d dsJ t | jd |d dsJ t d }|d |v s+J |d |v s3J t|d s;J t|d sCJ t|d sKJ t|d sSJ t d }|d |vs`J |d |vshJ t|d rpJ t|d rxJ dS )z
        You should be able to install different versions of the same extension with different
        pinned names and uninstall them with those names.
        ztest-1ztest-2r   )pin   rt   N)r   rh   r   r   r   )r3   NAMESrt   r+   r+   r,   !test_install_and_uninstall_pinned  s   

z/TestExtension.test_install_and_uninstall_pinnedWindowsz$running npm pack fails on windows CI)reasonc                    s   t |    fdd| jD }tt |d  t d  tt |d  t d  t d d t d d g| _|   dS )	z[
        Same as above test, but installs from a local folder instead of from npm.
        c              	      s2   g | ]}t jd d|gt jddt dj qS )npmpackT)stdouttextcheckcwd)
subprocessrunPIPEr   r   strip).0r2   base_dirr+   r,   
<listcomp>&  s    zJTestExtension.test_install_and_uninstall_pinned_folder.<locals>.<listcomp>r   1r   2r?   N)r   r5   rh   rY   unpack_archiver   r   )r3   packagesr+   r   r,   (test_install_and_uninstall_pinned_folder  s   
  "z6TestExtension.test_install_and_uninstall_pinned_folderc                 C   s   | j }| jd }t| t d }||vsJ |t d v s J t|s&J t|du s.J t d }||vs9J |t d vsBJ t|rHJ d S )Nr=   linked_packagesrt   T)rw   rW   r   r   r   r   r3   r   r2   linkedr+   r+   r,   test_link_extension7  s   


z!TestExtension.test_link_extensionc                 C   s   | j }| jd }t|du sJ t d }||v sJ |t d vs$J t|s*J t|s0J t d }||vs;J t|rAJ d S )Nr?   Tr   rt   )r   rW   r   r   r   r   r   r+   r+   r,   test_link_packageE  s   


zTestExtension.test_link_packagec                 C   sV   | j }t|du sJ t|du sJ t d }| jd }||vs#J t|r)J d S )NTr   r?   )r   r   r   r   rW   r   )r3   targetr   r2   r+   r+   r,   test_unlink_packageR  s   

z!TestExtension.test_unlink_packagec                 C   s   t | jdu s	J t  d S )NT)r   rw   r   r9   r+   r+   r,   test_list_extensions[  s   
z"TestExtension.test_list_extensionsc                 C   sb  |   }t|d}t| j|ddu sJ t|dd}t|s!J t|dd }| jd }||v s3J t||ds;J t	| jd |ddu sHJ t|dd}t|rUJ t|dd }||vsbJ t||drjJ t
| j|ddu suJ t|dd }| jd }||v sJ t||dsJ t| j|ddu sJ t|dd }||vsJ t||drJ d S )	Nrg   app_optionsTrt   ru   r=   r   r?   )r5   r
   r   rw   rT   rx   r   rW   r   r   r   r   r   )r3   rg   optionsr   rt   r   r   pkg_namer+   r+   r,   test_app_dir_  s0   


zTestExtension.test_app_dirc                 C   s   |   }t|d}tj| jrt| j t| jdu sJ t	|dd}t

|r,J t|dd }| jd }||v s>J t||dsFJ d S Nr   Trt   ru   r   r=   r5   r
   r   r   r    rg   
removedirsr   rw   rT   rx   r   rW   r   r3   rg   r   r   rt   r   r+   r+   r,   test_app_dir_use_sys_prefix}  s   

z)TestExtension.test_app_dir_use_sys_prefixc                 C   s   |   }t|dd}tj| jrt| j t| jdu s J t	|dd}t

|r-J t|dd }| jd }||vs?J t||drGJ d S )NF)rg   use_sys_dirTrt   ru   r   r=   r   r   r+   r+   r,   test_app_dir_disable_sys_prefix  s   
z-TestExtension.test_app_dir_disable_sys_prefixc                 C   s  |   }| j}t|d}tj|rt| t| jdu s J t	|dd}t

|s-J t	|dd}t

|r:J t|dd }| jd }||v sLJ t||dsTJ t| j|ddu s_J t

|sfJ t|dd }||v ssJ t||ds{J t| jd |ddu sJ t

|rJ t

|sJ t|dd }||v sJ t||dsJ t| jd |ddu sJ t

|rJ t

|rJ t|dd }||vsJ t||drJ d S r   )r5   rg   r
   r   r   r    r   r   rw   rT   rx   r   rW   r   r   )r3   rg   sys_dirr   sys_pathapp_pathrt   r   r+   r+   r,   test_app_dir_shadowing  s>   


z$TestExtension.test_app_dir_shadowingc                 C   s   t | jdu s	J t  t| jddd}t|}| }W d    n1 s'w   Y  | jd |v s5J t| jdd}t|}| }W d    n1 sOw   Y  | jd |v s]J d S )NTr   r   index.out.jsr=   static)r   rw   r   rT   rg   r"   readrW   )r3   entryrk   r;   r+   r+   r,   
test_build  s   



zTestExtension.test_buildzNot in git checkoutc                 C   s   t dd}t| jdu sJ t|d dt|v sJ t| jddd}t|}| }W d    n1 s6w   Y  | j	d |v sDJ t| jd	d}t|}| }W d    n1 s^w   Y  | j	d |v slJ d S )
NT)splice_sourcer   z-splicedr   r   r   r=   r   )
r
   r   rw   r   r   rT   rg   r"   r   rW   )r3   r   r   rk   r;   r+   r+   r,   test_build_splice_packages  s   





z(TestExtension.test_build_splice_packagesc                 C   s   t | jdu s	J tdddd t| jdd}t|}| }W d    n1 s*w   Y  | jd |v s8J t| jdd	}t|}t	|}W d    n1 sSw   Y  |d
 d dksbJ |d
 d dkslJ |d
 d dksvJ d S )NTfooz1.0bar)r2   version
static_urlr   r   r=   rH   r   r2   r   	staticUrl)
r   rw   r   rT   rg   r"   r   rW   r\   r]   )r3   r   rk   r;   pkgr+   r+   r,   test_build_custom  s   


zTestExtension.test_build_customc                 C   s  t  }t  }|  td}|d |  }t|||dd}d}d}|D ]}|j| }	|j||	dd q&|D ]}|j	| }	|||	 q8t
| j|d	du sQJ t|d	 t|d
d}
t|
}| }W d    n1 sow   Y  | jd |v s}J t|d
d}t|}t|}W d    n1 sw   Y  t|d d  g dksJ |d d i ksJ |d d D ]}|dr||v sJ qd S )Njupyterlab_test_loggerDEBUGF)rg   core_configloggerr   )!@jupyterlab/application-extension@jupyterlab/apputils-extension)@jupyterlab/applicationz@jupyterlab/apputilsz@jupyterlab/coreutilsz@jupyterlab/servicesT)r=   r   r   r   r=   rH   r   rt   )r   r   z@jupyterlab/mock-extensionmimeExtensionssingletonPackagesz@jupyterlab/)r   clear_packageslogging	getLoggersetLevelr5   r
   rt   add
singletonsr   rw   r   rT   r"   r   rW   r\   r]   sortedkeys
startswith)r3   default_configr   r   rg   r   rt   r   r2   semverr   rk   r;   r   r+   r+   r,   %test_build_custom_minimal_core_config  sL   







 
z3TestExtension.test_build_custom_minimal_core_configc                 C   s  t |  d}t| j|ddu sJ t| jd |ddu sJ t|d}| jd }|d |du s4J t||dr<J t|d|dsEJ td|ddu sOJ t|d}|d ddu s_J td|drgJ tdd|dspJ |d |du s{J t||drJ t|d|dsJ d S )Nr   r   Tr=   disabled)	installedr   @jupyterlab/notebook-extension)	r
   r5   r   rw   r   rW   r   getr   r3   r   infor2   r+   r+   r,   test_disable_extension)  s$   



z$TestExtension.test_disable_extensionc                 C   s   t |  d}t| j|ddu sJ t| jd |ddu sJ t| jd |ddu s,J t|d}d|d vs9J | jd }|d |ddu sJJ t	||dsRJ td|ddu s\J t	||dsdJ t	d|drlJ d S )Nr   r   Tr=   r   r   F)
r
   r5   r   rw   r   rW   r   r   r   r   r   r+   r+   r,   test_enable_extension=  s   

z#TestExtension.test_enable_extensionc                 C   sL  t  sJ t| jdu sJ t| jdu sJ t  t  rJ t| jdu s(J t  s-J t| jd du s8J t  r=J t	| jd}t
|}t|}W d    n1 sWw   Y  t
|d}| }W d    n1 spw   Y  d|d< t
|d}t|| W d    n1 sw   Y  t  sJ t  sJ t
|d}|| W d    n1 sw   Y  t  rJ t	| jd	}t
|d}| }W d    n1 sw   Y  t
|d}||d
  W d    n1 sw   Y  t  sJ t  sJ t
|d}|| W d    n	1 sw   Y  t  r$J d S )NTr@   rH   rbr   r   r6   wbr   s   
console.log("hello");)r   r   rw   r   r   r   r|   r   rW   rT   r"   r\   r]   r   dumpwrite)r3   pkg_pathrk   r;   origr+   r+   r,   test_build_checkK  sN   










zTestExtension.test_build_checkc                 C   s   t ddsJ t ddsJ t ddsJ t ddsJ t ddr#J t d	d
r*J t ddd u s3J t ddd u s<J t ddsCJ t ddsJJ t ddsQJ t ddsXJ t dds_J t ddrfJ t ddrmJ 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^1 || ^2^1z^2^2 || ^3^3 || ^4z^1 || ^3)r   r9   r+   r+   r,   test_compatibilityx  s   z TestExtension.test_compatibilityc                 C   s^   t dddks	J t dddksJ t dddksJ t dddks$J t ddd u s-J d S )	Nr   r   r   r   r   r   z^1 || ^4)r   r9   r+   r+   r,   test_compare_ranges  s
   z!TestExtension.test_compare_rangesc                    sD  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|}|V |; tjj|% t  t	ddu s[J W d    n1 sew   Y  W d    n1 stw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Ndependenciesr   c                 S   s   dd| iiS )Nr   r   r+   )verr+   r+   r,   _gen_dep  s   z7TestExtension.test_install_compatible.<locals>._gen_depc              	      sB   |dksJ |    d  d dddS )Nmockextension	^2000.0.0)z0.9.0z1.0.0z1.1.0z2.0.0z2.0.0-b0z2.1.0-b02.1.0)r2   versionsr+   )registryr2   r   )r  current_app_depr+   r,   _mock_metadata  s   z=TestExtension.test_install_compatible.<locals>._mock_metadatac              	      sD   |dddidgd}|  d |d|||d d	t|d	d
}|S )Nr  r=   Tr   )r2   r   r   jupyterlab_extracted_filesr  Fr   zmockextension.tgz)sourceis_dirr;   r2   r   filenamer   )updaterT   )r3   r  r5   argskwargsr;   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)ro   rp   rq   r+   r+   r+   r,   Success  s    r  c                    s2   |dv sJ |dkr  | |g|R i |S )N)r  mockextension@1.1.0r  r+   r3   r2   r  r  )r  orig_installr+   r,   _mock_install  s   z<TestExtension.test_install_compatible.<locals>._mock_install_fetch_package_metadata_extract_package_install_extensionr  T)
r   	Exceptionr   ra   r   _AppHandlerr  r   r   r   )r3   	core_datar	  r  r  p1p2p3r+   )r  r  r  r  r,   test_install_compatible  s&    Pz%TestExtension.test_install_compatiblec              	      s   g   fdd}dd }t tjd|}t tjd|}t| jdu s%J t| jdu s.J |% | t| jd du s?J W d    n1 sIw   Y  W d    n1 sXw   Y   | jd gksgJ d S )	Nc                    4     |d |dd  dd   |dd| dS Nr   r   @Fzfoo/bar/)r2   r  r   r1   splitr  r   r+   r,   r       $z7TestExtension.test_update_single.<locals>._mock_installc                 S      dS Nz	10000.0.0r+   r}   r+   r+   r,   _mock_latest     z6TestExtension.test_update_single.<locals>._mock_latestr  "_latest_compatible_package_versionTr=   	r   ra   r   r  r   rw   r|   r   rW   r3   r  r*  r  r  r+   r&  r,   test_update_single  s    z TestExtension.test_update_singlec                 C   s   t ddu sJ d S )Nr   F)r   r9   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 |0 | t| jd du s7J t| jd	 du sBJ W d    n1 sLw   Y  W d    n1 s[w   Y   | jd | jd	 gksnJ d S )
Nc                    r!  r"  r$  r  r&  r+   r,   r    r'  z9TestExtension.test_update_multiple.<locals>._mock_installc                 S   r(  r)  r+   r}   r+   r+   r,   r*    r+  z8TestExtension.test_update_multiple.<locals>._mock_latestr  r,  r=   Tr@   r-  r.  r+   r&  r,   test_update_multiple  s   

  z"TestExtension.test_update_multiplec              	      s   g fdd}t jj  fdd}t| jdu sJ t| jdu s$J tt jd|}tt jd|}|$ | td dddu sDJ W d    n1 sNw   Y  W d    n1 s]w   Y  t	| j
d	 | j
d
 gksrJ d S )Nc                    s(     |d |dd  dd   dS )Nr   r   r#  Tr$  r  )updatedr+   r,   _mock_update  s   $z3TestExtension.test_update_all.<locals>._mock_updatec                    s    | }g |d< |S )Nlocal_extensionsr+   )r3   r   )original_app_infor+   r,   _mock_app_info  s   z5TestExtension.test_update_all.<locals>._mock_app_infoT_update_extension_get_app_infor   r=   r@   )r   r  r8  r   rw   r|   r   ra   r   r   rW   )r3   r3  r6  r  r  r+   )r5  r2  r,   test_update_all  s    $zTestExtension.test_update_allN).ro   rp   rq   rz   r{   r~   r   r   r   r   r   r   markslowr   r   skipifplatformsystemr   r   r   r   r   r   r   r   r   r   r   r   r    r	   r   r   r   r   r   r   r   r   r   r/  r0  r1  r9  r+   r+   r+   r,   rr      sX    	



	%


5
,:rr   c                 C   s(   | }t j}||  |  |t _d S r/   )sysstderr_link_jupyter_server_extension
initialize)jp_serverappmake_lab_appappr@  r+   r+   r,   test_load_extension  s
   

rF  r/   )7__doc__rx   r\   r   r   r=  rY   r   r?  os.pathr   rT   pathlibr   tempfiler   unittestr   unittest.mockr   r   jupyter_corer   r   r   jupyterlab.commandsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   jupyterlab.coreconfigr   r   r   r   abspath__file__rX   r-   r.   rr   rF  r+   r+   r+   r,   <module>   s8    L
V    |