
    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'd#S )&    )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                  4    e Zd Zdddddd
ZddZd Zd ZdS )FakeStreamlitN)inputs
checkboxesbutton_pressesset[str] | Noner   dict[str, object] | Noner   returnNonec                   g | _         | | _        i | _        |pt                      | _        |pi | _        |pt                      | _        d S N)callssidebarsession_statesetr   r   r   )selfr   r   r   s       'tests/unit/test_dashboard_ux_sprint2.py__init__zFakeStreamlit.__init__   sH    NP
,5l$-    namestrc                      fd}|S )Nc                    	j                             | |f           dk    r| rt          | d                   n"t          |                    dd                    }|	j        v o#t          |                    dd                     }|rXt          |                    d                    r6 |d         |                    dd	          i |                    d
i            |S dk    r| rt          | d                   n"t          |                    dd                    }t          |                    d|                    }t          	j                            ||	j        v                     S dk    r#t          |                    dd                    S dv rEt          |                    d| r| d         nd                    }|	j        v r	j        |         S dS dv rt          |           dk    r| d         n|                    dg           }t          |                    d| r| d         nd                    }|	j        v r	j        |         S |rt          |          d         nd S dv rM| r| d         ng }t          |t                    r|nt          |          }	fdt          |          D             S dk    r	S d S )Nbuttonr   label disabledFon_clickargs kwargscheckboxkeytogglevalue>   	text_area
date_input
text_input>   pillsradio	selectbox   options>   tabscolumnsc                    g | ]}S r,   r,   ).0_r   s     r   
<listcomp>z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>6   s    333333r!   expander)r   appendr#   getr   boolcallabler   r   lenlist
isinstanceintrange)
r+   r-   r'   pressedr/   r9   valuescountr"   r   s
           r   recorderz+FakeStreamlit.__getattr__.<locals>.recorder   s   JtT62333x(,NDG#fjj"6M6M2N2N4#66btFJJz[`DaDa?b?b;b \x

:(>(>?? \&F:&

62(>(>[&**XWYBZBZ[[[z!!(,NDG#fjj"6M6M2N2N&**UE2233DKOOC$/1IJJKKKxFJJw66777@@@&**Ut,CDGGDDEE$+%%;s++r666%(YY]]$q''

9b8Q8Q&**Ut,CDGGDDEE$+%%;s+++2<tG}}Q''<***$(0ab",VS"9"9Js6{{3333eEll3333z!!4r!   r,   )r   r"   rM   s   `` r   __getattr__zFakeStreamlit.__getattr__   s*    	 	 	 	 	 	@ r!   c                    | S r   r,   )r   s    r   	__enter__zFakeStreamlit.__enter__<   s    r!   c                    dS )NFr,   )r   r+   s     r   __exit__zFakeStreamlit.__exit__?   s    ur!   r   )r   r   r   r   r   r   r   r   )r"   r#   )__name__
__module____qualname__r    rN   rP   rR   r,   r!   r   r   r      st        .ei  JN . . . . . .! ! ! !F      r!   r   c                 ^    t                      } t          |            t          |            | S r   )r   r   r	   conns    r   setup_demo_connrY   C   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)ro   quotez40000.00)r   r   r   r   r   r   r   r   )rX   w1w2ethbtcs        r   setup_multi_wallet_crypto_connr}   J   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!   >   rule_idro   	dedup_key	entity_id	source_idrp   
account_idfingerprinthedge_statusinstrument_idprovider_symbol_statusr   r   c                    t                      } t          j        |           }|sJ t          j        |d                   }t	          |          dk    sJ t
                              |          sJ |d         d                             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
                              |d                   sJ t          d |D                       sJ d S )Nr      kurs_chfzCHF 'z12345.67missing_market_pricezPreis fehltfreshAktuellc              3  <   K   | ]}t          |          d k    V  dS )r   N)rE   r=   rows     r   	<genexpr>zUtest_user_mode_crypto_and_portfolio_tables_are_clean_and_formatted.<locals>.<genexpr>u   s,      22s3xx1}222222r!   )r}   dashboard_dataget_crypto_coin_summaryvisible_user_columnsrE   TECHNICAL_FIELDS
isdisjoint
startswithchf_textr   translate_statusget_portfolio_positions_userall)rX   crypto_rowsvisible_crypto	portfolios       r   Btest_user_mode_crypto_and_portfolio_tables_are_clean_and_formattedr   g   sM   )++D 8>>K;#8QHHN~!####&&~66666q>*%0088888.)'**=*=>>>>>>*+ABBmSSSS*733y@@@@;DAAI??.99)A,GG??G22	2222222222r!   c                 6   t                      } t          j        |           }t          j        |           }d |D             d d         ddgk    sJ |d         d         dk    sJ d |D             d	d
hk    sJ t	          d ||z   D                       sJ d S )Nc                    g | ]
}|d          S r'   r,   r   s     r   r?   zVtest_chart_data_for_crypto_coin_and_wallet_distribution_is_correct.<locals>.<listcomp>|   s    ///SCL///r!      rd   rj   r   	value_chfz10000.00c                    h | ]
}|d          S r   r,   r   s     r   	<setcomp>zUtest_chart_data_for_crypto_coin_and_wallet_distribution_is_correct.<locals>.<setcomp>~   s    111SCL111r!   r[   ra   c              3  &   K   | ]}d |vod|vV  dS )ro   rp   Nr,   r   s     r   r   zUtest_chart_data_for_crypto_coin_and_wallet_distribution_is_correct.<locals>.<genexpr>   s1      eeCz$?C)?eeeeeer!   )r}   r    get_crypto_coin_allocation_chart"get_crypto_wallet_allocation_chartr   )rX   
coin_chartwallet_charts      r   Btest_chart_data_for_crypto_coin_and_wallet_distribution_is_correctr   x   s    )++D@FFJ!DTJJL//J///3
I7NNNNNa=%333311L111oGW5XXXXXee:XdKdeeeeeeeeeer!   c                    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                              |          sJ t                              |d         d                   sJ t          j	        |           d         }t          j
        | |d                   }|d         sJ |d         sJ h dt          |d                   k    sJ t                              |          sJ d S )Nc              3  2   K   | ]}|d          dk    |V  dS )rh   re   Nr,   r   s     r   r   zPtest_coin_detail_and_wallet_detail_are_selectable_read_models.<locals>.<genexpr>   s2      eescRZm_dNdNdsNdNdNdNdeer!   	_asset_idiɚ;)price_max_age_secondscoinrd   gesamtwert_chfzCHF 10'000.00preisstatusr   walletsr   >      Bestand hinzufügenBestand auf 0 setzenAudit / Verlauf anzeigenTransferBestand korrigierenactionsr   
_wallet_idr]   coins>      Coin in Wallet hinzufügenWallet bearbeitenTransfer aus WalletWallet deaktivierenWallet verifizierenr   )r}   nextr   r   get_crypto_coin_detailrE   r   r   r   get_wallet_user_overviewget_wallet_detail)rX   r{   detailwalletwallet_details        r   =test_coin_detail_and_wallet_detail_are_selectable_read_modelsr      s   )++D
eenDTJJeee
e
eC24[9IajkkkF&>Z''''"#6666- I----vi !!Q&&&&yyy  ~A  BH  IR  BS  ~T  ~T  T  T  T  T&&v.....&&vi'8';<<<<<4T::1=F"4T6,;OPPM''''!!!! [  [  [  _b  cp  qz  c{  _|  _|  |  |  |  |&&}5555555r!   c                 p   t                      } t          j        | d          }t          j        |           }h dt	          |          k    sJ |sJ h dt	          |d                   k    sJ t
                              |d                   sJ |d         d                             d          rJ d S )N   )limit>   infowichtigkritisch>   titler   affectedseveritydescriptionr   r   missing_)rY   r   get_alert_cardsget_alert_summary_cardsr   r   r   r   )rX   cardssummarys      r   8test_alert_cards_are_readable_and_do_not_expose_rule_idsr      s    D*4q999E4T::G***c'll::::LL5FFF#eTUh--WWWW&&uQx00000Qx ++J7777777r!   c                    t                      } t                      }t          j        ||            d |j        D             }d |j        D             }h dt          |          k    sJ t          |          dk    sJ d S )Nc                6    g | ]\  }}}|d k    ||d         S )r&   r   r,   r=   r"   r+   _kwargss       r   r?   zTtest_crypto_manage_renders_action_cards_not_all_forms_by_default.<locals>.<listcomp>   s3    XXX.4wdh>N>NSW>NtAw>N>N>Nr!   c                6    g | ]\  }}}|d k    ||d         S )r4   r   r,   r   s       r   r?   zTtest_crypto_manage_renders_action_cards_not_all_forms_by_default.<locals>.<listcomp>   s3    ```2tT7$,BVBV[_BV47BVBVBVr!   >      Coin hinzufügenNeues WalletVerlauf ansehenTransfer zwischen Wallets Bestand entfernen / auf 0 setzenr      )r}   r   r
   renderr   r   rE   )rX   stbuttonstext_inputss       r   @test_crypto_manage_renders_action_cards_not_all_forms_by_defaultr      s    )++D	B T***XX"(XXXG``bh```K [  [  [  _b  cj  _k  _k  k  k  k  k{q      r!   c                     t                      } dt          j        | d          d         v sJ dt          j        | d          d         v sJ d S )Nro   T)
admin_moder   rp   )r}   r   r   r   rW   s    r   1test_admin_mode_can_still_access_technical_fieldsr      sc    )++D?QUVVVWXYYYYY.A$SWXXXYZ[[[[[[[r!   r   r"   r#   list[tuple[object, ...]]c                *    fd| j         D             S )Nc                (    g | ]\  }}}|k    |S r,   r,   )r=   	call_namer+   r   r"   s       r   r?   z_call_args.<locals>.<listcomp>   s*    OOO-YgY$=N=ND=N=N=Nr!   )r   )r   r"   s    `r   
_call_argsr      s    OOOOOOOOr!   c                 H   ddl m}  t                      }t                      }|                     ||           d                    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 t          |d          D             }|sJ d |D             }|sJ d |D             }t          	                    |          sJ h d|k    sJ d t          |d          D             }d|v sJ d
|v sJ t          d |D                       sJ d S )Nr   )page_03_equities_etfs
c              3  F   K   | ]\  }}}|D ]}t          |          V  d S r   r#   r=   _namer+   r   args        r   r   zVtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<genexpr>   <      TT#75$tTTc#hhTTTTTTTr!   zGesamtwert CHFzCash CHFz
Ohne Preisu   Position aus Liste öffnenDetailpanelu   Position hinzufügenc                X    g | ]'}|t          |d          t                    |d          (S r   rG   rF   r=   r+   s     r   r?   zWtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<listcomp>   9    lll$lR\]abc]dfjRkRkld1glllr!   	dataframec                F    g | ]}|D ]}t          |t                    |S r,   )rG   dict)r=   payloadr   s      r   r?   zWtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<listcomp>   s6    dddg7ddCjY\^bNcNcdcddddr!   c                    h | ]	}|D ]}|
S r,   r,   r=   r   r/   s      r   r   zVtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<setcomp>   s%    AAACSAAcCAAAAr!   >   Marktwert CHFStatusAssettypc                "    g | ]}||d          S r   r,   r   s     r   r?   zWtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<listcomp>   s!    DDD4tDtAwDDDr!   r&   zBewertung aktualisierenc              3  Z   K   | ]&}t          |                              d           V  'dS )u   Öffnen:N)r#   r   )r=   r'   s     r   r   zVtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<genexpr>   s6      FFUs5zz$$Z00FFFFFFr!   )jarvis_finance.dashboard.pagesr   rY   r   r   joinr   r   r   r   any)r   rX   r   textstable_payloadsflattened_rowsvisible_keysr   s           r   Ctest_user_mode_portfolio_page_groups_cash_equities_etfs_without_idsr     s   DDDDDDD	B  T***IITT28TTTTTEu$$$$5    '50000E!!!!!U****ll*R*E*ElllN>dddddN>AA>AAAL&&|44444222lBBBBDD:b(#;#;DDDG$////!W,,,,FFgFFFFFFFFFFr!   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 d S )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  )rY   r   get_command_center_summaryr   drH   )rX   r   s     r   Itest_command_center_summary_has_separate_asset_totals_and_unvalued_countsr     s    D7==G	 	 	 
W	 	 	 	 G$4566!;;;;G$6788A====w,-..!333333r!   c                    ddl m}  t                      }t                      }|                     ||           d                    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 d S )Nr   )page_00_command_centerr   c              3  F   K   | ]\  }}}|D ]}t          |          V  d S 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-Positionenro   r   )r  r!  rY   r   r   r  r   )r!  rX   r   r  s       r   Jtest_command_center_renders_clear_price_update_labels_without_internal_idsr#     s    EEEEEED	B!!"d+++IITT28TTTTTE E))))5    #u,,,,$----U""""%''''''r!   c                 z    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 d S )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,     so    ------$/////!T%;;;;;!)>>>>>o.+======r!   c                    ddl m}  t                      }|                    d           |                                 t                      }|                     ||           d                    d |j        D                       }d|v sJ d|vsJ d|vsJ d	 t          |d
          D             }|sJ dd |d         D             vsJ d S )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  F   K   | ]\  }}}|D ]}t          |          V  d S 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_runtimec                X    g | ]'}|t          |d          t                    |d          (S r   r   r   s     r   r?   zCtest_reports_user_mode_hides_runtime_file_paths.<locals>.<listcomp>  r   r!   r  c                    h | ]	}|D ]}|
S r,   r,   r  s      r   r   zBtest_reports_user_mode_hides_runtime_file_paths.<locals>.<setcomp>  s%    OOOs3OOCsOOOOr!   )
r  r.  rY   executecommitr   r   r  r   r   )r.  rX   r   r  r  s        r   /test_reports_user_mode_hides_runtime_file_pathsr5     s   >>>>>>DLL	   	KKMMM	B2t$$$IITT28TTTTTE#u,,,,e####'u4444ll*R*E*ElllN>OOnQ.?OOOOOOOOOr!   N)r   r   )r   r   r"   r#   r   r   )(
__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   rY   r}   r   r   r   r   r   r   r   r   r  r  r#  r,  r5  r,   r!   r   <module>r?     s:   " " " " " "       < < < < < < J J J J J J 7 7 7 7 7 7 ; ; ; ; ; ; G G G G G G @ @ @ @ @ @ J J J J J J J J : : : : : : > > > > > >0 0 0 0 0 0 0 0f       3 3 3 3"f f f f6 6 6 6(8 8 8 8! ! ! !\ \ \ \P P P PG G G G:4 4 4 4$( ( ( ("> > > >P P P P P Pr!   