
    mvj2                       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  G d d      Zd Zd Zh 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dZ'y)     )annotations)Decimal)create_crypto_asset)create_initial_holding_snapshot)create_wallet)data)load_synthetic_demo_data)page_12_crypto_manage)
PriceQuotestore_crypto_price)connect_memory)apply_migrationsc                  2    e Zd ZddddddZd	dZd Zd Zy)
FakeStreamlitN)inputs
checkboxesc                   g | _         | | _        i | _        |xs
 t               | _        |xs i | _        |xs
 t               | _        y N)callssidebarsession_statesetbutton_pressesr   r   )selfr   r   r   s       'tests/unit/test_dashboard_ux_sprint2.py__init__zFakeStreamlit.__init__   s@    NP
,5l$-    c                      fd}|S )Nc                    
j                   j                  	| |f       	dk(  r| rt        | d         nt        |j                  dd            }|
j                  v xr t        |j                  dd             }|rEt        |j                  d            r+ |d   |j                  dd	      i |j                  d
i        |S 	dk(  rw| rt        | d         nt        |j                  dd            }t        |j                  d|            }t        
j                  j                  ||
j                  v             S 	dk(  rt        |j                  dd            S 	dv r@t        |j                  d| r| d   nd            }|
j                  v r
j                  |   S y	dv rvt        |       dkD  r| d   n|j                  dg       }t        |j                  d| r| d   nd            }|
j                  v r
j                  |   S |rt        |      d   S d S 	dv r?| r| d   ng }t        |t              r|n
t        |      }t        |      D cg c]  }
 c}S 	dk(  r
S y c c}w )Nbuttonr   label disabledFon_clickargs kwargscheckboxkeytogglevalue>   	text_area
date_input
text_input>   pillsradio	selectbox   options>   tabscolumnsexpander)r   appendstrgetr   boolcallabler   r   lenlist
isinstanceintrange)r%   r'   r!   pressedr)   r3   valuescount_namer   s            r   recorderz+FakeStreamlit.__getattr__.<locals>.recorder   s?   JJtT623x(,DG#fjj"6M2N4#6#66btFJJz[`Da?b;bx

:(>?&F:&

62(>[&**XWYBZ[z!(,DG#fjj"6M2N&**UE23DKKOOC$//1IJKKxFJJw677@@&**UtDGDE$++%;;s++66%(Y]$q'

9b8Q&**UtDGDE$++%;;s+++2tG}Q'<<**$(ab",VS"9s6{&+El333z! 4s   	I*r&   )r   rE   rF   s   `` r   __getattr__zFakeStreamlit.__getattr__   s    	@ r   c                    | S r   r&   )r   s    r   	__enter__zFakeStreamlit.__enter__<   s    r   c                     y)NFr&   )r   r%   s     r   __exit__zFakeStreamlit.__exit__?   s    r   r   )r   set[str] | Noner   zdict[str, object] | Noner   rL   returnNone)rE   r8   )__name__
__module____qualname__r   rG   rI   rK   r&   r   r   r   r      s&    .ei  JN .!Fr   r   c                 F    t               } t        |        t        |        | S r   )r   r   r	   conns    r   setup_demo_connrU   C   s    DTT"Kr   c                    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   J   sA   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#D3"wWZ|q{  Oe  lA  B#D3"wWcOd  {B  Uk  rF  GtcJwW`Oal}  Si  2j  ktcIugV`Nal}  Si  2j  kKr   >   rule_idrk   	dedup_key	entity_id	source_idrl   
account_idfingerprinthedge_statusinstrument_idprovider_symbol_statusc                 6   t               } t        j                  |       }|sJ t        j                  |d         }t	        |      dk  sJ t
        j                  |      sJ |d   d   j                  d      sJ dt        j                  t        d            v sJ t        j                  d      dk(  sJ t        j                  d	      d
k(  sJ t        j                  |       }|g k(  st
        j                  |d         sJ t        d |D              sJ y )Nr      kurs_chfzCHF 'z12345.67missing_market_pricezPreis fehltfreshAktuellc              3  8   K   | ]  }t        |      d k    yw)r   N)r<   .0rows     r   	<genexpr>zUtest_user_mode_crypto_and_portfolio_tables_are_clean_and_formatted.<locals>.<genexpr>u   s     2s3x1}2s   )ry   dashboard_dataget_crypto_coin_summaryvisible_user_columnsr<   TECHNICAL_FIELDS
isdisjoint
startswithchf_textr   translate_statusget_portfolio_positions_userall)rT   crypto_rowsvisible_crypto	portfolios       r   Btest_user_mode_crypto_and_portfolio_tables_are_clean_and_formattedr   g   s   )+D 88>K;#88QHN~!###&&~666q>*%00888.))'**=>>>>**+ABmSSS**73y@@@;;DAI?.99)A,GGG2	2222r   c                 6   t               } t        j                  |       }t        j                  |       }|D cg c]  }|d   	 c}d d ddgk(  sJ |d   d   dk(  sJ |D ch c]  }|d   	 c}dd	hk(  sJ t	        d
 ||z   D              sJ y c c}w c c}w )Nr!      r`   rf   r   	value_chfz10000.00rW   r]   c              3  0   K   | ]  }d |vxr d|v  yw)rk   rl   Nr&   r   s     r   r   zUtest_chart_data_for_crypto_coin_and_wallet_distribution_is_correct.<locals>.<genexpr>   s"     eCz$?C)??es   )ry   r    get_crypto_coin_allocation_chart"get_crypto_wallet_allocation_chartr   )rT   
coin_chartwallet_chartr   s       r   Btest_chart_data_for_crypto_coin_and_wallet_distribution_is_correctr   x   s    )+D@@FJ!DDTJL$./SCL/3
I7NNNNa=%333$01SCL1oGW5XXXXe:XdKdeeee 01s   B#Bc                 b   t               } t        d t        j                  |       D              }t        j                  | |d   d      }|d   dk(  sJ |d   dk(  sJ |d	   d
k(  sJ t        |d         dk(  sJ h dt        |d         k  sJ t        j                  |      sJ t        j                  |d   d         sJ t        j                  |       d   }t        j                  | |d         }|d   sJ |d   sJ h dt        |d         k  sJ t        j                  |      sJ y )Nc              3  2   K   | ]  }|d    dk(  s|  yw)rd   ra   Nr&   r   s     r   r   zPtest_coin_detail_and_wallet_detail_are_selectable_read_models.<locals>.<genexpr>   s     escRZm_dNdses   	_asset_idiɚ;)price_max_age_secondscoinr`   gesamtwert_chfzCHF 10'000.00preisstatusr   walletsr   >      Bestand hinzufügenBestand auf 0 setzenAudit / Verlauf anzeigenTransferBestand korrigierenactionsr   
_wallet_idrY   coins>      Coin in Wallet hinzufügenWallet bearbeitenTransfer aus WalletWallet deaktivierenWallet verifizierenr   )ry   nextr   r   get_crypto_coin_detailr<   r   r   r   get_wallet_user_overviewget_wallet_detail)rT   rw   detailwalletwallet_details        r   =test_coin_detail_and_wallet_detail_are_selectable_read_modelsr      s   )+D
enDDTJe
eC224[9IajkF&>Z'''"#666- I---vi !Q&&&y  ~A  BH  IR  BS  ~T  T  T  T&&v...&&vi'8';<<<44T:1=F"44T6,;OPM'''!!! [  _b  cp  qz  c{  _|  |  |  |&&}555r   c                 ,   t               } t        j                  | d      }t        j                  |       }h dt	        |      k  sJ |sJ h dt	        |d         k  sJ t
        j                  |d         sJ |d   d   j                  d      rJ y )N   )limit>   infowichtigkritisch>   titler   affectedseveritydescriptionr   r   missing_)rU   r   get_alert_cardsget_alert_summary_cardsr   r   r   r   )rT   cardssummarys      r   8test_alert_cards_are_readable_and_do_not_expose_rule_idsr      s    D**4q9E44T:G*c'l:::L5F#eTUh-WWW&&uQx000Qx ++J7777r   c                 l   t               } t               }t        j                  ||        |j                  D cg c]  \  }}}|dk(  s|s|d    }}}}|j                  D cg c]  \  }}}|dk(  s|s|d    }}}}h dt        |      k  sJ t        |      dk  sJ y c c}}}w c c}}}w )Nr    r   r.   >      Coin hinzufügenNeues WalletVerlauf ansehenTransfer zwischen Wallets Bestand entfernen / auf 0 setzenr      )ry   r   r
   renderr   r   r<   )rT   strE   r%   _kwargsbuttonstext_inputss          r   @test_crypto_manage_renders_action_cards_not_all_forms_by_defaultr      s    )+D	B  T*24((XX.4wdh>NSWtAwXGX68hh``2tT7$,BV[_47`K` [  _b  cj  _k  k  k  k{q    Y`s#   B(
B(B((B/7B/:B/c                     t               } dt        j                  | d      d   v sJ dt        j                  | d      d   v sJ y )Nrk   T)
admin_moder   rl   )ry   r   r   r   rS   s    r   1test_admin_mode_can_still_access_technical_fieldsr      sN    )+D??QUVWXYYYY.AA$SWXYZ[[[[r   c                `    | j                   D cg c]  \  }}}||k(  s| c}}}S c c}}}w r   )r   )r   rE   	call_namer%   r   s        r   
_call_argsr      s+    13OO-YgY$=NDOOOs   ))c            	        ddl m}  t               }t               }| j	                  ||       dj                  d |j                  D              }d|v sJ d|v sJ d|v sJ d|v sJ d	|v sJ d
|v sJ t        |d      D cg c]  }|st        |d   t              s|d     }}|sJ |D cg c]  }|D ]  }t        |t              s|  }}}|sJ |D 	ch c]  }|D ]  }	|	  }
}}	t        j                  |
      sJ h d|
k  sJ t        |d      D cg c]
  }|s|d    }}d|v sJ d
|v sJ t        d |D              sJ y c c}w c c}}w c c}	}w c c}w )Nr   )page_03_equities_etfs
c              3  H   K   | ]  \  }}}|D ]  }t        |         y wr   r8   r   _namer%   r   args        r   r   zVtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<genexpr>   '     T#75$tTc#hThT    "zGesamtwert CHFzCash CHFz
Ohne Preisu   Position aus Liste öffnenDetailpanelu   Position hinzufügen	dataframe>   Marktwert CHFStatusAssettypr    zBewertung aktualisierenc              3  P   K   | ]  }t        |      j                  d          yw)u   Öffnen:N)r8   r   )r   r!   s     r   r   zVtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<genexpr>   s     FUs5z$$Z0Fs   $&)jarvis_finance.dashboard.pagesr   rU   r   r   joinr   r   r>   r=   dictr   r   any)r   rT   r   textsr%   table_payloadspayloadr   flattened_rowsr)   visible_keysr   s               r   Ctest_user_mode_portfolio_page_groups_cash_equities_etfs_without_idsr      s   DD	B  T*IIT288TTEu$$$5   '5000E!!!!U****4R*El$R\]abc]dfjRkd1glNl>)7dg7dCjY\^bNccdcdNd>#1ACSAcCACALA&&|4442lBBB#-b(#;D4ttAwDGD$///!W,,,FgFFFF mdA Es0   E	EE/E
EEE %E c                     t               } t        j                  |       }h dt        |      k  sJ t        j                  |d         dk\  sJ t        j                  |d         dk\  sJ t        |d         dk\  sJ y )N>   etf_total_chfcash_total_chfstock_total_chfcrypto_total_chfmissing_fx_countmissing_price_countequity_price_data_as_ofunvalued_position_countr  r   r  r  )rU   r   get_command_center_summaryr   dr?   )rT   r   s     r   Itest_command_center_summary_has_separate_asset_totals_and_unvalued_countsr     s    D77=G	 
W	 	 	 G$456!;;;G$678A===w,-.!333r   c                     ddl m}  t               }t               }| j	                  ||       dj                  d |j                  D              }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|vsJ y )Nr   )page_00_command_centerr   c              3  H   K   | ]  \  }}}|D ]  }t        |         y wr   r   r   s        r   r   z]test_command_center_renders_clear_price_update_labels_without_internal_ids.<locals>.<genexpr>   r   r   zGesamtportfolio CHFz
Aktien CHFzETFs CHFzUnbewertete PositionenzTop 5 Crypto-Positionenrk   r   )r   r  rU   r   r   r   r   )r  rT   r   r   s       r   Jtest_command_center_renders_clear_price_update_labels_without_internal_idsr     s    ED	B!!"d+IIT288TTE E)))5   #u,,,$---U"""%'''r   c                     ddl m}  d| j                  v sJ d| j                  v sJ d| j                  vsJ | j                  d   dk(  sJ y )Nr   main	Portfoliou   Portfolio ÜbersichtzEquities/ETFs)jarvis_finance.dashboardr  USER_PAGE_TITLESADMIN_PAGE_TITLESTITLE_ALIASESr  s    r   Jtest_user_mode_navigation_uses_new_portfolio_page_and_admin_keeps_overviewr     sZ    -$/////!T%;%;;;;!)>)>>>>o.+===r   c                    ddl m}  t               }|j                  d       |j	                          t               }| j                  ||       dj                  d |j                  D              }d|v sJ d|vsJ d|vsJ t        |d	      D cg c]  }|st        |d   t              s|d     }}|sJ d|d   D ch c]  }|D ]  }|  c}}vsJ y c c}w c c}}w )
Nr   )page_08_reportsaE  
        INSERT INTO reports(report_id, report_type, title, file_path, format, generated_at, data_quality_status, created_at)
        VALUES ('report-demo', 'crypto_inventory', 'Demo Report', '/home/agent/jarvis_runtime/finance-system/reports/demo.html', 'html', '2026-02-01T00:00:00Z', 'ok', '2026-02-01T00:00:00Z')
        r   c              3  H   K   | ]  \  }}}|D ]  }t        |         y wr   r   r   s        r   r   zBtest_reports_user_mode_hides_runtime_file_paths.<locals>.<genexpr>  r   r   zRuntime-Reports-Ordner	file_pathz/home/agent/jarvis_runtimer   )r   r  rU   executecommitr   r   r   r   r   r>   r=   )r  rT   r   r   r%   r   r   r)   s           r   /test_reports_user_mode_hides_runtime_file_pathsr     s    >DLL	 	KKM	B2t$IIT288TTE#u,,,e###'u444*4R*El$R\]abc]dfjRkd1glNl>nQ.?Os3OCsOsOOOO mOs   CC,CCN)rM   rN   )r   r   rE   r8   rM   zlist[tuple[object, ...]])(
__future__r   decimalr   jarvis_finance.crypto.assetsr   jarvis_finance.crypto.holdingsr   jarvis_finance.crypto.walletsr   r  r   r   "jarvis_finance.dashboard.demo_datar	   r   r
   jarvis_finance.market.providersr   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   rU   ry   r   r   r   r   r   r   r   r   r   r  r  r  r  r&   r   r   <module>r)     s    "  < J 7 ; G @ J : >0 0f 3"f6(8!\PG:4$(">Pr   