
    aj                        d dl mZ d dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZmZ d dl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mZ  G d de          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)data)page_03_equities_etfspage_09_alerts)get_admin_navigation_titlesget_user_navigation_titles) apply_review_test_equity_cleanup%identify_review_test_equity_artifacts) add_manual_position_from_catalogcreate_manual_catalog_entryensure_standard_broker_accounts)connect_memory)apply_migrations)setup_equity_conn)FakeStreamlitsetup_multi_wallet_crypto_connc                  ,     e Zd Zd fdZd fdZ xZS )	DuplicateKeyGuardStreamlitreturnNonec                `     t                      j        |i | t                      | _        d S N)super__init__setseen_button_keys)selfargskwargs	__class__s      /tests/unit/test_dashboard_real_ui_acceptance.pyr   z#DuplicateKeyGuardStreamlit.__init__   s1    $)&)))*-%%    namestrc                ^     t                                                     fd}|S )Nc                     dk    ra|                     d          }|rJt          |          j        vsJ d|             j                            t          |                      | i |S )Nbuttonkeyz duplicate Streamlit button key: )getr$   r   add)r   r   r(   baser#   r   s      r!   recorderz8DuplicateKeyGuardStreamlit.__getattr__.<locals>.recorder   s    xjj'' 8s884+@@@@BjehBjBj@@@)--c#hh7774((((r"   )r   __getattr__)r   r#   r,   r+   r    s   `` @r!   r-   z&DuplicateKeyGuardStreamlit.__getattr__   sG    ww""4((	) 	) 	) 	) 	) 	) 	) r"   r   r   )r#   r$   )__name__
__module____qualname__r   r-   __classcell__)r    s   @r!   r   r      s[        0 0 0 0 0 0         r"   r   str   r   r$   c                    g }| j         D ]V\  }}}|                    d |D                        |                    d |                                D                        Wd                    |          S )Nc              3  4   K   | ]}t          |          V  d S r   r$   ).0args     r!   	<genexpr>z _visible_text.<locals>.<genexpr>$   s(      ..#SXX......r"   c              3  4   K   | ]}t          |          V  d S r   r6   )r7   values     r!   r9   z _visible_text.<locals>.<genexpr>%   s(      ==ESZZ======r"   
)callsextendvaluesjoin)r3   parts_namer   r   s        r!   _visible_textrC   !   s~    E!x > >tV........==V]]__=======99Ur"   r   c                     t                      } t                      }| g dk    sJ d| vsJ d| vsJ d|v sJ d|v sJ d S )N)zCommand Center	PortfolioCryptoWallets   Position hinzufügenReportszManual Review QueuezEquity/ETF ManageAlerts)r   r   )useradmins     r!   :test_user_navigation_is_short_and_admin_keeps_review_toolsrM   )   sz    %''D'))Ejjjjjjj ,,,,d**** E))))ur"   c                 R   t                      } t          |            t          d          D ] }|                     dd| d| f           !|                                  t                      }t          j        ||            ddh|j        k    sJ dt          |          vsJ d S )N   aM  
            INSERT INTO alerts(alert_id, priority, status, category, entity_type, entity_id, rule_id, message, occurrence_count, last_seen_at, created_at)
            VALUES (?, 'warnung', 'active', 'test', 'instrument', ?, 'missing_market_price', 'synthetic message', 1, '2026-01-01T00:00:00Z', '2026-01-01T00:00:00Z')
            zalert-zinstrument-u   alert_alert-0_prüfenu   alert_alert-1_prüfenz(Admin: technische Alert-Tabelle anzeigen)
r   r   rangeexecutecommitr   r   renderr   rC   )connidxr3   s      r!   Jtest_alert_page_uses_unique_button_keys_and_hides_admin_table_in_user_moderV   4   s    DTQxx 
 
 c^^03001	
 	
 	
 	
 	KKMMM	#	%	%B"d####%<=ATTTTT5]2=N=NNNNNNNr"   c                    t                      \  } }}t          | ||dddddddd	           t          | d
dddddddd
  
        }t          | ||ddddddd
  
        }|                     d|j        f           |                                  t          |           }t          |j                  dk    sJ |j	        dk    sJ t          | |d          }|sJ |                     d                                          d         }|                     d                                          d         }|dk    sJ |dk    sJ d S )Ninitial_snapshot1
2026-01-15USD100missingzreal manual dashboard positionT
catalog_entry_id
account_idposition_typequantity_text
trade_datecurrencycost_basis_original_text	fx_statusnoteconfirmstockzDOCX Review Test AGCHFCH0000000009DOCXTSIXmanualzdocx review synthetic artifact)	asset_classr#   rd   isintickerexchangeproviderprovider_symbolrg   550)	r_   r`   ra   rb   rc   rd   re   rg   rh   zUPDATE transactions SET source_type='broker_import_reviewed_snapshot', notes='docx review synthetic artifact' WHERE transaction_id=?   ztest cleanup)planrg   zgSELECT COUNT(*) AS c FROM transactions WHERE source_type='manual_dashboard' AND COALESCE(is_voided,0)=0czvSELECT COUNT(*) AS c FROM transactions WHERE source_type='broker_import_reviewed_snapshot' AND COALESCE(is_voided,0)=1)r   r   r   rQ   transaction_idrR   r
   lentransaction_idsmanual_position_countr	   fetchone)	rT   r`   manual_catalog_idreview_catalog_idreview_resultrx   audit_idactive_manualvoided_reviews	            r!   Dtest_review_docx_equity_cleanup_preserves_manual_dashboard_positionsr   H   s   *;*=*='D*'$*(!&-    4"-   5*(!%-  M 	LL 	O		%'   	KKMMM066Dt#$$))))%****/4nUUUHOO8LL  "K  L  L  U  U  W  W  X[  \MLL  "Z  [  [  d  d  f  f  gj  kMAAr"   c                     t                      \  } }}t          | ||dddddddd	           t          d
dd          }t          j        ||            t          |          }dD ]}||v sJ 	d|vsJ d|vsJ d S )NrX   2rZ   r[   r\   r]   zsynthetic equity interactionTr^   zAlle Positionenu
   Name A–Z)portfolio_viewportfolio_sort_by)inputs)zGesamtwert CHFu   Position aus Liste öffnenDetailpanelKorrigierenzVerlauf anzeigenrH   instrument_idr`   )r   r   r   r   rS   rC   )rT   r`   
catalog_idr3   textexpecteds         r!   Ftest_equity_page_renders_user_summary_selection_actions_and_no_raw_idsr      s    #4#6#6 D*j$#(!&+    
1BYeff	g	g	gB T***D O    4$&&&&t######r"   c                 p   t                      } t          d t          j        |           D                       }t          j        | |d         d          }|d         dk    sJ d|vsJ d|vsJ d	d
lm} t                      }|                    ||            t          |          }d|v sJ d|v sJ d S )Nc              3  2   K   | ]}|d          dk    |V  dS )symbolETHN )r7   rows     r!   r9   zUtest_crypto_detail_contains_minimal_coingecko_link_without_raw_ids.<locals>.<genexpr>   s2      eescRZm_dNdNdsNdNdNdNdeer"   	_asset_idiɚ;)price_max_age_secondscoingecko_linkz+https://www.coingecko.com/en/coins/ethereumcoingecko_idasset_idr   )page_04_cryptou   CoinGecko öffnen)
r   nextdashboard_dataget_crypto_coin_summaryget_crypto_coin_detailjarvis_finance.dashboard.viewsr   r   rS   rC   )rT   ethdetailr   r3   r   s         r!   Btest_crypto_detail_contains_minimal_coingecko_link_without_raw_idsr      s    )++D
eenDTJJeee
e
eC24[9IajkkkF"#'TTTTT''''V####======	B"d###D$&&&&8D@@@@@@r"   c                    t                      \  }}}t          |||dddddddd	           d
 }|                     t          d|           t          j        t                      |           d S )NrX   rY   rZ   r[   r\   r]   z%plain render should not call providerTr^   c                      t          d          )Nz5provider must not be called during normal page render)AssertionError)_args_kwargss     r!   fail_providerzOtest_equity_page_does_not_refresh_prices_on_plain_render.<locals>.fail_provider   s    TUUUr"   equity_price_provider_by_name)r   r   setattrr   rS   r   )monkeypatchrT   r`   r   r   s        r!   8test_equity_page_does_not_refresh_prices_on_plain_renderr      s    #4#6#6 D*j$#(!&4   V V V -/NP]^^^ $77777r"   N)r3   r   r   r$   r.   )#
__future__r   jarvis_finance.dashboardr   r   r   r   r   jarvis_finance.dashboard.mainr   r   jarvis_finance.equity.cleanupr	   r
   jarvis_finance.equity.manager   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   test_dashboard_mvp_regressionsr   test_dashboard_ux_sprint2r   r   r   rC   rM   rV   r   r   r   r   r   r"   r!   <module>r      s   " " " " " " ; ; ; ; ; ; P P P P P P P P a a a a a a a a q q q q q q q q H  H  H  H  H  H  H  H  H  H : : : : : : > > > > > > < < < < < < S S S S S S S S       &      O O O O(6 6 6 6r$ $ $ $4A A A A&8 8 8 8 8 8r"   