
    YajH                        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 d dlmZ d d	lmZ d d
lmZ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S )    )annotations)Decimal)Path)RuntimePaths)Settings)create_crypto_asset)create_initial_holding_snapshot)create_wallet)load_synthetic_demo_data)build_crypto_report_contextexport_crypto_inventory_report)connect_memory)apply_migrationsc                 ^    t                      } t          |            t          |            | S N)r   r   r   )conns     tests/unit/test_crypto_report.pysetup_demo_connr      s.    DTT"""K    returnNonec                    t                      } t          |           }|d         dk    sJ |d         dk    sJ |d         d         dk    sJ |d         d         dk    sJ t          d	 |d
         D                       }|d         dk    sJ |d         dk    sJ |d         dk    sJ |d         d         dk    sJ t          d |d         D                       }|d         dk    sJ d S )Ntitleu3   JARVIS Finance System – Crypto-Bestandsübersichtbase_currencyCHFsummary
coin_count   wallet_countc              3  2   K   | ]}|d          dk    |V  dS symbolDBTCN .0rows     r   	<genexpr>z\test_crypto_report_context_from_synthetic_db_aggregates_coins_and_wallets.<locals>.<genexpr>$   0      JJs#h-62I2Is2I2I2I2IJJr   coinstotal_quantity0.0999	price_chfz40000.00	value_chf	3996.0000total_value_chfz	7746.0000c              3  2   K   | ]}|d          dk    |V  dS )wallet_namezKraken DemoNr$   r%   s     r   r(   z\test_crypto_report_context_from_synthetic_db_aggregates_coins_and_wallets.<locals>.<genexpr>)   s1      [[#s=7I]7Z7Z#7Z7Z7Z7Z[[r   wallets)r   r   next)r   contextbtckrakens       r   Itest_crypto_report_context_from_synthetic_db_aggregates_coins_and_walletsr8      s:   D)$//G7TTTTT?#u,,,,9l+q00009n-2222
JJgg.JJJ
J
JC H,,,,{z)))){{****9/0K????[[!3[[[[[F,1$$$$$$r   c                 t   t                      } |                     dd           |                                  t          |           }t	          d |d         D                       }|d         dk    sJ |d         dk    sJ |d	         d
         dk    sJ t          d |d         D                       sJ d S )NzcUPDATE crypto_holdings SET legacy_snapshot_value_chf=?, legacy_snapshot_currency=? WHERE quantity=?)999999999.99r   z0.10c              3  2   K   | ]}|d          dk    |V  dS r!   r$   r%   s     r   r(   zgtest_crypto_report_context_preserves_decimal_text_and_ignores_legacy_snapshot_values.<locals>.<genexpr>7   r)   r   r*   r+   r,   r.   r/   r   r0   r:   c              3  .   K   | ]}|d          dk    V  dS )codelegacy_snapshot_value_ignoredNr$   )r&   ws     r   r(   zgtest_crypto_report_context_preserves_decimal_text_and_ignores_legacy_snapshot_values.<locals>.<genexpr>;   s,      ffqy;;ffffffr   data_quality_warnings)r   executecommitr   r4   any)r   r5   r6   s      r   Ttest_crypto_report_context_preserves_decimal_text_and_ignores_legacy_snapshot_valuesrD   -   s    DLLm'   	KKMMM)$//G
JJgg.JJJ
J
JC H,,,,{{****9/0NBBBBffWMdEeffffffffffr   c            	        t                      } |                     d                                          d         }t          | ddd           }t	          | ||t          d          ddd	
           t          |           }t          d |d         D                       }|d         dk    sJ d |d         D             }d|v sJ d|v sJ d S )Nz,SELECT wallet_id FROM crypto_wallets LIMIT 1	wallet_idzDemo MissingDMX)	coin_namer"   coingecko_idz12.34567890123456789verifiedz2026-01-31T12:00:00Zzsynthetic missing price)asset_idrF   quantityverification_statuslast_verified_atnotec              3  2   K   | ]}|d          dk    |V  dS )r"   rG   Nr$   r%   s     r   r(   z^test_crypto_report_context_warns_for_missing_price_and_missing_coingecko_id.<locals>.<genexpr>N   s0      IIs#h-52H2Hs2H2H2H2HIIr   r*   r+   c                    h | ]
}|d          S r=   r$   r&   warnings     r   	<setcomp>z^test_crypto_report_context_warns_for_missing_price_and_missing_coingecko_id.<locals>.<setcomp>P       MMMWV_MMMr   r@   missing_coingecko_idmissing_price)r   rA   fetchoner   r	   r   r   r4   )r   rF   rK   r5   dmxcodess         r   Ktest_crypto_report_context_warns_for_missing_price_and_missing_coingecko_idr\   >   s   DKLLUUWWXcdI"4>%^bcccH#/00&/&    *$//G
IIgg.III
I
IC $:::::MMG4K,LMMME!U****e######r   c                 V   t                      } |                     d                                          d         }t          | dddd           }|                     d||f           |                                  t          |           }d |d	         D             }d
|v sJ d|v sJ d S )Nz6SELECT asset_id FROM crypto_assets WHERE symbol='DETH'rK   zUnverified Demo WalletzSoftware Wallet	Synthetic)r2   wallet_typeplatform_providerrN   a5  
        INSERT INTO crypto_holdings(
            crypto_holding_id, asset_id, wallet_id, quantity, acquisition_source,
            verification_status, notes, created_at
        ) VALUES ('negative-demo', ?, ?, '-0.25', 'initial_snapshot', 'unverified', 'synthetic negative', '2026-01-31T00:00:00Z')
        c                    h | ]
}|d          S rR   r$   rS   s     r   rU   z^test_crypto_report_context_warns_for_unverified_wallet_and_negative_holding.<locals>.<setcomp>l   rV   r   r@   unverified_walletnegative_holding)r   rA   rY   r
   rB   r   )r   rK   rF   r5   r[   s        r   Ktest_crypto_report_context_warns_for_unverified_wallet_and_negative_holdingrd   U   s    D||TUU^^``aklH,%%  I 	LL	 
9   	KKMMM)$//GMMG4K,LMMME%''''&&&&&&r   tmp_pathr   c                   t                      }t          j        | dz            }t          |          }t	          ||dd           }t          |d                   }|                                sJ |j        dk    sJ |j        |j	        v sJ t          |d                   
                                                    t          j                    
                                          rJ |                    d                                          }|J |d	         d
k    sJ |d         t          |          k    sJ |                    d                                          }|J d S )Nruntimeruntime_pathspdfc                    dS )NFr$   )htmlpaths     r   <lambda>zTtest_crypto_report_export_writes_runtime_report_metadata_and_audit.<locals>.<lambda>v   s    y~ r   settingspreferred_formatrenderer	file_path.htmlz:SELECT * FROM reports WHERE report_type='crypto_inventory'formatrl   z7SELECT * FROM audit_log WHERE action='report_generated')r   r   	from_baser   r   r   existssuffixreports_dirparentsresolveis_relative_tocwdrA   rY   str)re   r   rg   rp   resultoutput_pathreportaudits           r   Btest_crypto_report_export_writes_runtime_report_metadata_and_auditr   q   su   D$X	%9::Gg...H+D8V[f~f~Fvk*++K((((+"55555F;'((0022AA$(**BTBTBVBVWWWWW\\VWW``bbF(v%%%%+#k"2"22222LLRSS\\^^Er   c                   t                      }t          j        | dz            }t          |          }t	          ||dd           }t          |d                   }|                                sJ |j        dv sJ |d         dv sJ |d	         sJ t          d
 |j	        
                    d          D                       sJ d S )Nrg   rh   rj   ro   rs   >   .mdrt   ru   >   rl   markdownwarningsc              3     K   | ]=}|                     t          j                                                               V  >d S r   )r|   r   r}   r{   )r&   ps     r   r(   z\test_crypto_report_export_markdown_fallback_when_pdf_renderer_unavailable.<locals>.<genexpr>   sE      aaa1##DHJJ$6$6$8$8999aaaaaar   *)r   r   rv   r   r   r   rw   rx   allry   glob)re   r   rg   rp   r   r   s         r   Itest_crypto_report_export_markdown_fallback_when_pdf_renderer_unavailabler      s    D$X	%9::Gg...H+D8V[fjkkkFvk*++K!11111(33333*aa7CVC[C[\_C`C`aaaaaaaaaar   N)r   r   )re   r   r   r   ) 
__future__r   decimalr   pathlibr   jarvis_finance.config.pathsr   jarvis_finance.config.settingsr   jarvis_finance.crypto.assetsr   jarvis_finance.crypto.holdingsr	   jarvis_finance.crypto.walletsr
   "jarvis_finance.dashboard.demo_datar   'jarvis_finance.reports.crypto_inventoryr   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r8   rD   r\   rd   r   r   r$   r   r   <module>r      s   " " " " " "             4 4 4 4 4 4 3 3 3 3 3 3 < < < < < < J J J J J J 7 7 7 7 7 7 G G G G G G        ; : : : : : > > > > > >  % % % %$g g g g"$ $ $ $.' ' ' '8   (b b b b b br   