
    pj                         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mZ d dlmZmZmZ d dlmZ d dlmZ  G d	 d
          Zd ZddZddZddZdS )    )annotationsN)Decimal)create_crypto_asset)
PriceQuoterefresh_crypto_prices)create_alert
mute_alertresolve_alert)connect_memory)apply_migrationsc                      e Zd Zd Zd
ddZd	S )MockProviderc                <    t          |          | _        d| _        d S )Nr   )listquotescalls)selfr   s     W/home/agent/.hermes/worktrees/FinanceManager-sprint20d/tests/unit/test_market_alerts.py__init__zMockProvider.__init__   s    6ll


    CHFcoingecko_idstrcurrencyreturnr   c                V    | xj         dz  c_         | j                            d          S )N   r   )r   r   pop)r   r   r   s      r   get_crypto_pricezMockProvider.get_crypto_price   s%    

a

{q!!!r   N)r   )r   r   r   r   r   r   )__name__
__module____qualname__r   r    r   r   r   r      s<          " " " " " " "r   r   c                 @    t                      } t          |            | S )N)r   r   )cs    r   connr&      s    A*1---axr   r   Nonec            	     	   t                      } t          | ddd          }t          t          ddt	          d          d          g          }t          | |d	          }|sed
ddt          j                    v st          j	        |          rt          j
        |          ndiz  }t          t          j        |                    |                     d|f                                          }|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}||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}||k    }|slt          j        d|fd||f          t          j
        |          t          j
        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}}t          | |dd          }|j        }g }||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}}|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}}|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 S )#NzSynthetic BitcoinBTCbitcoin	coin_namesymbolr   r   z12345.00000001
1700000000)provider_timestamp)providerr   zassert %(py0)spy0idszOSELECT price, typeof(price), quality_status FROM crypto_prices WHERE asset_id=?price==z%(py1)s == %(py4)spy1py4assert %(py6)spy6ztypeof(price)textquality_statusfreshi  r0   r   max_age_seconds)z9%(py2)s
{%(py2)s = %(py0)s.written_price_ids
} == %(py5)scached)r1   py2py5zassert %(py7)spy7r   )z4%(py2)s
{%(py2)s = %(py0)s.cached_count
} == %(py5)s)z-%(py2)s
{%(py2)s = %(py0)s.calls
} == %(py5)sr0   )r&   r   r   r   r   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationexecutefetchone_call_reprcomparewritten_price_idscached_countr   )r%   assetr0   r2   @py_format1row@py_assert0@py_assert3@py_assert2@py_format5@py_format7rA   @py_assert1@py_assert4@py_format6@py_format8s                   r   =test_refresh_crypto_prices_stores_decimal_text_and_uses_cacher]      s   A+A9LUZirsssZ	%@P8Q8QeqrrrsttH
Hu
E
E
ECJJJJJJJJJJJJ3JJJJJ3JJJJJJJJJJJJJJJJ
))ehmgo
p
p
y
y
{
{Cw<+++<+++++++++++<++++++<++++++++++++++++++++++++++++++++)6)6))))))))))6)))))))))6))))))))))))))))))))))))))) +G+ G++++++++++ G+++++ ++++G+++++++++++++++++++++++++++"1x%Y]^^^F#)r)#r))))))))))#r))))))))))))6)))))6))))))#))))r)))))))))))))))))))))))))))#!#!##########!############6#####6##########!###########################>Q>Q>Q88>Qr   c                    t                      } t          | dd          }t          | ddd          }t          t          ddd d	d
          g          }t	          | |dd           t	          | t          t          ddd d	d
          g          dd           |                     d|f                                          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|f                                          }	|	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}||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 )NzSynthetic MysteryMYS)r,   r-   zSynthetic EtherETHethereumr+   r   missingzno price)r=   error_messager   r?   zUSELECT COUNT(*) AS c FROM alerts WHERE rule_id='missing_coingecko_id' AND entity_id=?r%   r   r4   r6   r7   r:   r;   zsSELECT COUNT(*) AS c, MAX(occurrence_count) AS occ FROM alerts WHERE rule_id='crypto_price_missing' AND entity_id=?occ   )>=)z%(py1)s >= %(py4)s)r&   r   r   r   r   rL   rM   rG   rN   rI   rJ   rK   )
r%   rb   rQ   r0   rT   rU   rV   rW   rX   rS   s
             r   Ltest_refresh_crypto_prices_warns_missing_coingecko_and_missing_price_dedupesrg   (   s   A-a;NW\]]]->u[efffEZ
5YeopppqrrH!hPQRRRR!lJz%PTdm  }G  5H  5H  5H  4I  'J  'J  UZ  lm  n  n  n  n99lovnxyy  C  C  E  E  FI  J  O  NO  O  J  NO  O  O  O  O  O  O  O  O  O  O  J  NO  O  O  O  O  O  J  O  O  O  O  NO  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O
))  J  MR  LT  U  U  ^  ^  `  `Cs8q8q=8q8qu::?::r   c                    t                      } t          | ddddddddd	
          }t          | ddddddddd	
          }||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          nddt	          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d }t          | |           d}d}d}d}	d}
d}ddd	}t          | ||||	|
||
          }||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        |          t          j        |          t          j        |	          t          j        |
          t          j        |          t          j        |          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}x}x}x}	x}
x}x}x}}t          | |d           d}d}d}d}	d}
d}ddd	}t          | ||||	|
||
          }||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        |          t          j        |          t          j        |	          t          j        |
          t          j        |          t          j        |          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}x}x}x}	x}
x}x}x}}t          | ddddddddd	
          }||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          nddt	          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d }d S )Nkritischfxtransactiont1
missing_fxz
missing fxUSDz
2026-01-01)r   date)prioritycategoryentity_type	entity_idrule_idmessageevidencer4   )z%(py0)s == %(py2)sa1a2)r1   rB   zassert %(py4)sr9   )z%(py17)s
{%(py17)s = %(py0)s(%(py1)s, priority=%(py3)s, category=%(py5)s, entity_type=%(py7)s, entity_id=%(py9)s, rule_id=%(py11)s, message=%(py13)s, evidence=%(py15)s)
} == %(py19)sr   r%   )r1   r8   py3rC   rD   py9py11py13py15py17py19zassert %(py21)spy21z2099-01-01T00:00:00Z)muted_untilEUR)!=)z%(py0)s != %(py2)sa3)r&   r   rG   rN   rE   rF   rH   rI   rJ   rK   r
   r	   )r%   rw   rx   rY   @py_format3rW   rV   rZ   @py_assert6@py_assert8@py_assert10@py_assert12@py_assert14@py_assert16@py_assert18@py_format20@py_format22r   s                     r   Jtest_alert_lifecycle_dedupes_resolved_and_muted_but_allows_new_fingerprintr   4   sg
   A	a*tbfp|  GS  jo  wC  ^D  ^D  
E  
E  
EB	a*tbfp|  GS  jo  wC  ^D  ^D  
E  
E  
EB8OOOOOOOOO2OOOOOOOOOOOO2OOOOO2OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!R$.  M  M=  Mdh  Mr~  M  IU  M  lq  yE  `F  `F  M<J=dhr~  IU  `F  G  G  G  M  G  KM  M  M  M  M  M  M  M  M  M  M  G  KM  M  M  M  M  M  M  M  M  M  M  M  M<  M  M  M  M  M<  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  MJ  M  M  M  M  M  M  M  M=  M  M  M  Mdh  M  M  M  Mr~  M  M  M  M  IU  M  M  M  M  `F  M  M  M  M  G  M  M  M  M  M  M  M  M  M  M  M  KM  M  M  M  M  M  KM  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  Mq""89999$.  M  M=  Mdh  Mr~  M  IU  M  lq  yE  `F  `F  M<J=dhr~  IU  `F  G  G  G  M  G  KM  M  M  M  M  M  M  M  M  M  M  G  KM  M  M  M  M  M  M  M  M  M  M  M  M<  M  M  M  M  M<  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  MJ  M  M  M  M  M  M  M  M=  M  M  M  Mdh  M  M  M  Mr~  M  M  M  M  IU  M  M  M  M  `F  M  M  M  M  G  M  M  M  M  M  M  M  M  M  M  M  KM  M  M  M  M  M  KM  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M  M	a*tbfp|  GS  jo  wC  ^D  ^D  
E  
E  
EB8OOOOOOOOO2OOOOOOOOOOOO2OOOOO2OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOr   )r   r'   )
__future__r   builtinsrE   _pytest.assertion.rewrite	assertionrewriterG   decimalr   jarvis_finance.crypto.assetsr   jarvis_finance.market.providersr   r   jarvis_finance.quality.alertsr   r	   r
   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r&   r]   rg   r   r#   r   r   <module>r      s-   " " " " " "                     < < < < < < M M M M M M M M Q Q Q Q Q Q Q Q Q Q : : : : : : > > > > > >" " " " " " " "8 8 8   	 	 	 	
 
 
 
 
 
r   