o
    ^iz                     @   sN  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*m+Z+m,Z, ddl-m.Z.m/Z/ ej01ej02e3Z4dddZ5G dd deZ6G dd de6Z7dd Z8d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lock_extensionuninstall_extensionunlink_packageunlock_extension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-   [/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyterlab/tests/test_jupyterlab.pytouch1   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.   tempdirI   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 r1   )r2   cleanup)dr5   r-   r.   cleanup_tempdirsT   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.   ignorec   s
   
z$AppHandlerTest.setUp.<locals>.ignore)rH   rD   mock_package.jsonr4   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)&r2   r$   r   devnull
addCleanupr7   test_dirpjoindata_dir
config_dir	pkg_nameshereshutilcopytreer    r"   r#   setattrjsonloadpatchesr   dictr3   r   hasattrobjectstartstopassertEqualrP   rO   r   r   get_app_dirresolveapp_dirpinned_packages)
r5   r<   r4   srcrH   destfidr=   pmodr-   r;   r.   setUpN   sj   








zAppHandlerTest.setUpN)__name__
__module____qualname__r7   rp   r-   r-   r-   r.   r0   H   s    r0   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
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%d7d8 Z&ejjd9d: Z'd;d< Z(d=d> Z)d?d@ Z*dAdB Z+dCdD Z,dEdF Z-dGdH Z.dIS )J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_extensionrV   ri   globr   rY   r   r5   r    rv   r4   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 ru   rx   r{   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 )NrB   rv   T)r   mock_mimeextensionrY   r   r   r   r5   r4   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   rY   )r5   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 )NrJ   rv   r4   )mock_packager   r   r   r   r$   rV   r^   r_   r   r   )r5   r    rm   r=   rv   r4   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?   rB   )ry   r   rE   rV   r   r   r   r   r   rY   r~   )r5   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?   rv   rw   )	r   ry   rY   r   r   rV   ri   rz   r   )r5   r4   r    rv   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?   rB   Tall_rv   )r   ry   r~   rY   r   r   r   )r5   ext_namemime_ext_namerv   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stagingrJ   
jupyterlabrv   )	r   ri   r   r$   rV   r^   r_   r   r   )r5   ri   rm   r=   rv   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   rv   N)r   rj   r   r   r   )r5   NAMESrv   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).0r4   base_dirr-   r.   
<listcomp>(  s    zJTestExtension.test_install_and_uninstall_pinned_folder.<locals>.<listcomp>r   1r   2rA   N)r   r7   rj   r[   unpack_archiver   r   )r5   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_packagesrv   T)ry   rY   r   r   r   r   r5   r    r4   linkedr-   r-   r.   test_link_extension9  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 )NrA   Tr   rv   )r   rY   r   r   r   r   r   r-   r-   r.   test_link_packageG  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   rA   )r   r   r   r   rY   r   )r5   targetr   r4   r-   r-   r.   test_unlink_packageT  s   

z!TestExtension.test_unlink_packagec                 C   s   t | jdu s	J t  d S )NT)r   ry   r   r;   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ri   app_optionsTrv   rw   r?   r   rA   )r7   r
   r   ry   rV   rz   r   rY   r   r   r   r   r   )r5   ri   optionsr    rv   r   r   pkg_namer-   r-   r.   test_app_dira  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   Trv   rw   r   r?   r7   r
   r   r    r"   ri   
removedirsr   ry   rV   rz   r   rY   r   r5   ri   r   r    rv   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)ri   use_sys_dirTrv   rw   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   )r7   ri   r
   r   r    r"   r   r   ry   rV   rz   r   rY   r   r   )r5   ri   sys_dirr   sys_pathapp_pathrv   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   ry   r   rV   ri   r$   readrY   )r5   entryrm   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   ry   r   r   rV   ri   r$   r   rY   )r5   r   r   rm   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)r4   version
static_urlr   r   r?   rJ   r   r4   r   	staticUrl)
r   ry   r   rV   ri   r$   r   rY   r^   r_   )r5   r   rm   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)ri   core_configloggerr   )!@jupyterlab/application-extension@jupyterlab/apputils-extension)@jupyterlab/applicationz@jupyterlab/apputilsz@jupyterlab/coreutilsz@jupyterlab/servicesT)r?   r   r   r   r?   rJ   r   rv   )r   r   z@jupyterlab/mock-extensionmimeExtensionssingletonPackagesz@jupyterlab/)r   clear_packageslogging	getLoggersetLevelr7   r
   rv   add
singletonsr   ry   r   rV   r$   r   rY   r^   r_   sortedkeys
startswith)r5   default_configr   r   ri   r   rv   r   r4   semverr   rm   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
   r7   r   ry   r   rY   r   getr   r5   r   infor4   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
   r7   r   ry   r   rY   r   r   r   r   r   r-   r-   r.   test_enable_extension?  s   

z#TestExtension.test_enable_extensionc                 C   s   t |  d}t| j|ddu sJ | jd }t|d}|d |ddu s(J t| jd |d t|d}|d |ddu sBJ t| jd |d t|d}|d |ddu s\J d S )Nr   r   Tr?   lockedF)	r
   r7   r   ry   rY   r   r   r   r   )r5   r   r4   r   r-   r-   r.   test_lock_unlock_extensionM  s   



z(TestExtension.test_lock_unlock_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 )NTrB   rJ   rbr   r   r8   wbr   s   
console.log("hello");)r   r   ry   r   r   r   r~   r   rY   rV   r$   r^   r_   r   dumpwrite)r5   pkg_pathrm   r=   origr-   r-   r.   test_build_checkZ  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   r;   r-   r-   r.   test_compatibility  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   r;   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)r4   versionsr-   )registryr4   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   )r4   r   r   jupyterlab_extracted_filesr  Fr   zmockextension.tgz)sourceis_dirr=   r4   r   filenamer    )updaterV   )r5   r  r7   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)rq   rr   rs   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-   r5   r4   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   rc   r   _AppHandlerr  r   r   r   )r5   	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/)r4   r  r    r3   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   rc   r   r  r   ry   r~   r   rY   r5   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   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 |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  r0  r?   TrB   r1  r2  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-   )r5   r   )original_app_infor-   r.   _mock_app_info  s   z5TestExtension.test_update_all.<locals>._mock_app_infoT_update_extension_get_app_infor   r?   rB   )r   r  r<  r   ry   r~   r   rc   r   r   rY   )r5   r7  r:  r!  r"  r-   )r9  r6  r.   test_update_all  s    $zTestExtension.test_update_allN)/rq   rr   rs   r|   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$  r3  r4  r5  r=  r-   r-   r-   r.   rt      sZ    	



	%


5
,:rt   c                 C   s(   | }t j}||  |  |t _d S r1   )sysstderr_link_jupyter_server_extension
initialize)jp_serverappmake_lab_appapprD  r-   r-   r.   test_load_extension#  s
   

rJ  r1   )9__doc__rz   r^   r   r   rA  r[   r   rC  os.pathr   rV   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   r   r   jupyterlab.coreconfigr   r   r    r!   abspath__file__rZ   r/   r0   rt   rJ  r-   r-   r-   r.   <module>   s:    T
V     
