o
    tf4w                     @   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+   i/var/www/html/software/conda/envs/catlas/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mimeextensionZ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)rE   rA   Zmock_package.jsonr2   z
os.environZlab)ZJUPYTER_CONFIG_DIRZJUPYTER_DATA_DIRZJUPYTERLAB_DIRENV_JUPYTER_PATHENV_CONFIG_PATHZCONFIG_PATHZ
BUILD_PATHzjupyterlab-test-extension@1.0zjupyterlab-test-extension@2.0)&r0   r"   r   devnullZ
addCleanupr5   Ztest_dirpjoindata_dirZ
config_dir	pkg_nameshereshutilcopytreer   r    r!   setattrjsonloadZpatchesr   dictr1   r   hasattrobjectstartstopassertEqualrH   rG   r   r   Zget_app_dirresolveapp_dirpinned_packages)
r3   r:   r2   srcrE   destfidr;   pmodr+   r9   r,   setUpL   sj   








zAppHandlerTest.setUpN)__name__
__module____qualname__r5   ra   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_extensionrJ   rZ   globr   rL   r   r3   r   rg   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 rf   ri   rl   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@   rg   T)r   mock_mimeextensionrL   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   Zmock_incompatstrvaluer   rL   )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 )NrF   rg   r2   )mock_packagerr   rs   rt   r   r"   rJ   rQ   rR   r   r   )r3   r   r^   r;   rg   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@   )rj   r   rB   rJ   rr   rs   rt   r   r   rL   ro   )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=   rg   rh   )	r   rj   rL   r   r   rJ   rZ   rk   r   )r3   r2   r   rg   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Zall_rg   )r   rj   ro   rL   r   r   r   )r3   ext_nameZmime_ext_namerg   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stagingrF   
jupyterlabrg   )	r   rZ   r   r"   rJ   rQ   rR   r   r   )r3   rZ   r^   r;   rg   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   )Zpin   rg   N)r   r[   r   r   r   )r3   ZNAMESrg   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 )ZnpmpackT)stdouttextcheckcwd)
subprocessrunPIPEru   r   strip).0r2   base_dirr+   r,   
<listcomp>&  s    zJTestExtension.test_install_and_uninstall_pinned_folder.<locals>.<listcomp>r   1r   2r?   N)r   r5   r[   rN   unpack_archiveru   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_packagesrg   T)rj   rL   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   rg   )ry   rL   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?   )ry   r   r   r   rL   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   rj   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rZ   app_optionsTrg   rh   r=   r   r?   )r5   r
   r   rj   rJ   rk   r   rL   r   r   r   ry   r   )r3   rZ   optionsr   rg   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   Trg   rh   r   r=   r5   r
   r   r   r    rZ   
removedirsr   rj   rJ   rk   r   rL   r   r3   rZ   r   r   rg   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)rZ   use_sys_dirTrg   rh   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   rZ   r
   r   r   r    r   r   rj   rJ   rk   r   rL   r   r   )r3   rZ   Zsys_dirr   sys_pathZapp_pathrg   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   rj   r   rJ   rZ   r"   readrL   )r3   entryr^   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)Zsplice_sourcer   z-splicedr   r   r   r=   r   )
r
   r   rj   r   r   rJ   rZ   r"   r   rL   )r3   r   r   r^   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   versionZ
static_urlr   r   r=   rF   r   r2   r   Z	staticUrl)
r   rj   r   rJ   rZ   r"   r   rL   rQ   rR   )r3   r   r^   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 )NZjupyterlab_test_loggerDEBUGF)rZ   core_configloggerr   )!@jupyterlab/application-extension@jupyterlab/apputils-extension)@jupyterlab/applicationz@jupyterlab/apputilsz@jupyterlab/coreutilsz@jupyterlab/servicesT)r=   r   r   r   r=   rF   r   rg   )r   r   z@jupyterlab/mock-extensionZmimeExtensionsZsingletonPackagesz@jupyterlab/)r   Zclear_packageslogging	getLoggersetLevelr5   r
   rg   add
singletonsr   rj   r   rJ   r"   r   rL   rQ   rR   sortedkeys
startswith)r3   Zdefault_configr   r   rZ   r   rg   r   r2   Zsemverr   r^   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   rj   r   rL   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   rj   r   rL   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@   rF   rbr   r   r6   wbr{   s   
console.log("hello");)r   r   rj   r   ry   r   ro   r   rL   rJ   r"   rQ   rR   r   dumpwrite)r3   Zpkg_pathr^   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   Zjupyterlab_extracted_filesr   Fr   zmockextension.tgz)sourceis_dirr;   r2   r   filenamer   )updaterJ   )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)rb   rc   rd   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_installZ_fetch_package_metadataZ_extract_package_install_extensionr   T)
r   	Exceptionr   rU   r   _AppHandlerr   rr   rs   r   )r3   Z	core_datar   r   r   p1p2Z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+   rp   r+   r+   r,   _mock_latest     z6TestExtension.test_update_single.<locals>._mock_latestr   "_latest_compatible_package_versionTr=   	r   rU   r   r   r   rj   ro   r   rL   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+   rp   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 )NZlocal_extensionsr+   )r3   r   )original_app_infor+   r,   _mock_app_info  s   z5TestExtension.test_update_all.<locals>._mock_app_infoTZ_update_extension_get_app_infor~   r=   r@   )r   r   r  r   rj   ro   r   rU   r   r   rL   )r3   r  r  r   r   r+   )r  r  r,   test_update_all  s    $zTestExtension.test_update_allN).rb   rc   rd   rm   rn   rq   rx   rz   r|   r}   r   rr   markZslowr   r   Z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  r  r  r  r+   r+   r+   r,   re      sX    	



	%


5
,:re   c                 C   s(   | }t j}||  |  |t _d S r/   )sysstderrZ_link_jupyter_server_extensionZ
initialize)Zjp_serverappZmake_lab_appZappr  r+   r+   r,   test_load_extension  s
   

r  r/   )7__doc__rk   rQ   r   r   r  rN   r   r  Zos.pathr   rJ   pathlibr   tempfiler   Zunittestr   Zunittest.mockr   rr   Zjupyter_corer   r   r   Zjupyterlab.commandsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zjupyterlab.coreconfigr   r   r   r   abspath__file__rM   r-   r.   re   r  r+   r+   r+   r,   <module>   s8    L
V    |