
    YajF"                       d dl mZ d dlZd dlmc 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 d d	lmZ d d
lmZ d dlmZ d dlmZ  G d d          Z G d d          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S )    )annotationsN)Decimal)create_crypto_asset)create_initial_holding_snapshot)create_wallet)main)
PriceQuoterefresh_crypto_pricesstore_crypto_price)create_alert)check_crypto_data_quality)connect_memory)apply_migrationsc                      e Zd ZddZdS )FreshProviderCHFc                     fd|D             S )Nc           
     T    i | ]$}|t          |t          d           dd          %S )100	MockGecko2026-01-31T00:00:00+00:00)coingecko_idcurrencypriceproviderprovider_timestamp)r	   r   .0cidr   s     j/home/agent/.hermes/worktrees/FinanceManager-test-baseline/tests/unit/test_data_quality_alert_lifecycle.py
<dictcomp>z3FreshProvider.get_crypto_prices.<locals>.<dictcomp>   sQ     	
 	
 	
   !enn$#>  	
 	
 	
     selfcoingecko_idsr   s     `r    get_crypto_priceszFreshProvider.get_crypto_prices   0    	
 	
 	
 	
 %	
 	
 	
 		
r"   Nr   __name__
__module____qualname__r'   r#   r"   r    r   r      (        

 

 

 

 

 

r"   r   c                      e Zd ZddZdS )MissingProviderr   c                     fd|D             S )Nc           
     :    i | ]}|t          |d dd          S )Nmissingz
not listed)r   r   r   quality_statuserror_message)r	   r   s     r    r!   z5MissingProvider.get_crypto_prices.<locals>.<dictcomp>    sK     	
 	
 	
   !(*  	
 	
 	
r"   r#   r$   s     `r    r'   z!MissingProvider.get_crypto_prices   r(   r"   Nr)   r*   r#   r"   r    r0   r0      r.   r"   r0   c            	         t                      } t          |            t          | dddd          }t          | ddd	          }t	          | ||t          d
          ddd           | |fS )NzSynthetic WalletHardware Wallet	Syntheticr   wallet_namewallet_typeplatform_providerlast_verified_atBitcoinBTCbitcoin	coin_namesymbolr   0.01verifiedsynthetic fixtureasset_id	wallet_idquantityverification_statusnoter=   )r   r   r   r   r   r   )connrI   rH   s      r    setup_crypto_connrN   ,   s    DT&%%4  I #49UYbcccH#& 4    >r"   returnNonec                    t                      \  } }t          | ddd|ddddid		  	        }t          | |t          d
dt	          d                               t          | dd          }|                     d|f                                          }|j        }d}||k    }|st          j
        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}|d         }
d}|
|k    }|slt          j
        d|fd|
|f          t          j        |
          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}
x}}|d         }
|
s:ddt          j        |
          iz  }t          t          j        |                    d }
|d          }
|
s:ddt          j        |
          iz  }t          t          j        |                    d }
d S )!Nwarnungmarket_datacrypto_assetcrypto_price_stalestaler   r   crypto_price_stale:CHFprioritycategoryentity_type	entity_idrule_idmessageevidencefingerprintr@   r   rH   quoteTr   resolve_fixedzESELECT status, resolved_at, last_seen_at FROM alerts WHERE alert_id=?   ==z7%(py2)s
{%(py2)s = %(py0)s.resolved_alerts
} == %(py5)sresultpy0py2py5assert %(py7)spy7statusresolvedz%(py1)s == %(py4)spy1py4assert %(py6)spy6resolved_atzassert %(py1)srt   last_seen_at)rN   r   r   r	   r   r   executefetchoneresolved_alerts
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)rM   rH   alert_idri   row@py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert0@py_assert2@py_format5@py_format7@py_format2s                  r    6test_stale_price_alert_is_resolved_when_price_is_freshr   C   s   &((ND("$e$,
 
 
H thjESZ[`SaSa6b6bcccc&te4PPPF
,,^ai`k
l
l
u
u
w
wC!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&6&&&&&6&&&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&x=&J&=J&&&&&&&&&&=J&&&&&=&&&&J&&&&&&&&&&&&&&&&&&&&&&&&&&&}~r"   c                 \   t                      \  } }t          | ddd|ddddid		  	        }t          | dd
          }|                     d|f                                          }|j        }d}||k    }|st          j        d|fd||f          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}|d         }
d}|
|k    }|slt          j        d|fd|
|f          t          j        |
          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}
x}}d S )NrR   rS   rT   crypto_price_missing_localr3   r   r   zcrypto_price_missing_local:CHFrX   Trc   z*SELECT status FROM alerts WHERE alert_id=?r   rf   rh   ri   rj   rn   ro   rp   activerr   rs   rv   rw   )rN   r   r   rz   r{   r|   r}   r~   r   r   r   r   r   r   )rM   rH   r   ri   r   r   r   r   r   r   r   r   r   r   s                 r    Atest_missing_price_alert_stays_active_when_price_is_still_missingr   [   s	   &((ND(",e$4
 
 
H 'te4PPPF
,,Ch[
Q
Q
Z
Z
\
\C!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&6&&&&&6&&&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&x=$H$=H$$$$$$$$$$=H$$$$$=$$$$H$$$$$$$$$$$$$$$$$$$$$$$$$$$$$r"   c                    t                      \  } }t          | ddd|ddddid		  	         t          | |t          d
dt	          d                               t          | dd           t          | ddd|ddddid		  	         |                     d|f                                          }t          |          }d}||k    }|st          j
        d|fd||f          dt          j                    v st          j        t                    rt          j        t                    nddt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         d         }d}	||	k    }|slt          j
        d|fd||	f          t          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j        |                    d x}x}}	|d         d          }d!}	||	k    }|slt          j
        d|fd||	f          t          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j        |                    d x}x}}	d S )"NrR   rS   rT   r   r3   r   r   zsame-fingerprintrX   r@   r   ra   Trc   zmissing againfSELECT status, occurrence_count FROM alerts WHERE entity_id=? AND rule_id='crypto_price_missing_local're   rf   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenrowsrk   rt   py3rw   assert %(py8)spy8r   rp   rq   rr   rs   rv   rw   occurrence_count   )rN   r   r   r	   r   r   rz   fetchallr   r}   r~   r   r   r   r   r   r   rM   rH   r   r   @py_assert5r   r   @py_format9r   r   r   s              r    >test_resolved_alert_is_not_recreated_when_fingerprint_is_equalr   p   s   &((ND(",e$&
 
 
 
 thjESZ[`SaSa6b6bccccdU$GGGG",e$&
 
 
 
 <<  A  DL  CN  O  O  X  X  Z  ZDt999>933tt978*
*
**********
*********
***************************7%&+!+&!++++++++++&!+++++&++++!+++++++++++++++++++++++++++++r"   c                 <   t                      \  } }t          | ddd|dddddd	
	  	         t          | ddd|dddddd
	  	         |                     d|f                                          d         }d}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}}d S )NrR   rS   rT   r   zmissing oner   one)r   errorz	error-onerX   zmissing twotwoz	error-twoz[SELECT COUNT(*) AS n FROM alerts WHERE entity_id=? AND rule_id='crypto_price_missing_local'nr   rf   z%(py0)s == %(py3)scountrk   r   assert %(py5)srm   )rN   r   rz   r{   r}   r~   r   r   r   r   r   r   )rM   rH   r   r   r   @py_format4r   s          r    0test_changed_error_fingerprint_creates_new_alertr      s   &((ND(",#e44
 
 
 
 ",#e44
 
 
 
 LLv  zB  yD  E  E  N  N  P  P  QT  UE5A:5A55Ar"   c                 $   t                      \  } }t          | ddd|ddddid		  	         t          | t                      dd
d           |                     d|f                                          }t          |          }d}||k    }|st          j        d|fd||f          dt          j
                    v st          j        t                    rt          j        t                    nddt          j
                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         d         }d}	||	k    }|slt          j        d|fd||	f          t          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j        |                    d x}x}}	d S )NrR   rS   rT   rU   rV   r   r   rW   rX   i  r?   r   r   max_age_secondsonly_symbolzLSELECT status FROM alerts WHERE entity_id=? AND rule_id='crypto_price_stale're   rf   r   r   r   r   r   r   r   rp   rq   rr   rs   rv   rw   )rN   r   r
   r   rz   r   r   r}   r~   r   r   r   r   r   r   r   s              r    @test_refresh_auto_resolves_fixed_stale_alert_without_alert_floodr      sZ   &((ND("$e$,
 
 
 
 $5Z^lqrrrr<<fiqhstt}}Dt999>933tt978*
*
**********
*********
*****************************r"   c                   |dz  }|                      dt          |                     ddlm} |dz  dz  } ||          }t	          |           t          |ddd	d
          }t          |ddd          }t          |||t          d          ddd
           t          |ddd|ddddid	  	         t          ||t          ddt          d                               |                                 t          g d          }	|                                j        }
d}|	|k    }|st!          j        d |fd!|	|f          d"t%          j                    v st!          j        |	          rt!          j        |	          nd"t!          j        |          d#z  }d$d%|iz  }t-          t!          j        |                    d x}}d&}||
v }|st!          j        d'|fd(||
f          t!          j        |          d)t%          j                    v st!          j        |
          rt!          j        |
          nd)d*z  }d$d%|iz  }t-          t!          j        |                    d x}}d+}||
v }|st!          j        d'|fd(||
f          t!          j        |          d)t%          j                    v st!          j        |
          rt!          j        |
          nd)d*z  }d$d%|iz  }t-          t!          j        |                    d x}}d S ),NruntimeJARVIS_FINANCE_RUNTIME_DIRr   )connectdatazfinance.sqlite3z
CLI Walletr7   r8   r   r9   r>   r?   r@   rA   rD   rE   rF   rG   rR   rS   rT   rU   rV   r   r   rW   rX   r   ra   )zcheck-data-qualityz--scopecryptoz--resolve-fixedrf   r   rcr   r   rm   DATA_QUALITY_CHECK)in)z%(py1)s in %(py3)sout)rt   r   zresolved_alerts=1)setenvstrjarvis_finance.storage.databaser   r   r   r   r   r   r   r   r	   closer   
readouterrr   r}   r~   r   r   r   r   r   r   )monkeypatchtmp_pathcapsysr   r   dbrM   rI   rH   r   r   r   r   r   r   r   s                   r    0test_cli_check_data_quality_resolves_fixed_alertr      s   "G3S\\BBB777777	6	-	-B72;;DT %%4  I #49UYbcccH#& 4    "$e$,
 
 
 
 thjESZ[`SaSa6b6bccccJJLLL	LLL	M	MB





!CN27NNNNNNNNN2NNNNNNNNNNNN2NNNNN2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&3&&&&&&&&&&3&&&&&&&&&&&&&&&&3&&&&&3&&&&&&&&&&&&&&&&&&&&&&&&&&&%#%%%%%%%%%%#%%%%%%%%%%%%%%%%#%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%r"   c                 D   t                      \  } }t          | t                      ddd           t          | t                      ddd           |                     d|f                                          }t          |          }d}||k    }|st          j        d|fd||f          d	t          j	                    v st          j
        t
                    rt          j        t
                    nd	d
t          j	                    v st          j
        |          rt          j        |          nd
t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         d         }d}	||	k    }|slt          j        d|fd||	f          t          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j        |                    d x}x}}	|d         d         }d}	||	k    }|slt          j        d|fd||	f          t          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j        |                    d x}x}}	d S )Nr   r   r?   r   r   re   rf   r   r   r   r   r   r   rp   r   rr   rs   rv   rw   r   r   )>=)z%(py1)s >= %(py4)s)rN   r
   r0   rz   r   r   r}   r~   r   r   r   r   r   r   r   s              r    /test_failed_refresh_keeps_missing_alert_dedupedr      s   &((ND($):):U\]kpqqqq$):):U\]kpqqqq<<  A  DL  CN  O  O  X  X  Z  ZDt999>933tt978((((((((((((((((((((((((((((((((((((((((((((((((7%&+!+&!++++++++++&!+++++&++++!+++++++++++++++++++++++++++++r"   )rO   rP   )(
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter}   decimalr   jarvis_finance.crypto.assetsr   jarvis_finance.crypto.holdingsr   jarvis_finance.crypto.walletsr   jarvis_finance.cli.mainr   jarvis_finance.market.providersr	   r
   r   jarvis_finance.quality.alertsr   #jarvis_finance.quality.data_qualityr   r   r   !jarvis_finance.storage.migrationsr   r   r0   rN   r   r   r   r   r   r   r   r#   r"   r    <module>r      s   " " " " " "                     < < < < < < J J J J J J 7 7 7 7 7 7 ( ( ( ( ( ( a a a a a a a a a a 6 6 6 6 6 6 I I I I I I : : : : : : > > > > > >
 
 
 
 
 
 
 

 
 
 
 
 
 
 
  .   0% % % %*, , , ,D   :+ + + +*,& ,& ,& ,&^	, 	, 	, 	, 	, 	,r"   