
    aj;$                        d dl mZ d dlmZ d dlZd dlmZmZ d dlm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZ d dlm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dZddZddZddZ dS )    )annotations)DecimalN)calculate_crypto_holdingscreate_initial_holding_snapshot) CRYPTO_MANUAL_REVIEW_COIN_LABELSadd_crypto_positionadjust_crypto_positionget_crypto_management_optionsreduce_crypto_positiontransfer_crypto_positioncreate_wallet)connect_memory)apply_migrationsc                 @    t                      } t          |            | S )N)r   r   conns     tests/unit/test_crypto_manage.py
setup_connr      s     DTK    returnstrc                &    t          | dd          S )NzSynthetic Review WalletzSoftware Walletwallet_namewallet_typer   r   s    r   seed_walletr      s    +DRcddddr   c                &    t          | dd          S )NzSynthetic Target WalletExchanger   r   r   s    r   seed_second_walletr       s    +DR\]]]]r   actionintc                `    |                      d|f                                          d         S )Nz2SELECT COUNT(*) AS c FROM audit_log WHERE action=?c)executefetchone)r   r!   s     r   audit_countr'   #   s+    <<LviXXaaccdghhr   Nonec                    t                      } t          |           }t          | ddd|ddddd	
  
        }|                     d
|j        f                                          }|                     d|j        f                                          }|d         dk    sJ |d         dk    sJ |d         dk    sJ t          | d          dk    sJ |j        g k    sJ d S )NzSynthetic CardanoADAcardano
0.00000001
2025-12-31initial_snapshot_additionzsynthetic confirmed additionT		coin_namesymbolcoingecko_id	wallet_idquantity_texteffective_dateoperation_typenoteconfirmz7SELECT * FROM crypto_holdings WHERE crypto_holding_id=?z,SELECT * FROM crypto_assets WHERE asset_id=?quantitylegacy_snapshot_dater2   initial_crypto_holding_snapshot   )	r   r   r   r%   
holding_idr&   asset_idr'   warnings)r   r3   resultholdingassets        r   Btest_add_initial_snapshot_addition_creates_asset_holding_and_auditrC   '   s   <<DD!!I %"#2+  F llTW]WhVjkkttvvGLLG&/I[\\eeggE:,....)*l:::: I----t>??1DDDD?b      r   c                 h   t                      } t          |           }t          | ddd |dddddd	          }|                     d
|j        f                                          d         }|dk    sJ |                     d                                          d         dk    sJ d|j        v sJ d S )NzSynthetic MysteryMYSTr,   r-   r.   z$synthetic uncertain mapping acceptedmissing_confirmedT)
r0   r1   r2   r3   r4   r5   r6   r7   coingecko_statusr8   z>SELECT quantity FROM crypto_holdings WHERE crypto_holding_id=?r9   zESELECT COUNT(*) AS c FROM alerts WHERE rule_id='missing_coingecko_id'r$   r<   missing_coingecko_id)r   r   r   r%   r=   r&   r?   )r   r3   r@   storeds       r   Mtest_add_coin_without_coingecko_id_creates_warning_and_preserves_decimal_textrJ   A   s    <<DD!!I %"#23,  F \\Z]c]n\pqqzz||  ~H  IF\!!!!<<_``iikkloptuuuuu!V_444444r   c                 F   t                      } t          |           }t          | ddd|ddddd	
  
        }t          j        t
          d
          5  t          | |j        |dddd           d d d            n# 1 swxY w Y   t          | |j        |dddd          j        }t          |           }|j
        ||j        f         j        t          d          k    sJ |                     d|f                                          }d|d         v sJ d|d         v sJ d S )NzSynthetic BitcoinBTCbitcoinz1.25r-   r.   synthetic initialTr/   r7   matchz1.30z
2026-01-15 r>   r3   new_quantity_textr5   r7   r8   zsynthetic correction noteznSELECT old_values_json, new_values_json FROM audit_log WHERE entity_id=? AND action='crypto_manual_adjustment'z"quantity": "1.25"old_values_jsonz"quantity": "1.30"new_values_json)r   r   r   pytestraises
ValueErrorr	   r>   transaction_idr   wallet_holdingsr9   r   r%   r&   )r   r3   addedtxidholdingsaudits         r   ?test_manual_adjustment_requires_note_and_records_old_new_valuesr_   Y   s   <<DD!!I%#2   E 
z	0	0	0 	
 	
^$'	
 	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 " #(    	 )..H#Y$?@IWU[__\\\\LL  J  MQ  LS  T  T  ]  ]  _  _E5):#;;;;;5):#;;;;;;;s   A::A>A>c                 .   t                      } t          |           }t          | ddd|ddddd	
  
        }t          | |j        |dd
dd           |                     d|j        |f                                          d         dk    sJ t          |           j        ||j        f         j	        t          d          k    sJ t          j        t          d          5  t          | |j        |dd
dd           d d d            d S # 1 swxY w Y   d S )NSynthetic EtherETHethereum2r-   r.   rN   Tr/   z
2026-02-01zsynthetic remove via adjustment)r>   r3   reduction_quantity_textr5   r7   r8   zJSELECT COUNT(*) AS c FROM crypto_holdings WHERE asset_id=? AND wallet_id=?r$   r<   0negativerO   r,   zsynthetic over reduce)r   r   r   r   r>   r%   r&   r   rZ   r9   r   rV   rW   rX   )r   r3   r[   s      r   Ltest_reduce_to_zero_preserves_holding_row_without_delete_and_blocks_negativerh      s   <<DD!!I##2   E  ##.    <<dglgu  xA  gB  C  C  L  L  N  N  OR  S  WX  X  X  X  X$T**:Iu~;VW`dklodpdppppp	z	4	4	4 	
 	
^$0'(	
 	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
s   !D

DDc                    t                      } t          |           }t          |           }t          | ddd|ddddd	
  
        }t	          | |j        ||d
dddd	  	        }t          |           }|j        ||j        f         j        t          d          k    sJ |j        ||j        f         j        t          d
          k    sJ |j
        sJ t          | d          dk    sJ d S )Nra   rb   rc   4r-   r.   rN   Tr/   z1.5z0.1z
2026-03-01zsynthetic transfer)r>   from_wallet_idto_wallet_idr4   fee_quantity_textr5   r7   r8   z2.4crypto_transferr<   )r   r   r    r   r   r>   r   rZ   r9   r   rY   r'   )r   sourcetargetr[   r@   r]   s         r   :test_transfer_between_wallets_via_manage_helper_is_auditedrq      sD   <<DF%%F0A%^htz  KN  _k  |W  ^q  {  @  @  @E%dU^TZio  @E  Y^  o{  BV  `d  e  e  eF(..H#VU^$<=F'RW..XXXX#VU^$<=F'RW..XXXX    t.//1444444r   c                    t                      } t          |           }t          j        t          d          5  t          | dd|ddddd	
	  	         d d d            n# 1 swxY w Y   t          j        t          d          5  t          | dddddddd	
	  	         d d d            n# 1 swxY w Y   t          j        t          d          5  t          | dd|ddddd	
	  	         d d d            n# 1 swxY w Y   t          j        t          d          5  t          | dd|ddddd
	  	         d d d            d S # 1 swxY w Y   d S )Nr9   rO   zSynthetic BadBADrf   r-   r.   	syntheticT)r0   r1   r3   r4   r5   r6   r7   r8   walletrQ   1r1   r8   F)r   r   rV   rW   rX   r   )r   r3   s     r   Btest_validations_reject_bad_amounts_wallets_and_unconfirmed_writesrw      s"   <<DD!!I	z	4	4	4 \ \DOEU^nq  CO  `{  BM  W[  	\  	\  	\  	\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \	z	2	2	2 U UDOEUWgj  |H  Yt  {F  PT  	U  	U  	U  	UU U U U U U U U U U U U U U U	z	2	2	2 Y YDOBR[kn  @L  ]x  J  TX  	Y  	Y  	Y  	YY Y Y Y Y Y Y Y Y Y Y Y Y Y Y	z	3	3	3 ] ]DOEU^nq  CO  `{  BM  W\  	]  	]  	]  	]] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]sG   AA"%A"B))B-0B-C44C8;C8E  EEc                     t                      } t          |           }dt          v sJ d|d         v sJ |d         g k    sJ d S )NzADA CardanozUSTC Terra Classicmanual_review_coin_labelswallets)r   r
   r   )r   optionss     r   9test_crypto_management_options_include_manual_review_listr|      s]    <<D+D11G<<<<<7+F#GGGGG9######r   c                 v   t                      } t          |           }t          | ddd|ddddd	
  
        j        }t	          | ||d
ddd           t          |           j        ||f         j        t          d
          k    sJ | 	                    d          
                                d         dk    sJ d S )NzSynthetic SolanaSOLsolanarv   r-   r.   rN   Tr/   z
1.00000001z
2026-01-01zsynthetic tiny correctionrR   zKSELECT COUNT(*) AS c FROM audit_log WHERE action='crypto_manual_adjustment'r$   r<   )r   r   r   r>   r	   r   rZ   r9   r   r%   r&   )r   r3   rB   s      r   Ftest_manual_adjustment_transaction_type_is_used_by_holding_calculationr      s    <<DD!!I$#2     
 4%9Xd  vB  Id  nr  s  s  s  s$T**:Iu;MNW[bco[p[ppppp<<effooqqruvz{{{{{{{r   )r   r   )r!   r   r   r"   )r   r(   )!
__future__r   decimalr   rV   jarvis_finance.crypto.holdingsr   r   jarvis_finance.crypto.manager   r   r	   r
   r   r   jarvis_finance.crypto.walletsr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   r    r'   rC   rJ   r_   rh   rq   rw   r|   r    r   r   <module>r      s   " " " " " "        e e e e e e e e                8 7 7 7 7 7 : : : : : : > > > > > >  e e e e^ ^ ^ ^i i i i! ! ! !45 5 5 50)< )< )< )<X&
 &
 &
 &
R5 5 5 5] ] ] ]$ $ $ $| | | | | |r   