o
    eY\j                     @  sT  d Z ddlm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
mZmZ ddlmZ ee jd Zejdee ejdZedurYeedsYejd= dd	lmZ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% ddl&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z- G dd de	j.Z/e0dkre	j1dd dS dS )z@Standalone billing signature, idempotency, and lifecycle checks.    )annotationsN)datetime	timedeltatimezone)Path   platform__path__)create_engineselect)Session)
StaticPool)Base)webhooks)stripe_adapter)evaluate_subscription)BillingProductMappingBillingWebhookEventPlanTenantTenantSubscriptionc                   @  s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )BillingChecksc              
     s   t ddditdd _tj j tj _ fddt_t	 jdd-}|
td	d	d
d |
tdddddd |
tddd	d |  W d    d S 1 sTw   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/billing_checks.py<lambda>.   s    z%BillingChecks.setUp.<locals>.<lambda>r   paidPaid)plan_idcodenametenant-azTenant Aactive)	tenant_idslugr'   status	is_activeadapter
price-paid)providerprice_idr%   )r
   r   r   r   metadata
create_allr   get_control_plane_sessionoriginal_factoryr   addr   r   r   commit)r    sessionr   r   r!   setUp'   s$   
"zBillingChecks.setUpc                 C  s2   | j t_tjdd  tjdd  | j  d S )NBILLING_WEBHOOK_SECRET_ADAPTERSTRIPE_WEBHOOK_SECRET)r5   r   r4   osenvironpopr   disposer   r   r   r!   tearDown:   s   zBillingChecks.tearDownc                 C  s   dt jd< d}ttt }td| d | tj	
 }td||| | tj td|d || W d    d S 1 sCw   Y  d S )Nztest-secretr:   s   {"id":"event-1"}s   test-secret   .r.      x)r<   r=   strinttimehmacnewencodehashlibsha256	hexdigestr   verify_signatureassertRaisesBillingWebhookError)r    body	timestamp	signaturer   r   r!   <test_signature_accepts_current_message_and_rejects_tampering@   s   
"zJBillingChecks.test_signature_accepts_current_message_and_rejects_tamperingc                 C  s   ddddddddd	}t j|d
d }td||}td||}| |d  | |d  t| jdd3}|	t
t }|	t
t  }| d|j | d|j | dt| W d    d S 1 snw   Y  d S )Nzevent-1zsubscription.activer(   z
customer-azsubscription-ar/   r)   )r*   customer_idsubscription_idr1   r,   idtypedata,:
separatorsr.   	duplicateTr   r#      )jsondumpsrH   r   process_eventassertFalse
assertTruer   r   executer   r   
scalar_oner   scalarsallassertEqualr,   r%   len)r    payloadrawfirstsecondr8   subscriptionreceiptsr   r   r!   ;test_event_creates_subscription_and_duplicate_is_idempotentK   s*   "zIBillingChecks.test_event_creates_subscription_and_duplicate_is_idempotentc                 C  sv   t tj}tdd|tdd  i|}tdd|tdd  i|}| |d  | |d  | |d  d S )Npast_duegrace_untilr_   )hours)secondsaccess_allowedin_grace_period)	r   nowr   utcr   r   	isoformatrd   rc   )r    rx   allowedblockedr   r   r!   test_past_due_grace_expiresc   s   z)BillingChecks.test_past_due_grace_expiresc                 C  s   dt jd< ddddddd	d
iddddiigiddddid}tj|dd }tt }tdt	| d | t
j }t|d| d|  t|}| d|d  | d
|d d	  | d|d d  d S )N
whsec_testr;   evt_stripe_1zcustomer.subscription.updatedobjectsub_stripe_1cus_stripe_1trialingr*   r(   rX   pricerV   r/   i Sei ~{eF)rV   customerr,   r2   itemscurrent_period_startcurrent_period_endcancel_at_period_endrU   rY   r\   s
   whsec_testrA   zt=z,v1=zsubscription.trialingrW   r1   )r<   r=   r`   ra   rH   rD   rE   rF   rG   rC   rI   rJ   rK   r   verify_stripe_signaturetranslate_stripe_eventri   )r    rk   rl   rP   rQ   
translatedr   r   r!   9test_native_stripe_signature_and_subscription_translationo   s4   

zGBillingChecks.test_native_stripe_signature_and_subscription_translationN)	__name__
__module____qualname__r9   r@   rR   rq   r}   r   r   r   r   r!   r   &   s    r   __main__)	verbosity)2__doc__
__future__r   rI   rF   r`   r<   sysrE   unittestr   r   r   pathlibr   __file__resolveparentsPROJECT_ROOTpathinsertrC   modulesgetloaded_platformhasattr
sqlalchemyr
   r   sqlalchemy.ormr   sqlalchemy.poolr   	config.dbr   platform.billingr   r   platform.billing.lifecycler   platform.tenants.modelsr   r   r   r   r   TestCaser   r   mainr   r   r   r!   <module>   s8    	e