
    3tj                       d dl mZ d dlZd dlmc 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 )    )annotationsN)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      X/home/agent/.hermes/repos/FinanceManager/tests/unit/test_dashboard_real_ui_acceptance.pyr   z#DuplicateKeyGuardStreamlit.__init__   s1    $)&)))*-%%    namestrc                ^     t                                                     fd}|S )Nc                 v   	dk    r|                     d          }|rt          |          }
j        }||v}|sHt          j        d|fd||f          dt          j                    v st          j        t                    rt          j        t                    nddt          j                    v st          j        |          rt          j        |          ndt          j        |          dt          j                    v st          j        
          rt          j        
          ndt          j        |          dz  }t          j	        d|           d	z   d
|iz  }t          t          j        |                    d x}x}}
j                            t          |                      | i |S )Nbuttonkeynot in)zZ%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} not in %(py7)s
{%(py7)s = %(py5)s.seen_button_keys
}r$   r   )py0py1py3py5py7z duplicate Streamlit button key: z
>assert %(py9)spy9)getr$   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationadd)r   r   r(   @py_assert2@py_assert6@py_assert4@py_format8@py_format10baser#   r   s           r!   recorderz8DuplicateKeyGuardStreamlit.__getattr__.<locals>.recorder   s   xjj'' 8s88j4+@j8+@@jjjjjjjjj8+@jjjjjjjjjjjj3jjjjj3jjjjjjjjjjjjjsjjjjjsjjjjjj8jjjjjjjjjjj4jjjjj4jjjjjj+@jjjjjjjjBjehBjBjjjjjjjjjjjjjjjjjjjjjjjjj)--c#hh7774((((r"   )r   __getattr__)r   r#   rB   rA   r    s   `` @r!   rC   z&DuplicateKeyGuardStreamlit.__getattr__   sG    ww""4((	) 	) 	) 	) 	) 	) 	) r"   r   r   )r#   r$   )__name__
__module____qualname__r   rC   __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   rL   )rM   values     r!   rO   z _visible_text.<locals>.<genexpr>%   s(      ==ESZZ======r"   
)callsextendvaluesjoin)rI   parts_namer   r   s        r!   _visible_textrY   !   s~    E!x > >tV........==V]]__=======99Ur"   r   c                    t                      } t                      }g d}| |k    }|st          j        d|fd| |f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          dz  }dd|iz  }t          t          j	        |                    d x}}d}|| v}|st          j        d	|fd
|| f          t          j        |          dt	          j                    v st          j        |           rt          j        |           nddz  }dd|iz  }t          t          j	        |                    d x}}d}|| v}|st          j        d	|fd
|| f          t          j        |          dt	          j                    v st          j        |           rt          j        |           nddz  }dd|iz  }t          t          j	        |                    d x}}d}||v }|st          j        d|fd||f          t          j        |          dt	          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d x}}d}||v }|st          j        d|fd||f          t          j        |          dt	          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d x}}d S )N)zCommand Center	PortfolioCryptoWallets   Position hinzufügenReports==z%(py0)s == %(py3)suserr+   r-   assert %(py5)sr.   zManual Review Queuer)   z%(py1)s not in %(py3)sr,   r-   zEquity/ETF Manageinz%(py1)s in %(py3)sadminAlerts)
r   r   r2   r3   r4   r5   r6   r7   r9   r:   )rc   rk   r<   @py_assert1@py_format4@py_format6@py_assert0s          r!   :test_user_navigation_is_short_and_admin_keeps_review_toolsrq   )   s   %''D'))Ejjjj4jjjjjjjjjjj4jjjjjjjjjjjjj4jjjjj4jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj , ,,,,,,,,,, ,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*d**********d****************d*****d*************************** ) E)))))))))) E))))) )))))))))))E)))))E)))))))))))))))))))))))))))8u8u8uur"   c                    t                      } t          |            t          d          D ] }|                     dd| d| f           !|                                  t                      }t          j        ||            ddh}|j        }||k    }|st          j
        d|fd||f          t          j        |          d	t          j                    v st          j        |          rt          j        |          nd	t          j        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}d}t#          |          }||v}|st          j
        d|fd||f          t          j        |          dt          j                    v st          j        t"                    rt          j        t"                    ndd	t          j                    v st          j        |          rt          j        |          nd	t          j        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}}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üfen)<=)z8%(py1)s <= %(py5)s
{%(py5)s = %(py3)s.seen_button_keys
}rI   )r,   r-   r.   assert %(py7)sr/   z(Admin: technische Alert-Tabelle anzeigenr)   )z4%(py1)s not in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}rY   )r,   r-   py4py6zassert %(py8)spy8)r   r   rangeexecutecommitr   r   renderr   r2   r3   r7   r4   r5   r6   r9   r:   rY   )connidxrI   rp   r>   r<   ro   r?   @py_assert5@py_format7@py_format9s              r!   Jtest_alert_page_uses_unique_button_keys_and_hides_admin_table_in_user_moder   4   s   DTQxx 
 
 c^^03001	
 	
 	
 	
 	KKMMM	#	%	%B"d####%<=TATT=ATTTTTTTTTTT=ATTTTTT=TTTTTTTTTTTTTTTTTTTTTTATTTTTTTTTTTTTTTTTTTTTTTTTTTT5N]2=N=NN5=NNNNNNNNNNN5=NNNNNN5NNNNNNNNNNN]NNNNN]NNNNNNNNNNNNN2NNNNN2NNNNNN=NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNr"   c                 X	   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          |           }|j        }t          |          }d}||k    }	|	st          j
        d|	fd||f          dt          j                    v st          j        t                    rt          j        t                    nddt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}x}	}|j        }d}||k    }|st          j
        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          d z  }d!d"|iz  }t          t          j        |                    d x}x}}t%          | |d#$          }|sed%d&d't          j                    v st          j        |          rt          j        |          nd'iz  }t          t          j        |                    |                     d(                                          d)         }|                     d*                                          d)         }d}||k    }|st          j
        d|fd+||f          d,t          j                    v st          j        |          rt          j        |          nd,t          j        |          d-z  }d.d/|iz  }t          t          j        |                    d x}}d}||k    }|st          j
        d|fd+||f          d0t          j                    v st          j        |          rt          j        |          nd0t          j        |          d-z  }d.d/|iz  }t          t          j        |                    d x}}d S )1N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#   r   isintickerexchangeproviderprovider_symbolr   550)	r   r   r   r   r   r   r   r   r   zUPDATE transactions SET source_type='broker_import_reviewed_snapshot', notes='docx review synthetic artifact' WHERE transaction_id=?   r`   )zU%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.transaction_ids
})
} == %(py8)slenplan)r+   r,   r-   r.   rx   zassert %(py10)spy10)z=%(py2)s
{%(py2)s = %(py0)s.manual_position_count
} == %(py5)s)r+   py2r.   ru   r/   ztest cleanup)r   r   zassert %(py0)sr+   audit_idzgSELECT 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)=1rb   active_manualrd   re   r.   voided_review)r   r   r   rz   transaction_idr{   r
   transaction_idsr   r2   r3   r4   r5   r6   r7   r9   r:   manual_position_countr	   fetchone)r}   r   manual_catalog_idreview_catalog_idreview_resultr   r<   r>   @py_assert7r=   r   @py_format11rm   @py_assert3ro   r?   r   @py_format1r   r   rn   s                        r!   Dtest_review_docx_equity_cleanup_preserves_manual_dashboard_positionsr   H   s   *;*=*='D*'$*(!&-    4"-   5*(!%-  M 	LL 	O		%'   	KKMMM066D#)3#$$))$))))))))))$))))))))))))3)))))3)))))))))))))t)))))t))))))#))))$)))))))))))))))))))))))))))))))))%**%**********%************4*****4******%*******************************/4nUUUHOOOOOOOOOOOO8OOOOO8OOOOOOOOOOOOOOOOLL  "K  L  L  U  U  W  W  X[  \MLL  "Z  [  [  d  d  f  f  gj  kM=A=A==A=A=A==Ar"   c                    t                      \  } }}t          | ||dddddddd	           t          d
dd          }t          j        ||            t          |          }dD ]}||v }|st          j        d|fd||f          dt          j	                    v st          j
        |          rt          j        |          nddt          j	                    v st          j
        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d }d}	|	|v}
|
st          j        d|
fd|	|f          t          j        |	          dt          j	                    v st          j
        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d x}	}
d}	|	|v}
|
st          j        d|
fd|	|f          t          j        |	          dt          j	                    v st          j
        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d x}	}
d S )Nr   2r   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 anzeigenr^   rh   )z%(py0)s in %(py2)sexpectedtext)r+   r   zassert %(py4)srv   instrument_idr)   rf   rg   re   r.   r   )r   r   r   r   r|   rY   r2   r3   r4   r5   r6   r7   r9   r:   )r}   r   
catalog_idrI   r   r   rm   @py_format3@py_format5rp   r<   rn   ro   s                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x4xx44&?$&&&&&&&&&&?$&&&&&?&&&&&&&&&&&$&&&&&$&&&&&&&&&&&&&&&&&&&&&&&&&&&#<t##########<t#####<###########t#####t#############################r"   c                 D   t                      } t          d t          j        |           D                       }t          j        | |d         d          }|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          d	z  }d
d|iz  }t          t          j	        |                    d x}x}}d}||v}|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }	t          t          j	        |	                    d x}}d}||v}|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }	t          t          j	        |	                    d x}}ddlm}
 t                      }|
                    ||            t#          |          }d}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }	t          t          j	        |	                    d x}}d}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }	t          t          j	        |	                    d x}}d S )Nc              3  2   K   | ]}|d          dk    |V  dS )symbolETHN )rM   rows     r!   rO   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/ethereumr`   )z%(py1)s == %(py4)s)r,   rv   zassert %(py6)srw   coingecko_idr)   rf   detailrg   re   r.   asset_idr   )page_04_cryptou   CoinGecko öffnenrh   rj   r   )r   nextdashboard_dataget_crypto_coin_summaryget_crypto_coin_detailr2   r3   r7   r9   r:   r4   r5   r6   jarvis_finance.dashboard.viewsr   r   r|   rY   )r}   ethr   rp   r   r<   r   r   rn   ro   r   rI   r   s                r!   Btest_crypto_detail_contains_minimal_coingecko_link_without_raw_idsr      sQ   )++D
eenDTJJeee
e
eC24[9IajkkkF"#T'TT#'TTTTTTTTTTT#'TTTTTT#TTTT'TTTTTTTTTTTTTTTTTTTTTTTTTTTT'>''''''''''>'''''>'''''''''''''''''''''''''''''''''''''''''''#:V##########:V#####:###########V#####V###########################======	B"d###D&$&&&&&&&&&&$&&&&&&&&&&&&&&&&$&&&&&$&&&&&&&&&&&&&&&&&&&&&&&&&&&8@8D@@@@@@@@@@8D@@@@@8@@@@@@@@@@@D@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r"   c                    t                      \  }}}t          |||dddddddd	           d
 }|                     t          d|           t          j        t                      |           d S )Nr   r   r   r   r   r   z%plain render should not call providerTr   c                      t          d          )Nz5provider must not be called during normal page render)r9   )_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   r|   r   )monkeypatchr}   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"   )rI   r   r   r$   rD   ))
__future__r   builtinsr4   _pytest.assertion.rewrite	assertionrewriter2   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   rY   rq   r   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"   