o
    +N\j                     @  s   d Z ddlm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rxej#dd dS dS )z#Standalone persistent quota checks.    )annotationsN)Path   platform__path__)create_engine)Session)
StaticPool)Base)service)AppTenantTenantLimitc                   @  s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
QuotaChecksc                   s   t ddditdd _tj j tj _ fddt_t	 jdd2}|
td	d	d
ddd |
tdddddd |
td	d ddddd |  W d    d S 1 sYw   Y  d S )Nz	sqlite://check_same_threadFT)connect_args	poolclassfuturec                     s   t  jddS )NTr   )r   engine selfr   9/var/www/html/flask_server/tests/platform/quota_checks.py<lambda>"   s    z#QuotaChecks.setUp.<locals>.<lambda>r   tenant-azTenant Aactive)	tenant_idslugnamestatus	is_activeapp-azApp Az
apps.app_az/app-a)app_iddisplay_namemodule_pathroute_prefixr!   requests_per_minuter   <   block)r   r#   
limit_namelimit_valuewindow_secondsoverage_policy)r   r	   r   r
   metadata
create_allr   get_control_plane_sessionoriginal_factoryr   addr   r   r   commit)r   sessionr   r   r   setUp   s2   
"zQuotaChecks.setUpc                 C  s   | j t_| j  d S )N)r1   r   r0   r   disposer   r   r   r   tearDown3   s   zQuotaChecks.tearDownc                 C  s`   t jdddd}| |j | d|j t d}| d|d d  | d|d d  d S )	Nr   r"   requestsr   r#   metric   r'   used	remaining)r   consume
assertTrueallowedassertEqualr=   usage_snapshot)r   firstsnapshotr   r   r   0test_usage_is_recorded_and_remaining_is_reported7   s   
z<QuotaChecks.test_usage_is_recorded_and_remaining_is_reportedc                 C  s   t jdddd t jdddd | t j}t jdddd W d    n1 s)w   Y  | d|jjj | d|jjj | dt 	dd d  d S )	Nr   r"   r8   r9   r   r   r'   r<   )
r   r>   assertRaisesQuotaExceededrA   	exceptiondecisionr<   r=   rB   )r   caughtr   r   r   1test_request_is_blocked_without_recording_overageA   s   z=QuotaChecks.test_request_is_blocked_without_recording_overageN)__name__
__module____qualname__r5   r7   rE   rK   r   r   r   r   r      s
    
r   __main__)	verbosity)$__doc__
__future__r   sysunittestpathlibr   __file__resolveparentsPROJECT_ROOTpathinsertstrmodulesgetloaded_platformhasattr
sqlalchemyr   sqlalchemy.ormr   sqlalchemy.poolr	   	config.dbr
   platform.quotasr   platform.tenants.modelsr   r   r   TestCaser   rL   mainr   r   r   r   <module>   s(    3