o
    O\j                     @  s   d Z ddlmZ ddlZddlZddlZddlmZ ee	 j
d Zejdee ejdZedur?eeds?ejd= 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mZmZm Z  G dd dej!Z"e#dkr|ej$dd dS dS )z-Standalone measured storage and quota checks.    )annotationsN)Path   platform__path__)create_engine)Session)
StaticPool)Base)service)AppTenantTenantLimitc                   @  s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )StorageChecksc                   s   t   _tddditdd _tj j t	j
 _t	j _ fddt	_
t jjt	_t jdd2}|td	d	d
d	ddd |tdddddd |td	d dddd |  W d    d S 1 siw   Y  d S )Nz	sqlite://check_same_threadFT)connect_args	poolclassfuturec                     s   t  jddS )NTr   )r   engine selfr   ;/var/www/html/flask_server/tests/platform/storage_checks.py<lambda>#   s    z%StorageChecks.setUp.<locals>.<lambda>r   tenant-azTenant Aactive)	tenant_idslugnamestorage_keystatus	is_activeapp-azApp Az
apps.app_az/app-a)app_iddisplay_namemodule_pathroute_prefixr"   
storage_mb   block)r   r$   
limit_namelimit_valueoverage_policy)tempfileTemporaryDirectorytemp_dirr   r	   r   r
   metadata
create_allr   get_control_plane_sessionoriginal_factorySTORAGE_ROOToriginal_rootr   r   r   addr   r   r   commit)r   sessionr   r   r   setUp   s2   

"zStorageChecks.setUpc                 C  s(   | j t_| jt_| j  | j  d S )N)	r4   r   r3   r6   r5   r   disposer0   cleanupr   r   r   r   tearDown4   s   
zStorageChecks.tearDownc                 C  sN   t jddddd t jddddd t d}| d|j | d|j d S )	Nr   r#   zinvoices/a.pdfsd   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   r$   relative_pathdatasP   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbP   	available)r   write_bytesget_storage_snapshotassertEqual
used_bytesr!   )r   snapshotr   r   r   6test_write_is_measured_and_replacement_uses_size_delta:   s   
zDStorageChecks.test_write_is_measured_and_replacement_uses_size_deltac                 C  sh   |  tj tjddddd d W d    n1 sw   Y  | t| jjd d d   d S )Nr   r#   z	large.bin   xi  r>   )	assertRaisesr   StorageQuotaExceededrC   assertFalser   r0   r   existsr   r   r   r   0test_over_limit_write_is_blocked_and_not_createdG   s   &z>StorageChecks.test_over_limit_write_is_blocked_and_not_createdc                 C  sB   |  t tjddddd W d    d S 1 sw   Y  d S )Nr   r#   z../../outside.binrI   r>   )rJ   
ValueErrorr   rC   r   r   r   r   test_path_traversal_is_rejectedO   s   "z-StorageChecks.test_path_traversal_is_rejectedN)__name__
__module____qualname__r:   r=   rH   rN   rP   r   r   r   r   r      s    r   __main__)	verbosity)%__doc__
__future__r   sysr.   unittestpathlibr   __file__resolveparentsPROJECT_ROOTpathinsertstrmodulesgetloaded_platformhasattr
sqlalchemyr   sqlalchemy.ormr   sqlalchemy.poolr	   	config.dbr
   platform.storager   platform.tenants.modelsr   r   r   TestCaser   rQ   mainr   r   r   r   <module>   s*    >