
    Mfj$                    D   d dl mZ d dlmZ d dlmZ d dl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mZ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 d dl m!Z!m"Z" d dl#m$Z$  G d d          Z%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#dZ/d#dZ0d%d"Z1dS )&    )annotations)Decimal)PathN)load_settings)data)load_synthetic_demo_data)	page_00_command_centerpage_01_portfoliopage_04_cryptopage_05_walletspage_06_ledgerpage_09_alertspage_10_auditpage_11_settings_data_qualitypage_12_crypto_manage)connect_memory)create_crypto_asset)create_initial_holding_snapshot)create_wallet)
PriceQuotestore_crypto_price)apply_migrationsc                  *    e Zd Zd
dZddZd Zd Zd	S )FakeStreamlitreturnNonec                "    g | _         | | _        d S N)callssidebarselfs     tests/unit/test_dashboard_mvp.py__init__zFakeStreamlit.__init__   s    NP
    namestrc                      fd}|S )Nc                    j                             | |f           dv rdS dv rdS dv rJt          |           dk    r| d         n|                    dg           }|rt	          |          d         nd S d	k    rfd
| r| d         ng D             S dk    rS dk    rJ| r| d         nd}t          |t                    rfdt          |          D             S fd|D             S d S )N>   buttoncheckboxF>   	text_area
date_input
text_input >   radio	selectbox   optionsr   tabsc                    g | ]}S  r6   .0_r"   s     r#   
<listcomp>z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>.   s    @@@@@@r%   expandercolumnsc                    g | ]}S r6   r6   r7   s     r#   r:   z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>4   s    777QD777r%   c                    g | ]}S r6   r6   r7   s     r#   r:   z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>5   s    ,,,,,,r%   )r   appendlengetlist
isinstanceintrange)argskwargsr3   countr&   r"   s       r#   recorderz+FakeStreamlit.__getattr__.<locals>.recorder$   s@   JtT62333---u@@@r---%(YY]]$q''

9b8Q8Q+2<tG}}Q''<v~~@@@@$'>tAwwB@@@@z!!y  #'.QQeS)) 87777%,,7777,,,,e,,,,4r%   r6   )r"   r&   rI   s   `` r#   __getattr__zFakeStreamlit.__getattr__#   s)    	 	 	 	 	 	& r%   c                    | S r   r6   r!   s    r#   	__enter__zFakeStreamlit.__enter__9   s    r%   c                    dS )NFr6   )r"   rF   s     r#   __exit__zFakeStreamlit.__exit__<   s    ur%   Nr   r   )r&   r'   )__name__
__module____qualname__r$   rJ   rL   rN   r6   r%   r#   r   r      sZ              ,      r%   r   c                 ^    t                      } t          |            t          |            | S r   )r   r   r   )conns    r#   setup_demo_connrU   @   s.    DTT"""Kr%   c                 r   t                      } t          |            t          | dddd          }t          | dddd	          }t          | d
dd          }t          | ddd          }t	          | ||t          d          ddd           t	          | ||t          d          dd	d           t	          | ||t          d          ddd           t          | |t          ddt          d          dd                     t          | |t          ddt          d          dd                     | S ) NMetaMask DemozSoftware WalletMetaMaskz2026-01-31T10:00:00Z)wallet_namewallet_typeplatform_providerlast_verified_atSwissBorg DemoExchange	SwissBorgz2026-01-31T11:00:00ZEthereumETHethereum)	coin_namesymbolcoingecko_idBitcoinBTCbitcoin2verifiedzsynthetic eth split)asset_id	wallet_idquantityverification_statusr\   notez
0.00000001stalez2026-01-01T00:00:00Zzsynthetic btc tinyCHFz2500.00zsynthetic-cachez2026-02-01T00:00:00Z)providerprovider_timestamp)rk   quotez40000.00)r   r   r   r   r   r   r   r   )rT   w1w2ethbtcs        r#   setup_multi_wallet_crypto_connry   H   s   DT	tFWku  I_  
`  
`  
`B	t)9zep  DZ  
[  
[  
[B
djU_
`
`
`C
diT]
^
^
^C#D3"wWZ||q{  Oe  lA  B  B  B  B#D3"wWZ||q{  Oe  lA  B  B  B  B#D3"wWcOdOd  {B  Uk  rF  G  G  G  GtcJwW`OaOal}  Si  2j  2j  2j  k  k  k  ktcIugV`NaNal}  Si  2j  2j  2j  k  k  k  kKr%   r   r   c                 4   t                      } t          j        |           }|d         dk    sJ |d         dk    sJ |d         dk    sJ t          |d                   t          d          t          d          z   k    sJ t          j        |           }t          d	 |D                       }|d
         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         sJ h dt          |          z  rJ d S )N
coin_countri   wallets_with_holdingsholding_count3total_value_chfz10000.00z0.0004c              3  2   K   | ]}|d          dk    |V  dS rd   ra   Nr6   r8   rows     r#   	<genexpr>zPtest_crypto_summary_cards_and_coin_aggregation_across_wallets.<locals>.<genexpr>_   s0      ==sc(mu&<&<s&<&<&<&<==r%   coinr`   gesamtmenge4walletskurs_chfzCHF 2'500.00gesamtwert_chfzCHF 10'000.00anteil>   rk   	dedup_keyrl   candidate_countprovider_symbol_status)ry   dashboard_dataget_crypto_summary_cardsr   get_crypto_coin_summarynextset)rT   summaryrowsrw   s       r#   =test_crypto_summary_cards_and_coin_aggregation_across_walletsr   W   sc   )++D5d;;G< C''''*+s2222?#s****7,-..'*2E2EPXHYHY2YYYYY1$77D
==d===
=
=Cv;*$$$$}$$$$y>S    z?n,,,, O3333x==cccfijmfnfnnooooor%   c                    t                      } t          d t          j        |           D                       }t          j        | |d                   }d |D             ddgk    sJ d |D             dhk    sJ t          d |D                       sJ t          d	 |D                       sJ h d
t          |d                   z  rJ t          j        |           }|d         dk    sJ t          |d                   t          d          k    sJ t          j	        |           }|d         d         sJ d|d         v sJ d|d         v sJ d|d         vsJ d S )Nc              3  2   K   | ]}|d          dk    |V  dS r   r6   r   s     r#   r   zRtest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<genexpr>k   s4      ii3RUV^R_chRhRh3RhRhRhRhiir%   	_asset_idc                    g | ]
}|d          S )walletr6   r   s     r#   r:   zStest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<listcomp>m   s    ,,,cCM,,,r%   rW   r]   c                    h | ]
}|d          S )menger6   r   s     r#   	<setcomp>zRtest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<setcomp>n   s    +++SCL+++r%   ri   c              3  .   K   | ]}|d          dk    V  dS )wert_chfzCHF 5'000.00Nr6   r   s     r#   r   zRtest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<genexpr>o   s+      CCSs:.0CCCCCCr%   c              3  .   K   | ]}|d          dk    V  dS )r   z50.00%Nr6   r   s     r#   r   zRtest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<genexpr>p   s+      ;;Ss8}(;;;;;;r%   >   rk   raw_jsonr   rl   r   wallet_countr   10000rY   r{   rl   )
ry   r   r   r   get_crypto_coin_wallet_detailsallr   get_wallet_overview_cardsr   get_wallet_user_overview)rT   eth_rowdetailr   wallet_rowss        r#   ?test_coin_wallet_drilldown_and_wallet_summary_are_user_friendlyr   i   s   )++Dii."H"N"NiiiiiG:4AUVVF,,V,,,BR0SSSSS++F+++u4444CCFCCCCCCCC;;F;;;;;;;;BBBSPQ^^STTT6t<<G>"c))))7,-..''2B2BBBBB 9$??Kq>-((((A....;q>))))k!n,,,,,,r%   c                     t                      } t          j        | d          }t          j        | d          }d|d         vsJ d|d         v sJ d|d         v sJ d|d         v sJ d S )NF)
admin_modeTrk   r   r   re   )ry   r   r   )rT   	user_rows
admin_rowss      r#   Btest_user_mode_hides_technical_fields_and_admin_mode_can_show_themr   |   s    )++D6tNNNI7NNNJYq\)))))A,&&&&A&&&&Z]******r%   c                     t                      } t          j        |           }d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ d S )Ntotal_portfolio_chfcrypto_total_chfequity_etf_total_chfcash_total_chfcritical_alert_countlast_price_update_at)ry   r   get_command_center_summaryrT   r   s     r#   9test_command_center_summary_includes_user_overview_fieldsr      s    )++D7==G G++++((((!W,,,,w&&&&!W,,,,!W,,,,,,r%   c            	         t                      } t                      }t          t          t          t
          t          t          t          t          t          f	D ]}|                    ||            t          d |j        D                       sJ d S )Nc              3  *   K   | ]}|d          dv V  dS )r   >   titleheader	subheaderNr6   )r8   calls     r#   r   zFtest_dashboard_modules_import_and_page_render_smoke.<locals>.<genexpr>   s,      PPttAw::PPPPPPr%   )rU   r   r	   r
   r   r   r   r   r   r   r   renderanyr   )rT   stmodules      r#   3test_dashboard_modules_import_and_page_render_smoker      s    D	B%
     	b$PPrxPPPPPPPPPPr%   c                    t                      } t          j        |           }|d         dk    sJ t          |d                   t          d          k    sJ t          |d                   t          d          k    sJ t          j        |           sJ t          j        |           sJ t          j        |           sJ d S )Nbase_currencyrq   r   0r   )rU   r   r   r   get_platform_overviewget_ledger_transactionsget_audit_eventsr   s     r#   :test_dashboard_reader_functions_return_expected_dummy_datar      s    D7==G?#u,,,,7+,--<<<<7-.//'#,,>>>>/555551$77777*40000000r%   monkeypatchpytest.MonkeyPatchc                    d }|                      d|           t                      }t                      }t          j        ||           t          j        |          }|sJ t          d |D                       sJ d S )Nc                      t          d          )Nz8dashboard must not call CoinGecko/API provider on render)AssertionError)rF   rG   s     r#   explodezOtest_crypto_dashboard_reads_cached_db_prices_without_api_calls.<locals>.explode   s    WXXXr%   z@jarvis_finance.market.providers.CoinGeckoClient.get_crypto_pricec              3  &   K   | ]}|d          V  dS )latest_price_chfNr6   r   s     r#   r   zQtest_crypto_dashboard_reads_cached_db_prices_without_api_calls.<locals>.<genexpr>   s(      773s%&777777r%   )setattrrU   r   r   r   r   get_crypto_overviewr   )r   r   rT   r   r   s        r#   >test_crypto_dashboard_reads_cached_db_prices_without_api_callsr      s    Y Y Y Z\cdddD	B"d###-d33DKK477$7777777777r%   c                     t                      } t          j        |           }d |D             }d|v sJ |D ] }d|d                                         vsJ !d S )Nc                    h | ]
}|d          S )rm   r6   r   s     r#   r   zJtest_dashboard_preserves_decimal_crypto_quantity_format.<locals>.<setcomp>   s    999c#j/999r%   z0.0899Erm   )rU   r   get_crypto_by_walletupper)rT   r   
quantitiesr   s       r#   7test_dashboard_preserves_decimal_crypto_quantity_formatr      s~    D 5d;;K99[999Jz!!!! 2 2#j///11111112 2r%   c                     t                      } t          j        |           }|sJ h dt          |d                   k    sJ d S )N>   statuspriorityr   fingerprintlast_seen_atoccurrence_countr   )rU   r   
get_alertsr   )rT   alertss     r#   )test_alert_lifecycle_data_loaded_readablyr      sS    D&t,,FMM6aaaehiopqiresesssssssr%   tmp_pathr   c           	        | dz  }|                                  |dz                      d           t          j        t          d          5  t          |dt          |dz            i           d d d            d S # 1 swxY w Y   d S )	Nrepozpyproject.tomlz[project]
name='demo'
z!Runtime directory must be outside)matchJARVIS_FINANCE_RUNTIME_DIRruntime)	repo_rootenviron)mkdir
write_textpytestraises
ValueErrorr   r'   )r   r   s     r#   7test_dashboard_runtime_path_inside_repo_remains_blockedr      s    fDJJLLL	(()CDDD	z)L	M	M	M e e/KSQUXaQaMbMb.cdddde e e e e e e e e e e e e e e e e es   $A>>BBrO   )r   r   r   r   )r   r   r   r   )2
__future__r   decimalr   pathlibr   r   jarvis_finance.config.settingsr   jarvis_finance.dashboardr   r   "jarvis_finance.dashboard.demo_datar   jarvis_finance.dashboard.pagesr	   r
   r   r   r   r   r   r   r   jarvis_finance.storage.databaser   jarvis_finance.crypto.assetsr   jarvis_finance.crypto.holdingsr   jarvis_finance.crypto.walletsr   jarvis_finance.market.providersr   r   !jarvis_finance.storage.migrationsr   r   rU   ry   r   r   r   r   r   r   r   r   r   r   r6   r%   r#   <module>r     s   " " " " " "              8 8 8 8 8 8 ; ; ; ; ; ; G G G G G G
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ; : : : : : < < < < < < J J J J J J 7 7 7 7 7 7 J J J J J J J J > > > > > >       D    p p p p$- - - -&+ + + +- - - -Q Q Q Q$1 1 1 1
8 
8 
8 
82 2 2 2t t t te e e e e er%   